メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcOSIndependent.c

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

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

Include dependency graph

ソースコードを見る。

マクロ定義

#define DKUTIL_C_OS_INDEPENDENT_C

関数

int dkcDynamicCheckEnvironment (BOOL isForceExit)
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 *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)
 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のファイル関数を使ってバイナリセーブを行う。 類似: dkcMemoryToFile()

BOOL WINAPI dkcCreateEmptyFile (const char *filename)
 空ファイルを作る。

int WINAPI dkcLoadBinary (void *data, size_t size, const char *fname, size_t *readsize)
 バイナリデータをメモリに読み込む。dkcSaveBinary()と対 類似: dkcFileToMemory()

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)
 flag[in] TRUEでチェックを有効

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型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。

DKC_INLINE size_t dkcNumOfBits (uint32 bits)
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)


説明

作者:
d金魚 @

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


マクロ定義

#define DKUTIL_C_OS_INDEPENDENT_C
 

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


関数

DKC_INLINE void* dkcAllocate size_t  size  ) 
 

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

参照先 dkcAllocateFill().

参照元 alloc_sameobjectpool(), dkcAlloc2TreeRoot(), dkcAllocArcfour(), dkcAllocArcfour2Byte(), dkcAllocArrayOneByOne(), dkcAllocBlowfish(), dkcAllocBuffer(), dkcAllocCircularMemoryStream(), dkcAllocCRC(), dkcAllocDeque(), dkcAllocDeserialize(), dkcAllocFindFile(), dkcAllocHC256(), dkcAllocHMAC(), dkcAllocLZSS(), dkcAllocMD5(), dkcAllocMemoryStream(), dkcAllocNewCircularStream(), dkcAllocPathString(), dkcAllocQueue(), dkcAllocReplace(), dkcAllocRijndael(), dkcAllocRijndaelDecrypt(), dkcAllocRijndaelEncrypt(), dkcAllocRLE(), dkcAllocSemiRealRandomFromGFS(), dkcAllocSemiRealRandomWin32(), dkcAllocSerialize(), dkcAllocSHA1(), dkcAllocSHA256(), dkcAllocSHA384(), dkcAllocSHA512(), dkcAllocSHO(), dkcAllocSingleList(), dkcAllocSingleListObject(), dkcAllocSNOW2(), dkcAllocStack(), dkcAllocStream(), dkcAllocString(), dkcAllocTaskEngine(), dkcAllocThreadLock(), dkcAllocUniqueID(), dkcCircularStreamDump(), dkcDistCountSortChar(), dkcDistCountSortInt(), dkcDistCountSortShort(), dkcLoadLibrary(), dkcNewSingleList(), と dkcOpenFileWithSignature().

00170                                          {
00171     return dkcAllocateFill(size,0); 
00172 /*void *ptr;
00173     ptr = dkcAllocateFast(size);
00174     if(NULL==ptr) return NULL;
00175     memset(ptr,0,size);
00176     return ptr;
00177     */
00178 }

DKC_INLINE void* dkcAllocateFast size_t  size  ) 
 

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

参照元 alloc_2tree_node(), dkcAllocateFill(), と dkcSameObjectPoolReserveFast().

00167                                              {
00168     return malloc(size);
00169 }

DKC_INLINE void* dkcAllocateFill size_t  size,
BYTE  fill
 

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

参照先 BYTE, dkcAllocateFast(), と NULL.

参照元 dkcAllocate().

00161                                                        {
00162     void *p = dkcAllocateFast(size);
00163     if(NULL==p) return NULL;
00164     memset(p,fill,size);
00165     return p;
00166 }

void WINAPI dkcCheckMemoryLeak BOOL  flag  ) 
 

flag[in] TRUEでチェックを有効

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

参照先 BOOL.

00631                                          {
00632 
00633 }

DKC_INLINE BOOL dkcCheckOverflowULONG ULONG  a1,
ULONG  a2
 

unsigned long型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。

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

参照先 BOOL, FALSE, と TRUE.

参照元 dkcMemoryStreamAdapterPushBack(), dkcRLEPackBitsDecode(), と dkcRLEPackBitsEncode().

00706                                                         {
00707     ULONG maxv = ULONG_MAX;
00708   ULONG halfv = maxv / 2 ;
00709   ULONG x = a1,y = a2;
00710   if(x < y){
00711     SWAP_NUM(x,y);
00712   }
00713   if(x > halfv + 1){
00714     if(y >= halfv){
00715       return TRUE;
00716     }
00717   }
00718   return FALSE;
00719 }

