メインページ | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcOSIndependent.c

#include "dkcOSIndependent.h"
#include "dkcDefined.h"
#include <assert.h>
#include <math.h>

dkcOSIndependent.cのインクルード依存関係図

Include dependency graph

ソースコードを見る。

関数

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)


説明

d金魚 @

dkcOSIndependent.c で定義されています。


関数

void* dkcAllocate size_t  size  ) 
 

dkcOSIndependent.c108 行で定義されています。

参照先 NULL.

参照元 dkcAllocArcfour(), dkcAllocBlowfish(), dkcAllocBuffer(), dkcAllocCircularMemoryStream(), dkcAllocDeque(), dkcAllocDeserialize(), dkcAllocFindFile(), dkcAllocLZSS(), dkcAllocMD5(), dkcAllocMemoryStream(), dkcAllocNewCircularStream(), dkcAllocPathString(), dkcAllocQueue(), dkcAllocSerialize(), dkcAllocSHA1(), dkcAllocSHA256(), dkcAllocSHA384(), dkcAllocSHA512(), dkcAllocSingleList(), dkcAllocSingleListObject(), dkcAllocStack(), dkcAllocStream(), dkcAllocString(), dkcAllocUniqueID(), dkcCircularStreamDump(), dkcDistCountSortChar(), dkcDistCountSortInt(), dkcDistCountSortShort(), dkcLoadLibrary(), dkcNewSingleList(), と dkcOpenFileWithSignature().

00108                               {
00109     void *ptr;
00110     ptr = malloc(size);
00111     if(NULL==ptr) return NULL;
00112     memset(ptr,0,size);
00113     return ptr;
00114 }

void WINAPI dkcCheckMemoryLeak BOOL  flag  ) 
 

dkcOSIndependent.c524 行で定義されています。

参照先 BOOL.

00524                                          {
00525 
00526 }

BOOL WINAPI dkcCreateEmptyFile const char *  filename  ) 
 

空ファイルを作る。

dkcOSIndependent.c381 行で定義されています。

参照先 BOOL, FALSE, NULL, と TRUE.

参照元 dkcFileCopyEx().

00381                                                     {
00382     FILE *fp;
00383     fp = fopen( filename , "wb" ) ;//wb
00384     if(fp==NULL) return FALSE;
00385     fclose( fp ) ;
00386     return TRUE;
00387 }

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

戻り値:
almost TRUE(1)

dkcOSIndependent.c28 行で定義されています。

参照先 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 }

DKC_EXTERN int WINAPI dkcFClose FILE **  ptr  ) 
 

fcloseのラッパー

dkcOSIndependent.c281 行で定義されています。

参照先 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 }

DKC_EXTERN FILE* WINAPI dkcFOpen const char *  filename,
const char *  mode
 

fopenのラッパー

dkcOSIndependent.c277 行で定義されています。

参照先 DKC_EXTERN.

参照元 dkcAllocStream(), dkcFileCopyEx(), dkcNewCircularStreamForFile(), と GetHeader().

00277                                                                         {
00278     return fopen(filename,mode);
00279 }

DKC_EXTERN size_t WINAPI dkcFReadAll void *  buffer,
size_t  size,
FILE *  fp
 

freadの全部責任持って読み込みますバージョン。(読み込めない場合はEOFかerror)

dkcOSIndependent.c287 行で定義されています。

参照先 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 }

int dkcFree void **  p  ) 
 

dkcOSIndependent.c115 行で定義されています。

参照先 edk_FAILED, edk_SUCCEEDED, と NULL.

参照元 dkcAllocBuffer(), dkcAllocCircularMemoryStream(), dkcAllocDeque(), dkcAllocDeserialize(), dkcAllocMemoryStream(), dkcAllocNewCircularStream(), dkcAllocPathString(), dkcAllocQueue(), dkcAllocSerialize(), dkcAllocSingleList(), dkcAllocSingleListObject(), dkcAllocStack(), dkcAllocStream(), dkcAllocString(), dkcAllocUniqueID(), dkcCloseFileWithSignature(), dkcDeleteCircularStream(), dkcDistCountSortChar(), dkcDistCountSortInt(), dkcDistCountSortShort(), dkcFreeArcfour(), dkcFreeBlowfish(), dkcFreeBuffer(), dkcFreeCircularMemoryStream(), dkcFreeDeleteCircularStream(), dkcFreeDeque(), dkcFreeDeserialize(), dkcFreeFindFile(), dkcFreeLZSS(), dkcFreeMD5(), dkcFreeMemoryStream(), dkcFreePathString(), dkcFreeQueue(), dkcFreeSerialize(), dkcFreeSHA1(), dkcFreeSHA256(), dkcFreeSHA384(), dkcFreeSHA512(), dkcFreeSingleListObject(), dkcFreeStack(), dkcFreeStream(), dkcFreeString(), dkcFreeUniqueID(), dkcLoadLibrary(), dkcOpenFileWithSignature(), dkcSingleListErase(), と dkcUnloadLibrary().

