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

dkcOSIndependent.c

#include "dkcOSIndependent.h"
#include "dkcDefined.h"
#include "dkcQueue.h"
#include <assert.h>
#include <math.h>

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

ソースコードを見る。

マクロ定義

#define DKUTIL_C_OS_INDEPENDENT_C

関数

int dkcDynamicCheckEnvironment (BOOL isForceExit)
int WINAPI dkcIsNativePathString (const char *s, size_t size)
DKC_INLINE int WINAPI dkcOutputDebugString (const char *str,...)
int WINAPI dkcErrorMessage (const char *expression, const char *filename, size_t line, const char *message,...)
void *WINAPIV dkcMallocAdapter (size_t s)
void WINAPIV dkcFreeAdapter (void *p)
DKC_INLINE void * dkcAllocateFill (size_t size, BYTE fill)
DKC_INLINE void * dkcAllocateFast (size_t size)
DKC_INLINE void * dkcAllocate (size_t size)
DKC_INLINE int dkcFree (void **p)
BOOL dkcIs_foepn_mode (const char *s)
 fopenの時の第二引数が有効な値かどうか調べる。
size_t dkcReallocateSizeFunction (size_t OldSize, size_t ExpandSize)
int WINAPI dkcReallocate (void **NewPtr, size_t NewSize, void **OldPtr)
int WINAPI dkcReallocateEx (DKC_REALLOC_F_TYPE your_realloc, void **NewPtr, size_t NewSize, void **OldPtr)
int WINAPI dkcReallocateAutoExpand (DKC_REALLOC_F_TYPE your_realloc, void **NewPtr, void **OldPtr, size_t OldSize, size_t *reallocated_size)
int WINAPI dkcGetMemorySize (uint64 *pTotalMemory, uint64 *pFreeMemory)
static int WINAPI dkcLoadFile (void *data, size_t size, const char *fname, const char *mode, size_t *readsize)
static int WINAPI dkcSaveFile (const void *data, size_t size, const char *fname, const char *mode)
DKC_EXTERN FILE *WINAPI dkcFOpen (const char *filename, const char *mode)
 fopenのラッパー
DKC_EXTERN int WINAPI dkcFClose (FILE **ptr)
 fcloseのラッパー
DKC_EXTERN size_t WINAPI dkcFReadAll (void *buffer, size_t size, FILE *fp)
 freadの全部責任持って読み込みますバージョン。(読み込めない場合はEOFかerror)
DKC_EXTERN size_t WINAPI dkcFWriteAll (const void *buffer, size_t size, FILE *fp)
DKC_INLINE size_t WINAPI dkcFSize (FILE *fp)
 dkcFileSize()を普段はお使いください。エラー時の時は動作は未定義です。
int WINAPI dkcSaveBinary (const void *data, size_t size, const char *fname)
 fopenのファイル関数を使ってバイナリセーブを行う。
DKC_INLINE BOOL WINAPI dkcCreateEmptyFile (const char *filename)
 空ファイルを作る。
DKC_INLINE int WINAPI dkcLoadBinary (void *data, size_t size, const char *fname, size_t *readsize)
 バイナリデータをメモリに読み込む。dkcSaveBinary()と対
DKC_INLINE int WINAPI dkcSaveText (const char *text, size_t length, const char *fname)
 fopenでテキストセーブを行う
DKC_INLINE int WINAPI dkcLoadText (char *text, size_t length, const char *fname, size_t *readsize)
 テキストデータをメモリに読み込む。dkcSaveText()と対
DKC_INLINE int WINAPI dkcInitFileFast (const char *filename)
 エラーログ(ファイル)を高速に初期化する、
DKC_INLINE int WINAPI dkcAddLogFile (const char *filename, const char *str,...)
 ログを吐く
BOOL WINAPI dkcSwapFast (void *p1, void *p2, size_t size)
void WINAPI dkcSwap64 (ULONGLONG *p1, ULONGLONG *p2, size_t size)
void WINAPI dkcSwap (void *p1, void *p2, size_t size)
DKC_INLINE void WINAPI dkcTwoDWORDToULONGLONG (ULONGLONG *dest, DWORD high, DWORD low)
DKC_INLINE void WINAPI dkcULONGLONGToTwoDWORD (DWORD *dhigh, DWORD *dlow, ULONGLONG src)
DKC_INLINE void WINAPI dkcLONGLONGToTwoLONG (LONG *high, LONG *low, LONGLONG src)
DKC_INLINE void WINAPI dkcTwoLONGToLONGLONG (LONGLONG *dest, LONG high, LONG low)
void WINAPI dkcCheckMemoryLeak (BOOL flag)
const char *WINAPI dkcGetPathSep ()
BOOL WINAPI dkcIsMMX (void)
DKC_INLINE USHORT dkcReverseEndian16 (USHORT x)
 endian change 16 bit version
DKC_INLINE DWORD dkcReverseEndian32 (DWORD x)
DKC_INLINE ULONGLONG dkcReverseEndian64 (ULONGLONG x)
DKC_INLINE BOOL dkcIsLittleEndian ()
int WINAPI dkcGetByteOrder ()
DKC_INLINE BOOL dkcCheckOverflowULONG (ULONG a1, ULONG a2)
 unsigned long型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。
DKC_INLINE BOOL dkcCheckOverflowULONGLONG (ULONGLONG a1, ULONGLONG a2)
static void * get_offset (void *p, size_t offset)
int WINAPI dkcSelect (void *dest, const void *a_src, size_t n, int k, size_t width, DKC_COMPARE_TYPE less)
 いわいるセレクト(選択)アルゴリズム
DKC_INLINE int WINAPI dkcSelectMax (void *a, const void *a_src, size_t n, size_t width, DKC_COMPARE_TYPE less)
DKC_INLINE int WINAPI dkcSelectMin (void *a, const void *a_src, size_t n, size_t width, DKC_COMPARE_TYPE less)
DKC_INLINE int dkcRotateShiftRightMemoryLogic (void *d, size_t size, size_t n, void *workbuff, size_t worksize)
int WINAPI dkcRotateShiftRightMemory (void *d, size_t size, size_t num)


説明

作者:
d金魚 @

dkcOSIndependent.c で定義されています。


マクロ定義

#define DKUTIL_C_OS_INDEPENDENT_C
 

dkcOSIndependent.c7 行で定義されています。


