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

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,...)
DKC_INLINE void * dkcAllocateFill (size_t size, BYTE fill)
DKC_INLINE void * dkcAllocateFast (size_t size)
DKC_INLINE void * dkcAllocate (size_t size)
DKC_INLINE int dkcFree (void **p)
BOOL dkcIs_foepn_mode (const char *s)
 fopenの時の第二引数が有効な値かどうか調べる。

size_t dkcReallocateSizeFunction (size_t OldSize, size_t ExpandSize)
int WINAPI dkcReallocate (void **NewPtr, size_t NewSize, void **OldPtr)
int WINAPI dkcReallocateEx (DKC_REALLOC_F_TYPE your_realloc, void **NewPtr, size_t NewSize, void **OldPtr)
 edk_SUCCEEDEDだったら成功

int WINAPI dkcReallocateAutoExpand (DKC_REALLOC_F_TYPE your_realloc, void **NewPtr, void **OldPtr, size_t OldSize, size_t *reallocated_size)
int WINAPI dkcLoadFile (void *data, size_t size, const char *fname, const char *mode, size_t *readsize)
int WINAPI dkcSaveFile (const void *data, size_t size, const char *fname, const char *mode)
DKC_EXTERN FILE *WINAPI dkcFOpen (const char *filename, const char *mode)
 fopenのラッパー

DKC_EXTERN int WINAPI dkcFClose (FILE **ptr)
 fcloseのラッパー

DKC_EXTERN size_t WINAPI dkcFReadAll (void *buffer, size_t size, FILE *fp)
 freadの全部責任持って読み込みますバージョン。(読み込めない場合はEOFかerror)

DKC_EXTERN size_t WINAPI dkcFWriteAll (void *buffer, size_t size, FILE *fp)
 dkcFReadAll() dkcFReadAllのfwrite版

int WINAPI dkcSaveBinary (const void *data, size_t size, const char *fname)
 fopenのファイル関数を使ってバイナリセーブを行う。

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

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

int WINAPI dkcSaveText (const char *text, size_t length, const char *fname)
 fopenでテキストセーブを行う

int WINAPI dkcLoadText (char *text, size_t length, const char *fname, size_t *readsize)
 テキストデータをメモリに読み込む。dkcSaveText()と対

void WINAPI dkcSwapFast (void *p1, void *p2, size_t size)
void WINAPI dkcSwap64 (ULONGLONG *p1, ULONGLONG *p2, size_t size)
void WINAPI dkcSwap (void *p1, void *p2, size_t size)
DKC_INLINE void WINAPI dkcTwoDWORDToULONGLONG (ULONGLONG *dest, DWORD high, DWORD low)
DKC_INLINE void WINAPI dkcULONGLONGToTwoDWORD (DWORD *dhigh, DWORD *dlow, ULONGLONG src)
DKC_INLINE void WINAPI dkcLONGLONGToTwoLONG (LONG *high, LONG *low, LONGLONG src)
DKC_INLINE void WINAPI dkcTwoLONGToLONGLONG (LONGLONG *dest, LONG high, LONG low)
void WINAPI dkcCheckMemoryLeak (BOOL flag)
const char *WINAPI dkcGetPathSep ()
 path separatorの入った文字列(1byte毎にpath separatorの文字定数が入っている)をゲット

BOOL WINAPI dkcIsMMX (void)
 MMXが使えるならTRUE.

DKC_INLINE USHORT dkcReverseEndian16 (USHORT x)
 endian change 16 bit version

DKC_INLINE DWORD dkcReverseEndian32 (DWORD x)
DKC_INLINE ULONGLONG dkcReverseEndian64 (ULONGLONG x)
 General Function Library Copyright (C) 2000,2001 SYN All Rights Reserved.より.

DKC_INLINE BOOL dkcIsLittleEndian ()
 little endian ならTRUE

DKC_INLINE BOOL dkcCheckOverflowULONG (ULONG a1, ULONG a2)
 unsigned long型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。

void * get_offset (void *p, size_t offset)
int WINAPI dkcSelect (void *dest, const void *a_src, size_t n, int k, size_t width,DKC_COMPARE_TYPE less)
 いわいるセレクト(選択)アルゴリズム

DKC_INLINE int WINAPI dkcSelectMax (void *a, const void *a_src, size_t n, size_t width,DKC_COMPARE_TYPE less)
DKC_INLINE int WINAPI dkcSelectMin (void *a, const void *a_src, size_t n, size_t width,DKC_COMPARE_TYPE less)
DKC_INLINE int dkcRotateShiftRightMemoryLogic (void *d, size_t size, size_t n, void *workbuff, size_t worksize)
int WINAPI dkcRotateShiftRightMemory (void *d, size_t size, size_t num)


