メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcString.c

#include "dkcString.h"
#include "dkcStdio.h"
#include "dkcOSIndependent.h"
#include <limits.h>

dkcString.cのインクルード依存関係図

ソースコードを見る。

マクロ定義

#define DKUTIL_C_STRING_C

関数

BOOL dkcIsSJIS1 (BYTE c)
BOOL dkcIsSJIS2 (BYTE c)
BOOL dkcIsSpace (BYTE c)
const char * dkcGetSpaceSeparator ()
int WINAPI dkcSJIS_StrChrSearch (const char *s, char c)
 SJIS文字を除外して文字を検索
int WINAPI dkcSJIS_StrChrSearchLast (const char *s, char c)
 SJIS文字を除外して文字を検索
int WINAPI dkcSJIS_StrChrSearchTail (const char *s, size_t len, char c)
int WINAPI dkcSJIS_StrChrSearchInStr (const char *s, const char *c)
int WINAPI dkcSJIS_StrChrSearchInStrLast (const char *s, const char *c)
int WINAPI dkcSJIS_SearchPathSep (const char *s)
int WINAPI dkcSJIS_SearchPathSepLast (const char *s)
int WINAPI dkcStrStr (const char *dest, const char *src)
static int dkcBMStrStrLogic (const char *text, const char *pattern)
int WINAPI dkcBMStrStr (const char *dest, const char *src)
DKC_STRING *WINAPI dkcAllocString (size_t size)
int WINAPI dkcFreeString (DKC_STRING **ptr)
int WINAPI dkcStringCopy (DKC_STRING *ptr, const char *str, size_t size)
int WINAPI dkcStringConcatenate (DKC_STRING *ptr, const char *str, size_t size)
 http://www.google.com/search?num=50&hl=ja&lr=lang_ja&q=strcat+cat%82%c6%82%cd
int WINAPI dkcStringInsert (DKC_STRING *ptr, size_t point, const char *str, size_t size)
int WINAPI dkcStringErase (DKC_STRING *ptr, size_t point, size_t len)
int WINAPI dkcStringReplace (DKC_STRING *ptr, size_t begin_, size_t end_, const char *str, size_t size)
size_t dkcStringSize (const DKC_STRING *ptr)
size_t dkcStringNum (const DKC_STRING *ptr)
const char *WINAPI dkcStringPointer (const DKC_STRING *ptr)
int WINAPI dkcStringGetBuffer (const DKC_STRING *ptr, char *buffer, size_t buffsize)
 DKC_STRINGの内部文字列をバッファにぶち込む

変数

static const BYTE SJIS1_S1 = 0x81
static const BYTE SJIS1_E1 = 0x9f
static const BYTE SJIS1_S2 = 0xe0
static const BYTE SJIS1_E2 = 0xf5
static const BYTE SJIS2_S1 = 0x40
static const BYTE SJIS2_E1 = 0x7e
static const BYTE SJIS2_S2 = 0x80
static const BYTE SJIS2_E2 = 0xfc


マクロ定義

#define DKUTIL_C_STRING_C
 

作者:
d金魚
参照:
dkcString.h

dkcString.c5 行で定義されています。


関数

DKC_STRING* WINAPI dkcAllocString size_t  size  ) 
 

dkcString.c225 行で定義されています。

参照先 dkcAllocate(), dkcAllocMemoryStream(), dkcFree(), dkc_String::mByteSize, dkc_String::mStream, と NULL.

参照元 dkcAllocPathString().

00225                                                {
00226     DKC_STRING *p;
00227     //へんな引数は除外
00228     //if(dkcErrorFlagCheck(flag)) return edk_ArgumentException;
00229     
00230     p = (DKC_STRING *)dkcAllocate(sizeof(DKC_STRING));
00231     if(NULL==p) return NULL;
00232     
00233     p->mStream = dkcAllocMemoryStream(size + 1);
00234     if(NULL==p->mStream) goto Error;
00235 
00236     p->mByteSize = 0;
00237 
00238     return p;
00239 Error:
00240     dkcFree((void **)&p);
00241     return NULL;
00242 }

int WINAPI dkcBMStrStr const char *  dest,
const char *  src
 

strstrをBM法でやってみたもの

戻り値:
最初に見つかった位置を返す -1なら見つからない /
覚え書き:
It has not tested.

