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

dkcOSIndependent.c

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

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

ソースコードを見る。

マクロ定義

#define DKUTIL_C_OS_INDEPENDENT_C

関数

int dkcDynamicCheckEnvironment (BOOL isForceExit)
int WINAPI dkcIsNativePathString (const char *s, size_t size)
DKC_INLINE int WINAPI dkcOutputDebugString (const char *str,...)
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)
int WINAPI dkcReallocateAutoExpand (DKC_REALLOC_F_TYPE your_realloc, void **NewPtr, void **OldPtr, size_t OldSize, size_t *reallocated_size)
static int WINAPI dkcLoadFile (void *data, size_t size, const char *fname, const char *mode, size_t *readsize)
static 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 (const void *buffer, size_t size, FILE *fp)
DKC_INLINE size_t WINAPI dkcFSize (FILE *fp)
 dkcFileSize()を普段はお使いください。エラー時の時は動作は未定義です。
int WINAPI dkcSaveBinary (const void *data, size_t size, const char *fname)
 fopenのファイル関数を使ってバイナリセーブを行う。
DKC_INLINE BOOL WINAPI dkcCreateEmptyFile (const char *filename)
 空ファイルを作る。
DKC_INLINE int WINAPI dkcLoadBinary (void *data, size_t size, const char *fname, size_t *readsize)
 バイナリデータをメモリに読み込む。dkcSaveBinary()と対
DKC_INLINE int WINAPI dkcSaveText (const char *text, size_t length, const char *fname)
 fopenでテキストセーブを行う
DKC_INLINE int WINAPI dkcLoadText (char *text, size_t length, const char *fname, size_t *readsize)
 テキストデータをメモリに読み込む。dkcSaveText()と対
DKC_INLINE int WINAPI dkcInitFileFast (const char *filename)
 エラーログ(ファイル)を高速に初期化する、
DKC_INLINE int WINAPI dkcAddLogFile (const char *filename, const char *str,...)
 ログを吐く
BOOL 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 ()
BOOL WINAPI dkcIsMMX (void)
DKC_INLINE USHORT dkcReverseEndian16 (USHORT x)
 endian change 16 bit version
DKC_INLINE DWORD dkcReverseEndian32 (DWORD x)
DKC_INLINE ULONGLONG dkcReverseEndian64 (ULONGLONG x)
DKC_INLINE BOOL dkcIsLittleEndian ()
DKC_INLINE BOOL dkcCheckOverflowULONG (ULONG a1, ULONG a2)
 unsigned long型の二つの整数をプラスしたらオーバーフローするかどうかをチェックする。
static 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 int WINAPI dkcAddLogFile const char *  filename,
const char *  str,
  ...
 

ログを吐く

引数:
filename[in] ファイルネーム
str[in] 吐く文字列
覚え書き:
出力速度が遅いので多用は奨励しない

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

参照先 NULL.

00512                                                                                   {
00513     FILE *fp=NULL;
00514     char s[2048]="";
00515     va_list VaList;
00516     int r;
00517     //SET_VA_LIST_INSERT_YEN_N(s,2048,str);
00518     SET_VA_LIST_C(VaList,r,s,sizeof(s),str);
00519 
00520     //ファイルをオープン
00521     if(NULL == (fp = fopen( filename , "at" )))
00522         return edk_FAILED;
00523     // エラーログファイルに書き出す
00524     fputs( s , fp ) ;
00525     fclose( fp ) ;
00526     return edk_SUCCEEDED;
00527 }

DKC_INLINE void* dkcAllocate size_t  size  ) 
 

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

参照先 dkcAllocateFill().

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

00189                                          {
00190     return dkcAllocateFill(size,0); 
00191 /*void *ptr;
00192     ptr = dkcAllocateFast(size);
00193     if(NULL==ptr) return NULL;
00194     memset(ptr,0,size);
00195     return ptr;
00196     */
00197 }

DKC_INLINE void* dkcAllocateFast size_t  size  ) 
 

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

参照元 alloc_2tree_node(), decode_hash(), decode_tst(), dkcAllocateFill(), dkcSameObjectPoolReserveFast(), と malloc_adapter().