関数

DKC_INLINE int WINAPI dkcAddLogFile const char *  filename,
const char *  str,
  ...
 

ログを吐く

引数:
filename[in] ファイルネーム
str[in] 吐く文字列
覚え書き:
出力速度が遅いので多用は奨励しない

dkcOSIndependent.c524 行で定義されています。

参照先 NULL.

00524                                                                                   {
00525     FILE *fp=NULL;
00526     char s[2048]="";
00527     va_list VaList;
00528     int r;
00529     //SET_VA_LIST_INSERT_YEN_N(s,2048,str);
00530     SET_VA_LIST_C(VaList,r,s,sizeof(s),str);
00531 
00532     //ファイルをオープン
00533     if(NULL == (fp = fopen( filename , "at" )))
00534         return edk_FAILED;
00535     // エラーログファイルに書き出す
00536     fputs( s , fp ) ;
00537     fclose( fp ) ;
00538     return edk_SUCCEEDED;
00539 }

DKC_INLINE void* dkcAllocate size_t  size  ) 
 

dkcOSIndependent.c189 行で定義されています。

参照先 dkcAllocate_INL().

参照元 alloc_hash(), alloc_RegNFA(), alloc_sameobjectpool(), dkcAlloc2TreeRoot(), dkcAllocArcfour(), dkcAllocArcfour2Byte(), dkcAllocArrayOneByOne(), dkcAllocBitMemoryStream(), dkcAllocBlowfish(), dkcAllocBuffer(), dkcAllocCircularMemoryStream(), dkcAllocCRC(), dkcAllocDCF_Version01_SNOW2(), dkcAllocDeque(), dkcAllocFile64(), dkcAllocFindFile(), dkcAllocHC256(), dkcAllocHMAC(), dkcAllocLZSS(), dkcAllocLZW(), dkcAllocMD2(), dkcAllocMD4(), dkcAllocMD5(), dkcAllocMD5Adapter(), dkcAllocMemoryStream(), dkcAllocMemoryStreamAdapter(), dkcAllocPathString(), dkcAllocQueue(), dkcAllocRedBlackTreeRoot(), dkcAllocRegex(), dkcAllocReplace(), dkcAllocRijndael(), dkcAllocRijndaelDecrypt(), dkcAllocRijndaelEncrypt(), dkcAllocRLE(), dkcAllocSemiRealRandomFromGFS(), dkcAllocSemiRealRandomWin32(), dkcAllocSHA1(), dkcAllocSHA256(), dkcAllocSHA384(), dkcAllocSHA512(), dkcAllocSHO(), dkcAllocSingleList(), dkcAllocSingleListObject(), dkcAllocSNOW2(), dkcAllocStack(), dkcAllocStream(), dkcAllocString(), dkcAllocTaskEngine(), dkcAllocThread(), dkcAllocThreadLock(), dkcAllocUniqueID(), dkcBufferCopy(), dkcBufferInit(), dkcDistCountSortChar(), dkcDistCountSortInt(), dkcDistCountSortShort(), dkcLoadLibrary(), dkcNewSingleList(), と dkcOpenFileWithSignature().

00189                                          {
00190     return dkcAllocate_INL(size);
00191 }

DKC_INLINE void* dkcAllocateFast size_t  size  ) 
 

dkcOSIndependent.c186 行で定義されています。

参照先 dkcAllocateFast_INL().

参照元 alloc_2tree_node(), decode_hash(), decode_tst(), dkcSameObjectPoolReserveFast(), と malloc_adapter().

00186                                              {
00187     return dkcAllocateFast_INL(size);
00188 }

DKC_INLINE void* dkcAllocateFill size_t  size,
BYTE  fill
 

dkcOSIndependent.c183 行で定義されています。

参照先 dkcAllocateFill_INL().

00183                                                        {
00184     return dkcAllocateFill_INL(size,fill);
00185 }

void WINAPI dkcCheckMemoryLeak BOOL  flag  ) 
 

引数:
flag[in] TRUEでチェックを有効

dkcOSIndependent.c748 行で定義されています。

00748                                          {
00749 
00750 }

DKC_INLINE BOOL dkcCheckOverflowULONG ULONG  a1,
ULONG  a2
 

unsigned long型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。

dkcOSIndependent.c843 行で定義されています。

参照先 FALSE, と TRUE.

参照元 dkcRLEPackBitsDecode(), と dkcRLEPackBitsEncode().

00843                                                         {
00844     ULONG maxv = ULONG_MAX;
00845   ULONG halfv = maxv / 2 ;
00846   ULONG x = a1,y = a2;
00847   if(x < y){
00848     SWAP_NUM(x,y);
00849   }
00850   if(x > halfv + 1){
00851     if(y >= halfv){
00852       return TRUE;
00853     }
00854   }
00855   return FALSE;
00856 }

DKC_INLINE BOOL dkcCheckOverflowULONGLONG ULONGLONG  a1,
ULONGLONG  a2
 

dkcOSIndependent.c858 行で定義されています。

参照先 FALSE, TRUE, ULONGLONG, と ULONGLONG_MAX.

00859 {
00860     ULONGLONG maxv = ULONGLONG_MAX;
00861   ULONGLONG halfv = maxv / 2 ;
00862   ULONGLONG x = a1,y = a2;
00863   if(x < y){
00864     SWAP_NUM(x,y);
00865   }
00866   if(x > halfv + 1){
00867     if(y >= halfv){
00868       return TRUE;
00869     }
00870   }
00871   return FALSE;
00872 }

DKC_INLINE BOOL WINAPI dkcCreateEmptyFile const char *  filename  ) 
 

空ファイルを作る。

dkcOSIndependent.c491 行で定義されています。

参照先 FALSE, NULL, と TRUE.

参照元 dkcFileCopyEx().

00491                                                                {
00492     FILE *fp;
00493     fp = fopen( filename , "wb" ) ;//wb
00494     if(fp==NULL) return FALSE;
00495     fclose( fp ) ;
00496     return TRUE;
00497 }

int dkcDynamicCheckEnvironment BOOL  isForceExit  ) 
 

引数:
isForceExit[in] TRUEを指定するとdkutil_cの奨励環境と違った場合、強制終了する。
戻り値:
edk_Result

dkcOSIndependent.c49 行で定義されています。

00049                                                 {
00050 
00051 }