BOOL WINAPI dkcCreateEmptyFile const char *  filename  ) 
 

空ファイルを作る。

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

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

参照元 dkcFileCopyEx().

00446                                                     {
00447     FILE *fp;
00448     fp = fopen( filename , "wb" ) ;//wb
00449     if(fp==NULL) return FALSE;
00450     fclose( fp ) ;
00451     return TRUE;
00452 }

int dkcDynamicCheckEnvironment BOOL  isForceExit  ) 
 

引数:
isForceExit[in] TRUEを指定するとdkutil_cの奨励環境と違った場合、強制終了する。
戻り値:
edk_Result

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

参照先 BOOL.

00047                                                 {
00048 
00049 }

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

戻り値:
almost TRUE(1)

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

参照先 MB, NULL, ODS, と TRUE.

00070 {
00071     char s[1024];
00072     char ss[1024 * 2];
00073     
00074     int va_list_result;
00075     va_list Valist;
00076 
00077     NULL_CHAR_ARRAY(s);
00078     NULL_CHAR_ARRAY(ss);
00079     
00080     if(message){
00081         SET_VA_LIST_C(Valist,va_list_result,s,sizeof(s),message);
00082     }else{
00083         //SET_VA_LIST(s,sizeof(s),"No message");
00084         _snprintf(s,sizeof(s),"No message\n");
00085     }
00086 
00087     _snprintf(ss,sizeof(ss),
00088         "DKUTIL_ASSERT(%s):\nfile:%s / \n line:%d / \n message: %s",
00089         expression,filename,line,s);
00090 
00091 
00092 
00093 #ifdef NDEBUG//release
00094 #   ifdef WIN32
00095         ODS(ss);
00096     //::MessageBox(NULL,ss,"ERROR ASSERTION !!",MB_OK);
00097     {
00098         LPCTSTR name="ERROR_TEMP.txt";
00099         {
00100             //ファイルをオープン
00101             FILE *fp;
00102             if(NULL != (fp = fopen( name , "at" ))){
00103             
00104                 // エラーログファイルに書き出す
00105                 fputs( ss , fp ) ;
00106                 fclose( fp ) ;
00107                 Sleep(800);
00108             }
00109         }
00110         ShellExecute(NULL, "open",name, NULL, NULL, SW_SHOWNORMAL);
00111         //Sleep(1000);
00112         //DeleteFile(name);
00113     }
00114     MB("このテキストをこのソフトの開発者に渡せば、バグ発見の近道なります。\n \
00115         開発者に知らせるときはこのテキストを転記してあげましょう。");
00116     if(IDYES==MessageBox(NULL,
00117         "このままこのソフトを起動しつづけると、更なるエラーが発生する可能性があります。\n終了しますか?",
00118         "あってはいけない エラー!!!",
00119         MB_YESNO))
00120     {
00121         exit(edk_FAILED);
00122         //terminate();
00123     }else{
00124     }
00125 #   else    //else of win32
00126     
00127     fprintf(stderr,ss);
00128     exit(edk_FAILED);
00129 
00130 #   endif //end of win32
00131 
00132 #else //debug
00133 
00134 #   ifdef WIN32
00135         ODS(ss);
00136     fprintf(stderr,ss);
00137     //_CrtDebugBreak();
00138     DebugBreak();
00139 #   else //else of win32
00140 
00141     fprintf(stderr,ss);
00142     Debugger();
00143 
00144 #   endif //end of win32
00145 #endif//end of NDEBUG
00146     //assert(ss);
00147     
00148     return TRUE;
00149 }

DKC_EXTERN int WINAPI dkcFClose FILE **  ptr  ) 
 

fcloseのラッパー

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

参照先 NULL.

参照元 dkcDeleteCircularStream(), dkcFileCopyEx(), dkcFreeStream(), と GetHeader().

00346                                            {
00347     if(NULL==ptr || NULL==*ptr) return edk_ArgumentException;
00348     fclose(*ptr);
00349     *ptr = NULL;
00350     return edk_SUCCEEDED;
00351 }

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

fopenのラッパー

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

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

00342                                                                         {
00343     return fopen(filename,mode);
00344 }

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

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

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

参照先 BYTE, と dkcmNOT_ASSERT.

参照元 GetHeader().