00186                                              {
00187     return malloc(size);
00188 }

DKC_INLINE void* dkcAllocateFill size_t  size,
BYTE  fill
 

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

参照先 dkcAllocateFast(), と NULL.

参照元 dkcAllocate().

00180                                                        {
00181     void *p = dkcAllocateFast(size);
00182     if(NULL==p) return NULL;
00183     memset(p,fill,size);
00184     return p;
00185 }

void WINAPI dkcCheckMemoryLeak BOOL  flag  ) 
 

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

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

00715                                          {
00716 
00717 }

DKC_INLINE BOOL dkcCheckOverflowULONG ULONG  a1,
ULONG  a2
 

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

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

参照先 FALSE, と TRUE.

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

00792                                                         {
00793     ULONG maxv = ULONG_MAX;
00794   ULONG halfv = maxv / 2 ;
00795   ULONG x = a1,y = a2;
00796   if(x < y){
00797     SWAP_NUM(x,y);
00798   }
00799   if(x > halfv + 1){
00800     if(y >= halfv){
00801       return TRUE;
00802     }
00803   }
00804   return FALSE;
00805 }

DKC_INLINE BOOL WINAPI dkcCreateEmptyFile const char *  filename  ) 
 

空ファイルを作る。

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

参照先 FALSE, NULL, と TRUE.

参照元 dkcFileCopyEx().

00479                                                                {
00480     FILE *fp;
00481     fp = fopen( filename , "wb" ) ;//wb
00482     if(fp==NULL) return FALSE;
00483     fclose( fp ) ;
00484     return TRUE;
00485 }

int dkcDynamicCheckEnvironment BOOL  isForceExit  ) 
 

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

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

00049                                                 {
00050 
00051 }

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

戻り値:
almost TRUE(1)

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

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

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

DKC_EXTERN int WINAPI dkcFClose FILE **  ptr  ) 
 

fcloseのラッパー

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

参照先 NULL.

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

00367                                            {
00368     if(NULL==ptr || NULL==*ptr) return edk_ArgumentException;
00369     fclose(*ptr);
00370     *ptr = NULL;
00371     return edk_SUCCEEDED;
00372 }

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

fopenのラッパー

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

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

00363                                                                         {
00364     return fopen(filename,mode);
00365 }

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

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

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

参照先 BYTE, と dkcmNOT_ASSERT.

参照元 dkcLoadFile(), と GetHeader().

00374 {
00375     size_t count;
00376     size_t tc,tsize;
00377     BYTE *tbuffer;
00378 
00379     //read size
00380     tsize = size;
00381     //temp variable
00382     tc = 0;
00383     //offset counter
00384     count = 0;
00385     //byte type pointer
00386     tbuffer = (BYTE *)buffer;
00387     for(;;)
00388     {
00389         //error check
00390         if(ferror(fp) ){
00391             break;
00392         }
00393         if(feof(fp)){
00394             break;
00395         }
00396         //read
00397         tc = fread(&tbuffer[count],1,tsize,fp);
00398         //update
00399         tsize -= tc;
00400         count += tc;
00401 
00402         if(count == size){
00403             break;
00404         }
00405 #   ifdef DEBUG
00406         //ありえないエラーチェック
00407         dkcmNOT_ASSERT(count > size);
00408 #   else
00409         if(count > size){
00410             break;
00411         }
00412 #   endif
00413     }
00414     return count;
00415 }

DKC_INLINE int dkcFree void **  p  ) 
 

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

参照先 NULL.