int WINAPI dkcErrorMessage const char *  expression,
const char *  filename,
size_t  line,
const char *  message,
  ...
 

戻り値:
almost TRUE(1)

dkcOSIndependent.c87 行で定義されています。

参照先 MB, NULL, ODS, と TRUE.

00089 {
00090     char s[1024];
00091     char ss[1024 * 2];
00092     
00093     int va_list_result;
00094     va_list Valist;
00095 
00096     NULL_CHAR_ARRAY(s);
00097     NULL_CHAR_ARRAY(ss);
00098     
00099     if(message){
00100         SET_VA_LIST_C(Valist,va_list_result,s,sizeof(s),message);
00101     }else{
00102         //SET_VA_LIST(s,sizeof(s),"No message");
00103         _snprintf(s,sizeof(s),"No message\n");
00104     }
00105 
00106     _snprintf(ss,sizeof(ss),
00107         "DKUTIL_ASSERT(%s):\nfile:%s / \n line:%d / \n message: %s",
00108         expression,filename,line,s);
00109 
00110 
00111 
00112 #ifdef NDEBUG//release
00113 #   ifdef WIN32
00114         ODS(ss);
00115     //::MessageBox(NULL,ss,"ERROR ASSERTION !!",MB_OK);
00116     {
00117         LPCTSTR name="ERROR_TEMP.txt";
00118         {
00119             //ファイルをオープン
00120             FILE *fp;
00121             if(NULL != (fp = fopen( name , "at" ))){
00122             
00123                 // エラーログファイルに書き出す
00124                 fputs( ss , fp ) ;
00125                 fclose( fp ) ;
00126                 Sleep(800);
00127             }
00128         }
00129         ShellExecute(NULL, "open",name, NULL, NULL, SW_SHOWNORMAL);
00130         //Sleep(1000);
00131         //DeleteFile(name);
00132     }
00133     MB("このテキストをこのソフトの開発者に渡せば、バグ発見の近道なります。\n \
00134         開発者に知らせるときはこのテキストを転記してあげましょう。");
00135     
00136     /*if(IDYES==MessageBox(NULL,
00137         "このままこのソフトを起動しつづけると、更なるエラーが発生する可能性があります。\n終了しますか?",
00138         "あってはいけない エラー!!!",
00139         MB_YESNO))
00140     {
00141         exit(edk_FAILED);
00142         //terminate();
00143     }else{
00144     }*/
00145     exit(edk_FAILED);
00146 #   else    //else of win32
00147     
00148     fprintf(stderr,ss);
00149     exit(edk_FAILED);
00150 
00151 #   endif //end of win32
00152 
00153 #else //debug
00154 
00155 #   ifdef WIN32
00156         ODS(ss);
00157     fprintf(stderr,ss);
00158     //_CrtDebugBreak();
00159     DebugBreak();
00160 #   else //else of win32
00161 
00162     fprintf(stderr,ss);
00163     Debugger();
00164 
00165 #   endif //end of win32
00166         
00167     return TRUE;
00168 #endif//end of NDEBUG
00169     //assert(ss);
00170 
00171 }

DKC_EXTERN int WINAPI dkcFClose FILE **  ptr  ) 
 

fcloseのラッパー

dkcOSIndependent.c379 行で定義されています。

参照先 NULL.

参照元 dkcFileCopyEx(), dkcFreeStream(), と GetHeader().

00379                                            {
00380     if(NULL==ptr || NULL==*ptr) return edk_ArgumentException;
00381     fclose(*ptr);
00382     *ptr = NULL;
00383     return edk_SUCCEEDED;
00384 }

DKC_EXTERN FILE* WINAPI dkcFOpen const char *  filename,
const char *  mode
 

fopenのラッパー

dkcOSIndependent.c375 行で定義されています。

参照元 dkcAllocStream(), dkcFileCopyEx(), と GetHeader().

00375                                                                         {
00376     return fopen(filename,mode);
00377 }

DKC_EXTERN size_t WINAPI dkcFReadAll void *  buffer,
size_t  size,
FILE *  fp
 

freadの全部責任持って読み込みますバージョン。(読み込めない場合はEOFかerror)

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

参照先 BYTE, と dkcmNOT_ASSERT.

参照元 dkcLoadFile(), と GetHeader().

00386 {
00387     size_t count;
00388     size_t tc,tsize;
00389     BYTE *tbuffer;
00390 
00391     //read size
00392     tsize = size;
00393     //temp variable
00394     tc = 0;
00395     //offset counter
00396     count = 0;
00397     //byte type pointer
00398     tbuffer = (BYTE *)buffer;
00399     for(;;)
00400     {
00401         //error check
00402         if(ferror(fp) ){
00403             break;
00404         }
00405         if(feof(fp)){
00406             break;
00407         }
00408         //read
00409         tc = fread(&tbuffer[count],1,tsize,fp);
00410         //update
00411         tsize -= tc;
00412         count += tc;
00413 
00414         if(count == size){
00415             break;
00416         }
00417 #   ifdef DEBUG
00418         //ありえないエラーチェック
00419         dkcmNOT_ASSERT(count > size);
00420 #   else
00421         if(count > size){
00422             break;
00423         }
00424 #   endif
00425     }
00426     return count;
00427 }

DKC_INLINE int dkcFree void **  p  ) 
 

dkcOSIndependent.c193 行で定義されています。

参照先 dkcFree_INL().

