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

# 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)
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 ()
DKC_INLINE BOOL | dkcCheckOverflowULONG (ULONG a1, ULONG a2)
| unsigned long型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。
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.c の 7 行で定義されています。

## 関数

DKC_INLINE int WINAPI dkcAddLogFile | ( | const char * | filename,
|  | const char * | str,
|  |  | ...
| ) |

  | ログを吐く 引数:
  | filename[in] | ファイルネーム
  | str[in] | 吐く文字列
覚え書き: 出力速度が遅いので多用は奨励しない dkcOSIndependent.c の 512 行で定義されています。 参照先 NULL.
    00512                                                                                   {
    00513     FILE *fp=NULL;
    00514     char s[2048]="";
    00515     va_list VaList;
    00516     int r;
    00517     //SET_VA_LIST_INSERT_YEN_N(s,2048,str);
    00518     SET_VA_LIST_C(VaList,r,s,sizeof(s),str);
    00519
    00520     //ファイルをオープン
    00521     if(NULL == (fp = fopen( filename , "at" )))
    00522         return edk_FAILED;
    00523     // エラーログファイルに書き出す
    00524     fputs( s , fp ) ;
    00525     fclose( fp ) ;
    00526     return edk_SUCCEEDED;
    00527 }

DKC_INLINE void* dkcAllocate | ( | size_t | size | ) |

| dkcOSIndependent.c の 189 行で定義されています。 参照先 dkcAllocateFill(). 参照元 alloc_hash(), alloc_RegNFA(), alloc_sameobjectpool(), dkcAlloc2TreeRoot(), dkcAllocArcfour(), dkcAllocArcfour2Byte(), dkcAllocArrayOneByOne(), dkcAllocBitMemoryStream(), dkcAllocBlowfish(), dkcAllocBuffer(), dkcAllocCircularMemoryStream(), dkcAllocCRC(), dkcAllocDeque(), dkcAllocFindFile(), dkcAllocHC256(), dkcAllocHMAC(), dkcAllocLZSS(), dkcAllocLZW(), dkcAllocMD5(), dkcAllocMemoryStream(), dkcAllocMemoryStreamAdapter(), dkcAllocPathString(), dkcAllocQueue(), dkcAllocRegex(), dkcAllocReplace(), dkcAllocRijndael(), dkcAllocRijndaelDecrypt(), dkcAllocRijndaelEncrypt(), dkcAllocRLE(), dkcAllocSemiRealRandomFromGFS(), dkcAllocSemiRealRandomWin32(), dkcAllocSHA1(), dkcAllocSHA256(), dkcAllocSHA384(), dkcAllocSHA512(), dkcAllocSHO(), dkcAllocSingleList(), dkcAllocSingleListObject(), dkcAllocSNOW2(), dkcAllocStack(), dkcAllocStream(), dkcAllocString(), dkcAllocTaskEngine(), dkcAllocThreadLock(), dkcAllocUniqueID(), dkcDistCountSortChar(), dkcDistCountSortInt(), dkcDistCountSortShort(), dkcLoadLibrary(), dkcNewSingleList(), と dkcOpenFileWithSignature().
    00189                                          {
    00190     return dkcAllocateFill(size,0);
    00191 /*void *ptr;
    00192     ptr = dkcAllocateFast(size);
    00193     if(NULL==ptr) return NULL;
    00194     memset(ptr,0,size);
    00195     return ptr;
    00196     */
    00197 }

DKC_INLINE void* dkcAllocateFast | ( | size_t | size | ) |

| dkcOSIndependent.c の 186 行で定義されています。 参照元 alloc_2tree_node(), decode_hash(), decode_tst(), dkcAllocateFill(), dkcSameObjectPoolReserveFast(), と malloc_adapter().
    00186                                              {
    00187     return malloc(size);
    00188 }

DKC_INLINE void* dkcAllocateFill | ( | size_t | size,
|  | BYTE | fill
| ) |

| dkcOSIndependent.c の 180 行で定義されています。 参照先 dkcAllocateFast(), と NULL. 参照元 dkcAllocate().
    00180                                                        {
    00181     void *p = dkcAllocateFast(size);
    00182     if(NULL==p) return NULL;
    00183     memset(p,fill,size);
    00184     return p;
    00185 }

void WINAPI dkcCheckMemoryLeak | ( | BOOL | flag | ) |

  | 引数:
  | flag[in] | TRUEでチェックを有効
dkcOSIndependent.c の 715 行で定義されています。
    00715                                          {
    00716
    00717 }

DKC_INLINE BOOL dkcCheckOverflowULONG | ( | ULONG | a1,
|  | ULONG | a2
| ) |