dkcString.c216 行で定義されています。

参照先 dkcBMStrStrLogic().

00217 {
00218     return dkcBMStrStrLogic(dest,src);
00219 }

static int dkcBMStrStrLogic const char *  text,
const char *  pattern
[static]
 

dkcString.c182 行で定義されています。

参照元 dkcBMStrStr().

00183 {
00184     int i, j, k, len;
00185     int skip[UCHAR_MAX + 1];
00186     unsigned char c, tail;
00187 
00188     len = strlen((char *)pattern);  /* 文字列の長さ */
00189     if (len == 0) return -1;        /* エラー: 長さ0 */
00190     tail = pattern[len - 1];        /* 最後の文字 */
00191     if (len == 1) {                 /* 長さ1なら簡単! */
00192         for (i = 0; text[i] != '\0'; i++)
00193             if (text[i] == tail) return i;
00194     } else {                        // 長さ2以上なら表を作って… 
00195         for (i = 0; i <= UCHAR_MAX; i++) skip[i] = len;
00196         for (i = 0; i < len - 1; i++)
00197             skip[pattern[i]] = len - 1 - i;
00198         /* i = len - 1; */          // いよいよ照合 
00199         while ((c = text[i]) != '\0') {
00200 /*     // デモンストレーション用 
00201             printf("テ: %s\n", text);
00202             printf("照: %*s\n", i + 1, pattern);
00203 */
00204             if (c == tail) {
00205                 j = len - 1;  k = i;
00206                 while (pattern[--j] == text[--k])
00207                     if (j == 0) return k;  //見つかった 
00208             }
00209             i += skip[c];
00210         }
00211     }
00212     return -1;  // 見つからなかった 
00213 }

int WINAPI dkcFreeString DKC_STRING **  ptr  ) 
 

dkcString.c244 行で定義されています。

参照先 dkcFree(), dkcFreeMemoryStream(), と NULL.

参照元 dkcAllocPathString(), と dkcFreePathString().

00244                                           {
00245     //変な引数入れるな!
00246     if(NULL==ptr || NULL==*ptr || NULL==(*ptr)->mStream){return edk_ArgumentException;}
00247     dkcFreeMemoryStream(&(*ptr)->mStream);
00248     return dkcFree((void **)ptr);
00249 }

const char* dkcGetSpaceSeparator  ) 
 

戻り値:
可視できる文字定数だったらTRUE

dkcString.c65 行で定義されています。

00065                                   {
00066     static const char temp[]={
00067         '\0',0x0a,0x0d,' ','\t'
00068     };
00069     return temp;
00070 }

BOOL dkcIsSJIS1 BYTE  c  ) 
 

戻り値:
cがSJISの1バイト目の時TRUE(1)

dkcString.c40 行で定義されています。

参照先 SJIS1_E2, と SJIS1_S1.

00041 {
00042   // 普通に書けばこのような感じだが、高速化する
00043   // if((c >= SJIS1_S1 && c <= SJIS1_E1) || (c >= SJIS1_S2 && c <= SJIS1_E2)) return TRUE;
00044   /*
00045     c ^= 0x20;
00046   if(c >= (SJIS1_S1 ^ 0x20) && c <= (SJIS1_E2 ^ 0x20)) return TRUE;
00047   return FALSE;
00048     */
00049     return ((c ^= 0x20) && (c >= (SJIS1_S1 ^ 0x20) && c <= (SJIS1_E2 ^ 0x20)));
00050 }

BOOL dkcIsSJIS2 BYTE  c  ) 
 

戻り値:
cがSJISの2バイト目の時TRUE(1)

dkcString.c52 行で定義されています。

参照先 SJIS2_E1, SJIS2_E2, SJIS2_S1, と SJIS2_S2.

00053 {
00054     /*if(dkcmIsSJIS2(c)) return TRUE;
00055   return FALSE;
00056     */
00057     return (c >= SJIS2_S1 && c <= SJIS2_E1) || (c >= SJIS2_S2 && c <= SJIS2_E2);
00058 }

BOOL dkcIsSpace BYTE  c  ) 
 

戻り値:
半角全角を区別なしにSpace系の文字だったらTRUE

dkcString.c60 行で定義されています。

00061 {
00062     return (c=='\0' || c==0x0a || c==0x0d || c==' ' || c=='\t');
00063 }