参照元 alloc_RegNFA(), decode_hash(), decode_tst(), dkcAlloc2TreeRoot(), dkcAllocArrayOneByOne(), dkcAllocBitMemoryStream(), dkcAllocBuffer(), dkcAllocCircularMemoryStream(), dkcAllocCRC(), dkcAllocDCF_Version01_SNOW2(), dkcAllocDeque(), dkcAllocLZW(), dkcAllocMD5Adapter(), dkcAllocMemoryStream(), dkcAllocPathString(), dkcAllocQueue(), dkcAllocRedBlackTreeRoot(), dkcAllocReplace(), dkcAllocRijndael(), dkcAllocSingleList(), dkcAllocSingleListObject(), dkcAllocStack(), dkcAllocStream(), dkcAllocString(), dkcAllocTaskEngine(), dkcAllocUniqueID(), dkcBufferCopy(), dkcBufferUninit(), dkcCloseFileWithSignature(), dkcDistCountSortChar(), dkcDistCountSortInt(), dkcDistCountSortShort(), dkcFreeArcfour(), dkcFreeArcfour2Byte(), dkcFreeArrayOneByOne(), dkcFreeBitMemoryStream(), dkcFreeBlowfish(), dkcFreeBuffer(), dkcFreeCircularMemoryStream(), dkcFreeCRC(), dkcFreeDCF01(), dkcFreeDeque(), dkcFreeFile64(), dkcFreeFindFile(), dkcFreeGenericFileSystem(), dkcFreeHC256(), dkcFreeHMAC(), dkcFreeLZSS(), dkcFreeLZW(), dkcFreeMD2(), dkcFreeMD4(), dkcFreeMD5(), dkcFreeMD5Adapter(), dkcFreeMemoryStream(), dkcFreeMemoryStreamAdapter(), dkcFreePathString(), dkcFreeQueue(), dkcFreeRedBlackTreeRoot(), dkcFreeRegex(), dkcFreeReplace(), dkcFreeRijndael(), dkcFreeRLE(), dkcFreeSemiRealRandom(), dkcFreeSHA1(), dkcFreeSHA256(), dkcFreeSHA384(), dkcFreeSHA512(), dkcFreeSHO(), dkcFreeSingleListObject(), dkcFreeSNOW2(), dkcFreeStack(), dkcFreeStream(), dkcFreeString(), dkcFreeTaskEngine(), dkcFreeThread(), dkcFreeThreadLock(), dkcFreeUniqueID(), dkcLoadLibrary(), dkcOpenFileWithSignature(), dkcSingleListErase(), dkcUnloadLibrary(), free_2tree_node(), free_2tree_root(), free_adapter(), free_hash(), free_RegNFA(), と free_sameobjectpool().

00193                                  {
00194     return dkcFree_INL(p);
00195 }

void WINAPIV dkcFreeAdapter void *  p  ) 
 

dkcOSIndependent.c177 行で定義されています。

参照元 dkcSameObjectPoolInit().

00177                                     {
00178     if(p){
00179         free(p);
00180     }
00181 }

DKC_INLINE size_t WINAPI dkcFSize FILE *  fp  ) 
 

dkcFileSize()を普段はお使いください。エラー時の時は動作は未定義です。

dkcOSIndependent.c474 行で定義されています。

00475 {
00476     long t;
00477     size_t len;
00478     //temporary
00479     t = ftell(fp);
00480     fseek(fp,0,SEEK_END);
00481     len = ftell(fp);
00482     fseek(fp,t,SEEK_SET);
00483     return len;
00484 }

DKC_EXTERN size_t WINAPI dkcFWriteAll const void *  ,
size_t  size,
FILE *  fp
 

参照:
dkcFReadAll() dkcFReadAllのfwrite版

dkcOSIndependent.c429 行で定義されています。

参照先 BYTE, と dkcmNOT_ASSERT.

参照元 dkcSaveFile().

00429                                                                               {
00430     size_t count;
00431     size_t tc,tsize;
00432     BYTE *tbuffer;
00433 
00434     //read size
00435     tsize = size;
00436     //temp variable
00437     tc = 0;
00438     //offset counter
00439     count = 0;
00440     //byte type pointer
00441     tbuffer = (BYTE *)buffer;
00442     for(;;)
00443     {
00444         //error check
00445         if(ferror(fp) ){
00446             break;
00447         }
00448         if(feof(fp)){
00449             break;
00450         }
00451         //read
00452         tc = fwrite(&tbuffer[count],1,tsize,fp);
00453         //update
00454         tsize -= tc;
00455         count += tc;
00456 
00457         if(count == size){
00458             break;
00459         }
00460 #   ifdef DEBUG
00461         //ありえないエラーチェック
00462         dkcmNOT_ASSERT(count > size);
00463 #   else
00464         if(count > size){
00465             break;
00466         }
00467 #   endif
00468     }
00469     return count;
00470 
00471 }

int WINAPI dkcGetByteOrder  ) 
 

戻り値:
enum edkcByteOrder

dkcOSIndependent.c826 行で定義されています。

参照先 dkc_byte_order_check_union::abcd, edkcByteOrder_ABCD, edkcByteOrder_BADC, edkcByteOrder_DCBA, edkcByteOrder_Unknown, と dkc_byte_order_check_union::x.

00827 {
00828     DKC_BYTE_ORDER_CHECK_UNION a;
00829     a.x = 0x04030201;
00830     switch(a.abcd[0]){
00831     case 0x01:
00832         return edkcByteOrder_DCBA;
00833     case 0x02:
00834         return edkcByteOrder_Unknown; 
00835     case 0x03:
00836         return edkcByteOrder_BADC;
00837     case 0x04:
00838         return edkcByteOrder_ABCD;
00839     }
00840     return edkcByteOrder_Unknown;
00841 }

int WINAPI dkcGetMemorySize uint64 *  pTotalMemory,
uint64 *  pFreeMemory
 

dkcOSIndependent.c323 行で定義されています。

参照先 NULL.

00324 {
00325 #ifdef WIN32
00326     MEMORYSTATUS ms;
00327     memset(&ms,0,sizeof(ms));
00328     ms.dwLength =  sizeof( ms );
00329     GlobalMemoryStatus( &ms );
00330 
00331     if ( pTotalMemory == NULL || pFreeMemory  == NULL)
00332         return edk_FAILED;
00333 
00334     *pTotalMemory = (uint64)ms.dwTotalPhys;
00335     *pFreeMemory  = (uint64)ms.dwAvailPhys;
00336     return edk_SUCCEEDED;
00337 #else
00338 
00339 
00340 #endif
00341 }

const char* WINAPI dkcGetPathSep  ) 
 

戻り値:
path separatorの入った文字列(1byte毎にpath separatorの文字定数が入っている)をゲット

dkcOSIndependent.c753 行で定義されています。

参照先 dkcdPATH_SEP.

参照元 dkcSJIS_SearchPathSep(), と dkcSJIS_SearchPathSepLast().

00753                                   {
00754 #ifdef WIN32
00755     static char target[3]={dkcdPATH_SEP,'/','\0'};
00756 #else
00757     static char target[3]={dkcdPATH_SEP,'\0'};
00758 #endif
00759     return target;
00760 }

DKC_INLINE int WINAPI dkcInitFileFast const char *  filename  ) 
 