00353 {
00354     size_t count;
00355     size_t tc,tsize;
00356     BYTE *tbuffer;
00357 
00358     //read size
00359     tsize = size;
00360     //temp variable
00361     tc = 0;
00362     //offset counter
00363     count = 0;
00364     //byte type pointer
00365     tbuffer = (BYTE *)buffer;
00366     for(;;)
00367     {
00368         //error check
00369         if(ferror(fp) ){
00370             break;
00371         }
00372         if(feof(fp)){
00373             break;
00374         }
00375         //read
00376         tc = fread(&tbuffer[count],1,tsize,fp);
00377         //update
00378         tsize -= tc;
00379         count += tc;
00380 
00381         if(count == size){
00382             break;
00383         }
00384 #   ifdef DEBUG
00385         //ありえないエラーチェック
00386         dkcmNOT_ASSERT(count > size);
00387 #   else
00388         if(count > size){
00389             break;
00390         }
00391 #   endif
00392     }
00393     return count;
00394 }

DKC_INLINE int dkcFree void **  p  ) 
 

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

参照先 NULL.

参照元 dkcAlloc2TreeRoot(), dkcAllocArrayOneByOne(), dkcAllocBuffer(), dkcAllocCircularMemoryStream(), dkcAllocCRC(), dkcAllocDeque(), dkcAllocDeserialize(), dkcAllocMemoryStream(), dkcAllocNewCircularStream(), dkcAllocPathString(), dkcAllocQueue(), dkcAllocReplace(), dkcAllocRijndael(), dkcAllocSerialize(), dkcAllocSingleList(), dkcAllocSingleListObject(), dkcAllocStack(), dkcAllocStream(), dkcAllocString(), dkcAllocTaskEngine(), dkcAllocUniqueID(), dkcCloseFileWithSignature(), dkcDeleteCircularStream(), dkcDistCountSortChar(), dkcDistCountSortInt(), dkcDistCountSortShort(), dkcFreeArcfour(), dkcFreeArcfour2Byte(), dkcFreeArrayOneByOne(), dkcFreeBlowfish(), dkcFreeBuffer(), dkcFreeCircularMemoryStream(), dkcFreeCRC(), dkcFreeDeleteCircularStream(), dkcFreeDeque(), dkcFreeDeserialize(), dkcFreeFindFile(), dkcFreeGenericFileSystem(), dkcFreeHC256(), dkcFreeHMAC(), dkcFreeLZSS(), dkcFreeMD5(), dkcFreeMemoryStream(), dkcFreePathString(), dkcFreeQueue(), dkcFreeReplace(), dkcFreeRijndael(), dkcFreeRLE(), dkcFreeSemiRealRandom(), dkcFreeSerialize(), dkcFreeSHA1(), dkcFreeSHA256(), dkcFreeSHA384(), dkcFreeSHA512(), dkcFreeSHO(), dkcFreeSingleListObject(), dkcFreeSNOW2(), dkcFreeStack(), dkcFreeStream(), dkcFreeString(), dkcFreeTaskEngine(), dkcFreeThreadLock(), dkcFreeUniqueID(), dkcLoadLibrary(), dkcOpenFileWithSignature(), dkcSingleListErase(), dkcUnloadLibrary(), free_2tree_node(), free_2tree_root(), と free_sameobjectpool().

00180                                  {
00181     if(!*p) return edk_FAILED;
00182     free(*p);
00183     *p = NULL;
00184     return edk_SUCCEEDED;
00185 }

void WINAPIV dkcFreeAdapter void *  p  ) 
 

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

参照元 dkcSameObjectPoolInit().

00155                                     {
00156     if(p){
00157         free(p);
00158     }
00159 }

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

dkcFReadAll() dkcFReadAllのfwrite版

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

参照先 BYTE, と dkcmNOT_ASSERT.

00396                                                                         {
00397     size_t count;
00398     size_t tc,tsize;
00399     BYTE *tbuffer;
00400 
00401     //read size
00402     tsize = size;
00403     //temp variable
00404     tc = 0;
00405     //offset counter
00406     count = 0;
00407     //byte type pointer
00408     tbuffer = (BYTE *)buffer;
00409     for(;;)
00410     {
00411         //error check
00412         if(ferror(fp) ){
00413             break;
00414         }
00415         if(feof(fp)){
00416             break;
00417         }
00418         //read
00419         tc = fwrite(&tbuffer[count],1,tsize,fp);
00420         //update
00421         tsize -= tc;
00422         count += tc;
00423 
00424         if(count == size){
00425             break;
00426         }
00427 #   ifdef DEBUG
00428         //ありえないエラーチェック
00429         dkcmNOT_ASSERT(count > size);
00430 #   else
00431         if(count > size){
00432             break;
00433         }
00434 #   endif
00435     }
00436     return count;
00437 
00438 }

