#include "dkcDefined.h"
#include <limits.h>
#include <float.h>
#include <assert.h>
#include "dkutil_cstd/stdlib.h"
#include <stdlib.h>
#include <direct.h>
dkcOSIndependent.hのインクルード依存関係図
このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。
構成 | |
struct | dkc_4char |
マクロ定義 | |
#define | DKUTIL_CSTD_NOT_DEFINE_STDLIB_MACRO |
#define | DWORD uint32 |
#define | WORD uint16 |
#define | BYTE uint8 |
#define | ULONGLONG unsigned long long int |
#define | LONGLONG long long int |
#define | TRUE 1 |
#define | FALSE 0 |
#define | NULL 0 |
#define | dkcdPATH_SEP '/' |
#define | dkcdPATH_SEP_STR "/" |
#define | dkcdPATH_LIST_SEP ':' |
#define | dkcdPATH_LIST_SEP_STR ":" |
#define | dkcmIS_PATH_SEP(c) (dkcdPATH_SEP==(c)) |
#define | dkcmIS_INVALID_FILENAME_CHAR(c) |
#define | dkcmIS_INVALID_FOLDERNAME_CHAR(c) dkcmIS_INVALID_FILENAME_CHAR(c) |
#define | dkcmIS_INVALID_PATH_CHAR(c) |
#define | dkcdLITTLE_ENDIAN 0 |
#define | dkcdBIG_ENDIAN 1 |
#define | ULONGLONG_MAX DKINGYO_ULONGLONG_MAX |
#define | LONGLONG_MAX DKINGYO_LONGLONG_MAX |
#define | LONGLONG_MIN DKINGYO_LONGLONG_MIN |
#define | dkcdMAXPATH 1024 |
#define | dkcdMAXPATH_LEN dkcdMAXPATH |
#define | dkcdMAXPATH_BUFFER (dkcdMAXPATH * 2 + 2) |
安全なMAX_PATHのバッファのサイズ(バイト単位) | |
#define | dkcdMAXPATH_FIXED_SIZE 2050 |
dkcdMAXPATH_BUFFERのサイズは各OSによってサイズが違うのでOSや環境によって左右されない固定サイズを定義しておくのが良いと思った | |
#define | MAYBE 2 |
#define | dkcmGETBYTE(x, y) ((x)>>(8*(y))) |
this version of the macro is fastest on Pentium 3 and Pentium 4 with MSVC 6 SP5 w/ Processor Pack | |
#define | dkcmGETBYTE8(x, y) (uint8)dkcmGETBYTE(x,y) |
#define | dkcmGETBYTE16(x, y) (uint16)dkcmGETBYTE(x,y) |
#define | dkcmGETBYTE32(x, y) (uint32)dkcmGETBYTE8(x,y) |
#define | dkcmNOT_ASSERT_MESSAGE(ex, mes) ((void)0) |
#define | dkcmASSERT_MESSAGE(ex, mes) ((void)0) |
#define | dkcmNOT_ASSERT(ex) ((void)0) |
#define | dkcmASSERT(ex) ((void)0) |
#define | dkcmFORCE_NOT_ASSERT(ex) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) ) |
#define | dkcmFORCE_ASSERT(ex) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) ) |
#define | dkcmFORCE_NOT_ASSERT_MESSAGE(ex, mes) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,mes) ) |
#define | dkcmFORCE_ASSERT_MESSAGE(ex, mes) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,mes) ) |
#define | dkcmREVERSE_ENDIAN16(x) ( (USHORT)( (x >> 8) | (x << 8) ) ) |
#define | dkcmREVERSE_ENDIAN32(x) ( (x << 24) | ( (x & 0x0000ff00) << 8) | ( (x & 0x00ff0000) >> 8 ) | (x >> 24) ) |
#define | dkcmREVERSE_ENDIAN64(x) dkcReverseEndian64(x) |
#define | dkcIsBigEndian() (!dkcIsLittleEndian()) |
#define | dkcCheckOverflow32(a, b) dkcCheckOverflowULONG(a,b) |
型定義 | |
typedef unsigned long long | QWORD |
typedef unsigned char | dkctBOOL |
boolean型 | |
typedef void *(* | DKC_REALLOC_F_TYPE )(void *, size_t) |
typedef int | BOOL |
typedef aword | DKC_4BYTE_UNION_BIG_ENDIAN_BASE |
typedef dkc4ByteUnionLittleEndianBase | DKC_4BYTE_UNION_LITTLE_ENDIAN_BASE |
typedef void * | DKC_WINAPI_PROC_F_TYPE |
typedef BOOL(* | DKC_STD_CALLBACK )(void *peculiar, void *user) |
いろんな場面で使われるコールバック関数 | |
typedef dkc_4char | DKC_4CHAR |
typedef void *(WINAPIV * | DKC_ALLOC_FUNC_TYPE )(size_t) |
malloc()系 関数の型 | |
typedef void(WINAPIV * | DKC_FREE_FUNC_TYPE )(void *) |
free()系 関数の型 | |
typedef int(WINAPIV * | DKC_COMPARE_TYPE )(const void *, const void *) |
関数 | |
DKC_EXTERN BOOL WINAPI | dkcIsNativePathString (const char *s, size_t size) |
DKC_EXTERN size_t | dkcReallocateSizeFunction (size_t OldSize, size_t ExpandSize) |
DKC_EXTERN void *WINAPIV | dkcMallocAdapter (size_t) |
DKC_EXTERN void WINAPIV | dkcFreeAdapter (void *) |
DKC_EXTERN void *WINAPIV | dkcAllocate (size_t size) |
DKC_EXTERN int WINAPIV | dkcFree (void **p) |
DKC_EXTERN void *WINAPIV | dkcAllocateFast (size_t size) |
DKC_EXTERN void *WINAPIV | dkcAllocateFill (size_t size, BYTE fill) |
DKC_EXTERN int WINAPI | dkcReallocate (void **NewPtr, size_t NewSize, void **OldPtr) |
DKC_EXTERN int WINAPI | dkcReallocateEx (DKC_REALLOC_F_TYPE your_realloc, void **NewPtr, size_t NewSize, void **OldPtr) |
DKC_EXTERN int WINAPI | dkcReallocateAutoExpand (DKC_REALLOC_F_TYPE your_realloc, void **NewPtr, void **OldPtr, size_t OldSize, size_t *reallocated_size) |
DKC_EXTERN void WINAPI | dkcSwap (void *p1, void *p2, size_t size) |
DKC_EXTERN BOOL WINAPI | dkcSwapFast (void *p1, void *p2, size_t size) |
DKC_EXTERN void WINAPI | dkcSwap64 (ULONGLONG *p1, ULONGLONG *p2, size_t size) |
DKC_EXTERN BOOL | dkcIs_foepn_mode (const char *s) |
fopenの時の第二引数が有効な値かどうか調べる。 | |
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 *, size_t size, FILE *fp) |
freadの全部責任持って読み込みますバージョン。(読み込めない場合はEOFかerror) | |
DKC_EXTERN size_t WINAPI | dkcFWriteAll (const void *, size_t size, FILE *fp) |
DKC_EXTERN size_t WINAPI | dkcFSize (FILE *fp) |
dkcFileSize()を普段はお使いください。エラー時の時は動作は未定義です。 | |
DKC_EXTERN int WINAPI | dkcSaveBinary (const void *data, size_t size, const char *fname) |
fopenのファイル関数を使ってバイナリセーブを行う。 | |
DKC_EXTERN int WINAPI | dkcLoadBinary (void *data, size_t size, const char *fname, size_t *readsize) |
バイナリデータをメモリに読み込む。dkcSaveBinary()と対 | |
DKC_EXTERN int WINAPI | dkcSaveText (const char *text, size_t length, const char *fname) |
fopenでテキストセーブを行う | |
DKC_EXTERN int WINAPI | dkcLoadText (char *text, size_t length, const char *fname, size_t *readsize) |
テキストデータをメモリに読み込む。dkcSaveText()と対 | |
DKC_EXTERN BOOL WINAPI | dkcCreateEmptyFile (const char *filename) |
空ファイルを作る。 | |
DKC_EXTERN int WINAPI | dkcInitFileFast (const char *filename) |
エラーログ(ファイル)を高速に初期化する、 | |
DKC_EXTERN int WINAPI | dkcAddLogFile (const char *filename, const char *str,...) |
ログを吐く | |
DKC_EXTERN void WINAPI | dkcTwoDWORDToULONGLONG (ULONGLONG *dest, DWORD high, DWORD low) |
DKC_EXTERN void WINAPI | dkcULONGLONGToTwoDWORD (DWORD *dhigh, DWORD *dlow, ULONGLONG src) |
DKC_EXTERN void WINAPI | dkcLONGLONGToTwoLONG (LONG *high, LONG *low, LONGLONG src) |
DKC_EXTERN void WINAPI | dkcTwoLONGToLONGLONG (LONGLONG *dest, LONG high, LONG low) |
DKC_EXTERN int WINAPI | dkcOutputDebugString (const char *str,...) |
DKC_EXTERN int WINAPI | dkcErrorMessage (const char *expression, const char *filename, size_t line, const char *message,...) |
DKC_EXTERN const char *WINAPI | dkcGetPathSep () |
DKC_EXTERN int | dkcDynamicCheckEnvironment (BOOL isForceExit) |
DKC_EXTERN void WINAPI | dkcCheckMemoryLeak (BOOL flag) |
DKC_EXTERN BOOL WINAPI | dkcIsMMX () |
DKC_EXTERN ULONG | dkcReverseEndian32 (ULONG x) |
DKC_EXTERN ULONGLONG | dkcReverseEndian64 (ULONGLONG x) |
DKC_EXTERN USHORT | dkcReverseEndian16 (USHORT x) |
endian change 16 bit version | |
DKC_EXTERN BOOL | dkcIsLittleEndian () |
DKC_EXTERN BOOL | dkcCheckOverflowULONG (ULONG a1, ULONG a2) |
unsigned long型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。 | |
DKC_EXTERN int WINAPI | dkcSelect (void *dest, const void *a_src, size_t n, int k, size_t width, DKC_COMPARE_TYPE comp) |
いわいるセレクト(選択)アルゴリズム | |
DKC_EXTERN int WINAPI | dkcSelectMax (void *dest, const void *a, size_t n, size_t width, DKC_COMPARE_TYPE comp) |
DKC_EXTERN int WINAPI | dkcSelectMin (void *dest, const void *a, size_t n, size_t width, DKC_COMPARE_TYPE comp) |
DKC_INLINE int | dkcRotateShiftRightMemoryLogic (void *dest, size_t size, size_t n, void *workbuff, size_t worksize) |
DKC_EXTERN int WINAPI | dkcRotateShiftRightMemory (void *dest, size_t size, size_t n) |
dkcOSIndependent.h で定義されています。
|
|
dkcOSIndependent.h の 671 行で定義されています。 |
|
dkcOSIndependent.h の 240 行で定義されています。 |
|
dkcOSIndependent.h の 239 行で定義されています。 参照元 dkcNLZ_IEEE(). |
|
dkcOSIndependent.h の 356 行で定義されています。 参照元 dkcPathStringConcatenate(), dkcPathStringCopy(), と dkcSemiRealRandomInit(). |
|
安全なMAX_PATHのバッファのサイズ(バイト単位)
dkcOSIndependent.h の 378 行で定義されています。 参照元 dkcAllocPathString(), dkcCreateDirectory(), dkcGetCurrentDirectory(), dkcIsEffectivePath(), dkcPathStringNormalizeConcatenateLogic(), dkcPathStringNormalizeCopyLogic(), と dkcToAbsolutelyPath(). |
|
dkcdMAXPATH_BUFFERのサイズは各OSによってサイズが違うのでOSや環境によって左右されない固定サイズを定義しておくのが良いと思った
dkcOSIndependent.h の 384 行で定義されています。 |
|
dkcOSIndependent.h の 362 行で定義されています。 参照元 dkcCreateDirectory(), と dkcCurrentDirectoryConcatenate(). |
|
dkcOSIndependent.h の 122 行で定義されています。 |
|
dkcOSIndependent.h の 123 行で定義されています。 |
|
dkcOSIndependent.h の 120 行で定義されています。 参照元 dkcCreateDirectory(), dkcGetPathSep(), dkcPathStringGetDirectory(), と dkcPushBackPathSep(). |
|
dkcOSIndependent.h の 121 行で定義されています。 |
|
dkcOSIndependent.h の 665 行で定義されています。 |
|
|
dkcOSIndependent.h の 615 行で定義されています。 |
|
dkcOSIndependent.h の 621 行で定義されています。 |
|
dkcOSIndependent.h の 623 行で定義されています。 |
|
|
dkcOSIndependent.h の 622 行で定義されています。 |
|
this version of the macro is fastest on Pentium 3 and Pentium 4 with MSVC 6 SP5 w/ Processor Pack
dkcOSIndependent.h の 394 行で定義されています。 |
|
dkcOSIndependent.h の 396 行で定義されています。 |
|
dkcOSIndependent.h の 397 行で定義されています。 |
|
dkcOSIndependent.h の 395 行で定義されています。 |
|
値: ( ((c) =='\\') || ((c)=='/') || ((c)=='*') || ((c)=='?') \ || ((c)== '"') || ((c) == '<') || ((c) == '>') || ((c) == '|') ) dkcOSIndependent.h の 126 行で定義されています。 |
|
dkcOSIndependent.h の 129 行で定義されています。 参照元 dkcCreateDirectory(). |
|
値: ( ( (c)=='\\') || ((c)=='*') || ((c)=='?') || ((c)== '"') || \ ((c) == '<') || ((c) == '>') || ((c) == '|') ) dkcOSIndependent.h の 132 行で定義されています。 |
|
dkcOSIndependent.h の 124 行で定義されています。 参照元 dkcCreateDirectory(). |
|
|
dkcOSIndependent.h の 614 行で定義されています。 参照元 dkcCreateDirectory(). |
|
dkcOSIndependent.h の 640 行で定義されています。 |
|
dkcOSIndependent.h の 642 行で定義されています。 |
|
dkcOSIndependent.h の 652 行で定義されています。 |
|
dkcOSIndependent.h の 44 行で定義されています。 |
|
|
|
dkcOSIndependent.h の 105 行で定義されています。 |
|
dkcOSIndependent.h の 338 行で定義されています。 |
|
dkcOSIndependent.h の 341 行で定義されています。 |
|
dkcOSIndependent.h の 389 行で定義されています。 |
|
|
|
|
dkcOSIndependent.h の 335 行で定義されています。 |
|
dkcOSIndependent.h の 93 行で定義されています。 |
|
dkcOSIndependent.h の 139 行で定義されています。 |
|
dkcOSIndependent.h の 305 行で定義されています。 |
|
dkcOSIndependent.h の 307 行で定義されています。 |
|
|
|
malloc()系 関数の型
dkcOSIndependent.h の 483 行で定義されています。 |
|
dkcOSIndependent.h の 675 行で定義されています。 |
|
free()系 関数の型
dkcOSIndependent.h の 485 行で定義されています。 |
|
dkcOSIndependent.h の 137 行で定義されています。 |
|
いろんな場面で使われるコールバック関数
dkcOSIndependent.h の 328 行で定義されています。 |
|
dkcOSIndependent.h の 324 行で定義されています。 |
|
boolean型
dkcOSIndependent.h の 70 行で定義されています。 |
|
dkcOSIndependent.h の 66 行で定義されています。 |
|
ログを吐く
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 }
|
|
|
dkcOSIndependent.c の 186 行で定義されています。 参照元 alloc_2tree_node(), decode_hash(), decode_tst(), dkcAllocateFill(), dkcSameObjectPoolReserveFast(), と malloc_adapter().
|
|
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 }
|
|
dkcOSIndependent.c の 715 行で定義されています。
|
|
unsigned long型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。
dkcOSIndependent.c の 792 行で定義されています。 参照元 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 }
|
|
空ファイルを作る。
dkcOSIndependent.c の 479 行で定義されています。 参照元 dkcFileCopyEx(). 00479 { 00480 FILE *fp; 00481 fp = fopen( filename , "wb" ) ;//wb 00482 if(fp==NULL) return FALSE; 00483 fclose( fp ) ; 00484 return TRUE; 00485 }
|
|
dkcOSIndependent.c の 49 行で定義されています。
|
|
dkcOSIndependent.c の 87 行で定義されています。 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 }
|
|
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 }
|
|
fopenのラッパー
dkcOSIndependent.c の 363 行で定義されています。 参照元 dkcAllocStream(), dkcFileCopyEx(), と GetHeader().
|
|
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 }
|
|
|
dkcOSIndependent.c の 174 行で定義されています。
|
|
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 }
|
|
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 }
|
|
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 }
|
|
エラーログ(ファイル)を高速に初期化する、
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 }
|
|
fopenの時の第二引数が有効な値かどうか調べる。
dkcOSIndependent.c の 205 行で定義されています。 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 }
|
|
dkcOSIndependent.c の 786 行で定義されています。 参照元 dkcOpenFileWithSignature(), GetHeader(), HeaderWrite(), と SetStreamInfo(). 00786 { 00787 int x=1; 00788 return (BOOL)((*(char*)&x)); 00789 }
|
|
dkcOSIndependent.c の 763 行で定義されています。 参照先 FALSE. 参照元 CheckMMX(). 00763 { 00764 return FALSE; 00765 }
|
|
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 }
|
|
バイナリデータをメモリに読み込む。dkcSaveBinary()と対
dkcOSIndependent.c の 488 行で定義されています。 参照先 dkcLoadFile(). 参照元 dkcFileCopyEx(), と dkcMemoryStreamLoadFromFile(). 00488 {//="rb" 00489 return dkcLoadFile(data,size,fname,"rb",readsize); 00490 }
|
|
テキストデータをメモリに読み込む。dkcSaveText()と対
dkcOSIndependent.c の 495 行で定義されています。 参照先 dkcLoadFile(). 00495 { 00496 return dkcLoadFile(text,length,fname,"rt",readsize); 00497 }
|
|
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 }
|
|
dkcOSIndependent.c の 170 行で定義されています。 参照元 dkcSameObjectPoolAlloc(), と dkcSameObjectPoolInit().
|
|
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 }
|
|
dkcOSIndependent.c の 260 行で定義されています。 参照先 dkcReallocateEx(). 参照元 dkc2TreeSetBuffer(), dkcBufferResize(), dkcMemoryStreamAutoExpandResize(), dkcMemoryStreamResize(), dkcQueueDynamicPush(), dkcSingleListSetBuffer(), と dkcStackDynamicPush(). 00262 { 00263 return dkcReallocateEx(realloc,NewPtr,NewSize,OldPtr); 00264 }
|
|
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 }
|
|
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 }
|
|
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 }
|
|
endian change 16 bit version
dkcOSIndependent.c の 769 行で定義されています。 参照元 dkcStreamProcess16().
|
|
|
|
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 }
|
|
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 }
|
|
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 }
|
|
fopenのファイル関数を使ってバイナリセーブを行う。
dkcOSIndependent.c の 475 行で定義されています。 参照先 dkcSaveFile(). 参照元 dkcFileCopyEx(), と dkcMemoryStreamDump(). 00475 {//="wb" 00476 return dkcSaveFile(data,size,fname,"wb"); 00477 }
|
|
fopenでテキストセーブを行う
dkcOSIndependent.c の 492 行で定義されています。 参照先 dkcSaveFile(). 00492 { 00493 return dkcSaveFile(text,length,fname,"wt"); 00494 }
|
|
いわいるセレクト(選択)アルゴリズム n:配列の再台数 k:調べたい番号(小さいうちから)
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 }
|
|
最大値を選択する
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 }
|
|
最小値を選択する
dkcOSIndependent.c の 903 行で定義されています。 参照先 dkcSelect(). 00903 { 00904 return dkcSelect(a,a_src,n,(int)0,width,less); 00905 }
|
|
演算でSwapさせる。SWAP_NUM()マクロを参照。 dkcOSIndependent.c の 636 行で定義されています。 参照先 dkcSwap64(), と ULONGLONG. 参照元 dkcBubbleSort(), dkcCombSort(), と dkcShellSort().
|
|
dkcOSIndependent.c の 601 行で定義されています。 参照元 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 }
|
|
どんな方法でもいいからともかく速くSwapさせる。
dkcOSIndependent.c の 530 行で定義されています。 参照元 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 }
|
|
dkcOSIndependent.c の 643 行で定義されています。 参照先 ULONGLONG. 00643 { 00644 //*dest = (ULONGLONG)((high << 32) + low); 00645 *dest = (ULONGLONG)high << 32; 00646 *dest += low; 00647 //( high * MAXDWORD ) + low; 00648 }
|
|
dkcOSIndependent.c の 665 行で定義されています。 参照先 LONGLONG. 00665 { 00666 //*dest = (ULONGLONG)((high << 32) + low); 00667 *dest = (LONGLONG)high << 32; 00668 *dest += low; 00669 00670 }
|
|
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 }
|