00001
00008 #ifndef DKUTIL_C_OS_INDEPENDENT_H
00009 #define DKUTIL_C_OS_INDEPENDENT_H
00010
00011
00012
00013 #include "dkc_misc.h"
00014
00015
00016
00018 DKC_EXTERN BOOL WINAPI dkcIsNativePathString(const char *s,size_t size);
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 DKC_EXTERN size_t dkcReallocateSizeFunction(size_t OldSize,size_t ExpandSize);
00031
00033 typedef void *( WINAPIV *DKC_ALLOC_FUNC_TYPE)(size_t);
00035 typedef void (WINAPIV *DKC_FREE_FUNC_TYPE)(void *);
00036
00037 DKC_EXTERN void *WINAPIV dkcMallocAdapter(size_t);
00038
00039 DKC_EXTERN void WINAPIV dkcFreeAdapter(void *);
00040
00041 DKC_EXTERN void* WINAPIV dkcAllocate(size_t size);
00042
00043 DKC_EXTERN int WINAPIV dkcFree(void **p);
00044
00045 DKC_EXTERN void *WINAPIV dkcAllocateFast(size_t size);
00046
00047 DKC_EXTERN void *WINAPIV dkcAllocateFill(size_t size,BYTE fill);
00048
00049 DKC_EXTERN int WINAPI dkcReallocate(
00050 void **NewPtr,size_t NewSize,void **OldPtr
00051 );
00052
00060
00061 DKC_EXTERN int WINAPI dkcReallocateEx(
00062 DKC_REALLOC_F_TYPE your_realloc,void **NewPtr,size_t NewSize,
00063 void **OldPtr
00064 );
00065
00075 DKC_EXTERN int WINAPI dkcReallocateAutoExpand(
00076 DKC_REALLOC_F_TYPE your_realloc,void **NewPtr,
00077 void **OldPtr,size_t OldSize,size_t *reallocated_size
00078 );
00079
00080 DKC_EXTERN int WINAPI dkcGetMemorySize(uint64 *pTotalMemory,uint64 *pFreeMemory);
00081
00085 DKC_EXTERN void WINAPI
00086 dkcSwap(void *p1,void *p2,size_t size);
00093 DKC_EXTERN BOOL WINAPI dkcSwapFast(void *p1,void *p2,size_t size);
00094
00102 DKC_EXTERN void WINAPI dkcSwap64(ULONGLONG *p1,ULONGLONG *p2,size_t size);
00103
00104
00105
00106
00107
00108
00109
00110
00112 DKC_EXTERN BOOL dkcIs_foepn_mode(const char *s);
00114 DKC_EXTERN FILE * WINAPI dkcFOpen(const char *filename,const char *mode);
00116 DKC_EXTERN int WINAPI dkcFClose(FILE **ptr);
00117
00119 DKC_EXTERN size_t WINAPI dkcFReadAll(void *,size_t size,FILE *fp);
00120
00121
00123 DKC_EXTERN size_t WINAPI dkcFWriteAll(const void *,size_t size,FILE *fp);
00124
00126 DKC_EXTERN size_t WINAPI dkcFSize(FILE *fp);
00127
00128
00130 DKC_EXTERN int WINAPI dkcSaveBinary(const void *data,size_t size,const char *fname);
00132 DKC_EXTERN int WINAPI dkcLoadBinary(void *data,size_t size,const char *fname,size_t *readsize);
00134 DKC_EXTERN int WINAPI dkcSaveText(const char *text,size_t length,const char *fname);
00136 DKC_EXTERN int WINAPI dkcLoadText(char *text,size_t length,const char *fname,size_t *readsize);
00138 DKC_EXTERN BOOL WINAPI dkcCreateEmptyFile(const char *filename);
00140 DKC_EXTERN int WINAPI dkcInitFileFast( const char *filename );
00142 DKC_EXTERN int WINAPI dkcAddLogFile( const char *filename,const char *str , ... );
00143
00144 DKC_EXTERN void WINAPI dkcTwoDWORDToULONGLONG(ULONGLONG *dest,DWORD high,DWORD low);
00145
00146 DKC_EXTERN void WINAPI dkcULONGLONGToTwoDWORD(DWORD *dhigh,DWORD *dlow,ULONGLONG src);
00147
00148 DKC_EXTERN void WINAPI dkcLONGLONGToTwoLONG(LONG *high,LONG *low,LONGLONG src);
00149
00150 DKC_EXTERN void WINAPI dkcTwoLONGToLONGLONG(LONGLONG *dest,LONG high,LONG low);
00151
00152
00154 DKC_INLINE void dkcTwoLONGToULONGLONG(ULONGLONG *dest,LONG high,LONG low){
00155 ULONG *p = (ULONG *)&low,*p2;
00156 *dest = *p;
00157 p = (ULONG *)(dest + 1);
00158 p2 = (ULONG *)&high;
00159 *p = *p2;
00160 }
00161
00162 DKC_EXTERN int WINAPI dkcOutputDebugString(const char *str,...);
00166 DKC_EXTERN int WINAPI dkcErrorMessage(const char *expression,
00167 const char *filename,size_t line,const char *message,...);
00168
00169
00170
00171 #if defined(DEBUG) || defined(DKUTIL_DEBUG)
00172 # define dkcmNOT_ASSERT(ex) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) )
00173 # define dkcmASSERT(ex) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) )
00174 # define dkcmNOT_ASSERT_MESSAGE(ex,mes) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,mes) )
00175 # define dkcmASSERT_MESSAGE(ex,mes) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,mes) )
00176 #else
00177 # define dkcmNOT_ASSERT_MESSAGE(ex,mes) ((void)0)
00178 # define dkcmASSERT_MESSAGE(ex,mes) ((void)0)
00179 # define dkcmNOT_ASSERT(ex) ((void)0)
00180 # define dkcmASSERT(ex) ((void)0)
00181 #endif
00182
00183 # define dkcmFORCE_NOT_ASSERT(ex) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) )
00184 # define dkcmFORCE_ASSERT(ex) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) )
00185 # define dkcmFORCE_NOT_ASSERT_MESSAGE(ex,mes) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,mes) )
00186 # define dkcmFORCE_ASSERT_MESSAGE(ex,mes) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,mes) )
00187
00189 DKC_EXTERN const char *WINAPI dkcGetPathSep();
00190
00195 DKC_EXTERN int dkcDynamicCheckEnvironment(BOOL isForceExit);
00197 DKC_EXTERN void WINAPI dkcCheckMemoryLeak(BOOL flag);
00199 DKC_EXTERN BOOL WINAPI dkcIsMMX();
00200
00201
00202
00203 #define dkcmREVERSE_ENDIAN16(x) ( (USHORT)( (x >> 8) | (x << 8) ) )
00204
00205 #define dkcmREVERSE_ENDIAN32(x) \
00206 ( (x << 24) | ( (x & 0x0000ff00) << 8) | ( (x & 0x00ff0000) >> 8 ) | (x >> 24) )
00207
00208 #ifdef WIN32
00209 # define dkcmREVERSE_ENDIAN64(x) (\
00210 (ULONGLONG)dkcReverseEndian32( (DWORD) (x & 0x00000000ffffffff) ) << 32 )\
00211 | \
00212 dkcReverseEndian32((DWORD)(x >> 32)\
00213 )
00214 #else
00215 # define dkcmREVERSE_ENDIAN64(x) dkcReverseEndian64(x)
00216
00217 #endif
00218
00219 DKC_EXTERN ULONG dkcReverseEndian32(ULONG x);
00221 DKC_EXTERN ULONGLONG dkcReverseEndian64(ULONGLONG x);
00223 DKC_EXTERN USHORT dkcReverseEndian16(USHORT x);
00224
00226 DKC_EXTERN BOOL dkcIsLittleEndian();
00228 #define dkcIsBigEndian() (!dkcIsLittleEndian())
00229
00230 enum edkcByteOrder{
00232 edkcByteOrder_ABCD = 0,
00234 edkcByteOrder_DCBA,
00236 edkcByteOrder_BADC,
00237 edkcByteOrder_Unknown = 255,
00238 };
00239 typedef union dkc_byte_order_check_union{
00240 uint32 x;
00241 uint8 abcd[4];
00242 }DKC_BYTE_ORDER_CHECK_UNION;
00244 DKC_EXTERN int WINAPI dkcGetByteOrder();
00245
00247 DKC_EXTERN BOOL dkcCheckOverflowULONG(ULONG a1,ULONG a2);
00248 DKC_EXTERN BOOL dkcCheckOverflowULONGLONG(ULONGLONG a1,ULONGLONG a2);
00249
00250 #define dkcCheckOverflow32(a,b) dkcCheckOverflowULONG(a,b)
00251 #define dkcCheckOverflow64(a,b) dkcCheckOverflowULONGLONG(a,b)
00252
00253
00254 typedef int (WINAPIV *DKC_COMPARE_TYPE)(const void *,const void *);
00255
00279
00280 DKC_EXTERN int WINAPI dkcSelect(void *dest,const void *a_src,size_t n,int k,size_t width ,DKC_COMPARE_TYPE comp);
00281
00286 DKC_EXTERN int WINAPI dkcSelectMax(void *dest,const void *a, size_t n,size_t width ,DKC_COMPARE_TYPE comp);
00291 DKC_EXTERN int WINAPI dkcSelectMin(void *dest,const void *a, size_t n,size_t width ,DKC_COMPARE_TYPE comp);
00292
00293
00294 DKC_INLINE int dkcRotateShiftRightMemoryLogic(void *dest,size_t size,size_t n,void *workbuff,size_t worksize);
00295
00296
00297 DKC_EXTERN int WINAPI dkcRotateShiftRightMemory(void *dest,size_t size,size_t n);
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307 #if DKC_HAVE_INLINE==1
00308
00309 DKC_FORCE_INLINE void *WINAPI dkcSecureFillMemory (void * Destination,size_t Length,uint8 Fill){
00310 volatile uint8 *vptr = (volatile uint8 *)Destination;
00311 while(Length){
00312 *vptr = Fill;
00313 vptr++;
00314 Length--;
00315 }
00316 return Destination;
00317 }
00318
00319 DKC_FORCE_INLINE void *dkcSecureZeroMemory(void *ptr, size_t cnt)
00320 {
00321
00322
00323
00324
00325
00326
00327
00328 return dkcSecureFillMemory(ptr,cnt,0);
00329 }
00330
00331
00333 DKC_INLINE BOOL dkcFReadAllCheck(void *buff,size_t size,FILE *fp)
00334 {
00335 if(size != dkcFReadAll(buff,size,fp))
00336 return FALSE;
00337 return TRUE;
00338 }
00339 DKC_INLINE BOOL dkcFWriteAllCheck(const void *buff,size_t size,FILE *fp)
00340 {
00341 if(size != dkcFWriteAll(buff,size,fp))
00342 return FALSE;
00343 return TRUE;
00344 }
00345
00346
00347
00349 DKC_INLINE size_t dkcGetProperTemporaryBufferSize(){
00350 uint64 total_size,free_size;
00351 if(DKUTIL_FAILED(dkcGetMemorySize(&total_size,&free_size)))
00352 {
00353 return 1024 * 64;
00354 }
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365 total_size = free_size / 0x1000;
00366 if(total_size > 1024 * 1024){
00367 total_size = 1024 * 1024;
00368 }
00369 else if(0==total_size)
00370 {
00371 total_size = free_size % 0x1000;
00372 if(0==total_size){
00373 return 1;
00374 }
00375 }
00376 return (size_t)total_size;
00377 }
00378 #else
00379
00380
00381
00382 #endif
00383
00384
00385
00386
00387
00388 #ifdef __cplusplus
00389
00390 namespace dkutil{
00391
00392
00402
00403 inline bool SaveBinary(const void *data,size_t size,const char *fname,const char *mode="wb"){
00404 FILE *fp;
00405 fp = fopen( fname , mode ) ;
00406 if(fp==NULL) return false;
00407
00408 dkcFWriteAll(data,size,fp);
00409
00410 fclose( fp ) ;
00411 return true;
00412
00413 }
00414
00422
00423 inline bool LoadBinary(void *data,size_t size,const char *fname,const char *mode="rb" ){
00424 FILE *fp ;
00425 fp = fopen( fname , mode ) ;
00426 if(fp==NULL)return false;
00427 dkcFReadAll(data,size,fp);
00428
00429
00430 fclose( fp ) ;
00431 return true;
00432 }
00433
00434 inline bool SaveText(const char *text,size_t length,const char *fname,const char *mode="wt"){
00435 return SaveBinary(text,length,fname,mode);
00436 }
00437 inline bool LoadText(char *text,size_t length,const char *fname,const char *mode="rt"){
00438 return LoadBinary(text,length,fname,mode);
00439 }
00440
00441
00442
00443 }
00444
00445
00446 #else //for c lang
00447
00448
00449
00450
00451 #endif //end of __cplusplus
00452
00453 #endif //end of include once