const char* WINAPI dkcGetPathSep  ) 
 

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

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

参照先 dkcdPATH_SEP.

参照元 dkcSJIS_SearchPathSep(), と dkcSJIS_SearchPathSepLast().

00636                                   {
00637 #ifdef WIN32
00638     static char target[3]={dkcdPATH_SEP,'/','\0'};
00639 #else
00640     static char target[3]={dkcdPATH_SEP,'\0'};
00641 #endif
00642     return target;
00643 }

BOOL dkcIs_foepn_mode const char *  s  ) 
 

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

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

参照先 BOOL, FALSE, と TRUE.

00186                                     {
00187     /* wrtb+ */
00188     const char *ms= "wrtb+";
00189     size_t slen = strlen(s);
00190     size_t mslen = strlen(ms);
00191     size_t i,j;
00192     int flag = FALSE;
00193     for(i=0;i<slen;i++){
00194         for(j=0;j<mslen;j++){
00195             if(ms[j]==s[i]){
00196                 flag = TRUE;
00197                 break;
00198             }
00199         }
00200         if(TRUE!=flag){
00201             return FALSE;
00202         }else{
00203             flag = FALSE;
00204         }
00205     }
00206     return TRUE;
00207 }

DKC_INLINE BOOL dkcIsLittleEndian  ) 
 

little endian ならTRUE

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

参照先 BOOL.

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

00700                                     {
00701     int x=1;
00702     return (BOOL)((*(char*)&x));
00703 }

BOOL WINAPI dkcIsMMX void   ) 
 

MMXが使えるならTRUE.

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

参照先 BOOL, と FALSE.

参照元 CheckMMX().

00677                           {
00678   return FALSE;
00679 }

int WINAPI dkcIsNativePathString const char *  s,
size_t  size
 

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

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

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

参照元 dkcAllocPathString(), dkcIsEffectivePath(), dkcPathStringElementInsert_Logic(), と dkcPathStringElementReplace_Logic().

00054                                                            {
00055 
00056     size_t i=0;
00057     if(s==NULL) return edk_FAILED;
00058     for(;i<size;i++){
00059         if(dkcmIS_INVALID_PATH_CHAR(s[i]))
00060         {
00061             return FALSE;
00062         }
00063     }
00064     return TRUE;
00065 }

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

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

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

参照先 dkcLoadFile().

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

00455                                                                                    {//="rb"
00456     return dkcLoadFile(data,size,fname,"rb",readsize);
00457 }

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

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

参照先 NULL.

参照元 dkcLoadBinary(), と dkcLoadText().

00313                                                                                                          {//="rb"
00314     FILE *fp ;
00315     if(NULL==readsize || NULL==data || NULL==fname || NULL==mode){
00316         return edk_FAILED;
00317     }
00318     fp = fopen( fname , mode ) ;//rb
00319     if(fp==NULL)return edk_FAILED;
00320     *readsize = fread( data , 1 , size , fp ) ;
00321     //fread( data , sizeof(size)  , 1 , fp ) ;
00322     fclose( fp ) ;
00323 
00324     return edk_SUCCEEDED;
00325 
00326 }

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

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

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

参照先 dkcLoadFile().

00462                                                                                    {
00463     return dkcLoadFile(text,length,fname,"rt",readsize);
00464 }

DKC_INLINE void WINAPI dkcLONGLONGToTwoLONG LONG *  high,
LONG *  low,
LONGLONG  src
 

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

参照先 dkcmNOT_ASSERT, と LONGLONG.

00574                                                                               {
00575     LONG *o = (LONG *)&src;
00576     dkcmNOT_ASSERT(sizeof(LONG) * 2 != sizeof(LONGLONG));
00577     *high = o[0];
00578     *low = o[1];
00579 }

void* WINAPIV dkcMallocAdapter size_t  s  ) 
 

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

参照元 dkcSameObjectPoolAlloc(), と dkcSameObjectPoolInit().

00151                                         {
00152     return malloc(s);
00153 }

DKC_INLINE size_t dkcNumOfBits uint32  bits  ) 
 