| unsigned long型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。 dkcOSIndependent.c の 792 行で定義されています。 参照先 FALSE, と TRUE. 参照元 dkcRLEPackBitsDecode(), と dkcRLEPackBitsEncode().
    00792                                                         {
    00793     ULONG maxv = ULONG_MAX;
    00794   ULONG halfv = maxv / 2 ;
    00795   ULONG x = a1,y = a2;
    00796   if(x < y){
    00797     SWAP_NUM(x,y);
    00798   }
    00799   if(x > halfv + 1){
    00800     if(y >= halfv){
    00801       return TRUE;
    00802     }
    00803   }
    00804   return FALSE;
    00805 }

DKC_INLINE BOOL WINAPI dkcCreateEmptyFile | ( | const char * | filename | ) |

| 空ファイルを作る。 dkcOSIndependent.c の 479 行で定義されています。 参照先 FALSE, NULL, と TRUE. 参照元 dkcFileCopyEx().
    00479                                                                {
    00480     FILE *fp;
    00481     fp = fopen( filename , "wb" ) ;//wb
    00482     if(fp==NULL) return FALSE;
    00483     fclose( fp ) ;
    00484     return TRUE;
    00485 }

int dkcDynamicCheckEnvironment | ( | BOOL | isForceExit | ) |

  | 引数:
  | isForceExit[in] | TRUEを指定するとdkutil_cの奨励環境と違った場合、強制終了する。
戻り値: edk_Result dkcOSIndependent.c の 49 行で定義されています。
    00049                                                 {
    00050
    00051 }

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

| 戻り値: almost TRUE(1) dkcOSIndependent.c の 87 行で定義されています。 参照先 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     if(IDYES==MessageBox(NULL,
    00136         "このままこのソフトを起動しつづけると、更なるエラーが発生する可能性があります。\n終了しますか？",
    00137         "あってはいけない エラー!!!",
    00138         MB_YESNO))
    00139     {
    00140         exit(edk_FAILED);
    00141         //terminate();
    00142     }else{
    00143     }
    00144 #   else    //else of win32
    00145
    00146     fprintf(stderr,ss);
    00147     exit(edk_FAILED);
    00148
    00149 #   endif //end of win32
    00150
    00151 #else //debug
    00152
    00153 #   ifdef WIN32
    00154         ODS(ss);
    00155     fprintf(stderr,ss);
    00156     //_CrtDebugBreak();
    00157     DebugBreak();
    00158 #   else //else of win32
    00159
    00160     fprintf(stderr,ss);
    00161     Debugger();
    00162
    00163 #   endif //end of win32
    00164 #endif//end of NDEBUG
    00165     //assert(ss);
    00166
    00167     return TRUE;
    00168 }

DKC_EXTERN int WINAPI dkcFClose | ( | FILE ** | ptr | ) |

| fcloseのラッパー dkcOSIndependent.c の 367 行で定義されています。 参照先 NULL. 参照元 dkcFileCopyEx(), dkcFreeStream(), と GetHeader().
    00367                                            {
    00368     if(NULL==ptr || NULL==*ptr) return edk_ArgumentException;
    00369     fclose(*ptr);
    00370     *ptr = NULL;
    00371     return edk_SUCCEEDED;
    00372 }

DKC_EXTERN FILE* WINAPI dkcFOpen | ( | const char * | filename,
|  | const char * | mode
| ) |

| fopenのラッパー dkcOSIndependent.c の 363 行で定義されています。 参照元 dkcAllocStream(), dkcFileCopyEx(), と GetHeader().
    00363                                                                         {
    00364     return fopen(filename,mode);
    00365 }

DKC_EXTERN size_t WINAPI dkcFReadAll | ( | void * | buffer,
|  | size_t | size,
|  | FILE * | fp
| ) |

| freadの全部責任持って読み込みますバージョン。(読み込めない場合はEOFかerror) dkcOSIndependent.c の 373 行で定義されています。 参照先 BYTE, と dkcmNOT_ASSERT. 参照元 dkcLoadFile(), と GetHeader().
    00374 {
    00375     size_t count;
    00376     size_t tc,tsize;
    00377     BYTE *tbuffer;
    00378
    00379     //read size
    00380     tsize = size;
    00381     //temp variable
    00382     tc = 0;
    00383     //offset counter
    00384     count = 0;
    00385     //byte type pointer
    00386     tbuffer = (BYTE *)buffer;
    00387     for(;;)
    00388     {
    00389         //error check
    00390         if(ferror(fp) ){
    00391             break;
    00392         }
    00393         if(feof(fp)){
    00394             break;
    00395         }
    00396         //read
    00397         tc = fread(&tbuffer[count],1,tsize,fp);
    00398         //update
    00399         tsize -= tc;
    00400         count += tc;
    00401
    00402         if(count == size){
    00403             break;
    00404         }
    00405 #   ifdef DEBUG
    00406         //ありえないエラーチェック
    00407         dkcmNOT_ASSERT(count > size);
    00408 #   else
    00409         if(count > size){
    00410             break;
    00411         }
    00412 #   endif
    00413     }
    00414     return count;
    00415 }