int WINAPI dkcSJIS_SearchPathSep const char *  s  ) 
 

戻り値:
パスセパレータが最初に見つかった位置を返す。

-1は見つからない

dkcString.c155 行で定義されています。

参照先 dkcGetPathSep(), と dkcSJIS_StrChrSearchInStr().

参照元 dkcPathStringElementErase_Logic(), dkcPathStringElementReplace_Logic(), と dkcPathStringGetFileExtension().

00156 {
00157     const char *target = dkcGetPathSep();
00158     return dkcSJIS_StrChrSearchInStr(s,target);
00159 }

int WINAPI dkcSJIS_SearchPathSepLast const char *  s  ) 
 

戻り値:
パスセパレータが最期に見つかった位置を返す。

-1は見つからない

dkcString.c161 行で定義されています。

参照先 dkcGetPathSep(), と dkcSJIS_StrChrSearchInStrLast().

参照元 dkcIsTailPathSep(), と dkcPathStringGetFileName().

00162 {
00163     const char *target = dkcGetPathSep();
00164     return dkcSJIS_StrChrSearchInStrLast(s,target);
00165 }

int WINAPI dkcSJIS_StrChrSearch const char *  s,
char  c
 

SJIS文字を除外して文字を検索

戻り値:
最初に見つかった位置を返す -1なら見つからない

dkcString.c73 行で定義されています。

参照先 dkcmIsSJIS1, と dkcmIsSJIS2.

参照元 dkcIsRelativityPath(), dkcPathStringDevideBegin_Logic(), dkcPathStringDevideNext_Logic(), と dkcPathStringGetDrive().

00074 {
00075   // c == 0 も考慮している
00076   int i;
00077     for(i = 0; ; i++){
00078       if(s[i] == c) return i;
00079       if(s[i] == '\0') break;
00080       if(dkcmIsSJIS1(s[i]) && dkcmIsSJIS2(s[i + 1])) i++;
00081   }
00082   return -1;
00083 } 

int WINAPI dkcSJIS_StrChrSearchInStr const char *  s,
const char *  c
 

複数の文字定数を検索指定できるdkcSJIS_StrChrSearch() /

覚え書き:
It has not tested.

dkcString.c118 行で定義されています。

参照先 dkcmIsSJIS1, と dkcmIsSJIS2.

参照元 dkcSJIS_SearchPathSep().

00119 {
00120     // c == 0 も考慮している
00121   size_t i,j;
00122     size_t len = strlen(c);
00123     for(i = 0; ; i++){
00124         if(s[i] == '\0') break;
00125         if(dkcmIsSJIS1(s[i]) && dkcmIsSJIS2(s[i + 1])){
00126             i++;
00127             continue;
00128         }
00129         for(j=0;j<len;j++){
00130       if(s[i] == c[j]) return i;
00131         }
00132   }
00133   return -1;
00134 }

int WINAPI dkcSJIS_StrChrSearchInStrLast const char *  s,
const char *  c
 

覚え書き:
It has not tested.

dkcString.c136 行で定義されています。

参照先 dkcmIsSJIS1, と dkcmIsSJIS2.

参照元 dkcSJIS_SearchPathSepLast().

00137 {
00138   int nLast = -1;
00139     size_t i,j;
00140     size_t len = strlen(c);
00141   // c == 0 も考慮している
00142   for(i = 0; ; i++){
00143     if(s[i] == '\0') break;
00144     if(dkcmIsSJIS1(s[i]) && dkcmIsSJIS2(s[i + 1])){
00145             i++;
00146             continue;
00147         }
00148         for(j=0;j<len;j++){
00149             if(s[i] == c[j]) nLast = i;
00150         }
00151   }
00152   return nLast;
00153 } 

int WINAPI dkcSJIS_StrChrSearchLast const char *  s,
char  c
 

SJIS文字を除外して文字を検索

戻り値:
最後に見つかった位置を返す -1なら見つからない

dkcString.c86 行で定義されています。

参照先 dkcmIsSJIS1, と dkcmIsSJIS2.

参照元 dkcPathStringGetFileExtension().

