#include "dkcOSIndependent.h"
#include "dkcDefined.h"
#include "dkcQueue.h"
#include <assert.h>
#include <math.h>
dkcOSIndependent.cのインクルード依存関係図
マクロ定義 | |
#define | DKUTIL_C_OS_INDEPENDENT_C |
関数 | |
int WINAPI | dkcIsNativePathString (const char *s, size_t size) |
FALSEならNativeなファイルパスではない。. | |
int WINAPI | dkcErrorMessage (const char *expression, const char *filename, size_t line, const char *message,...) |
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) |
edk_SUCCEEDEDだったら成功 | |
int WINAPI | dkcReallocateAutoExpand (DKC_REALLOC_F_TYPE your_realloc, void **NewPtr, void **OldPtr, size_t OldSize, size_t *reallocated_size) |
int WINAPI | dkcLoadFile (void *data, size_t size, const char *fname, const char *mode, size_t *readsize) |
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 (void *buffer, size_t size, FILE *fp) |
dkcFReadAll() dkcFReadAllのfwrite版 | |
int WINAPI | dkcSaveBinary (const void *data, size_t size, const char *fname) |
fopenのファイル関数を使ってバイナリセーブを行う。 | |
BOOL WINAPI | dkcCreateEmptyFile (const char *filename) |
空ファイルを作る。 | |
int WINAPI | dkcLoadBinary (void *data, size_t size, const char *fname, size_t *readsize) |
バイナリデータをメモリに読み込む。dkcSaveBinary()と対 | |
int WINAPI | dkcSaveText (const char *text, size_t length, const char *fname) |
fopenでテキストセーブを行う | |
int WINAPI | dkcLoadText (char *text, size_t length, const char *fname, size_t *readsize) |
テキストデータをメモリに読み込む。dkcSaveText()と対 | |
void 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 () |
path separatorの入った文字列(1byte毎にpath separatorの文字定数が入っている)をゲット | |
BOOL WINAPI | dkcIsMMX (void) |
MMXが使えるならTRUE. | |
DKC_INLINE USHORT | dkcReverseEndian16 (USHORT x) |
endian change 16 bit version | |
DKC_INLINE DWORD | dkcReverseEndian32 (DWORD x) |
DKC_INLINE ULONGLONG | dkcReverseEndian64 (ULONGLONG x) |
General Function Library Copyright (C) 2000,2001 SYN All Rights Reserved.より. | |
DKC_INLINE BOOL | dkcIsLittleEndian () |
little endian ならTRUE | |
DKC_INLINE BOOL | dkcCheckOverflowULONG (ULONG a1, ULONG a2) |
unsigned long型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。 | |
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 の 120 行で定義されています。 参照先 DKC_INLINE. 参照元 alloc_sop_node(), dkcAllocateFill(), と dkcSameObjectPoolReserve().
00120 {
00121 return malloc(size);
00122 }
|
|
dkcOSIndependent.c の 114 行で定義されています。 参照先 BYTE, DKC_INLINE, dkcAllocateFast(), と NULL. 参照元 alloc_sameobjectpool(), と dkcAllocate().
00114 { 00115 void *p = dkcAllocateFast(size); 00116 if(NULL==p) return NULL; 00117 memset(p,fill,size); 00118 return p; 00119 } |
|
dkcOSIndependent.c の 583 行で定義されています。 参照先 BOOL.
00583 { 00584 00585 } |
|
unsigned long型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。
dkcOSIndependent.c の 658 行で定義されています。 参照先 BOOL, DKC_INLINE, FALSE, SWAP_NUM, と TRUE. 参照元 dkcMemoryStreamAdapterPushBack(), と dkcRLEPackBitsEncode().
|
|
空ファイルを作る。
dkcOSIndependent.c の 399 行で定義されています。 参照先 BOOL, FALSE, NULL, と TRUE. 参照元 dkcFileCopyEx().
|
|
dkcOSIndependent.c の 32 行で定義されています。 参照先 edk_FAILED, MB, NULL, NULL_CHAR_ARRAY, ODS, SET_VA_LIST_C, と TRUE.
00034 { 00035 char s[1024]; 00036 char ss[1024 * 2]; 00037 00038 int va_list_result; 00039 va_list Valist; 00040 00041 NULL_CHAR_ARRAY(s); 00042 NULL_CHAR_ARRAY(ss); 00043 00044 if(message){ 00045 SET_VA_LIST_C(Valist,va_list_result,s,sizeof(s),message); 00046 }else{ 00047 //SET_VA_LIST(s,sizeof(s),"No message"); 00048 _snprintf(s,sizeof(s),"No message\n"); 00049 } 00050 00051 _snprintf(ss,sizeof(ss), 00052 "DKUTIL_ASSERT(%s):\nfile:%s / \n line:%d / \n message: %s", 00053 expression,filename,line,s); 00054 00055 00056 00057 #ifdef NDEBUG//release 00058 # ifdef WIN32 00059 ODS(ss); 00060 //::MessageBox(NULL,ss,"ERROR ASSERTION !!",MB_OK); 00061 { 00062 LPCTSTR name="ERROR_TEMP.txt"; 00063 { 00064 //ファイルをオープン 00065 FILE *fp; 00066 if(NULL != (fp = fopen( name , "at" ))){ 00067 00068 // エラーログファイルに書き出す 00069 fputs( ss , fp ) ; 00070 fclose( fp ) ; 00071 Sleep(800); 00072 } 00073 } 00074 ShellExecute(NULL, "open",name, NULL, NULL, SW_SHOWNORMAL); 00075 //Sleep(1000); 00076 //DeleteFile(name); 00077 } 00078 MB("このテキストをこのソフトの開発者に渡せば、バグ発見の近道なります。\n \ 00079 開発者に知らせるときはこのテキストを転記してあげましょう。"); 00080 if(IDYES==MessageBox(NULL, 00081 "このままこのソフトを起動しつづけると、更なるエラーが発生する可能性があります。\n終了しますか?", 00082 "あってはいけない エラー!!!", 00083 MB_YESNO)) 00084 { 00085 exit(edk_FAILED); 00086 //terminate(); 00087 }else{ 00088 } 00089 # else //else of win32 00090 00091 fprintf(stderr,ss); 00092 exit(edk_FAILED); 00093 00094 # endif //end of win32 00095 00096 #else //debug 00097 00098 # ifdef WIN32 00099 ODS(ss); 00100 fprintf(stderr,ss); 00101 //_CrtDebugBreak(); 00102 DebugBreak(); 00103 # else //else of win32 00104 00105 fprintf(stderr,ss); 00106 Debugger(); 00107 00108 # endif //end of win32 00109 #endif//end of NDEBUG 00110 //assert(ss); 00111 00112 return TRUE; 00113 } |
|
fcloseのラッパー
dkcOSIndependent.c の 299 行で定義されています。 参照先 DKC_EXTERN, edk_ArgumentException, edk_SUCCEEDED, と NULL. 参照元 dkcDeleteCircularStream(), dkcFileCopyEx(), dkcFreeStream(), と GetHeader().
00299 { 00300 if(NULL==ptr || NULL==*ptr) return edk_ArgumentException; 00301 fclose(*ptr); 00302 *ptr = NULL; 00303 return edk_SUCCEEDED; 00304 } |
|
fopenのラッパー
dkcOSIndependent.c の 295 行で定義されています。 参照先 DKC_EXTERN. 参照元 dkcAllocStream(), dkcFileCopyEx(), dkcNewCircularStreamForFile(), と GetHeader().
00295 {
00296 return fopen(filename,mode);
00297 }
|
|
freadの全部責任持って読み込みますバージョン。(読み込めない場合はEOFかerror)
dkcOSIndependent.c の 305 行で定義されています。 参照先 BYTE, DKC_EXTERN, と dkcmNOT_ASSERT. 参照元 GetHeader().
00306 { 00307 size_t count; 00308 size_t tc,tsize; 00309 BYTE *tbuffer; 00310 00311 //read size 00312 tsize = size; 00313 //temp variable 00314 tc = 0; 00315 //offset counter 00316 count = 0; 00317 //byte type pointer 00318 tbuffer = (BYTE *)buffer; 00319 for(;;) 00320 { 00321 //error check 00322 if(ferror(fp) ){ 00323 break; 00324 } 00325 if(feof(fp)){ 00326 break; 00327 } 00328 //read 00329 tc = fread(&tbuffer[count],1,tsize,fp); 00330 //update 00331 tsize -= tc; 00332 count += tc; 00333 00334 if(count == size){ 00335 break; 00336 } 00337 # ifdef DEBUG 00338 //ありえないエラーチェック 00339 dkcmNOT_ASSERT(count > size); 00340 # else 00341 if(count > size){ 00342 break; 00343 } 00344 # endif 00345 } 00346 return count; 00347 } |
|
|
dkcFReadAll() dkcFReadAllのfwrite版
dkcOSIndependent.c の 349 行で定義されています。 参照先 BYTE, DKC_EXTERN, と dkcmNOT_ASSERT.
00349 { 00350 size_t count; 00351 size_t tc,tsize; 00352 BYTE *tbuffer; 00353 00354 //read size 00355 tsize = size; 00356 //temp variable 00357 tc = 0; 00358 //offset counter 00359 count = 0; 00360 //byte type pointer 00361 tbuffer = (BYTE *)buffer; 00362 for(;;) 00363 { 00364 //error check 00365 if(ferror(fp) ){ 00366 break; 00367 } 00368 if(feof(fp)){ 00369 break; 00370 } 00371 //read 00372 tc = fwrite(&tbuffer[count],1,tsize,fp); 00373 //update 00374 tsize -= tc; 00375 count += tc; 00376 00377 if(count == size){ 00378 break; 00379 } 00380 # ifdef DEBUG 00381 //ありえないエラーチェック 00382 dkcmNOT_ASSERT(count > size); 00383 # else 00384 if(count > size){ 00385 break; 00386 } 00387 # endif 00388 } 00389 return count; 00390 00391 } |
|
path separatorの入った文字列(1byte毎にpath separatorの文字定数が入っている)をゲット
dkcOSIndependent.c の 588 行で定義されています。 参照先 dkcdPATH_SEP. 参照元 dkcSJIS_SearchPathSep(), と dkcSJIS_SearchPathSepLast().
00588 { 00589 #ifdef WIN32 00590 static char target[3]={dkcdPATH_SEP,'/','\0'}; 00591 #else 00592 static char target[3]={dkcdPATH_SEP,'\0'}; 00593 #endif 00594 return target; 00595 } |
|
fopenの時の第二引数が有効な値かどうか調べる。
dkcOSIndependent.c の 139 行で定義されています。
00139 { 00140 /* wrtb+ */ 00141 const char *ms= "wrtb+"; 00142 size_t slen = strlen(s); 00143 size_t mslen = strlen(ms); 00144 size_t i,j; 00145 int flag = FALSE; 00146 for(i=0;i<slen;i++){ 00147 for(j=0;j<mslen;j++){ 00148 if(ms[j]==s[i]){ 00149 flag = TRUE; 00150 break; 00151 } 00152 } 00153 if(TRUE!=flag){ 00154 return FALSE; 00155 }else{ 00156 flag = FALSE; 00157 } 00158 } 00159 return TRUE; 00160 } |
|
little endian ならTRUE
dkcOSIndependent.c の 652 行で定義されています。 参照先 BOOL, と DKC_INLINE. 参照元 dkcOpenFileWithSignature(), GetHeader(), HeaderWrite(), と SetStreamInfo().
00652 { 00653 int x=1; 00654 return (BOOL)((*(char*)&x)); 00655 } |
|
MMXが使えるならTRUE.
dkcOSIndependent.c の 629 行で定義されています。 参照元 CheckMMX().
00629 { 00630 return FALSE; 00631 } |
|
FALSEならNativeなファイルパスではない。.
dkcOSIndependent.c の 18 行で定義されています。 参照先 dkcmIS_INVALID_PATH_CHAR, edk_FAILED, FALSE, NULL, と TRUE. 参照元 dkcAllocPathString(), dkcIsEffectivePath(), dkcPathStringElementInsert_Logic(), と dkcPathStringElementReplace_Logic().
00018 { 00019 00020 size_t i=0; 00021 if(s==NULL) return edk_FAILED; 00022 for(;i<size;i++){ 00023 if(dkcmIS_INVALID_PATH_CHAR(s[i])) 00024 { 00025 return FALSE; 00026 } 00027 } 00028 return TRUE; 00029 } |
|
バイナリデータをメモリに読み込む。dkcSaveBinary()と対
dkcOSIndependent.c の 408 行で定義されています。 参照先 dkcLoadFile(). 参照元 dkcAllocDeserialize(), と dkcFileCopyEx().
00408 {//="rb" 00409 return dkcLoadFile(data,size,fname,"rb",readsize); 00410 } |
|
dkcOSIndependent.c の 266 行で定義されています。 参照先 edk_FAILED, edk_SUCCEEDED, と NULL. 参照元 dkcLoadBinary(), と dkcLoadText().
00266 {//="rb" 00267 FILE *fp ; 00268 if(NULL==readsize || NULL==data || NULL==fname || NULL==mode){ 00269 return edk_FAILED; 00270 } 00271 fp = fopen( fname , mode ) ;//rb 00272 if(fp==NULL)return edk_FAILED; 00273 *readsize = fread( data , 1 , size , fp ) ; 00274 //fread( data , sizeof(size) , 1 , fp ) ; 00275 fclose( fp ) ; 00276 00277 return edk_SUCCEEDED; 00278 00279 } |
|
テキストデータをメモリに読み込む。dkcSaveText()と対
dkcOSIndependent.c の 415 行で定義されています。 参照先 dkcLoadFile().
00415 { 00416 return dkcLoadFile(text,length,fname,"rt",readsize); 00417 } |
|
dkcOSIndependent.c の 526 行で定義されています。 参照先 DKC_INLINE, dkcmNOT_ASSERT, と LONGLONG.
00526 { 00527 LONG *o = (LONG *)&src; 00528 dkcmNOT_ASSERT(sizeof(LONG) * 2 != sizeof(LONGLONG)); 00529 *high = o[0]; 00530 *low = o[1]; 00531 } |
|
dkcOSIndependent.c の 194 行で定義されています。 参照先 dkcReallocateEx(). 参照元 dkcBufferResize(), dkcMemoryStreamAutoExpandResize(), dkcMemoryStreamResize(), dkcQueueDynamicPush(), dkcSingleListSetBuffer(), と dkcStackDynamicPush().
00196 { 00197 return dkcReallocateEx(realloc,NewPtr,NewSize,OldPtr); 00198 } |
|
dkcOSIndependent.c の 225 行で定義されています。 参照先 DKC_REALLOC_F_TYPE, dkcReallocateSizeFunction(), edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, と NULL.
00229 { 00230 void *ptr = NULL; 00231 size_t want_size = OldSize / 8; 00232 size_t ra_size = dkcReallocateSizeFunction(OldSize, 00233 (want_size <= 20) ? 20 : want_size 00234 ); 00235 size_t div = 8; 00236 size_t tmp_ra = ra_size / div; 00237 size_t i; 00238 if(NULL== your_realloc /*|| NULL==*NewPtr*/ || NULL == *OldPtr || 00239 0==OldSize || NULL==reallocated_size 00240 ){ 00241 return edk_ArgumentException;//アホ引数入れるな!! 00242 } 00243 00244 for(i=0;i<div;i++){ 00245 ptr = your_realloc(*OldPtr,ra_size); 00246 if(NULL==ptr){ 00247 if(OldSize > (ra_size -= tmp_ra)){//とりあえずtmp_ra分を引く。 00248 break;//こら望みなしだわ 00249 } 00250 continue; 00251 }else{ 00252 break; 00253 } 00254 } 00255 if(NULL==ptr) return edk_FAILED; 00256 00257 //更新 00258 *NewPtr = ptr; 00259 *OldPtr = NULL; 00260 00261 *reallocated_size = ra_size; 00262 00263 return edk_SUCCEEDED; 00264 } |
|
edk_SUCCEEDEDだったら成功
dkcOSIndependent.c の 200 行で定義されています。 参照先 DKC_REALLOC_F_TYPE, edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, と NULL. 参照元 dkcReallocate().
00204 { 00205 void *ptr = NULL; 00206 00207 if(NULL== your_realloc /*|| NULL == *OldPtr || 00208 0==OldSize*/ 00209 ){ 00210 return edk_ArgumentException;//アホ引数入れるな!! 00211 } 00212 00213 ptr = your_realloc(*OldPtr,NewSize); 00214 if(NULL==ptr) return edk_FAILED; 00215 00216 //更新 00217 *OldPtr = NULL; 00218 *NewPtr = ptr; 00219 00220 return edk_SUCCEEDED; 00221 } |
|
dkcOSIndependent.c の 176 行で定義されています。 参照元 dkcMemoryStreamAutoExpandResize(), dkcQueueDynamicPush(), dkcReallocateAutoExpand(), と dkcStackDynamicPush().
00176 { 00177 //y=-25.43035 * pow(x,2) + 116.7214 00178 //y = -0.00000018 * pow(x,2) + 0.00019 00179 //y = -99.9999 * pow(OldSize,2) + 104857600; 00180 //y = 0.105263 * x * x + 10.52631 00181 //double x; 00182 // size_t size; 00183 if(OldSize <= 1024 * 5){//5KB以内なら2倍 00184 return OldSize * 2; 00185 }else if(OldSize >= 1024 * 1024 * 10 || 0==OldSize) 00186 {//10MB以上なら + ExpandSize 00187 return OldSize + ExpandSize; 00188 } 00189 //それ以外ならExpandSize * 3 00190 return OldSize + ExpandSize * 3; 00191 //return OldSize * 2;//ひでぇ関数だ。 00192 } |
|
endian change 16 bit version
dkcOSIndependent.c の 635 行で定義されています。 参照先 DKC_INLINE. 参照元 dkcStreamProcess16().
00635 {
00636 return (USHORT)((x >> 8) | (x << 8));
00637 }
|
|
dkcOSIndependent.c の 639 行で定義されています。 参照先 DKC_INLINE, と DWORD.
00639 {
00640 return (x << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | (x >> 24);
00641 }
|
|
General Function Library Copyright (C) 2000,2001 SYN All Rights Reserved.より.
dkcOSIndependent.c の 643 行で定義されています。 参照先 DKC_INLINE, dkcReverseEndian32(), DWORD, と ULONGLONG. 参照元 dkcStreamProcess64(), GetHeader(), HeaderWrite(), と ReverseEndianQWORD().
00643 { 00644 00645 return ( 00646 (ULONGLONG)dkcReverseEndian32((DWORD)(x & 0x00000000ffffffff)) << 32) 00647 | 00648 dkcReverseEndian32((DWORD)(x >> 32) 00649 ); 00650 00651 } |
|
dkcOSIndependent.c の 900 行で定義されています。 参照先 dkcRotateShiftRightMemoryLogic(), DKUTIL_SUCCEEDED, edk_FAILED, edk_OutOfMemory, edk_SUCCEEDED, と NULL.
00900 { 00901 //size_t i = 0; 00902 void *pd = NULL; 00903 int r = edk_FAILED; 00904 00905 pd = malloc(num); 00906 if(NULL==pd){ 00907 return edk_OutOfMemory; 00908 } 00909 if(DKUTIL_SUCCEEDED(dkcRotateShiftRightMemoryLogic(d,size,num,pd,num))){ 00910 r = edk_SUCCEEDED; 00911 } 00912 00913 free(pd); 00914 00915 return r; 00916 00917 } |
|
dkcOSIndependent.c の 878 行で定義されています。 参照先 BYTE, DKC_INLINE, edk_FAILED, と edk_SUCCEEDED. 参照元 dkcRotateShiftRightMemory().
00879 { 00880 BYTE *dest = (BYTE *)d; 00881 size_t temp; 00882 00883 if(n > worksize){ 00884 return edk_FAILED; 00885 } 00886 for(;;){ 00887 if(n < size){ 00888 break; 00889 } 00890 n -= size; 00891 } 00892 temp = size - n; 00893 memcpy(workbuff,dest + temp,n); 00894 memmove(dest + n,dest,temp); 00895 memcpy(dest,workbuff,n); 00896 return edk_SUCCEEDED; 00897 00898 } |
|
fopenのファイル関数を使ってバイナリセーブを行う。
dkcOSIndependent.c の 395 行で定義されています。 参照先 dkcSaveFile(). 参照元 dkcCircularStreamDump(), dkcFileCopyEx(), と dkcFreeSerialize().
00395 {//="wb" 00396 return dkcSaveFile(data,size,fname,"wb"); 00397 } |
|
dkcOSIndependent.c の 280 行で定義されています。 参照先 edk_FAILED, edk_SUCCEEDED, と NULL. 参照元 dkcSaveBinary(), と dkcSaveText().
00281 { 00282 FILE *fp; 00283 if(NULL==fname || NULL==mode){ 00284 return edk_FAILED; 00285 } 00286 fp = fopen( fname , mode ) ;//wb 00287 if(fp==NULL) return edk_FAILED; 00288 fwrite( data , size , 1 , fp ) ; 00289 //fwrite( data , sizeof(size) , 1 , fp ) ; 00290 fclose( fp ) ; 00291 return edk_SUCCEEDED; 00292 } |
|
fopenでテキストセーブを行う
dkcOSIndependent.c の 412 行で定義されています。 参照先 dkcSaveFile().
00412 { 00413 return dkcSaveFile(text,length,fname,"wt"); 00414 } |
|
いわいるセレクト(選択)アルゴリズム n:配列の再台数 k:調べたい番号(小さいうちから)
dkcOSIndependent.c の 685 行で定義されています。 参照先 DKC_COMPARE_TYPE, dkcSwapFast(), edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, get_offset(), と NULL. 参照元 dkcSelectMax(), と dkcSelectMin().
00686 { 00687 00688 int i,j,left, right; 00689 00690 void *x = malloc(width); 00691 void *a = malloc(n * width); 00692 if(NULL==x || NULL==a){ 00693 return edk_ArgumentException; 00694 } 00695 if(n > INT_MAX){ 00696 return edk_FAILED; 00697 } 00698 00699 00700 memcpy(a,a_src,width * n); 00701 00702 00703 left = 0; right = n - 1; 00704 00705 while (left < right) 00706 { 00707 00708 memcpy(x, (const void *)get_offset(a,k * width),width); 00709 i = left; 00710 j = right; 00711 00712 for ( ; ; ) { 00713 00714 while( less(get_offset(a,i * width),x) > 0){ 00715 //while( *(int *)get_offset(a,i * width) < *(int *)x){ 00716 i++; 00717 } 00718 00719 while( less(x,get_offset(a,j * width)) > 0){ 00720 //while( *(int *)x < *(int *)get_offset(a,j * width) ){ 00721 j--; 00722 } 00723 00724 if (i > j){ 00725 break; 00726 } 00727 00728 00729 dkcSwapFast( 00730 get_offset(a,i * width), 00731 get_offset(a,j * width), 00732 width 00733 ); 00734 00735 i++; 00736 j--; 00737 } 00738 if (j < k){ 00739 left = i; 00740 } 00741 if (k < i){ 00742 right = j; 00743 } 00744 } 00745 00746 //ゲットする 00747 { 00748 //printf("%d",*(int *)get_offset(a,k * width)); 00749 00750 memcpy(dest,(const void *)get_offset(a,k * width),width); 00751 00752 } 00753 free(x); 00754 free(a); 00755 00756 return edk_SUCCEEDED; 00757 00758 } |
|
最大値を選択する
dkcOSIndependent.c の 761 行で定義されています。 参照先 DKC_COMPARE_TYPE, DKC_INLINE, dkcSelect(), と edk_FAILED.
00761 { 00762 if(n-1 > INT_MAX){ 00763 return edk_FAILED; 00764 } 00765 return dkcSelect(a,a_src,n,(int)n-1,width,less); 00766 } |
|
最小値を選択する
dkcOSIndependent.c の 767 行で定義されています。 参照先 DKC_COMPARE_TYPE, DKC_INLINE, と dkcSelect().
00767 { 00768 return dkcSelect(a,a_src,n,(int)0,width,less); 00769 } |
|
演算でSwapさせる。SWAP_NUM()マクロを参照。 dkcOSIndependent.c の 504 行で定義されています。 参照先 dkcSwap64(), と ULONGLONG. 参照元 dkcBubbleSort(), dkcCombSort(), と dkcShellSort().
00505 { 00506 dkcSwap64((ULONGLONG *)p1,(ULONGLONG *)p2,size); 00507 } |
|
dkcOSIndependent.c の 469 行で定義されています。 参照先 BYTE, SWAP_NUM, と ULONGLONG. 参照元 dkcSwap().
00469 { 00470 size_t i; 00471 BYTE buf; 00472 size_t mod_ = size % sizeof(ULONGLONG); 00473 size_t cnt = size / sizeof(ULONGLONG); 00474 //char *tp1 = (char *)p1,*tp2 = (char *)p2; 00475 for(i=0;i<cnt;i++){ 00476 SWAP_NUM(p1[i],p2[i]); 00477 } 00478 for(i=0;i<mod_;i++){ 00479 00480 //SWAP_NUM((char)tp1[size - mod_ + 1],(char)tp2[size - mod_ + i]); 00481 /*a = b - a ;\ 00482 b -= a ;\ 00483 a += b 00484 */ 00485 /*( ( ((char *) p2)[size - mod_ + i])) 00486 = (char)( ( ((char *) p2)[size - mod_ + i])) - 00487 (char)( ( ((char *) p1)[size - mod_ + i])); 00488 00489 ( ( ((char *) p2)[size - mod_ + i])) -= ( ( ((char *) p1)[size - mod_ + i])); 00490 00491 ( ( ((char *) p1)[size - mod_ + i])) += ( ( ((char *) p2)[size - mod_ + i])); 00492 */ 00493 00494 00495 buf = (((BYTE *)p1)[size - mod_ + i]); 00496 (((BYTE *)p1)[size - mod_ + i]) = 00497 (((BYTE *)p2)[size - mod_ + i]) ; 00498 (((BYTE *)p2)[size - mod_ + i]) = buf; 00499 00500 } 00501 00502 } |
|
どんな方法でもいいからともかく速くSwapさせる。
dkcOSIndependent.c の 419 行で定義されています。 参照先 dkcmNOT_ASSERT, と NULL. 参照元 dkcSelect().
00420 { 00421 void *p = malloc(size); 00422 dkcmNOT_ASSERT(NULL==p); 00423 memcpy(p,p1,size); 00424 memcpy(p1,p2,size); 00425 memcpy(p2,p,size); 00426 free(p); 00427 } |
|
dkcOSIndependent.c の 511 行で定義されています。 参照先 DKC_INLINE, と ULONGLONG.
00511 { 00512 //*dest = (ULONGLONG)((high << 32) + low); 00513 *dest = (ULONGLONG)high << 32; 00514 *dest += low; 00515 //( high * MAXDWORD ) + low; 00516 } |
|
dkcOSIndependent.c の 533 行で定義されています。 参照先 DKC_INLINE, と LONGLONG.
00533 { 00534 //*dest = (ULONGLONG)((high << 32) + low); 00535 *dest = (LONGLONG)high << 32; 00536 *dest += low; 00537 00538 } |
|
dkcOSIndependent.c の 518 行で定義されています。 参照先 DKC_INLINE, dkcmNOT_ASSERT, DWORD, と ULONGLONG.
00518 { 00519 DWORD *o = (DWORD *)&src; 00520 dkcmNOT_ASSERT(sizeof(DWORD) * 2 != sizeof(ULONGLONG)); 00521 //エンディアン問題をどうにかしよう! 00522 *dhigh = o[0]; 00523 *dlow = o[1]; 00524 } |
|
dkcOSIndependent.c の 674 行で定義されています。 参照先 BYTE. 参照元 dkcSelect().
|