説明

d金魚 @

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


マクロ定義

#define DKUTIL_C_OS_INDEPENDENT_C
 

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


関数

DKC_INLINE void* dkcAllocate size_t  size  ) 
 

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

参照先 DKC_INLINE, と dkcAllocateFill().

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

00123                                          {
00124     return dkcAllocateFill(size,0); 
00125 /*void *ptr;
00126     ptr = dkcAllocateFast(size);
00127     if(NULL==ptr) return NULL;
00128     memset(ptr,0,size);
00129     return ptr;
00130     */
00131 }

DKC_INLINE void* dkcAllocateFast size_t  size  ) 
 

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

参照先 DKC_INLINE.

参照元 alloc_sop_node(), dkcAllocateFill(), と dkcSameObjectPoolReserve().

00120                                              {
00121     return malloc(size);
00122 }

DKC_INLINE void* dkcAllocateFill size_t  size,
BYTE  fill
 

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

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

参照元 alloc_sameobjectpool(), と dkcAllocate().

00114                                                        {
00115     void *p = dkcAllocateFast(size);
00116     if(NULL==p) return NULL;
00117     memset(p,fill,size);
00118     return p;
00119 }

void WINAPI dkcCheckMemoryLeak BOOL  flag  ) 
 

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

参照先 BOOL.

00583                                          {
00584 
00585 }

DKC_INLINE BOOL dkcCheckOverflowULONG ULONG  a1,
ULONG  a2
 

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

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

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

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

00658                                                         {
00659     ULONG maxv = ULONG_MAX;
00660   ULONG halfv = maxv / 2 ;
00661   ULONG x = a1,y = a2;
00662   if(x < y){
00663     SWAP_NUM(x,y);
00664   }
00665   if(x > halfv + 1){
00666     if(y >= halfv){
00667       return TRUE;
00668     }
00669   }
00670   return FALSE;
00671 }

BOOL WINAPI dkcCreateEmptyFile const char *  filename  ) 
 

空ファイルを作る。

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

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

参照元 dkcFileCopyEx().

00399                                                     {
00400     FILE *fp;
00401     fp = fopen( filename , "wb" ) ;//wb
00402     if(fp==NULL) return FALSE;
00403     fclose( fp ) ;
00404     return TRUE;
00405 }

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

DKC_EXTERN int WINAPI dkcFClose FILE **  ptr  ) 
 

fcloseのラッパー

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

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

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

00299                                            {
00300     if(NULL==ptr || NULL==*ptr) return edk_ArgumentException;
00301     fclose(*ptr);
00302     *ptr = NULL;
00303     return edk_SUCCEEDED;
00304 }

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

fopenのラッパー

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

参照先 DKC_EXTERN.

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

00295                                                                         {
00296     return fopen(filename,mode);
00297 }

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

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

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

参照先 BYTE, DKC_EXTERN, と dkcmNOT_ASSERT.

参照元 GetHeader().

00306 {
00307     size_t count;
00308     size_t tc,tsize;
00309     BYTE *tbuffer;
00310 
00311     //read size
00312     tsize = size;
00313     //temp variable
00314     tc = 0;
00315     //offset counter
00316     count = 0;
00317     //byte type pointer
00318     tbuffer = (BYTE *)buffer;
00319     for(;;)
00320     {
00321         //error check
00322         if(ferror(fp) ){
00323             break;
00324         }
00325         if(feof(fp)){
00326             break;
00327         }
00328         //read
00329         tc = fread(&tbuffer[count],1,tsize,fp);
00330         //update
00331         tsize -= tc;
00332         count += tc;
00333 
00334         if(count == size){
00335             break;
00336         }
00337 #   ifdef DEBUG
00338         //ありえないエラーチェック
00339         dkcmNOT_ASSERT(count > size);
00340 #   else
00341         if(count > size){
00342             break;
00343         }
00344 #   endif
00345     }
00346     return count;
00347 }

DKC_INLINE int dkcFree void **  p  ) 
 

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

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