引数:
調べたい32bit変数@note Hacker's Delight より

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

00721                                             {
00722   bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
00723   bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
00724   bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
00725   bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
00726   return (bits & 0x0000ffff) + (bits >>16 & 0x0000ffff);
00727 }

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

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

参照先 dkcReallocateEx().

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

00243 {
00244     return dkcReallocateEx(realloc,NewPtr,NewSize,OldPtr);
00245 }

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

参照先 DKC_REALLOC_F_TYPE, dkcReallocateSizeFunction(), と NULL.

00276 {
00277     void *ptr = NULL;
00278     size_t want_size = OldSize / 8;
00279     size_t ra_size = dkcReallocateSizeFunction(OldSize,
00280          (want_size <= 20) ? 20 : want_size
00281     );
00282     size_t div = 8;
00283     size_t tmp_ra = ra_size / div;
00284     size_t i;
00285     if(NULL== your_realloc /*|| NULL==*NewPtr*/ || NULL == *OldPtr ||
00286         0==OldSize  || NULL==reallocated_size   
00287     ){
00288         return edk_ArgumentException;//アホ引数入れるな!!
00289     }
00290 
00291     for(i=0;i<div;i++){
00292         ptr = your_realloc(*OldPtr,ra_size);
00293         if(NULL==ptr){
00294             if(OldSize > (ra_size -= tmp_ra)){//とりあえずtmp_ra分を引く。
00295                 break;//こら望みなしだわ
00296             }
00297             continue;
00298         }else{
00299             break;
00300         }
00301     }
00302     if(NULL==ptr) return edk_FAILED;
00303 
00304     //更新
00305     *NewPtr = ptr;  
00306     *OldPtr = NULL;
00307 
00308     *reallocated_size = ra_size;
00309 
00310     return edk_SUCCEEDED;
00311 }

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

参照先 DKC_REALLOC_F_TYPE, と NULL.

参照元 dkcReallocate().

00251 {
00252     void *ptr = NULL;
00253 
00254     if(NULL== your_realloc  /*|| NULL == *OldPtr ||
00255         0==OldSize*/
00256     ){
00257         return edk_ArgumentException;//アホ引数入れるな!!
00258     }
00259 
00260     ptr = your_realloc(*OldPtr,NewSize);
00261     if(NULL==ptr) return edk_FAILED;
00262 
00263     //更新
00264     *OldPtr = NULL;
00265     *NewPtr = ptr;
00266     
00267     return edk_SUCCEEDED;
00268 }

size_t dkcReallocateSizeFunction size_t  OldSize,
size_t  ExpandSize
 

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

参照元 dkcMemoryStreamAutoExpandResize(), dkcQueueDynamicPush(), dkcReallocateAutoExpand(), と dkcStackDynamicPush().

00223                                                                   {
00224     //y=-25.43035 * pow(x,2) + 116.7214
00225     //y = -0.00000018 * pow(x,2) + 0.00019
00226     //y = -99.9999 * pow(OldSize,2) + 104857600;
00227     //y = 0.105263 * x * x + 10.52631
00228     //double x;
00229 //  size_t size;
00230     if(OldSize <= 1024 * 5){//5KB以内なら2倍
00231         return OldSize * 2;
00232     }else if(OldSize >= 1024 * 1024 * 10 || 0==OldSize)
00233     {//10MB以上なら + ExpandSize
00234         return OldSize + ExpandSize;
00235     }
00236     //それ以外ならExpandSize * 3
00237     return OldSize + ExpandSize * 3; 
00238     //return OldSize * 2;//ひでぇ関数だ。
00239 }

DKC_INLINE USHORT dkcReverseEndian16 USHORT  x  ) 
 

endian change 16 bit version

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

参照元 dkcStreamProcess16().

00683                                               {
00684     return (USHORT)((x >> 8) | (x << 8));
00685 }

DKC_INLINE DWORD dkcReverseEndian32 DWORD  x  ) 
 

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

参照先 DWORD.

00687                                             {
00688     return (x << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | (x >> 24);
00689 }

DKC_INLINE ULONGLONG dkcReverseEndian64 ULONGLONG  x  ) 
 

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

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

参照先 dkcReverseEndian32(), DWORD, と ULONGLONG.

参照元 dkcStreamProcess64(), GetHeader(), HeaderWrite(), と ReverseEndianQWORD().