エラーログ(ファイル)を高速に初期化する、

覚え書き:
完全に抹消するわけではない
引数:
filename[in] ファイルの名前

dkcOSIndependent.c512 行で定義されています。

参照先 NULL.

00513 {
00514     FILE *fp;
00515     // エラーログファイルを開く(初期化)
00516     if(NULL==(fp = fopen( filename , "wt" ))){
00517         return edk_FAILED;
00518     }
00519     fclose( fp ) ;
00520     
00521     return edk_SUCCEEDED;
00522 }

BOOL dkcIs_foepn_mode const char *  s  ) 
 

fopenの時の第二引数が有効な値かどうか調べる。

dkcOSIndependent.c196 行で定義されています。

参照先 FALSE, と TRUE.

00196                                     {
00197     /* wrtb+ */
00198     const char *ms= "wrtb+";
00199     size_t slen = strlen(s);
00200     size_t mslen = strlen(ms);
00201     size_t i,j;
00202     int flag = FALSE;
00203     for(i=0;i<slen;i++){
00204         for(j=0;j<mslen;j++){
00205             if(ms[j]==s[i]){
00206                 flag = TRUE;
00207                 break;
00208             }
00209         }
00210         if(TRUE!=flag){
00211             return FALSE;
00212         }else{
00213             flag = FALSE;
00214         }
00215     }
00216     return TRUE;
00217 }

DKC_INLINE BOOL dkcIsLittleEndian  ) 
 

戻り値:
little endian ならTRUE

dkcOSIndependent.c819 行で定義されています。

参照元 dkcOpenFileWithSignature(), GetHeader(), HeaderWrite(), と SetStreamInfo().

00819                                     {
00820     int x=1;
00821     return (BOOL)((*(char*)&x));
00822 }

BOOL WINAPI dkcIsMMX  ) 
 

戻り値:
MMXが使えるならTRUE

dkcOSIndependent.c796 行で定義されています。

参照先 FALSE.

参照元 CheckMMX().

00796                           {
00797   return FALSE;
00798 }

int WINAPI dkcIsNativePathString const char *  s,
size_t  size
 

戻り値:
FALSEならNativeなファイルパスではない。

dkcOSIndependent.c56 行で定義されています。

参照先 dkcmIS_INVALID_PATH_CHAR, FALSE, NULL, と TRUE.

参照元 dkcAllocPathString(), dkcIsEffectivePath(), dkcPathStringElementInsert_Logic(), と dkcPathStringElementReplace_Logic().

00056                                                            {
00057 
00058     size_t i=0;
00059     if(s==NULL) return edk_FAILED;
00060     for(;i<size;i++){
00061         if(dkcmIS_INVALID_PATH_CHAR(s[i]))
00062         {
00063             return FALSE;
00064         }
00065     }
00066     return TRUE;
00067 }

DKC_INLINE int WINAPI dkcLoadBinary void *  data,
size_t  size,
const char *  fname,
size_t *  readsize
 

バイナリデータをメモリに読み込む。dkcSaveBinary()と対

覚え書き:
類似: dkcFileToMemory()

dkcOSIndependent.c500 行で定義されています。

参照先 dkcLoadFile().

参照元 dkcFileCopyEx(), と dkcMemoryStreamLoadFromFile().

00500                                                                                               {//="rb"
00501     return dkcLoadFile(data,size,fname,"rb",readsize);
00502 }

static int WINAPI dkcLoadFile void *  data,
size_t  size,
const char *  fname,
const char *  mode,
size_t *  readsize
[static]
 

dkcOSIndependent.c344 行で定義されています。

参照先 dkcFReadAll(), と NULL.

参照元 dkcLoadBinary(), と dkcLoadText().

00344                                                                                                          {//="rb"
00345     FILE *fp ;
00346     if(NULL==readsize || NULL==data || NULL==fname || NULL==mode){
00347         return edk_FAILED;
00348     }
00349     fp = fopen( fname , mode ) ;//rb
00350     if(fp==NULL)return edk_FAILED;
00351     *readsize = dkcFReadAll(data,size,fp);
00352     //*readsize = fread( data , 1 , size , fp ) ;
00353     //fread( data , sizeof(size)  , 1 , fp ) ;
00354     fclose( fp ) ;
00355 
00356     return edk_SUCCEEDED;
00357 
00358 }

DKC_INLINE int WINAPI dkcLoadText char *  text,
size_t  length,
const char *  fname,
size_t *  readsize
 

テキストデータをメモリに読み込む。dkcSaveText()と対

dkcOSIndependent.c507 行で定義されています。

参照先 dkcLoadFile().

00507                                                                                               {
00508     return dkcLoadFile(text,length,fname,"rt",readsize);
00509 }

DKC_INLINE void WINAPI dkcLONGLONGToTwoLONG LONG *  high,
LONG *  low,
LONGLONG  src
 

dkcOSIndependent.c672 行で定義されています。

参照先 dkc_2int32_to_int64::QuadPart, と dkc_2int32_to_int64::u.

00672                                                                               {
00673     /*LONG *o = (LONG *)&src;
00674     dkcmNOT_ASSERT(sizeof(LONG) * 2 != sizeof(LONGLONG));
00675     *high = o[0];
00676     *low = o[1];*/
00677 #ifdef WIN32
00678     DKC_TWOINT32_TO_INT64 a;
00679     a.QuadPart = src;
00680     *low = a.u.LowPart;
00681     *high = a.u.HighPart;
00682 #else
00683 
00684 #endif
00685 }

void* WINAPIV dkcMallocAdapter size_t  s  ) 
 

dkcOSIndependent.c173 行で定義されています。

参照元 dkcSameObjectPoolAlloc(), と dkcSameObjectPoolInit().

00173                                         {
00174     return malloc(s);
00175 }

DKC_INLINE int WINAPI dkcOutputDebugString const char *  str,
  ...
 

dkcOSIndependent.c69 行で定義されています。

00069                                                                {
00070     char s[1024 * 2];
00071 
00072     
00073     int va_list_result;
00074     va_list Valist;
00075 
00076     
00077     
00078     SET_VA_LIST_C(Valist,va_list_result,s,sizeof(s),str);
00079     if(0 > va_list_result){
00080         return edk_FAILED;
00081     }
00082     OutputDebugString(s);
00083     return edk_SUCCEEDED;
00084     //fprintf(stderr,s);
00085 }