DKC_INLINE int dkcFree | ( | void ** | p | ) |

| dkcOSIndependent.c の 199 行で定義されています。 参照先 NULL. 参照元 alloc_RegNFA(), decode_hash(), decode_tst(), dkcAlloc2TreeRoot(), dkcAllocArrayOneByOne(), dkcAllocBitMemoryStream(), dkcAllocBuffer(), dkcAllocCircularMemoryStream(), dkcAllocCRC(), dkcAllocDeque(), dkcAllocLZW(), dkcAllocMemoryStream(), dkcAllocPathString(), dkcAllocQueue(), dkcAllocReplace(), dkcAllocRijndael(), dkcAllocSingleList(), dkcAllocSingleListObject(), dkcAllocStack(), dkcAllocStream(), dkcAllocString(), dkcAllocTaskEngine(), dkcAllocUniqueID(), dkcCloseFileWithSignature(), dkcDistCountSortChar(), dkcDistCountSortInt(), dkcDistCountSortShort(), dkcFreeArcfour(), dkcFreeArcfour2Byte(), dkcFreeArrayOneByOne(), dkcFreeBitMemoryStream(), dkcFreeBlowfish(), dkcFreeBuffer(), dkcFreeCircularMemoryStream(), dkcFreeCRC(), dkcFreeDeque(), dkcFreeFindFile(), dkcFreeGenericFileSystem(), dkcFreeHC256(), dkcFreeHMAC(), dkcFreeLZSS(), dkcFreeLZW(), dkcFreeMD5(), dkcFreeMemoryStream(), dkcFreeMemoryStreamAdapter(), dkcFreePathString(), dkcFreeQueue(), dkcFreeRegex(), dkcFreeReplace(), dkcFreeRijndael(), dkcFreeRLE(), dkcFreeSemiRealRandom(), dkcFreeSHA1(), dkcFreeSHA256(), dkcFreeSHA384(), dkcFreeSHA512(), dkcFreeSHO(), dkcFreeSingleListObject(), dkcFreeSNOW2(), dkcFreeStack(), dkcFreeStream(), dkcFreeString(), dkcFreeTaskEngine(), dkcFreeThreadLock(), dkcFreeUniqueID(), dkcLoadLibrary(), dkcOpenFileWithSignature(), dkcSingleListErase(), dkcUnloadLibrary(), free_2tree_node(), free_2tree_root(), free_adapter(), free_hash(), free_RegNFA(), と free_sameobjectpool().
    00199                                  {
    00200     if(!*p) return edk_FAILED;
    00201     free(*p);
    00202     *p = NULL;
    00203     return edk_SUCCEEDED;
    00204 }

void WINAPIV dkcFreeAdapter | ( | void * | p | ) |

| dkcOSIndependent.c の 174 行で定義されています。 参照元 dkcSameObjectPoolInit().
    00174                                     {
    00175     if(p){
    00176         free(p);
    00177     }
    00178 }

DKC_INLINE size_t WINAPI dkcFSize | ( | FILE * | fp | ) |

| dkcFileSize()を普段はお使いください。エラー時の時は動作は未定義です。 dkcOSIndependent.c の 462 行で定義されています。
    00463 {
    00464     long t;
    00465     size_t len;
    00466     //temporary
    00467     t = ftell(fp);
    00468     fseek(fp,0,SEEK_END);
    00469     len = ftell(fp);
    00470     fseek(fp,t,SEEK_SET);
    00471     return len;
    00472 }

DKC_EXTERN size_t WINAPI dkcFWriteAll | ( | const void * | ,
|  | size_t | size,
|  | FILE * | fp
| ) |

