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

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 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)
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)


説明

d金魚 @

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


マクロ定義

#define DKUTIL_C_OS_INDEPENDENT_C
 

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


関数

void* dkcAllocate size_t  size  ) 
 

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

参照先 NULL.

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

00112                               {
00113     void *ptr;
00114     ptr = malloc(size);
00115     if(NULL==ptr) return NULL;
00116     memset(ptr,0,size);
00117     return ptr;
00118 }

void WINAPI dkcCheckMemoryLeak BOOL  flag  ) 
 

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

参照先 BOOL.

00569                                          {
00570 
00571 }

DKC_INLINE BOOL dkcCheckOverflowULONG ULONG  a1,
ULONG  a2
 

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

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

参照先 BOOL, DKC_INLINE, FALSE, SWAP_NUM, と TRUE.

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

00644                                                         {
00645     ULONG maxv = ULONG_MAX;
00646   ULONG halfv = maxv / 2 ;
00647   ULONG x = a1,y = a2;
00648   if(x < y){
00649     SWAP_NUM(x,y);
00650   }
00651   if(x > halfv + 1){
00652     if(y >= halfv){
00653       return TRUE;
00654     }
00655   }
00656   return FALSE;
00657 }

BOOL WINAPI dkcCreateEmptyFile const char *  filename  ) 
 

空ファイルを作る。

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

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

参照元 dkcFileCopyEx().

00385                                                     {
00386     FILE *fp;
00387     fp = fopen( filename , "wb" ) ;//wb
00388     if(fp==NULL) return FALSE;
00389     fclose( fp ) ;
00390     return TRUE;
00391 }

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

戻り値:
almost TRUE(1)

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

参照先 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             }
00072         }
00073         ShellExecute(NULL, "open",name, NULL, NULL, SW_SHOWNORMAL);
00074         DeleteFile(name);
00075     }
00076     MB("このテキストをこのソフトの開発者に渡せば、バグ発見の近道なります。\n \
00077         開発者に知らせるときはこのテキストを転記してあげましょう。");
00078     if(IDYES==MessageBox(NULL,
00079         "このままこのソフトを起動しつづけると、更なるエラーが発生する可能性があります。\n終了しますか?",
00080         "あってはいけない エラー!!!",
00081         MB_YESNO))
00082     {
00083         exit(edk_FAILED);
00084         //terminate();
00085     }else{
00086     }
00087 #   else    //else of win32
00088     
00089     fprintf(stderr,ss);
00090     exit(edk_FAILED);
00091 
00092 #   endif //end of win32
00093 
00094 #else //debug
00095 
00096 #   ifdef WIN32
00097         ODS(ss);
00098     fprintf(stderr,ss);
00099     //_CrtDebugBreak();
00100     DebugBreak();
00101 #   else //else of win32
00102 
00103     fprintf(stderr,ss);
00104     Debugger();
00105 
00106 #   endif //end of win32
00107 #endif//end of NDEBUG
00108     //assert(ss);
00109     
00110     return TRUE;
00111 }

DKC_EXTERN int WINAPI dkcFClose FILE **  ptr  ) 
 

fcloseのラッパー

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

参照先 DKC_EXTERN, edk_ArgumentException, edk_SUCCEEDED, と NULL.

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

00285                                            {
00286     if(NULL==ptr || NULL==*ptr) return edk_ArgumentException;
00287     fclose(*ptr);
00288     *ptr = NULL;
00289     return edk_SUCCEEDED;
00290 }

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

fopenのラッパー

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

参照先 DKC_EXTERN.

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

00281                                                                         {
00282     return fopen(filename,mode);
00283 }

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

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

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

参照先 BYTE, DKC_EXTERN, と dkcmNOT_ASSERT.

参照元 GetHeader().

00292 {
00293     size_t count;
00294     size_t tc,tsize;
00295     BYTE *tbuffer;
00296 
00297     //read size
00298     tsize = size;
00299     //temp variable
00300     tc = 0;
00301     //offset counter
00302     count = 0;
00303     //byte type pointer
00304     tbuffer = (BYTE *)buffer;
00305     for(;;)
00306     {
00307         //error check
00308         if(ferror(fp) ){
00309             break;
00310         }
00311         if(feof(fp)){
00312             break;
00313         }
00314         //read
00315         tc = fread(&tbuffer[count],1,tsize,fp);
00316         //update
00317         tsize -= tc;
00318         count += tc;
00319 
00320         if(count == size){
00321             break;
00322         }
00323 #   ifdef DEBUG
00324         //ありえないエラーチェック
00325         dkcmNOT_ASSERT(count > size);
00326 #   else
00327         if(count > size){
00328             break;
00329         }
00330 #   endif
00331     }
00332     return count;
00333 }