00115                      {
00116     if(!*p) return edk_FAILED;
00117     free(*p);
00118     *p = NULL;
00119     return edk_SUCCEEDED;
00120 }

DKC_EXTERN size_t WINAPI dkcFWriteAll void *  buffer,
size_t  size,
FILE *  fp
 

dkcFReadAll() dkcFReadAllのfwrite版

dkcOSIndependent.c331 行で定義されています。

参照先 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 }

const char* WINAPI dkcGetPathSep  ) 
 

path separatorの入った文字列(1byte毎にpath separatorの文字定数が入っている)をゲット

dkcOSIndependent.c529 行で定義されています。

参照先 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 }

BOOL dkcIs_foepn_mode const char *  s  ) 
 

fopenの時の第二引数が有効な値かどうか調べる。

dkcOSIndependent.c121 行で定義されています。

参照先 BOOL, FALSE, と TRUE.

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 }

DKC_INLINE BOOL dkcIsLittleEndian  ) 
 

little endian ならTRUE

dkcOSIndependent.c593 行で定義されています。

参照先 BOOL, と DKC_INLINE.

参照元 dkcOpenFileWithSignature(), GetHeader(), HeaderWrite(), と SetStreamInfo().

00593                                     {
00594     int x=1;
00595     return (BOOL)((*(char*)&x));
00596 }

BOOL WINAPI dkcIsMMX void   ) 
 

MMXが使えるならTRUE.

dkcOSIndependent.c570 行で定義されています。

参照先 BOOL, と FALSE.

参照元 CheckMMX().

00570                           {
00571   return FALSE;
00572 }

int WINAPI dkcIsNativePathString const char *  s,
size_t  size
 

FALSEならNativeなファイルパスではない。.

dkcOSIndependent.c14 行で定義されています。

参照先 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 }

int WINAPI dkcLoadBinary void *  data,
size_t  size,
const char *  fname,
size_t *  readsize
 

バイナリデータをメモリに読み込む。dkcSaveBinary()と対

dkcOSIndependent.c390 行で定義されています。

参照先 dkcLoadFile().

参照元 dkcAllocDeserialize(), と dkcFileCopyEx().

00390                                                                                    {//="rb"
00391     return dkcLoadFile(data,size,fname,"rb",readsize);
00392 }

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

dkcOSIndependent.c248 行で定義されています。

参照先 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 }

int WINAPI dkcLoadText char *  text,
size_t  length,
const char *  fname,
size_t *  readsize
 

テキストデータをメモリに読み込む。dkcSaveText()と対

dkcOSIndependent.c397 行で定義されています。

参照先 dkcLoadFile().

00397                                                                                    {
00398     return dkcLoadFile(text,length,fname,"rt",readsize);
00399 }

int WINAPI dkcReallocate void **  NewPtr,
size_t  NewSize,
void **  OldPtr
 

dkcOSIndependent.c176 行で定義されています。

参照先 dkcReallocateEx().

参照元 dkcBufferResize(), dkcMemoryStreamAutoExpandResize(), dkcMemoryStreamResize(), dkcQueueDynamicPush(), dkcSingleListSetBuffer(), と dkcStackDynamicPush().

00178 {
00179     return dkcReallocateEx(realloc,NewPtr,NewSize,OldPtr);
00180 }

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.c207 行で定義されています。

参照先 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 }

int WINAPI dkcReallocateEx DKC_REALLOC_F_TYPE  your_realloc,
void **  NewPtr,
size_t  NewSize,
void **  OldPtr
 

edk_SUCCEEDEDだったら成功

引数:
your_realloc[in] reallocする関数
NewPtr[out] 新しいメモリ空間アドレス
NewSize[in] 新しいメモリ空間アドレスのサイズ。
OldPtr[in][out] 古いメモリ空間アドレス。関数が成功すると、OldPtrは無効になる
OldSize[in] OldPtrのサイズ

dkcOSIndependent.c182 行で定義されています。

参照先 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 }

size_t dkcReallocateSizeFunction size_t  OldSize,
size_t  ExpandSize
 