参照元 alloc_RegNFA(), decode_hash(), decode_tst(), dkcAlloc2TreeRoot(), dkcAllocArrayOneByOne(), dkcAllocBitMemoryStream(), dkcAllocBuffer(), dkcAllocCircularMemoryStream(), dkcAllocCRC(), dkcAllocDeque(), dkcAllocLZW(), dkcAllocMemoryStream(), dkcAllocPathString(), dkcAllocQueue(), dkcAllocReplace(), dkcAllocRijndael(), dkcAllocSingleList(), dkcAllocSingleListObject(), dkcAllocStack(), dkcAllocStream(), dkcAllocString(), dkcAllocTaskEngine(), dkcAllocUniqueID(), dkcCloseFileWithSignature(), dkcDistCountSortChar(), dkcDistCountSortInt(), dkcDistCountSortShort(), dkcFreeArcfour(), dkcFreeArcfour2Byte(), dkcFreeArrayOneByOne(), dkcFreeBitMemoryStream(), dkcFreeBlowfish(), dkcFreeBuffer(), dkcFreeCircularMemoryStream(), dkcFreeCRC(), dkcFreeDeque(), dkcFreeFindFile(), dkcFreeGenericFileSystem(), dkcFreeHC256(), dkcFreeHMAC(), dkcFreeLZSS(), dkcFreeLZW(), dkcFreeMD5(), dkcFreeMemoryStream(), dkcFreeMemoryStreamAdapter(), dkcFreePathString(), dkcFreeQueue(), dkcFreeRegex(), dkcFreeReplace(), dkcFreeRijndael(), dkcFreeRLE(), dkcFreeSemiRealRandom(), dkcFreeSHA1(), dkcFreeSHA256(), dkcFreeSHA384(), dkcFreeSHA512(), dkcFreeSHO(), dkcFreeSingleListObject(), dkcFreeSNOW2(), dkcFreeStack(), dkcFreeStream(), dkcFreeString(), dkcFreeTaskEngine(), dkcFreeThreadLock(), dkcFreeUniqueID(), dkcLoadLibrary(), dkcOpenFileWithSignature(), dkcSingleListErase(), dkcUnloadLibrary(), free_2tree_node(), free_2tree_root(), free_adapter(), free_hash(), free_RegNFA(), と free_sameobjectpool().

00199                                  {
00200     if(!*p) return edk_FAILED;
00201     free(*p);
00202     *p = NULL;
00203     return edk_SUCCEEDED;
00204 }

void WINAPIV dkcFreeAdapter void *  p  ) 
 

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

参照元 dkcSameObjectPoolInit().

00174                                     {
00175     if(p){
00176         free(p);
00177     }
00178 }

DKC_INLINE size_t WINAPI dkcFSize FILE *  fp  ) 
 

dkcFileSize()を普段はお使いください。エラー時の時は動作は未定義です。

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

00463 {
00464     long t;
00465     size_t len;
00466     //temporary
00467     t = ftell(fp);
00468     fseek(fp,0,SEEK_END);
00469     len = ftell(fp);
00470     fseek(fp,t,SEEK_SET);
00471     return len;
00472 }

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

参照:
dkcFReadAll() dkcFReadAllのfwrite版

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

参照先 BYTE, と dkcmNOT_ASSERT.

参照元 dkcSaveFile().

00417                                                                               {
00418     size_t count;
00419     size_t tc,tsize;
00420     BYTE *tbuffer;
00421 
00422     //read size
00423     tsize = size;
00424     //temp variable
00425     tc = 0;
00426     //offset counter
00427     count = 0;
00428     //byte type pointer
00429     tbuffer = (BYTE *)buffer;
00430     for(;;)
00431     {
00432         //error check
00433         if(ferror(fp) ){
00434             break;
00435         }
00436         if(feof(fp)){
00437             break;
00438         }
00439         //read
00440         tc = fwrite(&tbuffer[count],1,tsize,fp);
00441         //update
00442         tsize -= tc;
00443         count += tc;
00444 
00445         if(count == size){
00446             break;
00447         }
00448 #   ifdef DEBUG
00449         //ありえないエラーチェック
00450         dkcmNOT_ASSERT(count > size);
00451 #   else
00452         if(count > size){
00453             break;
00454         }
00455 #   endif
00456     }
00457     return count;
00458 
00459 }

const char* WINAPI dkcGetPathSep  ) 
 

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

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

参照先 dkcdPATH_SEP.

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

00720                                   {
00721 #ifdef WIN32
00722     static char target[3]={dkcdPATH_SEP,'/','\0'};
00723 #else
00724     static char target[3]={dkcdPATH_SEP,'\0'};
00725 #endif
00726     return target;
00727 }

DKC_INLINE int WINAPI dkcInitFileFast const char *  filename  ) 
 