int dkcFree void **  p  ) 
 

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

参照先 edk_FAILED, edk_SUCCEEDED, と NULL.

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

00119                      {
00120     if(!*p) return edk_FAILED;
00121     free(*p);
00122     *p = NULL;
00123     return edk_SUCCEEDED;
00124 }

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

dkcFReadAll() dkcFReadAllのfwrite版

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

参照先 BYTE, DKC_EXTERN, と dkcmNOT_ASSERT.

00335                                                                         {
00336     size_t count;
00337     size_t tc,tsize;
00338     BYTE *tbuffer;
00339 
00340     //read size
00341     tsize = size;
00342     //temp variable
00343     tc = 0;
00344     //offset counter
00345     count = 0;
00346     //byte type pointer
00347     tbuffer = (BYTE *)buffer;
00348     for(;;)
00349     {
00350         //error check
00351         if(ferror(fp) ){
00352             break;
00353         }
00354         if(feof(fp)){
00355             break;
00356         }
00357         //read
00358         tc = fwrite(&tbuffer[count],1,tsize,fp);
00359         //update
00360         tsize -= tc;
00361         count += tc;
00362 
00363         if(count == size){
00364             break;
00365         }
00366 #   ifdef DEBUG
00367         //ありえないエラーチェック
00368         dkcmNOT_ASSERT(count > size);
00369 #   else
00370         if(count > size){
00371             break;
00372         }
00373 #   endif
00374     }
00375     return count;
00376 
00377 }

const char* WINAPI dkcGetPathSep  ) 
 

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

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

参照先 dkcdPATH_SEP.

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

00574                                   {
00575 #ifdef WIN32
00576     static char target[3]={dkcdPATH_SEP,'/','\0'};
00577 #else
00578     static char target[3]={dkcdPATH_SEP,'\0'};
00579 #endif
00580     return target;
00581 }

BOOL dkcIs_foepn_mode const char *  s  ) 
 

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

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

参照先 BOOL, FALSE, と TRUE.

00125                                     {
00126     /* wrtb+ */
00127     const char *ms= "wrtb+";
00128     size_t slen = strlen(s);
00129     size_t mslen = strlen(ms);
00130     size_t i,j;
00131     int flag = FALSE;
00132     for(i=0;i<slen;i++){
00133         for(j=0;j<mslen;j++){
00134             if(ms[j]==s[i]){
00135                 flag = TRUE;
00136                 break;
00137             }
00138         }
00139         if(TRUE!=flag){
00140             return FALSE;
00141         }else{
00142             flag = FALSE;
00143         }
00144     }
00145     return TRUE;
00146 }

DKC_INLINE BOOL dkcIsLittleEndian  ) 
 

little endian ならTRUE

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

参照先 BOOL, と DKC_INLINE.

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

00638                                     {
00639     int x=1;
00640     return (BOOL)((*(char*)&x));
00641 }

BOOL WINAPI dkcIsMMX void   ) 
 

MMXが使えるならTRUE.

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

参照先 BOOL, と FALSE.

参照元 CheckMMX().

00615                           {
00616   return FALSE;
00617 }

int WINAPI dkcIsNativePathString const char *  s,
size_t  size
 

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

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

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

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

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

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

参照先 dkcLoadFile().

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

00394                                                                                    {//="rb"
00395     return dkcLoadFile(data,size,fname,"rb",readsize);
00396 }

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

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

参照先 edk_FAILED, edk_SUCCEEDED, と NULL.

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

00252                                                                                                          {//="rb"
00253     FILE *fp ;
00254     if(NULL==readsize || NULL==data || NULL==fname || NULL==mode){
00255         return edk_FAILED;
00256     }
00257     fp = fopen( fname , mode ) ;//rb
00258     if(fp==NULL)return edk_FAILED;
00259     *readsize = fread( data , 1 , size , fp ) ;
00260     //fread( data , sizeof(size)  , 1 , fp ) ;
00261     fclose( fp ) ;
00262 
00263     return edk_SUCCEEDED;
00264 
00265 }

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

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

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