| 参照: dkcFReadAll() dkcFReadAllのfwrite版 dkcOSIndependent.c の 417 行で定義されています。 参照先 BYTE, と dkcmNOT_ASSERT. 参照元 dkcSaveFile().
    00417                                                                               {
    00418     size_t count;
    00419     size_t tc,tsize;
    00420     BYTE *tbuffer;
    00421
    00422     //read size
    00423     tsize = size;
    00424     //temp variable
    00425     tc = 0;
    00426     //offset counter
    00427     count = 0;
    00428     //byte type pointer
    00429     tbuffer = (BYTE *)buffer;
    00430     for(;;)
    00431     {
    00432         //error check
    00433         if(ferror(fp) ){
    00434             break;
    00435         }
    00436         if(feof(fp)){
    00437             break;
    00438         }
    00439         //read
    00440         tc = fwrite(&tbuffer[count],1,tsize,fp);
    00441         //update
    00442         tsize -= tc;
    00443         count += tc;
    00444
    00445         if(count == size){
    00446             break;
    00447         }
    00448 #   ifdef DEBUG
    00449         //ありえないエラーチェック
    00450         dkcmNOT_ASSERT(count > size);
    00451 #   else
    00452         if(count > size){
    00453             break;
    00454         }
    00455 #   endif
    00456     }
    00457     return count;
    00458
    00459 }

const char* WINAPI dkcGetPathSep | ( |  | ) |

| 戻り値: path separatorの入った文字列(1byte毎にpath separatorの文字定数が入っている)をゲット dkcOSIndependent.c の 720 行で定義されています。 参照先 dkcdPATH_SEP. 参照元 dkcSJIS_SearchPathSep(), と dkcSJIS_SearchPathSepLast().
    00720                                   {
    00721 #ifdef WIN32
    00722     static char target[3]={dkcdPATH_SEP,'/','\0'};
    00723 #else
    00724     static char target[3]={dkcdPATH_SEP,'\0'};
    00725 #endif
    00726     return target;
    00727 }

DKC_INLINE int WINAPI dkcInitFileFast | ( | const char * | filename | ) |

  | エラーログ(ファイル)を高速に初期化する、 覚え書き: 完全に抹消するわけではない 引数:
  | filename[in] | ファイルの名前
dkcOSIndependent.c の 500 行で定義されています。 参照先 NULL.
    00501 {
    00502     FILE *fp;
    00503     // エラーログファイルを開く(初期化)
    00504     if(NULL==(fp = fopen( filename , "wt" ))){
    00505         return edk_FAILED;
    00506     }
    00507     fclose( fp ) ;
    00508
    00509     return edk_SUCCEEDED;
    00510 }

BOOL dkcIs_foepn_mode | ( | const char * | s | ) |

| fopenの時の第二引数が有効な値かどうか調べる。 dkcOSIndependent.c の 205 行で定義されています。 参照先 FALSE, と TRUE.
    00205                                     {
    00206     /* wrtb+ */
    00207     const char *ms= "wrtb+";
    00208     size_t slen = strlen(s);
    00209     size_t mslen = strlen(ms);
    00210     size_t i,j;
    00211     int flag = FALSE;
    00212     for(i=0;i<slen;i++){
    00213         for(j=0;j<mslen;j++){
    00214             if(ms[j]==s[i]){
    00215                 flag = TRUE;
    00216                 break;
    00217             }
    00218         }
    00219         if(TRUE!=flag){
    00220             return FALSE;
    00221         }else{
    00222             flag = FALSE;
    00223         }
    00224     }
    00225     return TRUE;
    00226 }

DKC_INLINE BOOL dkcIsLittleEndian | ( |  | ) |

| 戻り値: little endian ならTRUE dkcOSIndependent.c の 786 行で定義されています。 参照元 dkcOpenFileWithSignature(), GetHeader(), HeaderWrite(), と SetStreamInfo().
    00786                                     {
    00787     int x=1;
    00788     return (BOOL)((*(char*)&x));
    00789 }

BOOL WINAPI dkcIsMMX | ( |  | ) |

| 戻り値: MMXが使えるならTRUE dkcOSIndependent.c の 763 行で定義されています。 参照先 FALSE. 参照元 CheckMMX().
    00763                           {
    00764   return FALSE;
    00765 }

int WINAPI dkcIsNativePathString | ( | const char * | s,
|  | size_t | size
| ) |

| 戻り値: FALSEならNativeなファイルパスではない。 dkcOSIndependent.c の 56 行で定義されています。 参照先 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.c の 488 行で定義されています。 参照先 dkcLoadFile(). 参照元 dkcFileCopyEx(), と dkcMemoryStreamLoadFromFile().
    00488                                                                                               {//="rb"
    00489     return dkcLoadFile(data,size,fname,"rb",readsize);
    00490 }

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

| dkcOSIndependent.c の 332 行で定義されています。 参照先 dkcFReadAll(), と NULL. 参照元 dkcLoadBinary(), と dkcLoadText().
    00332                                                                                                          {//="rb"
    00333     FILE *fp ;
    00334     if(NULL==readsize || NULL==data || NULL==fname || NULL==mode){
    00335         return edk_FAILED;
    00336     }
    00337     fp = fopen( fname , mode ) ;//rb
    00338     if(fp==NULL)return edk_FAILED;
    00339     *readsize = dkcFReadAll(data,size,fp);
    00340     //*readsize = fread( data , 1 , size , fp ) ;
    00341     //fread( data , sizeof(size)  , 1 , fp ) ;
    00342     fclose( fp ) ;
    00343
    00344     return edk_SUCCEEDED;
    00345
    00346 }

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