参照元 alloc_sameobjectpool(), alloc_sop_node(), 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(), dkcFreeArrayOneByOne(), dkcFreeBlowfish(), dkcFreeBuffer(), dkcFreeCircularMemoryStream(), dkcFreeCRC(), dkcFreeDeleteCircularStream(), dkcFreeDeque(), dkcFreeDeserialize(), dkcFreeFindFile(), dkcFreeLZSS(), dkcFreeMD5(), dkcFreeMemoryStream(), dkcFreePathString(), dkcFreeQueue(), dkcFreeReplace(), dkcFreeRijndael(), dkcFreeRLE(), dkcFreeSerialize(), dkcFreeSHA1(), dkcFreeSHA256(), dkcFreeSHA384(), dkcFreeSHA512(), dkcFreeSingleListObject(), dkcFreeStack(), dkcFreeStream(), dkcFreeString(), dkcFreeTaskEngine(), dkcFreeThreadLock(), dkcFreeUniqueID(), dkcLoadLibrary(), dkcOpenFileWithSignature(), dkcSingleListErase(), dkcUnloadLibrary(), free_sameobjectpool(), free_sop_node(), と free_sop_recycle().

00133                                  {
00134     if(!*p) return edk_FAILED;
00135     free(*p);
00136     *p = NULL;
00137     return edk_SUCCEEDED;
00138 }

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

dkcFReadAll() dkcFReadAllのfwrite版

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

参照先 BYTE, DKC_EXTERN, と dkcmNOT_ASSERT.

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

const char* WINAPI dkcGetPathSep  ) 
 

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

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

参照先 dkcdPATH_SEP.

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

00588                                   {
00589 #ifdef WIN32
00590     static char target[3]={dkcdPATH_SEP,'/','\0'};
00591 #else
00592     static char target[3]={dkcdPATH_SEP,'\0'};
00593 #endif
00594     return target;
00595 }

BOOL dkcIs_foepn_mode const char *  s  ) 
 

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

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

参照先 BOOL, FALSE, と TRUE.

00139                                     {
00140     /* wrtb+ */
00141     const char *ms= "wrtb+";
00142     size_t slen = strlen(s);
00143     size_t mslen = strlen(ms);
00144     size_t i,j;
00145     int flag = FALSE;
00146     for(i=0;i<slen;i++){
00147         for(j=0;j<mslen;j++){
00148             if(ms[j]==s[i]){
00149                 flag = TRUE;
00150                 break;
00151             }
00152         }
00153         if(TRUE!=flag){
00154             return FALSE;
00155         }else{
00156             flag = FALSE;
00157         }
00158     }
00159     return TRUE;
00160 }

DKC_INLINE BOOL dkcIsLittleEndian  ) 
 

little endian ならTRUE

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

参照先 BOOL, と DKC_INLINE.

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

00652                                     {
00653     int x=1;
00654     return (BOOL)((*(char*)&x));
00655 }

BOOL WINAPI dkcIsMMX void   ) 
 

MMXが使えるならTRUE.

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

参照先 BOOL, と FALSE.

参照元 CheckMMX().

00629                           {
00630   return FALSE;
00631 }

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

参照先 dkcLoadFile().

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

00408                                                                                    {//="rb"
00409     return dkcLoadFile(data,size,fname,"rb",readsize);
00410 }

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

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

参照先 edk_FAILED, edk_SUCCEEDED, と NULL.

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

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

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

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

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

参照先 dkcLoadFile().

00415                                                                                    {
00416     return dkcLoadFile(text,length,fname,"rt",readsize);
00417 }

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

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

参照先 DKC_INLINE, dkcmNOT_ASSERT, と LONGLONG.

00526                                                                               {
00527     LONG *o = (LONG *)&src;
00528     dkcmNOT_ASSERT(sizeof(LONG) * 2 != sizeof(LONGLONG));
00529     *high = o[0];
00530     *low = o[1];
00531 }

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

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

参照先 dkcReallocateEx().

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

00196 {
00197     return dkcReallocateEx(realloc,NewPtr,NewSize,OldPtr);
00198 }

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

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

00229 {
00230     void *ptr = NULL;
00231     size_t want_size = OldSize / 8;
00232     size_t ra_size = dkcReallocateSizeFunction(OldSize,
00233          (want_size <= 20) ? 20 : want_size
00234     );
00235     size_t div = 8;
00236     size_t tmp_ra = ra_size / div;
00237     size_t i;
00238     if(NULL== your_realloc /*|| NULL==*NewPtr*/ || NULL == *OldPtr ||
00239         0==OldSize  || NULL==reallocated_size   
00240     ){
00241         return edk_ArgumentException;//アホ引数入れるな!!
00242     }
00243 
00244     for(i=0;i<div;i++){
00245         ptr = your_realloc(*OldPtr,ra_size);
00246         if(NULL==ptr){
00247             if(OldSize > (ra_size -= tmp_ra)){//とりあえずtmp_ra分を引く。
00248                 break;//こら望みなしだわ
00249             }
00250             continue;
00251         }else{
00252             break;
00253         }
00254     }
00255     if(NULL==ptr) return edk_FAILED;
00256 
00257     //更新
00258     *NewPtr = ptr;  
00259     *OldPtr = NULL;
00260 
00261     *reallocated_size = ra_size;
00262 
00263     return edk_SUCCEEDED;
00264 }

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

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