int WINAPI dkcReallocate void **  NewPtr,
size_t  NewSize,
void **  OldPtr
 

dkcOSIndependent.c251 行で定義されています。

参照先 dkcReallocateEx().

参照元 dkc2TreeSetBuffer(), dkcBufferResize_INL(), dkcMemoryStreamAutoExpandResize(), dkcMemoryStreamResize(), dkcQueueDynamicPush(), dkcSingleListSetBuffer(), と dkcStackDynamicPush().

00253 {
00254     return dkcReallocateEx(realloc,NewPtr,NewSize,OldPtr);
00255 }

int WINAPI dkcReallocateAutoExpand DKC_REALLOC_F_TYPE  your_realloc,
void **  NewPtr,
void **  OldPtr,
size_t  OldSize,
size_t *  reallocated_size
 

引数:
your_realloc[in] reallocする関数
NewPtr[out] 新しいメモリ空間アドレス
OldPtr[in][out] 古いメモリ空間アドレス。関数が成功すると、OldPtrは無効になる
OldSize[in] OldPtrのサイズ
reallocated_size[out] 確保したサイズ
覚え書き:
メモリサイズ拡張専用

dkcOSIndependent.c282 行で定義されています。

参照先 dkcReallocateSizeFunction(), と NULL.

00286 {
00287     void *ptr = NULL;
00288     size_t want_size = OldSize / 8;
00289     size_t ra_size = dkcReallocateSizeFunction(OldSize,
00290          (want_size <= 20) ? 20 : want_size
00291     );
00292     size_t div = 8;
00293     size_t tmp_ra = ra_size / div;
00294     size_t i;
00295     if(NULL== your_realloc /*|| NULL==*NewPtr*/ || NULL == *OldPtr ||
00296         0==OldSize  || NULL==reallocated_size   
00297     ){
00298         return edk_ArgumentException;//アホ引数入れるな!!
00299     }
00300 
00301     for(i=0;i<div;i++){
00302         ptr = your_realloc(*OldPtr,ra_size);
00303         if(NULL==ptr){
00304             if(OldSize > (ra_size -= tmp_ra)){//とりあえずtmp_ra分を引く。
00305                 break;//こら望みなしだわ
00306             }
00307             continue;
00308         }else{
00309             break;
00310         }
00311     }
00312     if(NULL==ptr) return edk_FAILED;
00313 
00314     //更新
00315     *NewPtr = ptr;  
00316     *OldPtr = NULL;
00317 
00318     *reallocated_size = ra_size;
00319 
00320     return edk_SUCCEEDED;
00321 }

int WINAPI dkcReallocateEx DKC_REALLOC_F_TYPE  your_realloc,
void **  NewPtr,
size_t  NewSize,
void **  OldPtr
 

引数:
your_realloc[in] reallocする関数
NewPtr[out] 新しいメモリ空間アドレス
NewSize[in] 新しいメモリ空間アドレスのサイズ。
OldPtr[in][out] 古いメモリ空間アドレス。関数が成功すると、OldPtrは無効になる
OldSize[in] OldPtrのサイズ
戻り値:
edk_SUCCEEDEDだったら成功

dkcOSIndependent.c257 行で定義されています。

参照先 NULL.

参照元 dkcReallocate().

00261 {
00262     void *ptr = NULL;
00263 
00264     if(NULL== your_realloc  /*|| NULL == *OldPtr ||
00265         0==OldSize*/
00266     ){
00267         return edk_ArgumentException;//アホ引数入れるな!!
00268     }
00269 
00270     ptr = your_realloc(*OldPtr,NewSize);
00271     if(NULL==ptr) return edk_FAILED;
00272 
00273     //更新
00274     *OldPtr = NULL;
00275     *NewPtr = ptr;
00276     
00277     return edk_SUCCEEDED;
00278 }

size_t dkcReallocateSizeFunction size_t  OldSize,
size_t  ExpandSize
 

dkcOSIndependent.c233 行で定義されています。

参照元 dkcMemoryStreamAutoExpandResize(), dkcQueueDynamicPush(), dkcReallocateAutoExpand(), と dkcStackDynamicPush().

00233                                                                   {
00234     //y=-25.43035 * pow(x,2) + 116.7214
00235     //y = -0.00000018 * pow(x,2) + 0.00019
00236     //y = -99.9999 * pow(OldSize,2) + 104857600;
00237     //y = 0.105263 * x * x + 10.52631
00238     //double x;
00239 //  size_t size;
00240     if(OldSize <= 1024 * 5){//5KB以内なら2倍
00241         return OldSize * 2;
00242     }else if(OldSize >= 1024 * 1024 * 10 || 0==OldSize)
00243     {//10MB以上なら + ExpandSize
00244         return OldSize + ExpandSize;
00245     }
00246     //それ以外ならExpandSize * 3
00247     return OldSize + ExpandSize * 3; 
00248     //return OldSize * 2;//ひでぇ関数だ。
00249 }

DKC_INLINE USHORT dkcReverseEndian16 USHORT  x  ) 
 

endian change 16 bit version

dkcOSIndependent.c802 行で定義されています。

参照元 dkcStreamProcess16().

00802                                               {
00803     return (USHORT)((x >> 8) | (x << 8));
00804 }

DKC_INLINE DWORD dkcReverseEndian32 DWORD  x  ) 
 

dkcOSIndependent.c806 行で定義されています。

参照元 dkcReverseEndian64(), dkcSNOW2GetInitializeVector(), dkcStreamProcess32(), GetHeader(), HeaderWrite(), ReverseEndian(), と ReverseEndianDWORD().

00806                                             {
00807     return (x << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | (x >> 24);
00808 }

DKC_INLINE ULONGLONG dkcReverseEndian64 ULONGLONG  x  ) 
 

覚え書き:
General Function Library Copyright (C) 2000,2001 SYN All Rights Reserved.より

dkcOSIndependent.c810 行で定義されています。

参照先 dkcReverseEndian32(), DWORD, と ULONGLONG.

参照元 dkcStreamProcess64(), GetHeader(), HeaderWrite(), と ReverseEndianQWORD().

00810                                                      {
00811 
00812     return (
00813         (ULONGLONG)dkcReverseEndian32((DWORD)(x & 0x00000000ffffffff)) << 32)
00814         | 
00815         dkcReverseEndian32((DWORD)(x >> 32)
00816     );
00817 
00818 }