参照先 dkcLoadFile().

00401                                                                                    {
00402     return dkcLoadFile(text,length,fname,"rt",readsize);
00403 }

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

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

参照先 DKC_INLINE, dkcmNOT_ASSERT, と LONGLONG.

00512                                                                               {
00513     LONG *o = (LONG *)&src;
00514     dkcmNOT_ASSERT(sizeof(LONG) * 2 != sizeof(LONGLONG));
00515     *high = o[0];
00516     *low = o[1];
00517 }

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

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

参照先 dkcReallocateEx().

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

00182 {
00183     return dkcReallocateEx(realloc,NewPtr,NewSize,OldPtr);
00184 }

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

参照先 DKC_REALLOC_F_TYPE, dkcReallocateSizeFunction(), edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, と NULL.

00215 {
00216     void *ptr = NULL;
00217     size_t want_size = OldSize / 8;
00218     size_t ra_size = dkcReallocateSizeFunction(OldSize,
00219          (want_size <= 20) ? 20 : want_size
00220     );
00221     size_t div = 8;
00222     size_t tmp_ra = ra_size / div;
00223     size_t i;
00224     if(NULL== your_realloc /*|| NULL==*NewPtr*/ || NULL == *OldPtr ||
00225         0==OldSize  || NULL==reallocated_size   
00226     ){
00227         return edk_ArgumentException;//アホ引数入れるな!!
00228     }
00229 
00230     for(i=0;i<div;i++){
00231         ptr = your_realloc(*OldPtr,ra_size);
00232         if(NULL==ptr){
00233             if(OldSize > (ra_size -= tmp_ra)){//とりあえずtmp_ra分を引く。
00234                 break;//こら望みなしだわ
00235             }
00236             continue;
00237         }else{
00238             break;
00239         }
00240     }
00241     if(NULL==ptr) return edk_FAILED;
00242 
00243     //更新
00244     *NewPtr = ptr;  
00245     *OldPtr = NULL;
00246 
00247     *reallocated_size = ra_size;
00248 
00249     return edk_SUCCEEDED;
00250 }

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

参照先 DKC_REALLOC_F_TYPE, edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, と NULL.

参照元 dkcReallocate().

00190 {
00191     void *ptr = NULL;
00192 
00193     if(NULL== your_realloc  /*|| NULL == *OldPtr ||
00194         0==OldSize*/
00195     ){
00196         return edk_ArgumentException;//アホ引数入れるな!!
00197     }
00198 
00199     ptr = your_realloc(*OldPtr,NewSize);
00200     if(NULL==ptr) return edk_FAILED;
00201 
00202     //更新
00203     *OldPtr = NULL;
00204     *NewPtr = ptr;
00205     
00206     return edk_SUCCEEDED;
00207 }

size_t dkcReallocateSizeFunction size_t  OldSize,
size_t  ExpandSize
 

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

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

00162                                                                   {
00163     //y=-25.43035 * pow(x,2) + 116.7214
00164     //y = -0.00000018 * pow(x,2) + 0.00019
00165     //y = -99.9999 * pow(OldSize,2) + 104857600;
00166     //y = 0.105263 * x * x + 10.52631
00167     //double x;
00168 //  size_t size;
00169     if(OldSize <= 1024 * 5){//5KB以内なら2倍
00170         return OldSize * 2;
00171     }else if(OldSize >= 1024 * 1024 * 10 || 0==OldSize)
00172     {//10MB以上なら + ExpandSize
00173         return OldSize + ExpandSize;
00174     }
00175     //それ以外ならExpandSize * 3
00176     return OldSize + ExpandSize * 3; 
00177     //return OldSize * 2;//ひでぇ関数だ。
00178 }

DKC_INLINE USHORT dkcReverseEndian16 USHORT  x  ) 
 

endian change 16 bit version

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

参照先 DKC_INLINE.

参照元 dkcStreamProcess16().

00621                                               {
00622     return (USHORT)((x >> 8) | (x << 8));
00623 }

DKC_INLINE DWORD dkcReverseEndian32 DWORD  x  ) 
 

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

参照先 DKC_INLINE, と DWORD.