| テキストデータをメモリに読み込む。dkcSaveText()と対 dkcOSIndependent.c の 495 行で定義されています。 参照先 dkcLoadFile().
    00495                                                                                               {
    00496     return dkcLoadFile(text,length,fname,"rt",readsize);
    00497 }

DKC_INLINE void WINAPI dkcLONGLONGToTwoLONG | ( | LONG * | high,
|  | LONG * | low,
|  | LONGLONG | src
| ) |

| dkcOSIndependent.c の 658 行で定義されています。 参照先 dkcmNOT_ASSERT, と LONGLONG.
    00658                                                                               {
    00659     LONG *o = (LONG *)&src;
    00660     dkcmNOT_ASSERT(sizeof(LONG) * 2 != sizeof(LONGLONG));
    00661     *high = o[0];
    00662     *low = o[1];
    00663 }

void* WINAPIV dkcMallocAdapter | ( | size_t | s | ) |

| dkcOSIndependent.c の 170 行で定義されています。 参照元 dkcSameObjectPoolAlloc(), と dkcSameObjectPoolInit().
    00170                                         {
    00171     return malloc(s);
    00172 }

DKC_INLINE int WINAPI dkcOutputDebugString | ( | const char * | str,
|  |  | ...
| ) |

| dkcOSIndependent.c の 69 行で定義されています。
    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.c の 260 行で定義されています。 参照先 dkcReallocateEx(). 参照元 dkc2TreeSetBuffer(), dkcBufferResize(), dkcMemoryStreamAutoExpandResize(), dkcMemoryStreamResize(), dkcQueueDynamicPush(), dkcSingleListSetBuffer(), と dkcStackDynamicPush().
    00262 {
    00263     return dkcReallocateEx(realloc,NewPtr,NewSize,OldPtr);
    00264 }

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.c の 291 行で定義されています。 参照先 dkcReallocateSizeFunction(), と NULL.
    00295 {
    00296     void *ptr = NULL;
    00297     size_t want_size = OldSize / 8;
    00298     size_t ra_size = dkcReallocateSizeFunction(OldSize,
    00299          (want_size <= 20) ? 20 : want_size
    00300     );
    00301     size_t div = 8;
    00302     size_t tmp_ra = ra_size / div;
    00303     size_t i;
    00304     if(NULL== your_realloc /*|| NULL==*NewPtr*/ || NULL == *OldPtr ||
    00305         0==OldSize  || NULL==reallocated_size
    00306     ){
    00307         return edk_ArgumentException;//アホ引数入れるな！！
    00308     }
    00309
    00310     for(i=0;i<div;i++){
    00311         ptr = your_realloc(*OldPtr,ra_size);
    00312         if(NULL==ptr){
    00313             if(OldSize > (ra_size -= tmp_ra)){//とりあえずtmp_ra分を引く。
    00314                 break;//こら望みなしだわ
    00315             }
    00316             continue;
    00317         }else{
    00318             break;
    00319         }
    00320     }
    00321     if(NULL==ptr) return edk_FAILED;
    00322
    00323     //更新
    00324     *NewPtr = ptr;
    00325     *OldPtr = NULL;
    00326
    00327     *reallocated_size = ra_size;
    00328
    00329     return edk_SUCCEEDED;
    00330 }

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.c の 266 行で定義されています。 参照先 NULL. 参照元 dkcReallocate().
    00270 {
    00271     void *ptr = NULL;
    00272
    00273     if(NULL== your_realloc  /*|| NULL == *OldPtr ||
    00274         0==OldSize*/
    00275     ){
    00276         return edk_ArgumentException;//アホ引数入れるな！！
    00277     }
    00278
    00279     ptr = your_realloc(*OldPtr,NewSize);
    00280     if(NULL==ptr) return edk_FAILED;
    00281
    00282     //更新
    00283     *OldPtr = NULL;
    00284     *NewPtr = ptr;
    00285
    00286     return edk_SUCCEEDED;
    00287 }

size_t dkcReallocateSizeFunction | ( | size_t | OldSize,
|  | size_t | ExpandSize
| ) |