参照元 dkcReallocate().

00204 {
00205     void *ptr = NULL;
00206 
00207     if(NULL== your_realloc  /*|| NULL == *OldPtr ||
00208         0==OldSize*/
00209     ){
00210         return edk_ArgumentException;//アホ引数入れるな!!
00211     }
00212 
00213     ptr = your_realloc(*OldPtr,NewSize);
00214     if(NULL==ptr) return edk_FAILED;
00215 
00216     //更新
00217     *OldPtr = NULL;
00218     *NewPtr = ptr;
00219     
00220     return edk_SUCCEEDED;
00221 }

size_t dkcReallocateSizeFunction size_t  OldSize,
size_t  ExpandSize
 

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

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

00176                                                                   {
00177     //y=-25.43035 * pow(x,2) + 116.7214
00178     //y = -0.00000018 * pow(x,2) + 0.00019
00179     //y = -99.9999 * pow(OldSize,2) + 104857600;
00180     //y = 0.105263 * x * x + 10.52631
00181     //double x;
00182 //  size_t size;
00183     if(OldSize <= 1024 * 5){//5KB以内なら2倍
00184         return OldSize * 2;
00185     }else if(OldSize >= 1024 * 1024 * 10 || 0==OldSize)
00186     {//10MB以上なら + ExpandSize
00187         return OldSize + ExpandSize;
00188     }
00189     //それ以外ならExpandSize * 3
00190     return OldSize + ExpandSize * 3; 
00191     //return OldSize * 2;//ひでぇ関数だ。
00192 }

DKC_INLINE USHORT dkcReverseEndian16 USHORT  x  ) 
 

endian change 16 bit version

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

参照先 DKC_INLINE.

参照元 dkcStreamProcess16().

00635                                               {
00636     return (USHORT)((x >> 8) | (x << 8));
00637 }

DKC_INLINE DWORD dkcReverseEndian32 DWORD  x  ) 
 

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

参照先 DKC_INLINE, と DWORD.

00639                                             {
00640     return (x << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | (x >> 24);
00641 }

DKC_INLINE ULONGLONG dkcReverseEndian64 ULONGLONG  x  ) 
 

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

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

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

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

00643                                                      {
00644 
00645     return (
00646         (ULONGLONG)dkcReverseEndian32((DWORD)(x & 0x00000000ffffffff)) << 32)
00647         | 
00648         dkcReverseEndian32((DWORD)(x >> 32)
00649     );
00650 
00651 }

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

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

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

参照元 bse_target_to_table().

00900                                                                     {
00901     //size_t i = 0;
00902     void *pd = NULL;
00903     int r = edk_FAILED;
00904 
00905     pd = malloc(num);
00906     if(NULL==pd){
00907         return edk_OutOfMemory;
00908     }
00909     if(DKUTIL_SUCCEEDED(dkcRotateShiftRightMemoryLogic(d,size,num,pd,num))){
00910         r = edk_SUCCEEDED;
00911     }
00912 
00913     free(pd);
00914     
00915     return r;
00916 
00917 }

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

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

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

参照元 dkcRotateShiftRightMemory().

00879 {
00880     BYTE *dest = (BYTE *)d;
00881     size_t temp;
00882 
00883     if(n > worksize){
00884         return edk_FAILED;
00885     }
00886     for(;;){
00887         if(n < size){
00888             break;
00889         }
00890         n -= size;
00891     }
00892     temp = size - n;
00893     memcpy(workbuff,dest + temp,n);
00894     memmove(dest + n,dest,temp);
00895     memcpy(dest,workbuff,n);
00896     return edk_SUCCEEDED;
00897 
00898 }

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

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

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

参照先 dkcSaveFile().

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

00395                                                                         {//="wb"
00396     return dkcSaveFile(data,size,fname,"wb");
00397 }

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

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

参照先 edk_FAILED, edk_SUCCEEDED, と NULL.

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