00087 {
00088   int nLast = -1,i;
00089   // c == 0 も考慮している
00090   for(i = 0; ; i++){
00091     if(s[i] == c) nLast = i;
00092     if(s[i] == '\0') break;
00093     if(dkcmIsSJIS1(s[i]) && dkcmIsSJIS2(s[i + 1])) i++;
00094   }
00095   return nLast;
00096 } 

int WINAPI dkcSJIS_StrChrSearchTail const char *  s,
size_t  len,
char  c
 

SJIS文字を除外して文字を後ろから検索

戻り値:
後ろから検索して最初に見つかった位置を返す -1なら見つからない
覚え書き:
It has not tested.

dkcString.c98 行で定義されています。

参照先 dkcmIsSJIS1, と dkcmIsSJIS2.

参照元 dkcPathStringGetDirectory().

00098                                                                     {
00099     int i;
00100     for(i=len;i > 0;i--){//sjisを調べるためi > 0 iが0になったら終了。
00101         if(dkcmIsSJIS1(s[i - 1]) && dkcmIsSJIS2(s[i]) )
00102         {
00103             i--;
00104             continue;
00105         }
00106         if(s[i] == c) return i;
00107     }
00108     //iが0の時。
00109     if(! (dkcmIsSJIS1(s[i]) && dkcmIsSJIS2(s[i + 1]) ))
00110     {
00111         if(c==s[i]){
00112             return 0;
00113         }
00114     }
00115     return -1;
00116 }

int WINAPI dkcStringConcatenate DKC_STRING ptr,
const char *  str,
size_t  size
 

http://www.google.com/search?num=50&hl=ja&lr=lang_ja&q=strcat+cat%82%c6%82%cd

dkcString.c273 行で定義されています。

参照先 dkcMemoryStreamDynamicWrite(), dkcmNOT_ASSERT, dkc_String::mByteSize, dkc_MemoryStream::mNowOffset, dkc_String::mStream, と NULL.

参照元 dkcPathStringNormalizeConcatenateLogic(), と dkcStringInsert().

00273                                                                             {
00274     dkcmNOT_ASSERT(NULL==ptr  || NULL==ptr->mStream || 0==size);
00275 
00276     if(0 != ptr->mByteSize){
00277         ptr->mStream->mNowOffset --;//一つ減らしてNULL文字分を潰す。
00278     }
00279     if(DKUTIL_FAILED(dkcMemoryStreamDynamicWrite(ptr->mStream,str,size + 1)))//+1してNULL文字もコピー
00280     {
00281         return edk_FAILED;
00282     }
00283 
00284     ptr->mByteSize += size;
00285 
00286     return edk_SUCCEEDED;
00287 }

int WINAPI dkcStringCopy DKC_STRING ptr,
const char *  str,
size_t  size
 

dkcString.c252 行で定義されています。

参照先 dkcMemoryStreamClear(), dkcMemoryStreamDynamicWrite(), dkcMemoryStreamSeek(), dkcmNOT_ASSERT, edkcMemoryStreamSeekSet, dkc_String::mByteSize, dkc_String::mStream, と NULL.

参照元 dkcPathStringCopy().

00253 {
00254     dkcmNOT_ASSERT(NULL==ptr  || NULL==ptr->mStream || 0==size);
00255 
00256     if(DKUTIL_FAILED(dkcMemoryStreamSeek(ptr->mStream,0,edkcMemoryStreamSeekSet))){
00257         return edk_FAILED;
00258     }
00259 
00260     dkcMemoryStreamClear(ptr->mStream);
00261     
00262     if(DKUTIL_FAILED(dkcMemoryStreamDynamicWrite(ptr->mStream,str,
00263         size + 1/* + 1してNULL文字分もコピー*/)))
00264     {
00265         return edk_FAILED;
00266     }
00267 
00268     ptr->mByteSize = size;
00269 
00270     return edk_SUCCEEDED;
00271 }

int WINAPI dkcStringErase DKC_STRING ptr,
size_t  point,
size_t  len
 

引数:
ptr[in][out] dkcAllocString()で確保したポインタ
point[in] 何文字目以降を削除するのか
len[in] pointから何文字Eraseするか。
戻り値:
edk_SUCCEEDEDなら完全成功。
edk_Not_Satisfactoryならlenが大きすぎる等の理由から一応処理は出来たが要求した結果にはならなかった。
その他はエラー
TODO:
test

dkcString.c334 行で定義されています。