int WINAPI dkcRotateShiftRightMemory void *  d,
size_t  size,
size_t  num
 

dkcOSIndependent.c1101 行で定義されています。

参照先 dkcRotateShiftRightMemoryLogic(), と NULL.

01101                                                                     {
01102     //size_t i = 0;
01103     void *pd = NULL;
01104     int r = edk_FAILED;
01105 
01106     pd = malloc(num);
01107     if(NULL==pd){
01108         return edk_OutOfMemory;
01109     }
01110     if(DKUTIL_SUCCEEDED(dkcRotateShiftRightMemoryLogic(d,size,num,pd,num))){
01111         r = edk_SUCCEEDED;
01112     }
01113 
01114     free(pd);
01115     
01116     return r;
01117 
01118 }

DKC_INLINE int dkcRotateShiftRightMemoryLogic void *  d,
size_t  size,
size_t  n,
void *  workbuff,
size_t  worksize
 

dkcOSIndependent.c1079 行で定義されています。

参照先 BYTE.

参照元 dkcRotateShiftRightMemory().

01080 {
01081     BYTE *dest = (BYTE *)d;
01082     size_t temp;
01083 
01084     if(n > worksize){
01085         return edk_FAILED;
01086     }
01087     for(;;){
01088         if(n < size){
01089             break;
01090         }
01091         n -= size;
01092     }
01093     temp = size - n;
01094     memcpy(workbuff,dest + temp,n);
01095     memmove(dest + n,dest,temp);
01096     memcpy(dest,workbuff,n);
01097     return edk_SUCCEEDED;
01098 
01099 }

int WINAPI dkcSaveBinary const void *  data,
size_t  size,
const char *  fname
 

fopenのファイル関数を使ってバイナリセーブを行う。

覚え書き:
類似: dkcMemoryToFile()

dkcOSIndependent.c487 行で定義されています。

参照先 dkcSaveFile().

参照元 dkcFileCopyEx(), と dkcMemoryStreamDump().

00487                                                                         {//="wb"
00488     return dkcSaveFile(data,size,fname,"wb");
00489 }

static int WINAPI dkcSaveFile const void *  data,
size_t  size,
const char *  fname,
const char *  mode
[static]
 

dkcOSIndependent.c359 行で定義されています。

参照先 dkcFWriteAll(), と NULL.

参照元 dkcSaveBinary(), と dkcSaveText().

00360 {
00361     FILE *fp;
00362     if(NULL==fname || NULL==mode){
00363         return edk_FAILED;
00364     }
00365     fp = fopen( fname , mode ) ;//wb
00366     if(fp==NULL) return edk_FAILED;
00367     dkcFWriteAll(data,size,fp);
00368     //fwrite( data , size  , 1 , fp ) ;
00369     //fwrite( data , sizeof(size)  , 1 , fp ) ;
00370     fclose( fp ) ;
00371     return edk_SUCCEEDED;
00372 }

DKC_INLINE int WINAPI dkcSaveText const char *  text,
size_t  length,
const char *  fname
 

fopenでテキストセーブを行う

dkcOSIndependent.c504 行で定義されています。

参照先 dkcSaveFile().

00504                                                                                    {
00505     return dkcSaveFile(text,length,fname,"wt");
00506 }

int WINAPI dkcSelect void *  dest,
const void *  a_src,
size_t  n,
int  k,
size_t  width,
DKC_COMPARE_TYPE  less
 

いわいるセレクト(選択)アルゴリズム

n:配列の再台数 k:調べたい番号(小さいうちから)

戻り値:
offset number ,Error : UINT_MAX

dkcOSIndependent.c886 行で定義されています。

参照先 dkcSwapFast(), get_offset, と NULL.

参照元 dkcSelectMax(), と dkcSelectMin().

00887 {
00888 
00889     int i,j,left, right;
00890 
00891     void *x = malloc(width);
00892     void *a = malloc(n * width);
00893     if(NULL==x || NULL==a){
00894         return edk_ArgumentException;
00895     }
00896     if(n > INT_MAX){
00897         return edk_FAILED;
00898     }
00899     
00900 
00901     memcpy(a,a_src,width * n);
00902 
00903 
00904     left = 0;  right = n - 1;
00905 
00906     while (left < right) 
00907     {
00908 
00909         memcpy(x,   (const void *)get_offset(a,k * width),width);
00910         i = left;
00911         j = right;
00912 
00913         for ( ; ; ) {
00914 
00915             while( less(get_offset(a,i * width),x) > 0){
00916             //while( *(int *)get_offset(a,i * width) < *(int *)x){
00917                 i++;
00918             }
00919 
00920             while( less(x,get_offset(a,j * width)) > 0){
00921             //while( *(int *)x < *(int *)get_offset(a,j * width) ){
00922                 j--;
00923             }
00924 
00925             if (i > j){
00926                 break;
00927             }
00928             
00929 
00930             dkcSwapFast(
00931                 get_offset(a,i * width),
00932                 get_offset(a,j * width),
00933                 width
00934                 );
00935             
00936             i++;
00937             j--;
00938         }
00939         if (j < k){
00940             left  = i;
00941         }
00942         if (k < i){
00943             right = j;
00944         }
00945     }
00946 
00947     //ゲットする
00948     {
00949         //printf("%d",*(int *)get_offset(a,k * width));
00950 
00951         memcpy(dest,(const void *)get_offset(a,k * width),width);
00952 
00953     }
00954     free(x);
00955     free(a);
00956 
00957     return edk_SUCCEEDED;
00958 
00959 }

DKC_INLINE int WINAPI dkcSelectMax void *  dest,
const void *  a,
size_t  n,
size_t  width,
DKC_COMPARE_TYPE  comp
 

最大値を選択する

参照:
dkcSelect() の 引数kが無いだけ

dkcOSIndependent.c962 行で定義されています。

参照先 dkcSelect().

00962                                                                                                            {
00963     if(n-1 > INT_MAX){
00964         return edk_FAILED;
00965     }
00966     return dkcSelect(a,a_src,n,(int)n-1,width,less);
00967 }

DKC_INLINE int WINAPI dkcSelectMin void *  dest,
const void *  a,
size_t  n,
size_t  width,
DKC_COMPARE_TYPE  comp
 

最小値を選択する