エラーログ(ファイル)を高速に初期化する、

覚え書き:
完全に抹消するわけではない
引数:
filename[in] ファイルの名前

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

参照先 NULL.

00501 {
00502     FILE *fp;
00503     // エラーログファイルを開く(初期化)
00504     if(NULL==(fp = fopen( filename , "wt" ))){
00505         return edk_FAILED;
00506     }
00507     fclose( fp ) ;
00508     
00509     return edk_SUCCEEDED;
00510 }

BOOL dkcIs_foepn_mode const char *  s  ) 
 

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

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

参照先 FALSE, と TRUE.

00205                                     {
00206     /* wrtb+ */
00207     const char *ms= "wrtb+";
00208     size_t slen = strlen(s);
00209     size_t mslen = strlen(ms);
00210     size_t i,j;
00211     int flag = FALSE;
00212     for(i=0;i<slen;i++){
00213         for(j=0;j<mslen;j++){
00214             if(ms[j]==s[i]){
00215                 flag = TRUE;
00216                 break;
00217             }
00218         }
00219         if(TRUE!=flag){
00220             return FALSE;
00221         }else{
00222             flag = FALSE;
00223         }
00224     }
00225     return TRUE;
00226 }

DKC_INLINE BOOL dkcIsLittleEndian  ) 
 

戻り値:
little endian ならTRUE

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

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

00786                                     {
00787     int x=1;
00788     return (BOOL)((*(char*)&x));
00789 }

BOOL WINAPI dkcIsMMX  ) 
 

戻り値:
MMXが使えるならTRUE

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

参照先 FALSE.

参照元 CheckMMX().

00763                           {
00764   return FALSE;
00765 }

int WINAPI dkcIsNativePathString const char *  s,
size_t  size
 

戻り値:
FALSEならNativeなファイルパスではない。

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

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

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

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

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

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

覚え書き:
類似: dkcFileToMemory()

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

参照先 dkcLoadFile().

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

00488                                                                                               {//="rb"
00489     return dkcLoadFile(data,size,fname,"rb",readsize);
00490 }

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

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

参照先 dkcFReadAll(), と NULL.

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

00332                                                                                                          {//="rb"
00333     FILE *fp ;
00334     if(NULL==readsize || NULL==data || NULL==fname || NULL==mode){
00335         return edk_FAILED;
00336     }
00337     fp = fopen( fname , mode ) ;//rb
00338     if(fp==NULL)return edk_FAILED;
00339     *readsize = dkcFReadAll(data,size,fp);
00340     //*readsize = fread( data , 1 , size , fp ) ;
00341     //fread( data , sizeof(size)  , 1 , fp ) ;
00342     fclose( fp ) ;
00343 
00344     return edk_SUCCEEDED;
00345 
00346 }

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

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

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

参照先 dkcLoadFile().

00495                                                                                               {
00496     return dkcLoadFile(text,length,fname,"rt",readsize);
00497 }

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

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

参照先 dkcmNOT_ASSERT, と LONGLONG.

00658                                                                               {
00659     LONG *o = (LONG *)&src;
00660     dkcmNOT_ASSERT(sizeof(LONG) * 2 != sizeof(LONGLONG));
00661     *high = o[0];
00662     *low = o[1];
00663 }

void* WINAPIV dkcMallocAdapter size_t  s  ) 
 

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

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

00170                                         {
00171     return malloc(s);
00172 }

DKC_INLINE int WINAPI dkcOutputDebugString const char *  str,
  ...
 

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

00069                                                                {
00070     char s[1024 * 2];
00071 
00072     
00073     int va_list_result;
00074     va_list Valist;
00075 
00076     
00077     
00078     SET_VA_LIST_C(Valist,va_list_result,s,sizeof(s),str);
00079     if(0 > va_list_result){
00080         return edk_FAILED;
00081     }
00082     OutputDebugString(s);
00083     return edk_SUCCEEDED;
00084     //fprintf(stderr,s);
00085 }

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

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

参照先 dkcReallocateEx().

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

00262 {
00263     return dkcReallocateEx(realloc,NewPtr,NewSize,OldPtr);
00264 }

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