参照先 dkc_stream_swap(), dkcMemoryStreamSeek(), edkcMemoryStreamSeekSet, dkc_MemoryStream::mBuffer, dkc_String::mByteSize, dkc_MemoryStream::mNowOffset, と dkc_String::mStream.

参照元 dkcPathStringElementErase_Logic(), と dkcStringReplace().

00335 {
00336     char *tp;
00337     size_t size;
00338     int r;
00339 
00340     tp = (char *)ptr->mStream->mBuffer;
00341     size = ptr->mStream->mNowOffset;
00342     if(point + len >= size){
00343         len = size - len;
00344         dkcMemoryStreamSeek(ptr->mStream,len,edkcMemoryStreamSeekSet);
00345 
00346         return edk_Not_Satisfactory;
00347     }
00348     else
00349     {
00350         dkc_stream_swap(&tp[point],size - point - 1,len);//要らない領域を後ろに持ってくる。
00351     
00352         ptr->mByteSize -= len;//少なくする。
00353         //多分バッファオーバーフローしないと思うけど・・・。
00354         ptr->mStream->mBuffer[ptr->mByteSize] = '\0';
00355         
00356     
00357         r = dkcMemoryStreamSeek(ptr->mStream,size - len,edkcMemoryStreamSeekSet);
00358     }
00359     return r;
00360 }

int WINAPI dkcStringGetBuffer const DKC_STRING ptr,
char *  buffer,
size_t  buffsize
 

DKC_STRINGの内部文字列をバッファにぶち込む

dkcString.c385 行で定義されています。

参照先 dkc_memcpy(), dkcStringNum(), dkc_MemoryStream::mBuffer, dkc_MemoryStream::mNowOffset, dkc_String::mStream, と NULL.

00386 {
00387     int r;
00388     size_t num;
00389     if(NULL==ptr) return edk_FAILED;
00390     num = dkcStringNum(ptr);
00391     r = dkc_memcpy(buffer,buffsize,ptr->mStream->mBuffer,ptr->mStream->mNowOffset);
00392     if(DKUTIL_FAILED(r)) return r;
00393     
00394     return r;
00395     //return dkcStreamToBuffer(ptr->mStream,edkcStreamSeekSet,0,num,buffer,buffsize);
00396 }

int WINAPI dkcStringInsert DKC_STRING ptr,
size_t  point,
const char *  str,
size_t  size
 

引数:
ptr[in][out] dkcAllocString()で確保したポインタ
point[in] 何文字目以降に挿入するのか
str[in] 挿入したい文字列
size[in] strの文字数。
TODO:
テストをする。この関数の実装は醜いので直す。

dkcString.c289 行で定義されています。

参照先 dkc_stream_swap(), dkcMemoryStreamGetSeekPoint(), dkcmNOT_ASSERT, dkcStringConcatenate(), dkc_MemoryStream::mBuffer, dkc_String::mStream, と NULL.

参照元 dkcPathStringElementInsert_Logic(), と dkcStringReplace().

00290 {
00291     size_t tpo;//一時オフセット保存
00292     char *tp;//bufferのtemp
00293     //char *mlctp;//mallocで確保したバッファのtemp
00294     //size_t len;//tpo - point
00295     //size_t maxbuffsize;//ptr->mStream->mSize - len
00296 
00297     dkcmNOT_ASSERT(NULL==ptr  || NULL==ptr->mStream);
00298     if(0==size){
00299         return edk_Not_Satisfactory;
00300     }
00301     //lock thread
00302 
00303     //ここらへんがステートマシンだから嫌^^;
00304 
00305 
00306 
00307     //エラーチェック
00308     {
00309         tpo = dkcMemoryStreamGetSeekPoint(ptr->mStream);
00310         if(point > tpo)
00311         {//pointがはみ出ている。
00312             return edk_ArgumentException;
00313         }
00314         //とりあえず、push!!
00315         dkcStringConcatenate(ptr,str,size);//これでmByteSizeは+=されている。
00316 
00317         tp = (char *)ptr->mStream->mBuffer;
00318 
00319         //一度、Concatenateしたので再取得
00320         tpo = dkcMemoryStreamGetSeekPoint(ptr->mStream);
00321 
00322         //入れ替えしてやる。
00323         dkc_stream_swap(&tp[point],tpo - point - 1,tpo - point - size - 1);
00324 
00325     }
00326     return edk_SUCCEEDED;
00327         
00328     //unlock thread
00329 
00330 
00331 
00332 }