参照:
dkcSelect() の 引数kが無いだけ

dkcOSIndependent.c968 行で定義されています。

参照先 dkcSelect().

00968                                                                                                            {
00969     return dkcSelect(a,a_src,n,(int)0,width,less);
00970 }

void WINAPI dkcSwap void *  p1,
void *  p2,
size_t  size
 

演算でSwapさせる。SWAP_NUM()マクロを参照。

dkcOSIndependent.c649 行で定義されています。

参照先 dkcSwap64(), と ULONGLONG.

参照元 dkcBubbleSort(), dkcCombSort(), と dkcShellSort().

00650 {
00651     dkcSwap64((ULONGLONG *)p1,(ULONGLONG *)p2,size);
00652 }

void WINAPI dkcSwap64 ULONGLONG *  p1,
ULONGLONG *  p2,
size_t  size
 

引数:
p1[in] ULONGLONG *のバッファへのポインタ
p2[in] ULONGLONG *のバッファへのポインタ
size[in] p1,p2バッファのサイズ
覚え書き:
p1,p2共にULONGLONG *に強制型キャストしてください。

dkcOSIndependent.c613 行で定義されています。

参照先 BYTE, と ULONGLONG.

参照元 dkcSwap().

00613                                                               {
00614     size_t i;
00615     BYTE buf;
00616     size_t mod_ = size % sizeof(ULONGLONG);
00617     size_t cnt = size / sizeof(ULONGLONG);
00618     //char *tp1 = (char *)p1,*tp2 = (char *)p2;
00619     for(i=0;i<cnt;i++){
00620         SWAP_TEMP(register ULONGLONG,p1[i],p2[i]);
00621         //SWAP_NUM(p1[i],p2[i]);
00622     }
00623     for(i=0;i<mod_;i++){
00624         
00625         //SWAP_NUM((char)tp1[size - mod_ + 1],(char)tp2[size - mod_ + i]);
00626         /*a = b - a ;\
00627     b -= a ;\
00628     a += b
00629         */
00630         /*( ( ((char *) p2)[size - mod_ + i]))
00631             = (char)( ( ((char *) p2)[size - mod_ + i])) - 
00632             (char)( ( ((char *) p1)[size - mod_ + i]));
00633         
00634         ( ( ((char *) p2)[size - mod_ + i])) -= ( ( ((char *) p1)[size - mod_ + i]));
00635 
00636         ( ( ((char *) p1)[size - mod_ + i])) += ( ( ((char *) p2)[size - mod_ + i]));
00637             */
00638         
00639         
00640         buf = (((BYTE *)p1)[size - mod_ + i]);
00641         (((BYTE *)p1)[size - mod_ + i]) = 
00642             (((BYTE *)p2)[size - mod_ + i]) ;
00643         (((BYTE *)p2)[size - mod_ + i]) = buf;
00644         
00645     }
00646 
00647 }

BOOL WINAPI dkcSwapFast void *  p1,
void *  p2,
size_t  size
 

どんな方法でもいいからともかく速くSwapさせる。

覚え書き:
size分のメモリを動的確保してスワップします。

dkcOSIndependent.c542 行で定義されています。

参照先 FALSE, NULL, と TRUE.

参照元 dkcSelect().

00543 {
00544     void *p;
00545 #if 0//stack overflow 例外が発生するのも嫌だから挙動は共通で。
00546     int state = 0;
00547     p = _alloca( size );
00548     if(NULL==p){
00549         state = 1;
00550         p = malloc(size);
00551         if(NULL==p)
00552             return FALSE;
00553     }
00554 #else
00555     p = malloc(size);
00556     if(NULL==p)
00557         return FALSE;
00558 #endif
00559     memcpy(p,p1,size);
00560     memcpy(p1,p2,size);
00561     memcpy(p2,p,size);
00562 #if 0
00563     if(1==state){
00564         free(p);
00565     }
00566 
00567 #else
00568     free(p);
00569 #endif
00570     return TRUE;
00571 }

DKC_INLINE void WINAPI dkcTwoDWORDToULONGLONG ULONGLONG *  dest,
DWORD  high,
DWORD  low
 

dkcOSIndependent.c656 行で定義されています。

参照先 ULONGLONG.

参照元 dkcFileSize64V().

00656                                                                                    {
00657     //*dest = (ULONGLONG)((high << 32) + low);
00658     *dest = (ULONGLONG)high << 32;
00659     *dest += low;
00660         //( high * MAXDWORD ) + low;
00661 }

DKC_INLINE void WINAPI dkcTwoLONGToLONGLONG LONGLONG *  dest,
LONG  high,
LONG  low
 

dkcOSIndependent.c687 行で定義されています。

参照先 dkc_2int32_to_int64::QuadPart, と dkc_2int32_to_int64::u.

00687                                                                               {
00688     /*//*dest = (ULONGLONG)((high << 32) + low);
00689     *dest = (LONGLONG)high << 32;
00690     //*dest += low;
00691     (*dest) &= low;
00692     */
00693 #ifdef WIN32
00694     DKC_TWOINT32_TO_INT64 a;
00695 
00696     a.u.HighPart = high;
00697     a.u.LowPart = low;
00698     *dest = a.QuadPart;
00699 
00700 #else
00701 
00702 #endif
00703 }

DKC_INLINE void WINAPI dkcULONGLONGToTwoDWORD DWORD *  dhigh,
DWORD *  dlow,
ULONGLONG  src
 

TODO:
エンディアン問題をどうにかしよう!(あれ?

dkcOSIndependent.c663 行で定義されています。

参照先 dkcmNOT_ASSERT, DWORD, と ULONGLONG.

00663                                                                                      {
00664     DWORD *o = (DWORD *)&src;
00665     dkcmNOT_ASSERT(sizeof(DWORD) * 2 != sizeof(ULONGLONG));
00666 
00667 
00668     //*dhigh = o[0];*dlow = o[1];
00669     *dhigh = o[1];*dlow = o[0];
00670 }

static void* get_offset void *  p,
size_t  offset
[static]
 

dkcOSIndependent.c875 行で定義されています。

参照先 BYTE.

00875                                               {
00876     BYTE *oo = (BYTE *)p;
00877     
00878     return (void *)&(oo[offset]);
00879 }


dkutil_cに対してMon Jan 16 00:42:42 2006に生成されました。  doxygen 1.4.4