| dkcOSIndependent.c の 242 行で定義されています。 参照元 dkcMemoryStreamAutoExpandResize(), dkcQueueDynamicPush(), dkcReallocateAutoExpand(), と dkcStackDynamicPush().
    00242                                                                   {
    00243     //y=-25.43035 * pow(x,2) + 116.7214
    00244     //y = -0.00000018 * pow(x,2) + 0.00019
    00245     //y = -99.9999 * pow(OldSize,2) + 104857600;
    00246     //y = 0.105263 * x * x + 10.52631
    00247     //double x;
    00248 //  size_t size;
    00249     if(OldSize <= 1024 * 5){//5KB以内なら2倍
    00250         return OldSize * 2;
    00251     }else if(OldSize >= 1024 * 1024 * 10 || 0==OldSize)
    00252     {//10MB以上なら + ExpandSize
    00253         return OldSize + ExpandSize;
    00254     }
    00255     //それ以外ならExpandSize * 3
    00256     return OldSize + ExpandSize * 3;
    00257     //return OldSize * 2;//ひでぇ関数だ。
    00258 }

DKC_INLINE USHORT dkcReverseEndian16 | ( | USHORT | x | ) |

| endian change 16 bit version dkcOSIndependent.c の 769 行で定義されています。 参照元 dkcStreamProcess16().
    00769                                               {
    00770     return (USHORT)((x >> 8) | (x << 8));
    00771 }

DKC_INLINE DWORD dkcReverseEndian32 | ( | DWORD | x | ) |

