#include "dkcOSIndependent.h"#include "dkcDefined.h"#include <assert.h>#include <math.h>dkcOSIndependent.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,...) |
| void * | dkcAllocate (size_t size) |
| 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) |
| void WINAPI | dkcTwoDWORDToULONGLONG (ULONGLONG *dest, DWORD high, DWORD low) |
| void WINAPI | dkcULONGLONGToTwoDWORD (DWORD *dhigh, DWORD *dlow, ULONGLONG src) |
| 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 | |
| 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) |
dkcOSIndependent.c で定義されています。
|
|
|
dkcOSIndependent.c の 524 行で定義されています。 参照先 BOOL.
00524 {
00525
00526 }
|
|
|
空ファイルを作る。
dkcOSIndependent.c の 381 行で定義されています。 参照先 BOOL, FALSE, NULL, と TRUE. 参照元 dkcFileCopyEx().
|
|
||||||||||||||||||||||||
|
dkcOSIndependent.c の 28 行で定義されています。 参照先 edk_FAILED, MB, NULL, NULL_CHAR_ARRAY, ODS, SET_VA_LIST_C, と TRUE.
00030 {
00031 char s[1024];
00032 char ss[1024 * 2];
00033
00034 int va_list_result;
00035 va_list Valist;
00036
00037 NULL_CHAR_ARRAY(s);
00038 NULL_CHAR_ARRAY(ss);
00039
00040 if(message){
00041 SET_VA_LIST_C(Valist,va_list_result,s,sizeof(s),message);
00042 }else{
00043 //SET_VA_LIST(s,sizeof(s),"No message");
00044 _snprintf(s,sizeof(s),"No message\n");
00045 }
00046
00047 _snprintf(ss,sizeof(ss),
00048 "DKUTIL_ASSERT(%s):\nfile:%s / \n line:%d / \n message: %s",
00049 expression,filename,line,s);
00050
00051
00052
00053 #ifdef NDEBUG//release
00054 # ifdef WIN32
00055 ODS(ss);
00056 //::MessageBox(NULL,ss,"ERROR ASSERTION !!",MB_OK);
00057 {
00058 LPCTSTR name="ERROR_TEMP.txt";
00059 {
00060 //ファイルをオープン
00061 FILE *fp;
00062 if(NULL != (fp = fopen( name , "at" ))){
00063
00064 // エラーログファイルに書き出す
00065 fputs( ss , fp ) ;
00066 fclose( fp ) ;
00067 }
00068 }
00069 ShellExecute(NULL, "open",name, NULL, NULL, SW_SHOWNORMAL);
00070 DeleteFile(name);
00071 }
00072 MB("このテキストをこのソフトの開発者に渡せば、バグ発見の近道なります。\n \
00073 開発者に知らせるときはこのテキストを転記してあげましょう。");
00074 if(IDYES==MessageBox(NULL,
00075 "このままこのソフトを起動しつづけると、更なるエラーが発生する可能性があります。\n終了しますか?",
00076 "あってはいけない エラー!!!",
00077 MB_YESNO))
00078 {
00079 exit(edk_FAILED);
00080 //terminate();
00081 }else{
00082 }
00083 # else //else of win32
00084
00085 fprintf(stderr,ss);
00086 exit(edk_FAILED);
00087
00088 # endif //end of win32
00089
00090 #else //debug
00091
00092 # ifdef WIN32
00093 ODS(ss);
00094 fprintf(stderr,ss);
00095 //_CrtDebugBreak();
00096 DebugBreak();
00097 # else //else of win32
00098
00099 fprintf(stderr,ss);
00100 Debugger();
00101
00102 # endif //end of win32
00103 #endif//end of NDEBUG
00104 //assert(ss);
00105
00106 return TRUE;
00107 }
|
|
|
fcloseのラッパー
dkcOSIndependent.c の 281 行で定義されています。 参照先 DKC_EXTERN, edk_ArgumentException, edk_SUCCEEDED, と NULL. 参照元 dkcDeleteCircularStream(), dkcFileCopyEx(), dkcFreeStream(), と GetHeader().
00281 {
00282 if(NULL==ptr || NULL==*ptr) return edk_ArgumentException;
00283 fclose(*ptr);
00284 *ptr = NULL;
00285 return edk_SUCCEEDED;
00286 }
|
|
||||||||||||
|
fopenのラッパー
dkcOSIndependent.c の 277 行で定義されています。 参照先 DKC_EXTERN. 参照元 dkcAllocStream(), dkcFileCopyEx(), dkcNewCircularStreamForFile(), と GetHeader().
00277 {
00278 return fopen(filename,mode);
00279 }
|
|
||||||||||||||||
|
freadの全部責任持って読み込みますバージョン。(読み込めない場合はEOFかerror)
dkcOSIndependent.c の 287 行で定義されています。 参照先 BYTE, DKC_EXTERN, と dkcmNOT_ASSERT. 参照元 GetHeader().
00288 {
00289 size_t count;
00290 size_t tc,tsize;
00291 BYTE *tbuffer;
00292
00293 //read size
00294 tsize = size;
00295 //temp variable
00296 tc = 0;
00297 //offset counter
00298 count = 0;
00299 //byte type pointer
00300 tbuffer = (BYTE *)buffer;
00301 for(;;)
00302 {
00303 //error check
00304 if(ferror(fp) ){
00305 break;
00306 }
00307 if(feof(fp)){
00308 break;
00309 }
00310 //read
00311 tc = fread(&tbuffer[count],1,tsize,fp);
00312 //update
00313 tsize -= tc;
00314 count += tc;
00315
00316 if(count == size){
00317 break;
00318 }
00319 # ifdef DEBUG
00320 //ありえないエラーチェック
00321 dkcmNOT_ASSERT(count > size);
00322 # else
00323 if(count > size){
00324 break;
00325 }
00326 # endif
00327 }
00328 return count;
00329 }
|
|
|
||||||||||||||||
|
dkcFReadAll() dkcFReadAllのfwrite版
dkcOSIndependent.c の 331 行で定義されています。 参照先 BYTE, DKC_EXTERN, と dkcmNOT_ASSERT.
00331 {
00332 size_t count;
00333 size_t tc,tsize;
00334 BYTE *tbuffer;
00335
00336 //read size
00337 tsize = size;
00338 //temp variable
00339 tc = 0;
00340 //offset counter
00341 count = 0;
00342 //byte type pointer
00343 tbuffer = (BYTE *)buffer;
00344 for(;;)
00345 {
00346 //error check
00347 if(ferror(fp) ){
00348 break;
00349 }
00350 if(feof(fp)){
00351 break;
00352 }
00353 //read
00354 tc = fwrite(&tbuffer[count],1,tsize,fp);
00355 //update
00356 tsize -= tc;
00357 count += tc;
00358
00359 if(count == size){
00360 break;
00361 }
00362 # ifdef DEBUG
00363 //ありえないエラーチェック
00364 dkcmNOT_ASSERT(count > size);
00365 # else
00366 if(count > size){
00367 break;
00368 }
00369 # endif
00370 }
00371 return count;
00372
00373 }
|
|
|
path separatorの入った文字列(1byte毎にpath separatorの文字定数が入っている)をゲット
dkcOSIndependent.c の 529 行で定義されています。 参照先 dkcdPATH_SEP. 参照元 dkcSJIS_SearchPathSep(), と dkcSJIS_SearchPathSepLast().
00529 {
00530 #ifdef WIN32
00531 static char target[3]={dkcdPATH_SEP,'/','\0'};
00532 #else
00533 static char target[3]={dkcdPATH_SEP,'\0'};
00534 #endif
00535 return target;
00536 }
|
|
|
fopenの時の第二引数が有効な値かどうか調べる。
dkcOSIndependent.c の 121 行で定義されています。
00121 {
00122 /* wrtb+ */
00123 const char *ms= "wrtb+";
00124 size_t slen = strlen(s);
00125 size_t mslen = strlen(ms);
00126 size_t i,j;
00127 int flag = FALSE;
00128 for(i=0;i<slen;i++){
00129 for(j=0;j<mslen;j++){
00130 if(ms[j]==s[i]){
00131 flag = TRUE;
00132 break;
00133 }
00134 }
00135 if(TRUE!=flag){
00136 return FALSE;
00137 }else{
00138 flag = FALSE;
00139 }
00140 }
00141 return TRUE;
00142 }
|
|
|
little endian ならTRUE
dkcOSIndependent.c の 593 行で定義されています。 参照先 BOOL, と DKC_INLINE. 参照元 dkcOpenFileWithSignature(), GetHeader(), HeaderWrite(), と SetStreamInfo().
00593 {
00594 int x=1;
00595 return (BOOL)((*(char*)&x));
00596 }
|
|
|
MMXが使えるならTRUE.
dkcOSIndependent.c の 570 行で定義されています。 参照元 CheckMMX().
00570 {
00571 return FALSE;
00572 }
|
|
||||||||||||
|
FALSEならNativeなファイルパスではない。.
dkcOSIndependent.c の 14 行で定義されています。 参照先 dkcmIS_INVALID_PATH_CHAR, edk_FAILED, FALSE, NULL, と TRUE. 参照元 dkcAllocPathString(), dkcIsEffectivePath(), dkcPathStringElementInsert_Logic(), と dkcPathStringElementReplace_Logic().
00014 {
00015
00016 size_t i=0;
00017 if(s==NULL) return edk_FAILED;
00018 for(;i<size;i++){
00019 if(dkcmIS_INVALID_PATH_CHAR(s[i]))
00020 {
00021 return FALSE;
00022 }
00023 }
00024 return TRUE;
00025 }
|
|
||||||||||||||||||||
|
バイナリデータをメモリに読み込む。dkcSaveBinary()と対
dkcOSIndependent.c の 390 行で定義されています。 参照先 dkcLoadFile(). 参照元 dkcAllocDeserialize(), と dkcFileCopyEx().
00390 {//="rb"
00391 return dkcLoadFile(data,size,fname,"rb",readsize);
00392 }
|
|
||||||||||||||||||||||||
|
dkcOSIndependent.c の 248 行で定義されています。 参照先 edk_FAILED, edk_SUCCEEDED, と NULL. 参照元 dkcLoadBinary(), と dkcLoadText().
00248 {//="rb"
00249 FILE *fp ;
00250 if(NULL==readsize || NULL==data || NULL==fname || NULL==mode){
00251 return edk_FAILED;
00252 }
00253 fp = fopen( fname , mode ) ;//rb
00254 if(fp==NULL)return edk_FAILED;
00255 *readsize = fread( data , 1 , size , fp ) ;
00256 //fread( data , sizeof(size) , 1 , fp ) ;
00257 fclose( fp ) ;
00258
00259 return edk_SUCCEEDED;
00260
00261 }
|
|
||||||||||||||||||||
|
テキストデータをメモリに読み込む。dkcSaveText()と対
dkcOSIndependent.c の 397 行で定義されています。 参照先 dkcLoadFile().
00397 {
00398 return dkcLoadFile(text,length,fname,"rt",readsize);
00399 }
|
|
||||||||||||||||
|
dkcOSIndependent.c の 176 行で定義されています。 参照先 dkcReallocateEx(). 参照元 dkcBufferResize(), dkcMemoryStreamAutoExpandResize(), dkcMemoryStreamResize(), dkcQueueDynamicPush(), dkcSingleListSetBuffer(), と dkcStackDynamicPush().
00178 {
00179 return dkcReallocateEx(realloc,NewPtr,NewSize,OldPtr);
00180 }
|
|
||||||||||||||||||||||||
|
dkcOSIndependent.c の 207 行で定義されています。 参照先 DKC_REALLOC_F_TYPE, dkcReallocateSizeFunction(), edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, と NULL.
00211 {
00212 void *ptr = NULL;
00213 size_t want_size = OldSize / 8;
00214 size_t ra_size = dkcReallocateSizeFunction(OldSize,
00215 (want_size <= 20) ? 20 : want_size
00216 );
00217 size_t div = 8;
00218 size_t tmp_ra = ra_size / div;
00219 size_t i;
00220 if(NULL== your_realloc /*|| NULL==*NewPtr*/ || NULL == *OldPtr ||
00221 0==OldSize || NULL==reallocated_size
00222 ){
00223 return edk_ArgumentException;//アホ引数入れるな!!
00224 }
00225
00226 for(i=0;i<div;i++){
00227 ptr = your_realloc(*OldPtr,ra_size);
00228 if(NULL==ptr){
00229 if(OldSize > (ra_size -= tmp_ra)){//とりあえずtmp_ra分を引く。
00230 break;//こら望みなしだわ
00231 }
00232 continue;
00233 }else{
00234 break;
00235 }
00236 }
00237 if(NULL==ptr) return edk_FAILED;
00238
00239 //更新
00240 *NewPtr = ptr;
00241 *OldPtr = NULL;
00242
00243 *reallocated_size = ra_size;
00244
00245 return edk_SUCCEEDED;
00246 }
|
|
||||||||||||||||||||
|
edk_SUCCEEDEDだったら成功
dkcOSIndependent.c の 182 行で定義されています。 参照先 DKC_REALLOC_F_TYPE, edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, と NULL. 参照元 dkcReallocate().
00186 {
00187 void *ptr = NULL;
00188
00189 if(NULL== your_realloc /*|| NULL == *OldPtr ||
00190 0==OldSize*/
00191 ){
00192 return edk_ArgumentException;//アホ引数入れるな!!
00193 }
00194
00195 ptr = your_realloc(*OldPtr,NewSize);
00196 if(NULL==ptr) return edk_FAILED;
00197
00198 //更新
00199 *OldPtr = NULL;
00200 *NewPtr = ptr;
00201
00202 return edk_SUCCEEDED;
00203 }
|
|
||||||||||||
|
dkcOSIndependent.c の 158 行で定義されています。 参照元 dkcMemoryStreamAutoExpandResize(), dkcQueueDynamicPush(), dkcReallocateAutoExpand(), と dkcStackDynamicPush().
00158 {
00159 //y=-25.43035 * pow(x,2) + 116.7214
00160 //y = -0.00000018 * pow(x,2) + 0.00019
00161 //y = -99.9999 * pow(OldSize,2) + 104857600;
00162 //y = 0.105263 * x * x + 10.52631
00163 //double x;
00164 // size_t size;
00165 if(OldSize <= 1024 * 5){//5KB以内なら2倍
00166 return OldSize * 2;
00167 }else if(OldSize >= 1024 * 1024 * 10 || 0==OldSize)
00168 {//10MB以上なら + ExpandSize
00169 return OldSize + ExpandSize;
00170 }
00171 //それ以外ならExpandSize * 3
00172 return OldSize + ExpandSize * 3;
00173 //return OldSize * 2;//ひでぇ関数だ。
00174 }
|
|
|
endian change 16 bit version
dkcOSIndependent.c の 576 行で定義されています。 参照先 DKC_INLINE. 参照元 dkcStreamProcess16().
00576 {
00577 return (USHORT)((x >> 8) | (x << 8));
00578 }
|
|
|
dkcOSIndependent.c の 580 行で定義されています。 参照先 DKC_INLINE, と DWORD.
00580 {
00581 return (x << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | (x >> 24);
00582 }
|
|
|
General Function Library Copyright (C) 2000,2001 SYN All Rights Reserved.より.
dkcOSIndependent.c の 584 行で定義されています。 参照先 DKC_INLINE, dkcReverseEndian32(), DWORD, と ULONGLONG. 参照元 dkcStreamProcess64(), GetHeader(), HeaderWrite(), と ReverseEndianQWORD().
00584 {
00585
00586 return (
00587 (ULONGLONG)dkcReverseEndian32((DWORD)(x & 0x00000000ffffffff)) << 32)
00588 |
00589 dkcReverseEndian32((DWORD)(x >> 32)
00590 );
00591
00592 }
|
|
||||||||||||||||
|
fopenのファイル関数を使ってバイナリセーブを行う。
dkcOSIndependent.c の 377 行で定義されています。 参照先 dkcSaveFile(). 参照元 dkcCircularStreamDump(), dkcFileCopyEx(), と dkcFreeSerialize().
00377 {//="wb"
00378 return dkcSaveFile(data,size,fname,"wb");
00379 }
|
|
||||||||||||||||||||
|
dkcOSIndependent.c の 262 行で定義されています。 参照先 edk_FAILED, edk_SUCCEEDED, と NULL. 参照元 dkcSaveBinary(), と dkcSaveText().
00263 {
00264 FILE *fp;
00265 if(NULL==fname || NULL==mode){
00266 return edk_FAILED;
00267 }
00268 fp = fopen( fname , mode ) ;//wb
00269 if(fp==NULL) return edk_FAILED;
00270 fwrite( data , size , 1 , fp ) ;
00271 //fwrite( data , sizeof(size) , 1 , fp ) ;
00272 fclose( fp ) ;
00273 return edk_SUCCEEDED;
00274 }
|
|
||||||||||||||||
|
fopenでテキストセーブを行う
dkcOSIndependent.c の 394 行で定義されています。 参照先 dkcSaveFile().
00394 {
00395 return dkcSaveFile(text,length,fname,"wt");
00396 }
|
|
||||||||||||||||||||||||||||
|
いわいるセレクト(選択)アルゴリズム n:配列の再台数 k:調べたい番号(小さいうちから)
dkcOSIndependent.c の 610 行で定義されています。 参照先 DKC_COMPARE_TYPE, dkcSwapFast(), edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, get_offset(), と NULL. 参照元 dkcSelectMax(), と dkcSelectMin().
00611 {
00612
00613 int i,j,left, right;
00614
00615 void *x = malloc(width);
00616 void *a = malloc(n * width);
00617 if(NULL==x || NULL==a){
00618 return edk_ArgumentException;
00619 }
00620 if(n > INT_MAX){
00621 return edk_FAILED;
00622 }
00623
00624
00625 memcpy(a,a_src,width * n);
00626
00627
00628 left = 0; right = n - 1;
00629
00630 while (left < right)
00631 {
00632
00633 memcpy(x, (const void *)get_offset(a,k * width),width);
00634 i = left;
00635 j = right;
00636
00637 for ( ; ; ) {
00638
00639 while( less(get_offset(a,i * width),x) > 0){
00640 //while( *(int *)get_offset(a,i * width) < *(int *)x){
00641 i++;
00642 }
00643
00644 while( less(x,get_offset(a,j * width)) > 0){
00645 //while( *(int *)x < *(int *)get_offset(a,j * width) ){
00646 j--;
00647 }
00648
00649 if (i > j){
00650 break;
00651 }
00652
00653
00654 dkcSwapFast(
00655 get_offset(a,i * width),
00656 get_offset(a,j * width),
00657 width
00658 );
00659
00660 i++;
00661 j--;
00662 }
00663 if (j < k){
00664 left = i;
00665 }
00666 if (k < i){
00667 right = j;
00668 }
00669 }
00670
00671 //ゲットする
00672 {
00673 //printf("%d",*(int *)get_offset(a,k * width));
00674
00675 memcpy(dest,(const void *)get_offset(a,k * width),width);
00676
00677 }
00678 free(x);
00679 free(a);
00680
00681 return edk_SUCCEEDED;
00682
00683 }
|
|
||||||||||||||||||||||||
|
最大値を選択する
dkcOSIndependent.c の 686 行で定義されています。 参照先 DKC_COMPARE_TYPE, DKC_INLINE, dkcSelect(), と edk_FAILED.
00686 {
00687 if(n-1 > INT_MAX){
00688 return edk_FAILED;
00689 }
00690 return dkcSelect(a,a_src,n,(int)n-1,width,less);
00691 }
|
|
||||||||||||||||||||||||
|
最小値を選択する
dkcOSIndependent.c の 692 行で定義されています。 参照先 DKC_COMPARE_TYPE, DKC_INLINE, と dkcSelect().
00692 {
00693 return dkcSelect(a,a_src,n,(int)0,width,less);
00694 }
|
|
||||||||||||||||
|
演算でSwapさせる。SWAP_NUM()マクロを参照。 dkcOSIndependent.c の 486 行で定義されています。 参照先 dkcSwap64(), と ULONGLONG. 参照元 dkcBubbleSort(), dkcCombSort(), と dkcShellSort().
00487 {
00488 dkcSwap64((ULONGLONG *)p1,(ULONGLONG *)p2,size);
00489 }
|
|
||||||||||||||||
|
dkcOSIndependent.c の 451 行で定義されています。 参照先 BYTE, SWAP_NUM, と ULONGLONG. 参照元 dkcSwap().
00451 {
00452 size_t i;
00453 BYTE buf;
00454 size_t mod_ = size % sizeof(ULONGLONG);
00455 size_t cnt = size / sizeof(ULONGLONG);
00456 //char *tp1 = (char *)p1,*tp2 = (char *)p2;
00457 for(i=0;i<cnt;i++){
00458 SWAP_NUM(p1[i],p2[i]);
00459 }
00460 for(i=0;i<mod_;i++){
00461
00462 //SWAP_NUM((char)tp1[size - mod_ + 1],(char)tp2[size - mod_ + i]);
00463 /*a = b - a ;\
00464 b -= a ;\
00465 a += b
00466 */
00467 /*( ( ((char *) p2)[size - mod_ + i]))
00468 = (char)( ( ((char *) p2)[size - mod_ + i])) -
00469 (char)( ( ((char *) p1)[size - mod_ + i]));
00470
00471 ( ( ((char *) p2)[size - mod_ + i])) -= ( ( ((char *) p1)[size - mod_ + i]));
00472
00473 ( ( ((char *) p1)[size - mod_ + i])) += ( ( ((char *) p2)[size - mod_ + i]));
00474 */
00475
00476
00477 buf = (((BYTE *)p1)[size - mod_ + i]);
00478 (((BYTE *)p1)[size - mod_ + i]) =
00479 (((BYTE *)p2)[size - mod_ + i]) ;
00480 (((BYTE *)p2)[size - mod_ + i]) = buf;
00481
00482 }
00483
00484 }
|
|
||||||||||||||||
|
どんな方法でもいいからともかく速くSwapさせる。
dkcOSIndependent.c の 401 行で定義されています。 参照先 dkcmNOT_ASSERT, と NULL. 参照元 dkcSelect().
00402 {
00403 void *p = malloc(size);
00404 dkcmNOT_ASSERT(NULL==p);
00405 memcpy(p,p1,size);
00406 memcpy(p1,p2,size);
00407 memcpy(p2,p,size);
00408 free(p);
00409 }
|
|
||||||||||||||||
|
dkcOSIndependent.c の 493 行で定義されています。 参照先 ULONGLONG.
00493 {
00494 //*dest = (ULONGLONG)((high << 32) + low);
00495 *dest = (ULONGLONG)high << 32;
00496 *dest += low;
00497 //( high * MAXDWORD ) + low;
00498 }
|
|
||||||||||||||||
|
dkcOSIndependent.c の 500 行で定義されています。 参照先 dkcmNOT_ASSERT, DWORD, と ULONGLONG.
00500 {
00501 DWORD *o = (DWORD *)&src;
00502 dkcmNOT_ASSERT(sizeof(DWORD) * 2 != sizeof(ULONGLONG));
00503 //エンディアン問題をどうにかしよう!
00504 *dhigh = o[0];
00505 *dlow = o[1];
00506 }
|
|
||||||||||||
|
dkcOSIndependent.c の 599 行で定義されています。 参照先 BYTE. 参照元 dkcSelect().
|
1.3.6