参照先 dkcReallocateSizeFunction(), と NULL.

00295 {
00296     void *ptr = NULL;
00297     size_t want_size = OldSize / 8;
00298     size_t ra_size = dkcReallocateSizeFunction(OldSize,
00299          (want_size <= 20) ? 20 : want_size
00300     );
00301     size_t div = 8;
00302     size_t tmp_ra = ra_size / div;
00303     size_t i;
00304     if(NULL== your_realloc /*|| NULL==*NewPtr*/ || NULL == *OldPtr ||
00305         0==OldSize  || NULL==reallocated_size   
00306     ){
00307         return edk_ArgumentException;//アホ引数入れるな!!
00308     }
00309 
00310     for(i=0;i<div;i++){
00311         ptr = your_realloc(*OldPtr,ra_size);
00312         if(NULL==ptr){
00313             if(OldSize > (ra_size -= tmp_ra)){//とりあえずtmp_ra分を引く。
00314                 break;//こら望みなしだわ
00315             }
00316             continue;
00317         }else{
00318             break;
00319         }
00320     }
00321     if(NULL==ptr) return edk_FAILED;
00322 
00323     //更新
00324     *NewPtr = ptr;  
00325     *OldPtr = NULL;
00326 
00327     *reallocated_size = ra_size;
00328 
00329     return edk_SUCCEEDED;
00330 }

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

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

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

参照先 NULL.

参照元 dkcReallocate().

00270 {
00271     void *ptr = NULL;
00272 
00273     if(NULL== your_realloc  /*|| NULL == *OldPtr ||
00274         0==OldSize*/
00275     ){
00276         return edk_ArgumentException;//アホ引数入れるな!!
00277     }
00278 
00279     ptr = your_realloc(*OldPtr,NewSize);
00280     if(NULL==ptr) return edk_FAILED;
00281 
00282     //更新
00283     *OldPtr = NULL;
00284     *NewPtr = ptr;
00285     
00286     return edk_SUCCEEDED;
00287 }

size_t dkcReallocateSizeFunction size_t  OldSize,
size_t  ExpandSize
 

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

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

00242                                                                   {
00243     //y=-25.43035 * pow(x,2) + 116.7214
00244     //y = -0.00000018 * pow(x,2) + 0.00019
00245     //y = -99.9999 * pow(OldSize,2) + 104857600;
00246     //y = 0.105263 * x * x + 10.52631
00247     //double x;
00248 //  size_t size;
00249     if(OldSize <= 1024 * 5){//5KB以内なら2倍
00250         return OldSize * 2;
00251     }else if(OldSize >= 1024 * 1024 * 10 || 0==OldSize)
00252     {//10MB以上なら + ExpandSize
00253         return OldSize + ExpandSize;
00254     }
00255     //それ以外ならExpandSize * 3
00256     return OldSize + ExpandSize * 3; 
00257     //return OldSize * 2;//ひでぇ関数だ。
00258 }

DKC_INLINE USHORT dkcReverseEndian16 USHORT  x  ) 
 

endian change 16 bit version

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

参照元 dkcStreamProcess16().

00769                                               {
00770     return (USHORT)((x >> 8) | (x << 8));
00771 }

DKC_INLINE DWORD dkcReverseEndian32 DWORD  x  ) 
 

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

参照元 dkcReverseEndian64(), dkcSNOW2GetInitializeVector(), dkcStreamProcess32(), GetHeader(), HeaderWrite(), ReverseEndian(), と ReverseEndianDWORD().

00773                                             {
00774     return (x << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | (x >> 24);
00775 }

DKC_INLINE ULONGLONG dkcReverseEndian64 ULONGLONG  x  ) 
 

覚え書き:
General Function Library Copyright (C) 2000,2001 SYN All Rights Reserved.より

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

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

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

00777                                                      {
00778 
00779     return (
00780         (ULONGLONG)dkcReverseEndian32((DWORD)(x & 0x00000000ffffffff)) << 32)
00781         | 
00782         dkcReverseEndian32((DWORD)(x >> 32)
00783     );
00784 
00785 }

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

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

参照先 dkcRotateShiftRightMemoryLogic(), と NULL.

