#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) |
dkcOSIndependent.c で定義されています。
|
dkcOSIndependent.c の 7 行で定義されています。 |
|
ログを吐く
dkcOSIndependent.c の 524 行で定義されています。 参照先 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 }
|
|
|
dkcOSIndependent.c の 186 行で定義されています。 参照元 alloc_2tree_node(), decode_hash(), decode_tst(), dkcSameObjectPoolReserveFast(), と malloc_adapter(). 00186 { 00187 return dkcAllocateFast_INL(size); 00188 }
|
|
dkcOSIndependent.c の 183 行で定義されています。 00183 { 00184 return dkcAllocateFill_INL(size,fill); 00185 }
|
|
dkcOSIndependent.c の 748 行で定義されています。
|
|
unsigned long型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。
dkcOSIndependent.c の 843 行で定義されています。 参照元 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 }
|
|
dkcOSIndependent.c の 858 行で定義されています。 参照先 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 }
|
|
空ファイルを作る。
dkcOSIndependent.c の 491 行で定義されています。 参照元 dkcFileCopyEx(). 00491 { 00492 FILE *fp; 00493 fp = fopen( filename , "wb" ) ;//wb 00494 if(fp==NULL) return FALSE; 00495 fclose( fp ) ; 00496 return TRUE; 00497 }
|
|
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 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 }
|
|
fcloseのラッパー
dkcOSIndependent.c の 379 行で定義されています。 参照先 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 }
|
|
fopenのラッパー
dkcOSIndependent.c の 375 行で定義されています。 参照元 dkcAllocStream(), dkcFileCopyEx(), と GetHeader().
|
|
freadの全部責任持って読み込みますバージョン。(読み込めない場合はEOFかerror)
dkcOSIndependent.c の 385 行で定義されています。 参照先 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 }
|
|
|
dkcOSIndependent.c の 177 行で定義されています。
|
|
dkcFileSize()を普段はお使いください。エラー時の時は動作は未定義です。
dkcOSIndependent.c の 474 行で定義されています。 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 }
|
|
dkcOSIndependent.c の 429 行で定義されています。 参照先 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 }
|
|
dkcOSIndependent.c の 826 行で定義されています。 参照先 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 }
|
|
dkcOSIndependent.c の 323 行で定義されています。 参照先 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 }
|
|
dkcOSIndependent.c の 753 行で定義されています。 参照先 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 }
|
|
エラーログ(ファイル)を高速に初期化する、
dkcOSIndependent.c の 512 行で定義されています。 参照先 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 }
|
|
fopenの時の第二引数が有効な値かどうか調べる。
dkcOSIndependent.c の 196 行で定義されています。 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 }
|
|
dkcOSIndependent.c の 819 行で定義されています。 参照元 dkcOpenFileWithSignature(), GetHeader(), HeaderWrite(), と SetStreamInfo(). 00819 { 00820 int x=1; 00821 return (BOOL)((*(char*)&x)); 00822 }
|
|
dkcOSIndependent.c の 796 行で定義されています。 参照先 FALSE. 参照元 CheckMMX(). 00796 { 00797 return FALSE; 00798 }
|
|
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 の 500 行で定義されています。 参照先 dkcLoadFile(). 参照元 dkcFileCopyEx(), と dkcMemoryStreamLoadFromFile(). 00500 {//="rb" 00501 return dkcLoadFile(data,size,fname,"rb",readsize); 00502 }
|
|
dkcOSIndependent.c の 344 行で定義されています。 参照先 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 }
|
|
テキストデータをメモリに読み込む。dkcSaveText()と対
dkcOSIndependent.c の 507 行で定義されています。 参照先 dkcLoadFile(). 00507 { 00508 return dkcLoadFile(text,length,fname,"rt",readsize); 00509 }
|
|
dkcOSIndependent.c の 672 行で定義されています。 参照先 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 }
|
|
dkcOSIndependent.c の 173 行で定義されています。 参照元 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 の 251 行で定義されています。 参照先 dkcReallocateEx(). 参照元 dkc2TreeSetBuffer(), dkcBufferResize_INL(), dkcMemoryStreamAutoExpandResize(), dkcMemoryStreamResize(), dkcQueueDynamicPush(), dkcSingleListSetBuffer(), と dkcStackDynamicPush(). 00253 { 00254 return dkcReallocateEx(realloc,NewPtr,NewSize,OldPtr); 00255 }
|
|
dkcOSIndependent.c の 282 行で定義されています。 参照先 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 }
|
|
dkcOSIndependent.c の 257 行で定義されています。 参照先 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 }
|
|
dkcOSIndependent.c の 233 行で定義されています。 参照元 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 }
|
|
endian change 16 bit version
dkcOSIndependent.c の 802 行で定義されています。 参照元 dkcStreamProcess16().
|
|
dkcOSIndependent.c の 806 行で定義されています。 参照元 dkcReverseEndian64(), dkcSNOW2GetInitializeVector(), dkcStreamProcess32(), GetHeader(), HeaderWrite(), ReverseEndian(), と ReverseEndianDWORD(). 00806 { 00807 return (x << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | (x >> 24); 00808 }
|
|
dkcOSIndependent.c の 810 行で定義されています。 参照先 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 }
|
|
dkcOSIndependent.c の 1101 行で定義されています。 参照先 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 }
|
|
dkcOSIndependent.c の 1079 行で定義されています。 参照先 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 }
|
|
fopenのファイル関数を使ってバイナリセーブを行う。
dkcOSIndependent.c の 487 行で定義されています。 参照先 dkcSaveFile(). 参照元 dkcFileCopyEx(), と dkcMemoryStreamDump(). 00487 {//="wb" 00488 return dkcSaveFile(data,size,fname,"wb"); 00489 }
|
|
dkcOSIndependent.c の 359 行で定義されています。 参照先 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 }
|
|
fopenでテキストセーブを行う
dkcOSIndependent.c の 504 行で定義されています。 参照先 dkcSaveFile(). 00504 { 00505 return dkcSaveFile(text,length,fname,"wt"); 00506 }
|
|
いわいるセレクト(選択)アルゴリズム n:配列の再台数 k:調べたい番号(小さいうちから)
dkcOSIndependent.c の 886 行で定義されています。 参照先 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 }
|
|
最大値を選択する
dkcOSIndependent.c の 962 行で定義されています。 参照先 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 }
|
|
最小値を選択する
dkcOSIndependent.c の 968 行で定義されています。 参照先 dkcSelect(). 00968 { 00969 return dkcSelect(a,a_src,n,(int)0,width,less); 00970 }
|
|
演算でSwapさせる。SWAP_NUM()マクロを参照。 dkcOSIndependent.c の 649 行で定義されています。 参照先 dkcSwap64(), と ULONGLONG. 参照元 dkcBubbleSort(), dkcCombSort(), と dkcShellSort().
|
|
dkcOSIndependent.c の 613 行で定義されています。 参照元 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 }
|
|
どんな方法でもいいからともかく速くSwapさせる。
dkcOSIndependent.c の 542 行で定義されています。 参照元 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 }
|
|
dkcOSIndependent.c の 656 行で定義されています。 参照先 ULONGLONG. 参照元 dkcFileSize64V(). 00656 { 00657 //*dest = (ULONGLONG)((high << 32) + low); 00658 *dest = (ULONGLONG)high << 32; 00659 *dest += low; 00660 //( high * MAXDWORD ) + low; 00661 }
|
|
dkcOSIndependent.c の 687 行で定義されています。 参照先 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 }
|
|
dkcOSIndependent.c の 663 行で定義されています。 参照先 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 }
|
|
dkcOSIndependent.c の 875 行で定義されています。 参照先 BYTE.
|