00691                                                      {
00692 
00693     return (
00694         (ULONGLONG)dkcReverseEndian32((DWORD)(x & 0x00000000ffffffff)) << 32)
00695         | 
00696         dkcReverseEndian32((DWORD)(x >> 32)
00697     );
00698 
00699 }

int WINAPI dkcRotateShiftRightMemory void *  d,
size_t  size,
size_t  num
 

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

参照先 dkcRotateShiftRightMemoryLogic(), と NULL.

00956                                                                     {
00957     //size_t i = 0;
00958     void *pd = NULL;
00959     int r = edk_FAILED;
00960 
00961     pd = malloc(num);
00962     if(NULL==pd){
00963         return edk_OutOfMemory;
00964     }
00965     if(DKUTIL_SUCCEEDED(dkcRotateShiftRightMemoryLogic(d,size,num,pd,num))){
00966         r = edk_SUCCEEDED;
00967     }
00968 
00969     free(pd);
00970     
00971     return r;
00972 
00973 }

DKC_INLINE int dkcRotateShiftRightMemoryLogic void *  d,
size_t  size,
size_t  n,
void *  workbuff,
size_t  worksize
 

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

参照先 BYTE.

参照元 dkcRotateShiftRightMemory().

00935 {
00936     BYTE *dest = (BYTE *)d;
00937     size_t temp;
00938 
00939     if(n > worksize){
00940         return edk_FAILED;
00941     }
00942     for(;;){
00943         if(n < size){
00944             break;
00945         }
00946         n -= size;
00947     }
00948     temp = size - n;
00949     memcpy(workbuff,dest + temp,n);
00950     memmove(dest + n,dest,temp);
00951     memcpy(dest,workbuff,n);
00952     return edk_SUCCEEDED;
00953 
00954 }

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

fopenのファイル関数を使ってバイナリセーブを行う。 類似: dkcMemoryToFile()

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

参照先 dkcSaveFile().

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

00442                                                                         {//="wb"
00443     return dkcSaveFile(data,size,fname,"wb");
00444 }

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

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

参照先 NULL.

参照元 dkcSaveBinary(), と dkcSaveText().

00328 {
00329     FILE *fp;
00330     if(NULL==fname || NULL==mode){
00331         return edk_FAILED;
00332     }
00333     fp = fopen( fname , mode ) ;//wb
00334     if(fp==NULL) return edk_FAILED;
00335     fwrite( data , size  , 1 , fp ) ;
00336     //fwrite( data , sizeof(size)  , 1 , fp ) ;
00337     fclose( fp ) ;
00338     return edk_SUCCEEDED;
00339 }

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

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

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

参照先 dkcSaveFile().

00459                                                                         {
00460     return dkcSaveFile(text,length,fname,"wt");
00461 }

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

参照先 DKC_COMPARE_TYPE, dkcSwapFast(), get_offset(), と NULL.

参照元 dkcSelectMax(), と dkcSelectMin().

00742 {
00743 
00744     int i,j,left, right;
00745 
00746     void *x = malloc(width);
00747     void *a = malloc(n * width);
00748     if(NULL==x || NULL==a){
00749         return edk_ArgumentException;
00750     }
00751     if(n > INT_MAX){
00752         return edk_FAILED;
00753     }
00754     
00755 
00756     memcpy(a,a_src,width * n);
00757 
00758 
00759     left = 0;  right = n - 1;
00760 
00761     while (left < right) 
00762     {
00763 
00764         memcpy(x,   (const void *)get_offset(a,k * width),width);
00765         i = left;
00766         j = right;
00767 
00768         for ( ; ; ) {
00769 
00770             while( less(get_offset(a,i * width),x) > 0){
00771             //while( *(int *)get_offset(a,i * width) < *(int *)x){
00772                 i++;
00773             }
00774 
00775             while( less(x,get_offset(a,j * width)) > 0){
00776             //while( *(int *)x < *(int *)get_offset(a,j * width) ){
00777                 j--;
00778             }
00779 
00780             if (i > j){
00781                 break;
00782             }
00783             
00784 
00785             dkcSwapFast(
00786                 get_offset(a,i * width),
00787                 get_offset(a,j * width),
00788                 width
00789                 );
00790             
00791             i++;
00792             j--;
00793         }
00794         if (j < k){
00795             left  = i;
00796         }
00797         if (k < i){
00798             right = j;
00799         }
00800     }
00801 
00802     //ゲットする
00803     {
00804         //printf("%d",*(int *)get_offset(a,k * width));
00805 
00806         memcpy(dest,(const void *)get_offset(a,k * width),width);
00807 
00808     }
00809     free(x);
00810     free(a);
00811 
00812     return edk_SUCCEEDED;
00813 
00814 }

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