00281 {
00282     FILE *fp;
00283     if(NULL==fname || NULL==mode){
00284         return edk_FAILED;
00285     }
00286     fp = fopen( fname , mode ) ;//wb
00287     if(fp==NULL) return edk_FAILED;
00288     fwrite( data , size  , 1 , fp ) ;
00289     //fwrite( data , sizeof(size)  , 1 , fp ) ;
00290     fclose( fp ) ;
00291     return edk_SUCCEEDED;
00292 }

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

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

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

参照先 dkcSaveFile().

00412                                                                         {
00413     return dkcSaveFile(text,length,fname,"wt");
00414 }

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

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

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

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

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

最大値を選択する

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

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

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

00761                                                                                                            {
00762     if(n-1 > INT_MAX){
00763         return edk_FAILED;
00764     }
00765     return dkcSelect(a,a_src,n,(int)n-1,width,less);
00766 }

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

最小値を選択する

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

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

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

00767                                                                                                            {
00768     return dkcSelect(a,a_src,n,(int)0,width,less);
00769 }

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

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

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

参照先 dkcSwap64(), と ULONGLONG.

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

00505 {
00506     dkcSwap64((ULONGLONG *)p1,(ULONGLONG *)p2,size);
00507 }

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

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

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

参照先 BYTE, SWAP_NUM, と ULONGLONG.

参照元 dkcSwap().

00469                                                               {
00470     size_t i;
00471     BYTE buf;
00472     size_t mod_ = size % sizeof(ULONGLONG);
00473     size_t cnt = size / sizeof(ULONGLONG);
00474     //char *tp1 = (char *)p1,*tp2 = (char *)p2;
00475     for(i=0;i<cnt;i++){
00476         SWAP_NUM(p1[i],p2[i]);
00477     }
00478     for(i=0;i<mod_;i++){
00479         
00480         //SWAP_NUM((char)tp1[size - mod_ + 1],(char)tp2[size - mod_ + i]);
00481         /*a = b - a ;\
00482     b -= a ;\
00483     a += b
00484         */
00485         /*( ( ((char *) p2)[size - mod_ + i]))
00486             = (char)( ( ((char *) p2)[size - mod_ + i])) - 
00487             (char)( ( ((char *) p1)[size - mod_ + i]));
00488         
00489         ( ( ((char *) p2)[size - mod_ + i])) -= ( ( ((char *) p1)[size - mod_ + i]));
00490 
00491         ( ( ((char *) p1)[size - mod_ + i])) += ( ( ((char *) p2)[size - mod_ + i]));
00492             */
00493         
00494         
00495         buf = (((BYTE *)p1)[size - mod_ + i]);
00496         (((BYTE *)p1)[size - mod_ + i]) = 
00497             (((BYTE *)p2)[size - mod_ + i]) ;
00498         (((BYTE *)p2)[size - mod_ + i]) = buf;
00499         
00500     }
00501 
00502 }

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

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

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

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

参照先 dkcmNOT_ASSERT, と NULL.

参照元 dkcSelect().

00420 {
00421     void *p = malloc(size);
00422     dkcmNOT_ASSERT(NULL==p);
00423     memcpy(p,p1,size);
00424     memcpy(p1,p2,size);
00425     memcpy(p2,p,size);
00426     free(p);
00427 }

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

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

参照先 DKC_INLINE, と ULONGLONG.

00511                                                                                    {
00512     //*dest = (ULONGLONG)((high << 32) + low);
00513     *dest = (ULONGLONG)high << 32;
00514     *dest += low;
00515         //( high * MAXDWORD ) + low;
00516 }

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

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

参照先 DKC_INLINE, と LONGLONG.

00533                                                                               {
00534     //*dest = (ULONGLONG)((high << 32) + low);
00535     *dest = (LONGLONG)high << 32;
00536     *dest += low;
00537 
00538 }

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

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

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

00518                                                                                      {
00519     DWORD *o = (DWORD *)&src;
00520     dkcmNOT_ASSERT(sizeof(DWORD) * 2 != sizeof(ULONGLONG));
00521     //エンディアン問題をどうにかしよう!
00522     *dhigh = o[0];
00523     *dlow = o[1];
00524 }

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

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

参照先 BYTE.

参照元 dkcSelect().

00674                                               {
00675     BYTE *oo = (BYTE *)p;
00676     
00677     return (void *)&(oo[offset]);
00678 }


dkutil_cに対してTue Dec 7 01:10:20 2004に生成されました。 doxygen 1.3.6