01036                                                                     {
01037     //size_t i = 0;
01038     void *pd = NULL;
01039     int r = edk_FAILED;
01040 
01041     pd = malloc(num);
01042     if(NULL==pd){
01043         return edk_OutOfMemory;
01044     }
01045     if(DKUTIL_SUCCEEDED(dkcRotateShiftRightMemoryLogic(d,size,num,pd,num))){
01046         r = edk_SUCCEEDED;
01047     }
01048 
01049     free(pd);
01050     
01051     return r;
01052 
01053 }

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

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

参照先 BYTE.

参照元 dkcRotateShiftRightMemory().

01015 {
01016     BYTE *dest = (BYTE *)d;
01017     size_t temp;
01018 
01019     if(n > worksize){
01020         return edk_FAILED;
01021     }
01022     for(;;){
01023         if(n < size){
01024             break;
01025         }
01026         n -= size;
01027     }
01028     temp = size - n;
01029     memcpy(workbuff,dest + temp,n);
01030     memmove(dest + n,dest,temp);
01031     memcpy(dest,workbuff,n);
01032     return edk_SUCCEEDED;
01033 
01034 }

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

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

覚え書き:
類似: dkcMemoryToFile()

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

参照先 dkcSaveFile().

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

00475                                                                         {//="wb"
00476     return dkcSaveFile(data,size,fname,"wb");
00477 }

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

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

参照先 dkcFWriteAll(), と NULL.

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

00348 {
00349     FILE *fp;
00350     if(NULL==fname || NULL==mode){
00351         return edk_FAILED;
00352     }
00353     fp = fopen( fname , mode ) ;//wb
00354     if(fp==NULL) return edk_FAILED;
00355     dkcFWriteAll(data,size,fp);
00356     //fwrite( data , size  , 1 , fp ) ;
00357     //fwrite( data , sizeof(size)  , 1 , fp ) ;
00358     fclose( fp ) ;
00359     return edk_SUCCEEDED;
00360 }

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

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

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

参照先 dkcSaveFile().

00492                                                                                    {
00493     return dkcSaveFile(text,length,fname,"wt");
00494 }

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

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

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

00822 {
00823 
00824     int i,j,left, right;
00825 
00826     void *x = malloc(width);
00827     void *a = malloc(n * width);
00828     if(NULL==x || NULL==a){
00829         return edk_ArgumentException;
00830     }
00831     if(n > INT_MAX){
00832         return edk_FAILED;
00833     }
00834     
00835 
00836     memcpy(a,a_src,width * n);
00837 
00838 
00839     left = 0;  right = n - 1;
00840 
00841     while (left < right) 
00842     {
00843 
00844         memcpy(x,   (const void *)get_offset(a,k * width),width);
00845         i = left;
00846         j = right;
00847 
00848         for ( ; ; ) {
00849 
00850             while( less(get_offset(a,i * width),x) > 0){
00851             //while( *(int *)get_offset(a,i * width) < *(int *)x){
00852                 i++;
00853             }
00854 
00855             while( less(x,get_offset(a,j * width)) > 0){
00856             //while( *(int *)x < *(int *)get_offset(a,j * width) ){
00857                 j--;
00858             }
00859 
00860             if (i > j){
00861                 break;
00862             }
00863             
00864 
00865             dkcSwapFast(
00866                 get_offset(a,i * width),
00867                 get_offset(a,j * width),
00868                 width
00869                 );
00870             
00871             i++;
00872             j--;
00873         }
00874         if (j < k){
00875             left  = i;
00876         }
00877         if (k < i){
00878             right = j;
00879         }
00880     }
00881 
00882     //ゲットする
00883     {
00884         //printf("%d",*(int *)get_offset(a,k * width));
00885 
00886         memcpy(dest,(const void *)get_offset(a,k * width),width);
00887 
00888     }
00889     free(x);
00890     free(a);
00891 
00892     return edk_SUCCEEDED;
00893 
00894 }

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

最大値を選択する

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

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

参照先 dkcSelect().

00897                                                                                                            {
00898     if(n-1 > INT_MAX){
00899         return edk_FAILED;
00900     }
00901     return dkcSelect(a,a_src,n,(int)n-1,width,less);
00902 }

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