最大値を選択する

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

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

参照先 DKC_COMPARE_TYPE, と dkcSelect().

00817                                                                                                            {
00818     if(n-1 > INT_MAX){
00819         return edk_FAILED;
00820     }
00821     return dkcSelect(a,a_src,n,(int)n-1,width,less);
00822 }

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

最小値を選択する

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

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

参照先 DKC_COMPARE_TYPE, と dkcSelect().

00823                                                                                                            {
00824     return dkcSelect(a,a_src,n,(int)0,width,less);
00825 }

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

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

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

参照先 dkcSwap64(), と ULONGLONG.

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

00553 {
00554     dkcSwap64((ULONGLONG *)p1,(ULONGLONG *)p2,size);
00555 }

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

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

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

参照先 BYTE, と ULONGLONG.

参照元 dkcSwap().

00517                                                               {
00518     size_t i;
00519     BYTE buf;
00520     size_t mod_ = size % sizeof(ULONGLONG);
00521     size_t cnt = size / sizeof(ULONGLONG);
00522     //char *tp1 = (char *)p1,*tp2 = (char *)p2;
00523     for(i=0;i<cnt;i++){
00524         SWAP_NUM(p1[i],p2[i]);
00525     }
00526     for(i=0;i<mod_;i++){
00527         
00528         //SWAP_NUM((char)tp1[size - mod_ + 1],(char)tp2[size - mod_ + i]);
00529         /*a = b - a ;\
00530     b -= a ;\
00531     a += b
00532         */
00533         /*( ( ((char *) p2)[size - mod_ + i]))
00534             = (char)( ( ((char *) p2)[size - mod_ + i])) - 
00535             (char)( ( ((char *) p1)[size - mod_ + i]));
00536         
00537         ( ( ((char *) p2)[size - mod_ + i])) -= ( ( ((char *) p1)[size - mod_ + i]));
00538 
00539         ( ( ((char *) p1)[size - mod_ + i])) += ( ( ((char *) p2)[size - mod_ + i]));
00540             */
00541         
00542         
00543         buf = (((BYTE *)p1)[size - mod_ + i]);
00544         (((BYTE *)p1)[size - mod_ + i]) = 
00545             (((BYTE *)p2)[size - mod_ + i]) ;
00546         (((BYTE *)p2)[size - mod_ + i]) = buf;
00547         
00548     }
00549 
00550 }

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

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

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

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

参照先 dkcmNOT_ASSERT, と NULL.

参照元 dkcSelect().

00468 {
00469     void *p = malloc(size);
00470     dkcmNOT_ASSERT(NULL==p);
00471     memcpy(p,p1,size);
00472     memcpy(p1,p2,size);
00473     memcpy(p2,p,size);
00474     free(p);
00475 }

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

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

参照先 ULONGLONG.

00559                                                                                    {
00560     //*dest = (ULONGLONG)((high << 32) + low);
00561     *dest = (ULONGLONG)high << 32;
00562     *dest += low;
00563         //( high * MAXDWORD ) + low;
00564 }

DKC_INLINE void WINAPI dkcTwoLONGToLONGLONG LONGLONG *  dest,
LONG  high,
LONG  low
 

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

参照先 LONGLONG.

00581                                                                               {
00582     //*dest = (ULONGLONG)((high << 32) + low);
00583     *dest = (LONGLONG)high << 32;
00584     *dest += low;
00585 
00586 }

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

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

参照先 dkcmNOT_ASSERT, DWORD, と ULONGLONG.

00566                                                                                      {
00567     DWORD *o = (DWORD *)&src;
00568     dkcmNOT_ASSERT(sizeof(DWORD) * 2 != sizeof(ULONGLONG));
00569     //エンディアン問題をどうにかしよう!
00570     *dhigh = o[0];
00571     *dlow = o[1];
00572 }

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

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

参照先 BYTE.

参照元 dkcSelect().

00730                                               {
00731     BYTE *oo = (BYTE *)p;
00732     
00733     return (void *)&(oo[offset]);
00734 }


dkutil_cに対してTue Feb 22 02:02:34 2005に生成されました。 doxygen 1.3.6