00625                                             {
00626     return (x << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | (x >> 24);
00627 }

DKC_INLINE ULONGLONG dkcReverseEndian64 ULONGLONG  x  ) 
 

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

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

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

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

00629                                                      {
00630 
00631     return (
00632         (ULONGLONG)dkcReverseEndian32((DWORD)(x & 0x00000000ffffffff)) << 32)
00633         | 
00634         dkcReverseEndian32((DWORD)(x >> 32)
00635     );
00636 
00637 }

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

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

参照先 dkcRotateShiftRightMemoryLogic(), DKUTIL_SUCCEEDED, edk_FAILED, edk_OutOfMemory, edk_SUCCEEDED, と NULL.

参照元 bse_target_to_table().

00886                                                                     {
00887     //size_t i = 0;
00888     void *pd = NULL;
00889     int r = edk_FAILED;
00890 
00891     pd = malloc(num);
00892     if(NULL==pd){
00893         return edk_OutOfMemory;
00894     }
00895     if(DKUTIL_SUCCEEDED(dkcRotateShiftRightMemoryLogic(d,size,num,pd,num))){
00896         r = edk_SUCCEEDED;
00897     }
00898 
00899     free(pd);
00900     
00901     return r;
00902 
00903 }

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

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

参照先 BYTE, DKC_INLINE, edk_FAILED, と edk_SUCCEEDED.

参照元 dkcRotateShiftRightMemory().

00865 {
00866     BYTE *dest = (BYTE *)d;
00867     size_t temp;
00868 
00869     if(n > worksize){
00870         return edk_FAILED;
00871     }
00872     for(;;){
00873         if(n < size){
00874             break;
00875         }
00876         n -= size;
00877     }
00878     temp = size - n;
00879     memcpy(workbuff,dest + temp,n);
00880     memmove(dest + n,dest,temp);
00881     memcpy(dest,workbuff,n);
00882     return edk_SUCCEEDED;
00883 
00884 }

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

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

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

参照先 dkcSaveFile().

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

00381                                                                         {//="wb"
00382     return dkcSaveFile(data,size,fname,"wb");
00383 }

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

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

参照先 edk_FAILED, edk_SUCCEEDED, と NULL.

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

00267 {
00268     FILE *fp;
00269     if(NULL==fname || NULL==mode){
00270         return edk_FAILED;
00271     }
00272     fp = fopen( fname , mode ) ;//wb
00273     if(fp==NULL) return edk_FAILED;
00274     fwrite( data , size  , 1 , fp ) ;
00275     //fwrite( data , sizeof(size)  , 1 , fp ) ;
00276     fclose( fp ) ;
00277     return edk_SUCCEEDED;
00278 }

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

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

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

参照先 dkcSaveFile().

00398                                                                         {
00399     return dkcSaveFile(text,length,fname,"wt");
00400 }

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

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

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

00672 {
00673 
00674     int i,j,left, right;
00675 
00676     void *x = malloc(width);
00677     void *a = malloc(n * width);
00678     if(NULL==x || NULL==a){
00679         return edk_ArgumentException;
00680     }
00681     if(n > INT_MAX){
00682         return edk_FAILED;
00683     }
00684     
00685 
00686     memcpy(a,a_src,width * n);
00687 
00688 
00689     left = 0;  right = n - 1;
00690 
00691     while (left < right) 
00692     {
00693 
00694         memcpy(x,   (const void *)get_offset(a,k * width),width);
00695         i = left;
00696         j = right;
00697 
00698         for ( ; ; ) {
00699 
00700             while( less(get_offset(a,i * width),x) > 0){
00701             //while( *(int *)get_offset(a,i * width) < *(int *)x){
00702                 i++;
00703             }
00704 
00705             while( less(x,get_offset(a,j * width)) > 0){
00706             //while( *(int *)x < *(int *)get_offset(a,j * width) ){
00707                 j--;
00708             }
00709 
00710             if (i > j){
00711                 break;
00712             }
00713             
00714 
00715             dkcSwapFast(
00716                 get_offset(a,i * width),
00717                 get_offset(a,j * width),
00718                 width
00719                 );
00720             
00721             i++;
00722             j--;
00723         }
00724         if (j < k){
00725             left  = i;
00726         }
00727         if (k < i){
00728             right = j;
00729         }
00730     }
00731 
00732     //ゲットする
00733     {
00734         //printf("%d",*(int *)get_offset(a,k * width));
00735 
00736         memcpy(dest,(const void *)get_offset(a,k * width),width);
00737 
00738     }
00739     free(x);
00740     free(a);
00741 
00742     return edk_SUCCEEDED;
00743 
00744 }

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