size_t dkcStringNum const DKC_STRING ptr  ) 
 

戻り値:
文字列の文字数を返す。内部streamをstrlenにかけたものを保存しておいたものを取得。

dkcString.c376 行で定義されています。

参照先 dkc_String::mByteSize.

参照元 dkcStringGetBuffer().

00376                                           {
00377     return ptr->mByteSize;
00378 }

const char* WINAPI dkcStringPointer const DKC_STRING ptr  ) 
 

dkcString.c380 行で定義されています。

参照先 dkc_MemoryStream::mBuffer, と dkc_String::mStream.

参照元 dkcPathStringGetDirectory(), dkcPathStringGetDrive(), dkcPathStringGetFileExtension(), dkcPathStringGetFileName(), と dkcPathStringPointer().

00380                                                            {
00381     //if(dkcErrorPtrCheck(ptr)) return edk_FAILED;
00382     return (const char *)ptr->mStream->mBuffer;
00383 }

int WINAPI dkcStringReplace DKC_STRING ptr,
size_t  begin_,
size_t  end_,
const char *  str,
size_t  size
 

引数:
ptr[in][out] dkcAllocString()で確保したポインタ
begin_[in] 何処から(何文字目から
end_[in] 何処まで(何文字目まで)注意:begin_からn byteまで とかではない。
str[in] 置換したい文字列
size[in] strの文字数。
TODO:
テストをする。この関数の実装は醜いので直す。

dkcString.c362 行で定義されています。

参照先 dkcStringErase(), と dkcStringInsert().

参照元 dkcPathStringElementReplace_Logic().

00364 {
00365     //非効率だけどこれで^^;;;;
00366     dkcStringErase(ptr,begin_,end_ - begin_);
00367     return dkcStringInsert(ptr,begin_,str,size);
00368 }

size_t dkcStringSize const DKC_STRING ptr  ) 
 

dkcString.c372 行で定義されています。

参照先 dkc_String::mByteSize.

参照元 dkcPathStringDevideNext_Logic(), dkcPathStringGetDirectory(), dkcPathStringGetFileExtension(), dkcPathStringGetFileName(), と dkcPathStringSize().

00372                                            {
00373     return ptr->mByteSize;
00374 }

int WINAPI dkcStrStr const char *  dest,
const char *  src
 

strstrのWrapper

戻り値:
最初に見つかった位置を返す -1なら見つからない -2だと、あまりにも文字列が離れすぎていて表現できない。

dkcString.c168 行で定義されています。

参照先 NULL.

00169 {
00170     char *p = strstr(dest,src);
00171     if(NULL==p) return -1;
00172     if((size_t)p - (size_t)dest > INT_MAX){
00173         return -2;
00174     }
00175     return (int)(p - dest);
00176     /*int offset = p - dest;//overflowすると危ない
00177     if(offset < 0) return -1;
00178     return offset;
00179     */
00180 }


変数

const BYTE SJIS1_E1 = 0x9f [static]
 

dkcString.c27 行で定義されています。

const BYTE SJIS1_E2 = 0xf5 [static]
 

dkcString.c29 行で定義されています。

参照元 dkcIsSJIS1().

const BYTE SJIS1_S1 = 0x81 [static]
 

dkcString.c26 行で定義されています。

参照元 dkcIsSJIS1().

const BYTE SJIS1_S2 = 0xe0 [static]
 

dkcString.c28 行で定義されています。

const BYTE SJIS2_E1 = 0x7e [static]
 

dkcString.c33 行で定義されています。

参照元 dkcIsSJIS2().

const BYTE SJIS2_E2 = 0xfc [static]
 

dkcString.c35 行で定義されています。

参照元 dkcIsSJIS2().

const BYTE SJIS2_S1 = 0x40 [static]
 

dkcString.c32 行で定義されています。

参照元 dkcIsSJIS2().

const BYTE SJIS2_S2 = 0x80 [static]
 

dkcString.c34 行で定義されています。

参照元 dkcIsSJIS2().


dkutil_cに対してSat Sep 10 09:25:18 2005に生成されました。  doxygen 1.4.4