dkcOSIndependent.c158 行で定義されています。

参照元 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 }

DKC_INLINE USHORT dkcReverseEndian16 USHORT  x  ) 
 

endian change 16 bit version

dkcOSIndependent.c576 行で定義されています。

参照先 DKC_INLINE.

参照元 dkcStreamProcess16().

00576                                               {
00577     return (USHORT)((x >> 8) | (x << 8));
00578 }

DKC_INLINE DWORD dkcReverseEndian32 DWORD  x  ) 
 

dkcOSIndependent.c580 行で定義されています。

参照先 DKC_INLINE, と DWORD.

00580                                             {
00581     return (x << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | (x >> 24);
00582 }

DKC_INLINE ULONGLONG dkcReverseEndian64 ULONGLONG  x  ) 
 

General Function Library Copyright (C) 2000,2001 SYN All Rights Reserved.より.

dkcOSIndependent.c584 行で定義されています。

参照先 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 }

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

fopenのファイル関数を使ってバイナリセーブを行う。

dkcOSIndependent.c377 行で定義されています。

参照先 dkcSaveFile().

参照元 dkcCircularStreamDump(), dkcFileCopyEx(), と dkcFreeSerialize().

00377                                                                         {//="wb"
00378     return dkcSaveFile(data,size,fname,"wb");
00379 }

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

dkcOSIndependent.c262 行で定義されています。

参照先 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 }

int WINAPI dkcSaveText const char *  text,
size_t  length,
const char *  fname
 

fopenでテキストセーブを行う

dkcOSIndependent.c394 行で定義されています。

参照先 dkcSaveFile().

00394                                                                         {
00395     return dkcSaveFile(text,length,fname,"wt");
00396 }

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.c610 行で定義されています。

参照先 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 }

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

最大値を選択する

参照:
dkcSelect() の 引数kが無いだけ

dkcOSIndependent.c686 行で定義されています。

参照先 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 }

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

最小値を選択する

参照:
dkcSelect() の 引数kが無いだけ

dkcOSIndependent.c692 行で定義されています。

参照先 DKC_COMPARE_TYPE, DKC_INLINE, と dkcSelect().

00692                                                                                                            {
00693     return dkcSelect(a,a_src,n,(int)0,width,less);
00694 }

void WINAPI dkcSwap void *  p1,
void *  p2,
size_t  size
 

演算でSwapさせる。SWAP_NUM()マクロを参照。

dkcOSIndependent.c486 行で定義されています。

参照先 dkcSwap64(), と ULONGLONG.

参照元 dkcBubbleSort(), dkcCombSort(), と dkcShellSort().

00487 {
00488     dkcSwap64((ULONGLONG *)p1,(ULONGLONG *)p2,size);
00489 }

void WINAPI dkcSwap64 ULONGLONG *  p1,
ULONGLONG *  p2,
size_t  size
 

引数:
p1[in] ULONGLONG *のバッファへのポインタ
p2[in] ULONGLONG *のバッファへのポインタ
size[in] p1,p2バッファのサイズ
覚え書き:
p1,p2共にULONGLONG *に強制型キャストしてください。

dkcOSIndependent.c451 行で定義されています。

参照先 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 }

void WINAPI dkcSwapFast void *  p1,
void *  p2,
size_t  size
 

どんな方法でもいいからともかく速くSwapさせる。

覚え書き:
size分のメモリを動的確保してスワップします。

dkcOSIndependent.c401 行で定義されています。

参照先 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 }

void WINAPI dkcTwoDWORDToULONGLONG ULONGLONG *  dest,
DWORD  high,
DWORD  low
 

dkcOSIndependent.c493 行で定義されています。

参照先 ULONGLONG.

00493                                                                         {
00494     //*dest = (ULONGLONG)((high << 32) + low);
00495     *dest = (ULONGLONG)high << 32;
00496     *dest += low;
00497         //( high * MAXDWORD ) + low;
00498 }

void WINAPI dkcULONGLONGToTwoDWORD DWORD *  dhigh,
DWORD *  dlow,
ULONGLONG  src
 

dkcOSIndependent.c500 行で定義されています。

参照先 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 }

void* get_offset void *  p,
size_t  offset
[static]
 

dkcOSIndependent.c599 行で定義されています。

参照先 BYTE.

参照元 dkcSelect().

00599                                               {
00600     BYTE *oo = (BYTE *)p;
00601     
00602     return (void *)&(oo[offset]);
00603 }


dkutil_cに対してSun Jul 18 22:45:52 2004に生成されました。 doxygen 1.3.6