最大値を選択する

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

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

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

00747                                                                                                            {
00748     if(n-1 > INT_MAX){
00749         return edk_FAILED;
00750     }
00751     return dkcSelect(a,a_src,n,(int)n-1,width,less);
00752 }

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

最小値を選択する

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

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

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

00753                                                                                                            {
00754     return dkcSelect(a,a_src,n,(int)0,width,less);
00755 }

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

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

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

参照先 dkcSwap64(), と ULONGLONG.

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

00491 {
00492     dkcSwap64((ULONGLONG *)p1,(ULONGLONG *)p2,size);
00493 }

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

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

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

参照先 BYTE, SWAP_NUM, と ULONGLONG.

参照元 dkcSwap().

00455                                                               {
00456     size_t i;
00457     BYTE buf;
00458     size_t mod_ = size % sizeof(ULONGLONG);
00459     size_t cnt = size / sizeof(ULONGLONG);
00460     //char *tp1 = (char *)p1,*tp2 = (char *)p2;
00461     for(i=0;i<cnt;i++){
00462         SWAP_NUM(p1[i],p2[i]);
00463     }
00464     for(i=0;i<mod_;i++){
00465         
00466         //SWAP_NUM((char)tp1[size - mod_ + 1],(char)tp2[size - mod_ + i]);
00467         /*a = b - a ;\
00468     b -= a ;\
00469     a += b
00470         */
00471         /*( ( ((char *) p2)[size - mod_ + i]))
00472             = (char)( ( ((char *) p2)[size - mod_ + i])) - 
00473             (char)( ( ((char *) p1)[size - mod_ + i]));
00474         
00475         ( ( ((char *) p2)[size - mod_ + i])) -= ( ( ((char *) p1)[size - mod_ + i]));
00476 
00477         ( ( ((char *) p1)[size - mod_ + i])) += ( ( ((char *) p2)[size - mod_ + i]));
00478             */
00479         
00480         
00481         buf = (((BYTE *)p1)[size - mod_ + i]);
00482         (((BYTE *)p1)[size - mod_ + i]) = 
00483             (((BYTE *)p2)[size - mod_ + i]) ;
00484         (((BYTE *)p2)[size - mod_ + i]) = buf;
00485         
00486     }
00487 
00488 }

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

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

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

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

参照先 dkcmNOT_ASSERT, と NULL.

参照元 dkcSelect().

00406 {
00407     void *p = malloc(size);
00408     dkcmNOT_ASSERT(NULL==p);
00409     memcpy(p,p1,size);
00410     memcpy(p1,p2,size);
00411     memcpy(p2,p,size);
00412     free(p);
00413 }

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

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

参照先 DKC_INLINE, と ULONGLONG.

00497                                                                                    {
00498     //*dest = (ULONGLONG)((high << 32) + low);
00499     *dest = (ULONGLONG)high << 32;
00500     *dest += low;
00501         //( high * MAXDWORD ) + low;
00502 }

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

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

参照先 DKC_INLINE, と LONGLONG.

00519                                                                               {
00520     //*dest = (ULONGLONG)((high << 32) + low);
00521     *dest = (LONGLONG)high << 32;
00522     *dest += low;
00523 
00524 }

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

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

参照先 DKC_INLINE, dkcmNOT_ASSERT, DWORD, と ULONGLONG.

00504                                                                                      {
00505     DWORD *o = (DWORD *)&src;
00506     dkcmNOT_ASSERT(sizeof(DWORD) * 2 != sizeof(ULONGLONG));
00507     //エンディアン問題をどうにかしよう!
00508     *dhigh = o[0];
00509     *dlow = o[1];
00510 }

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

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

参照先 BYTE.

参照元 dkcSelect().

00660                                               {
00661     BYTE *oo = (BYTE *)p;
00662     
00663     return (void *)&(oo[offset]);
00664 }


dkutil_cに対してTue Oct 19 03:35:48 2004に生成されました。 doxygen 1.3.6