| dkcOSIndependent.c の 773 行で定義されています。 参照元 dkcReverseEndian64(), dkcSNOW2GetInitializeVector(), dkcStreamProcess32(), GetHeader(), HeaderWrite(), ReverseEndian(), と ReverseEndianDWORD().
    00773                                             {
    00774     return (x << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | (x >> 24);
    00775 }

DKC_INLINE ULONGLONG dkcReverseEndian64 | ( | ULONGLONG | x | ) |

| 覚え書き: General Function Library Copyright (C) 2000,2001 SYN All Rights Reserved.より dkcOSIndependent.c の 777 行で定義されています。 参照先 dkcReverseEndian32(), DWORD, と ULONGLONG. 参照元 dkcStreamProcess64(), GetHeader(), HeaderWrite(), と ReverseEndianQWORD().
    00777                                                      {
    00778
    00779     return (
    00780         (ULONGLONG)dkcReverseEndian32((DWORD)(x & 0x00000000ffffffff)) << 32)
    00781         |
    00782         dkcReverseEndian32((DWORD)(x >> 32)
    00783     );
    00784
    00785 }

int WINAPI dkcRotateShiftRightMemory | ( | void * | d,
|  | size_t | size,
|  | size_t | num
| ) |

| dkcOSIndependent.c の 1036 行で定義されています。 参照先 dkcRotateShiftRightMemoryLogic(), と NULL.
    01036                                                                     {
    01037     //size_t i = 0;
    01038     void *pd = NULL;
    01039     int r = edk_FAILED;
    01040
    01041     pd = malloc(num);
    01042     if(NULL==pd){
    01043         return edk_OutOfMemory;
    01044     }
    01045     if(DKUTIL_SUCCEEDED(dkcRotateShiftRightMemoryLogic(d,size,num,pd,num))){
    01046         r = edk_SUCCEEDED;
    01047     }
    01048
    01049     free(pd);
    01050
    01051     return r;
    01052
    01053 }

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

| dkcOSIndependent.c の 1014 行で定義されています。 参照先 BYTE. 参照元 dkcRotateShiftRightMemory().
    01015 {
    01016     BYTE *dest = (BYTE *)d;
    01017     size_t temp;
    01018
    01019     if(n > worksize){
    01020         return edk_FAILED;
    01021     }
    01022     for(;;){
    01023         if(n < size){
    01024             break;
    01025         }
    01026         n -= size;
    01027     }
    01028     temp = size - n;
    01029     memcpy(workbuff,dest + temp,n);
    01030     memmove(dest + n,dest,temp);
    01031     memcpy(dest,workbuff,n);
    01032     return edk_SUCCEEDED;
    01033
    01034 }

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

| fopenのファイル関数を使ってバイナリセーブを行う。 覚え書き: 類似: dkcMemoryToFile() dkcOSIndependent.c の 475 行で定義されています。 参照先 dkcSaveFile(). 参照元 dkcFileCopyEx(), と dkcMemoryStreamDump().
    00475                                                                         {//="wb"
    00476     return dkcSaveFile(data,size,fname,"wb");
    00477 }

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

| dkcOSIndependent.c の 347 行で定義されています。 参照先 dkcFWriteAll(), と NULL. 参照元 dkcSaveBinary(), と dkcSaveText().
    00348 {
    00349     FILE *fp;
    00350     if(NULL==fname || NULL==mode){
    00351         return edk_FAILED;
    00352     }
    00353     fp = fopen( fname , mode ) ;//wb
    00354     if(fp==NULL) return edk_FAILED;
    00355     dkcFWriteAll(data,size,fp);
    00356     //fwrite( data , size  , 1 , fp ) ;
    00357     //fwrite( data , sizeof(size)  , 1 , fp ) ;
    00358     fclose( fp ) ;
    00359     return edk_SUCCEEDED;
    00360 }

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

| fopenでテキストセーブを行う dkcOSIndependent.c の 492 行で定義されています。 参照先 dkcSaveFile().
    00492                                                                                    {
    00493     return dkcSaveFile(text,length,fname,"wt");
    00494 }

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.c の 821 行で定義されています。 参照先 dkcSwapFast(), get_offset, と NULL. 参照元 dkcSelectMax(), と dkcSelectMin().
    00822 {
    00823
    00824     int i,j,left, right;
    00825
    00826     void *x = malloc(width);
    00827     void *a = malloc(n * width);
    00828     if(NULL==x || NULL==a){
    00829         return edk_ArgumentException;
    00830     }
    00831     if(n > INT_MAX){
    00832         return edk_FAILED;
    00833     }
    00834
    00835
    00836     memcpy(a,a_src,width * n);
    00837
    00838
    00839     left = 0;  right = n - 1;
    00840
    00841     while (left < right)
    00842     {
    00843
    00844         memcpy(x,   (const void *)get_offset(a,k * width),width);
    00845         i = left;
    00846         j = right;
    00847
    00848         for ( ; ; ) {
    00849
    00850             while( less(get_offset(a,i * width),x) > 0){
    00851             //while( *(int *)get_offset(a,i * width) < *(int *)x){
    00852                 i++;
    00853             }
    00854
    00855             while( less(x,get_offset(a,j * width)) > 0){
    00856             //while( *(int *)x < *(int *)get_offset(a,j * width) ){
    00857                 j--;
    00858             }
    00859
    00860             if (i > j){
    00861                 break;
    00862             }
    00863
    00864
    00865             dkcSwapFast(
    00866                 get_offset(a,i * width),
    00867                 get_offset(a,j * width),
    00868                 width
    00869                 );
    00870
    00871             i++;
    00872             j--;
    00873         }
    00874         if (j < k){
    00875             left  = i;
    00876         }
    00877         if (k < i){
    00878             right = j;
    00879         }
    00880     }
    00881
    00882     //ゲットする
    00883     {
    00884         //printf("%d",*(int *)get_offset(a,k * width));
    00885
    00886         memcpy(dest,(const void *)get_offset(a,k * width),width);
    00887
    00888     }
    00889     free(x);
    00890     free(a);
    00891
    00892     return edk_SUCCEEDED;
    00893
    00894 }

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

| 最大値を選択する 参照: dkcSelect() の 引数kが無いだけ dkcOSIndependent.c の 897 行で定義されています。 参照先 dkcSelect().
    00897                                                                                                            {
    00898     if(n-1 > INT_MAX){
    00899         return edk_FAILED;
    00900     }
    00901     return dkcSelect(a,a_src,n,(int)n-1,width,less);
    00902 }

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

| 最小値を選択する 参照: dkcSelect() の 引数kが無いだけ dkcOSIndependent.c の 903 行で定義されています。 参照先 dkcSelect().
    00903                                                                                                            {
    00904     return dkcSelect(a,a_src,n,(int)0,width,less);
    00905 }

void WINAPI dkcSwap | ( | void * | p1,
|  | void * | p2,
|  | size_t | size
| ) |

| 演算でSwapさせる。SWAP_NUM()マクロを参照。 dkcOSIndependent.c の 636 行で定義されています。 参照先 dkcSwap64(), と ULONGLONG. 参照元 dkcBubbleSort(), dkcCombSort(), と dkcShellSort().
    00637 {
    00638     dkcSwap64((ULONGLONG *)p1,(ULONGLONG *)p2,size);
    00639 }

void WINAPI dkcSwap64 | ( | ULONGLONG * | p1,
|  | ULONGLONG * | p2,
|  | size_t | size
| ) |

  | 引数:
  | p1[in] | ULONGLONG *のバッファへのポインタ
  | p2[in] | ULONGLONG *のバッファへのポインタ
  | size[in] | p1,p2バッファのサイズ
覚え書き: p1,p2共にULONGLONG *に強制型キャストしてください。 dkcOSIndependent.c の 601 行で定義されています。 参照先 BYTE, と ULONGLONG. 参照元 dkcSwap().
    00601                                                               {
    00602     size_t i;
    00603     BYTE buf;
    00604     size_t mod_ = size % sizeof(ULONGLONG);
    00605     size_t cnt = size / sizeof(ULONGLONG);
    00606     //char *tp1 = (char *)p1,*tp2 = (char *)p2;
    00607     for(i=0;i<cnt;i++){
    00608         SWAP_NUM(p1[i],p2[i]);
    00609     }
    00610     for(i=0;i<mod_;i++){
    00611
    00612         //SWAP_NUM((char)tp1[size - mod_ + 1],(char)tp2[size - mod_ + i]);
    00613         /*a = b - a ;\
    00614     b -= a ;\
    00615     a += b
    00616         */
    00617         /*( ( ((char *) p2)[size - mod_ + i]))
    00618             = (char)( ( ((char *) p2)[size - mod_ + i])) -
    00619             (char)( ( ((char *) p1)[size - mod_ + i]));
    00620
    00621         ( ( ((char *) p2)[size - mod_ + i])) -= ( ( ((char *) p1)[size - mod_ + i]));
    00622
    00623         ( ( ((char *) p1)[size - mod_ + i])) += ( ( ((char *) p2)[size - mod_ + i]));
    00624             */
    00625
    00626
    00627         buf = (((BYTE *)p1)[size - mod_ + i]);
    00628         (((BYTE *)p1)[size - mod_ + i]) =
    00629             (((BYTE *)p2)[size - mod_ + i]) ;
    00630         (((BYTE *)p2)[size - mod_ + i]) = buf;
    00631
    00632     }
    00633
    00634 }

BOOL WINAPI dkcSwapFast | ( | void * | p1,
|  | void * | p2,
|  | size_t | size
| ) |

| どんな方法でもいいからともかく速くSwapさせる。 覚え書き: size分のメモリを動的確保してスワップします。 dkcOSIndependent.c の 530 行で定義されています。 参照先 FALSE, NULL, と TRUE. 参照元 dkcSelect().
    00531 {
    00532     void *p;
    00533 #if 0//stack overflow 例外が発生するのも嫌だから挙動は共通で。
    00534     int state = 0;
    00535     p = _alloca( size );
    00536     if(NULL==p){
    00537         state = 1;
    00538         p = malloc(size);
    00539         if(NULL==p)
    00540             return FALSE;
    00541     }
    00542 #else
    00543     p = malloc(size);
    00544     if(NULL==p)
    00545         return FALSE;
    00546 #endif
    00547     memcpy(p,p1,size);
    00548     memcpy(p1,p2,size);
    00549     memcpy(p2,p,size);
    00550 #if 0
    00551     if(1==state){
    00552         free(p);
    00553     }
    00554
    00555 #else
    00556     free(p);
    00557 #endif
    00558     return TRUE;
    00559 }

DKC_INLINE void WINAPI dkcTwoDWORDToULONGLONG | ( | ULONGLONG * | dest,
|  | DWORD | high,
|  | DWORD | low
| ) |

| dkcOSIndependent.c の 643 行で定義されています。 参照先 ULONGLONG.
    00643                                                                                    {
    00644     //*dest = (ULONGLONG)((high << 32) + low);
    00645     *dest = (ULONGLONG)high << 32;
    00646     *dest += low;
    00647         //( high * MAXDWORD ) + low;
    00648 }

DKC_INLINE void WINAPI dkcTwoLONGToLONGLONG | ( | LONGLONG * | dest,
|  | LONG | high,
|  | LONG | low
| ) |

| dkcOSIndependent.c の 665 行で定義されています。 参照先 LONGLONG.
    00665                                                                               {
    00666     //*dest = (ULONGLONG)((high << 32) + low);
    00667     *dest = (LONGLONG)high << 32;
    00668     *dest += low;
    00669
    00670 }

DKC_INLINE void WINAPI dkcULONGLONGToTwoDWORD | ( | DWORD * | dhigh,
|  | DWORD * | dlow,
|  | ULONGLONG | src
| ) |

| dkcOSIndependent.c の 650 行で定義されています。 参照先 dkcmNOT_ASSERT, DWORD, と ULONGLONG.
    00650                                                                                      {
    00651     DWORD *o = (DWORD *)&src;
    00652     dkcmNOT_ASSERT(sizeof(DWORD) * 2 != sizeof(ULONGLONG));
    00653     //エンディアン問題をどうにかしよう！
    00654     *dhigh = o[0];
    00655     *dlow = o[1];
    00656 }

static void* get_offset | ( | void * | p,
|  | size_t | offset
| ) | `[static]`

| dkcOSIndependent.c の 810 行で定義されています。 参照先 BYTE.
    00810                                               {
    00811     BYTE *oo = (BYTE *)p;
    00812
    00813     return (void *)&(oo[offset]);
    00814 }