最小値を選択する

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

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

参照先 dkcSelect().

00903                                                                                                            {
00904     return dkcSelect(a,a_src,n,(int)0,width,less);
00905 }

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

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

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

参照先 dkcSwap64(), と ULONGLONG.

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

00637 {
00638     dkcSwap64((ULONGLONG *)p1,(ULONGLONG *)p2,size);
00639 }

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

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

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

参照先 BYTE, と ULONGLONG.

参照元 dkcSwap().

00601                                                               {
00602     size_t i;
00603     BYTE buf;
00604     size_t mod_ = size % sizeof(ULONGLONG);
00605     size_t cnt = size / sizeof(ULONGLONG);
00606     //char *tp1 = (char *)p1,*tp2 = (char *)p2;
00607     for(i=0;i<cnt;i++){
00608         SWAP_NUM(p1[i],p2[i]);
00609     }
00610     for(i=0;i<mod_;i++){
00611         
00612         //SWAP_NUM((char)tp1[size - mod_ + 1],(char)tp2[size - mod_ + i]);
00613         /*a = b - a ;\
00614     b -= a ;\
00615     a += b
00616         */
00617         /*( ( ((char *) p2)[size - mod_ + i]))
00618             = (char)( ( ((char *) p2)[size - mod_ + i])) - 
00619             (char)( ( ((char *) p1)[size - mod_ + i]));
00620         
00621         ( ( ((char *) p2)[size - mod_ + i])) -= ( ( ((char *) p1)[size - mod_ + i]));
00622 
00623         ( ( ((char *) p1)[size - mod_ + i])) += ( ( ((char *) p2)[size - mod_ + i]));
00624             */
00625         
00626         
00627         buf = (((BYTE *)p1)[size - mod_ + i]);
00628         (((BYTE *)p1)[size - mod_ + i]) = 
00629             (((BYTE *)p2)[size - mod_ + i]) ;
00630         (((BYTE *)p2)[size - mod_ + i]) = buf;
00631         
00632     }
00633 
00634 }

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

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

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

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

参照先 FALSE, NULL, と TRUE.

参照元 dkcSelect().

00531 {
00532     void *p;
00533 #if 0//stack overflow 例外が発生するのも嫌だから挙動は共通で。
00534     int state = 0;
00535     p = _alloca( size );
00536     if(NULL==p){
00537         state = 1;
00538         p = malloc(size);
00539         if(NULL==p)
00540             return FALSE;
00541     }
00542 #else
00543     p = malloc(size);
00544     if(NULL==p)
00545         return FALSE;
00546 #endif
00547     memcpy(p,p1,size);
00548     memcpy(p1,p2,size);
00549     memcpy(p2,p,size);
00550 #if 0
00551     if(1==state){
00552         free(p);
00553     }
00554 
00555 #else
00556     free(p);
00557 #endif
00558     return TRUE;
00559 }

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

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

参照先 ULONGLONG.

00643                                                                                    {
00644     //*dest = (ULONGLONG)((high << 32) + low);
00645     *dest = (ULONGLONG)high << 32;
00646     *dest += low;
00647         //( high * MAXDWORD ) + low;
00648 }

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

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

参照先 LONGLONG.

00665                                                                               {
00666     //*dest = (ULONGLONG)((high << 32) + low);
00667     *dest = (LONGLONG)high << 32;
00668     *dest += low;
00669 
00670 }

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

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

参照先 dkcmNOT_ASSERT, DWORD, と ULONGLONG.

00650                                                                                      {
00651     DWORD *o = (DWORD *)&src;
00652     dkcmNOT_ASSERT(sizeof(DWORD) * 2 != sizeof(ULONGLONG));
00653     //エンディアン問題をどうにかしよう!
00654     *dhigh = o[0];
00655     *dlow = o[1];
00656 }

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

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

参照先 BYTE.

00810                                               {
00811     BYTE *oo = (BYTE *)p;
00812     
00813     return (void *)&(oo[offset]);
00814 }


dkutil_cに対してSat Sep 10 09:24:40 2005に生成されました。  doxygen 1.4.4