00001
00007 #ifndef DKUTIL_C_OS_INDEPENDENT_H
00008 #define DKUTIL_C_OS_INDEPENDENT_H
00009
00010 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
00011 # pragma once
00012
00013 #else
00014
00015 #endif
00016
00017 #ifdef __cplusplus //C++のみ
00018
00019 # include <limits>
00020
00021
00022 #endif
00023
00024
00025 #include "dkcDefined.h"
00026 #include <limits.h>
00027 #include <float.h>
00028
00029 #if defined(_WIN32) || defined(__WIN32__)
00030 # ifndef WIN32
00031 # define WIN32
00032 # endif
00033 #endif
00034
00035 #if defined(_MSC_VER) || defined(WIN32)
00036 typedef unsigned __int64 QWORD;
00037 #else
00038 typedef unsigned long long QWORD;
00039 #endif
00040
00042 typedef unsigned char dkctBOOL;
00043
00044
00045
00046 #ifndef WIN32
00047
00048 #ifndef ULONGLONG
00049 # define ULONGLONG unsigned long long int
00050 #endif
00051
00052 #ifndef LONGLONG
00053 # define LONGLONG long long int
00054 #endif
00055
00056
00057
00058
00059 #ifndef TRUE
00060 # define TRUE 1
00061 #endif
00062 #ifndef FALSE
00063 # define FALSE 0
00064 #endif
00065
00066 #ifndef NULL
00067 # define NULL 0
00068 #endif
00069
00070 # define dkcdPATH_SEP '/'
00071 # define dkcdPATH_SEP_STR "/"
00072 # define dkcdPATH_LIST_SEP ':'
00073 # define dkcdPATH_LIST_SEP_STR ":"
00074 # define dkcmIS_PATH_SEP(c) (dkcdPATH_SEP==(c))
00075
00076 # define dkcmIS_INVALID_FILENAME_CHAR(c) ( ((c) =='\\') || ((c)=='/') || ((c)=='*') || ((c)=='?') \
00077 || ((c)== '"') || ((c) == '<') || ((c) == '>') || ((c) == '|') )
00078
00079 # define dkcmIS_INVALID_FOLDERNAME_CHAR(c) \
00080 dkcmIS_INVALID_FILENAME_CHAR(c)
00081
00082 #define dkcmIS_INVALID_PATH_CHAR(c) \
00083 ( ( (c)=='\\') || ((c)=='*') || ((c)=='?') || ((c)== '"') || \
00084 ((c) == '<') || ((c) == '>') || ((c) == '|') )
00085
00086
00087 typedef void *(*DKC_REALLOC_F_TYPE)(void *,size_t);
00088
00089 typedef int BOOL;
00090 typedef unsigned char BYTE;
00091
00092
00093
00094
00095 #if defined(_MT) || defined(__MT__)//MultiThread
00096 # define dkcdMultiThread
00097 #endif
00098
00099 #ifndef CALLBACK
00100 # define CALLBACK
00101 #endif
00102 #ifndef WINAPI
00103 # define WINAPI
00104 #endif
00105
00106 #else //else of WIN32
00107
00108 #ifdef _MSC_VER
00109 # ifdef _DEBUG
00110 # ifndef DEBUG
00111 # define DEBUG
00112 # endif
00113 # else
00114 # ifndef NDEBUG
00115 # define NDEBUG
00116 # endif
00117 # endif
00118
00119 # pragma warning(disable:4115)//union{ } struct{ }
00120 # pragma warning(disable:4100)//引数が関数の本体で 1 度も参照されません。
00121 # pragma warning(disable:4206)//プリプロセス後のファイルが空です。 #if 0 #endif
00122 # pragma warning(disable:4710)//場合によってはインライン処理を行いません。
00123 # pragma warning(disable:4505)//参照されていないローカル関数は削除されました。
00124 #endif
00125
00126 # include <windows.h>
00127
00128
00129
00130
00131 # ifndef CALLBACK
00132 # define CALLBACK __stdcall
00133 # endif
00134 # ifndef WINAPI
00135 # define WINAPI __stdcall
00136 # endif
00137
00138
00139
00140 # define dkcdPATH_SEP '\\'
00141 # define dkcdPATH_SEP_STR "\\"
00142 # define dkcdPATH_LIST_SEP ';'
00143 # define dkcdPATH_LIST_SEP_STR ";"
00144 # define dkcmIS_PATH_SEP(c) (dkcdPATH_SEP==(c) || '/'==(c))
00145
00147 # define dkcmIS_INVALID_FILENAME_CHAR(c) ( ((c) =='\\') || ((c)=='/') || ((c)=='*') || ((c)=='?') \
00148 || ((c)== '"') || ((c) == '<') || ((c) == '>') || ((c) == '|') || (':'== (c)) )
00149
00150 # define dkcmIS_INVALID_FOLDERNAME_CHAR(c) \
00151 dkcmIS_INVALID_FILENAME_CHAR(c)
00152
00154 # define dkcmIS_INVALID_PATH_CHAR(c) \
00155 ((c)=='*') || ((c)=='?') || ((c)== '"') || \
00156 ((c) == '<') || ((c) == '>') || ((c) == '|')
00157
00158 #ifdef _MT
00159 # define dkcdMultiThread
00160 #endif
00161
00162 #ifdef _MSC_VER
00163 #ifdef DEBUG
00164 # pragma comment(linker,"/NODEFAULTLIB:LIBC")
00165 # pragma comment(linker,"/NODEFAULTLIB:LIBCMT")
00166 # ifdef dkcdMultiThread
00167 # pragma comment(linker,"/NODEFAULTLIB:LIBCD")
00168 # else
00169 # pragma comment(linker,"/NODEFAULTLIB:LIBCMTD")
00170 # endif
00171 #else
00172 # pragma comment(linker,"/NODEFAULTLIB:LIBCD")
00173 # pragma comment(linker,"/NODEFAULTLIB:LIBCMTD")
00174 # ifdef dkcdMultiThread
00175 # pragma comment(linker,"/NODEFAULTLIB:LIBC")
00176 # else
00177 # pragma comment(linker,"/NODEFAULTLIB:LIBCMT")
00178 # endif
00179 #endif
00180 #endif //end of _MSC_VER
00181
00182 #endif //end of #ifndef WIN32
00183
00184
00185
00186 #ifndef ULONGLONG_MAX
00187 # define ULONGLONG_MAX DKINGYO_ULONGLONG_MAX
00188 #endif
00189 #ifndef LONGLONG_MAX
00190 # define LONGLONG_MAX DKINGYO_LONGLONG_MAX
00191 #endif
00192 #ifndef LONGLONG_MIN
00193 # define LONGLONG_MIN DKINGYO_LONGLONG_MIN
00194 #endif
00195
00196
00197 #ifdef WIN32
00198
00199 typedef void *(WINAPIV *DKC_REALLOC_F_TYPE)(void *,size_t);
00200
00201 #else
00202
00203 typedef void *(*DKC_REALLOC_F_TYPE)(void *,size_t);
00204
00205 #endif
00206
00207
00208
00209 #ifdef __BORLANDC__
00210 # include <dir.h>
00211 #else
00212 # include <direct.h>
00213 #endif
00214
00215
00216 #ifndef dkcdMAXPATH
00217 # if defined(PATH_MAX)
00218 # define dkcdMAXPATH PATH_MAX
00219
00220 # elif defined(MAX_PATH)
00221 # define dkcdMAXPATH MAX_PATH
00222
00223 # elif defined(_MAX_PATH)
00224 # define dkcdMAXPATH _MAX_PATH
00225
00226 # else
00227 # define dkcdMAXPATH 1024
00228
00229 # endif
00230 #endif
00231
00232 #ifndef dkcdMAXPATH_LEN
00233 # define dkcdMAXPATH_LEN dkcdMAXPATH
00234 #endif
00235
00236
00237
00238
00239
00240
00241
00242 #ifndef dkcdMAXPATH_BUFFER
00243
00244 # define dkcdMAXPATH_BUFFER dkcdMAXPATH * 2
00245 #endif
00246
00247
00248
00249 #ifndef MAYBE
00250 # define MAYBE 2
00251 #endif
00252
00253 typedef struct dkc_4char{
00254 signed char mode1,mode2,mode3,mode4;
00255 }DKC_4CHAR;
00256
00257
00258
00259
00260 #ifdef __cplusplus
00261
00262 namespace dkutil{
00263
00264
00274
00275 inline bool SaveBinary(const void *data,size_t size,const char *fname,const char *mode="wb"){
00276 FILE *fp;
00277 fp = fopen( fname , mode ) ;
00278 if(fp==NULL) return false;
00279 fwrite( data , size , 1 , fp ) ;
00280
00281 fclose( fp ) ;
00282 return true;
00283 }
00284
00292
00293 inline bool LoadBinary(void *data,size_t size,const char *fname,const char *mode="rb" ){
00294 FILE *fp ;
00295 fp = fopen( fname , mode ) ;
00296 if(fp==NULL)return false;
00297 fread( data , size , 1 , fp ) ;
00298
00299 fclose( fp ) ;
00300 return true;
00301 }
00302
00303 inline bool SaveText(const char *text,size_t length,const char *fname,const char *mode="wt"){
00304 return SaveBinary(text,length,fname,mode);
00305 }
00306 inline bool LoadText(char *text,size_t length,const char *fname,const char *mode="rt"){
00307 return LoadBinary(text,length,fname,mode);
00308 }
00309
00310
00311
00312 }
00313
00314
00315 #else //for c lang
00316
00317
00318 #endif //end of __cplusplus
00319
00321 DKC_EXTERN BOOL WINAPI dkcIsNativePathString(const char *s,size_t size);
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333 DKC_EXTERN size_t dkcReallocateSizeFunction(size_t OldSize,size_t ExpandSize);
00334
00335 DKC_EXTERN void* WINAPIV dkcAllocate(size_t size);
00336
00337 DKC_EXTERN int WINAPIV dkcFree(void **p);
00338
00339 DKC_EXTERN int WINAPI dkcReallocate(
00340 void **NewPtr,size_t NewSize,void **OldPtr
00341 );
00342
00350
00351 DKC_EXTERN int WINAPI dkcReallocateEx(
00352 DKC_REALLOC_F_TYPE your_realloc,void **NewPtr,size_t NewSize,
00353 void **OldPtr
00354 );
00355
00365 DKC_EXTERN int WINAPI dkcReallocateAutoExpand(
00366 DKC_REALLOC_F_TYPE your_realloc,void **NewPtr,
00367 void **OldPtr,size_t OldSize,size_t *reallocated_size
00368 );
00369
00373 DKC_EXTERN void WINAPI
00374 dkcSwap(void *p1,void *p2,size_t size);
00381 DKC_EXTERN void WINAPI dkcSwapFast(void *p1,void *p2,size_t size);
00382
00390 DKC_EXTERN void WINAPI dkcSwap64(ULONGLONG *p1,ULONGLONG *p2,size_t size);
00391
00392
00393
00394
00395
00396
00397
00398
00399
00401 DKC_EXTERN BOOL dkcIs_foepn_mode(const char *s);
00403 DKC_EXTERN FILE * WINAPI dkcFOpen(const char *filename,const char *mode);
00405 DKC_EXTERN int WINAPI dkcFClose(FILE **ptr);
00406
00408 DKC_EXTERN size_t WINAPI dkcFReadAll(void *,size_t size,FILE *fp);
00410 DKC_EXTERN size_t WINAPI dkcFWriteAll(void *,size_t size,FILE *fp);
00411
00412
00414 DKC_EXTERN int WINAPI dkcSaveBinary(const void *data,size_t size,const char *fname);
00415
00417 DKC_EXTERN int WINAPI dkcLoadBinary(void *data,size_t size,const char *fname,size_t *readsize);
00419 DKC_EXTERN int WINAPI dkcSaveText(const char *text,size_t length,const char *fname);
00421 DKC_EXTERN int WINAPI dkcLoadText(char *text,size_t length,const char *fname,size_t *readsize);
00423 DKC_EXTERN BOOL WINAPI dkcCreateEmptyFile(const char *filename);
00424
00425
00426 DKC_EXTERN void WINAPI dkcTwoDWORDToULONGLONG(ULONGLONG *dest,DWORD high,DWORD low);
00427
00428 DKC_EXTERN void WINAPI dkcULONGLONGToTwoDWORD(DWORD *dhigh,DWORD *dlow,ULONGLONG src);
00429
00430 DKC_EXTERN void WINAPI dkcLONGLONGToTwoLONG(LONG *high,LONG *low,LONGLONG src);
00431
00432 DKC_EXTERN void WINAPI dkcTwoLONGToLONGLONG(LONGLONG *dest,LONG high,LONG low);
00433
00434
00438 DKC_EXTERN int WINAPI dkcErrorMessage(const char *expression,
00439 const char *filename,size_t line,const char *message,...);
00440
00441
00442
00443 #if defined(DEBUG) || defined(DKUTIL_DEBUG)
00444 # define dkcmNOT_ASSERT(ex) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) )
00445 # define dkcmASSERT(ex) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) )
00446 # define dkcmNOT_ASSERT_MESSAGE(ex,mes) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,mes) )
00447 # define dkcmASSERT_MESSAGE(ex,mes) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,mes) )
00448 #else
00449 # define dkcmNOT_ASSERT_MESSAGE(ex,mes) ((void)0)
00450 # define dkcmASSERT_MESSAGE(ex,mes) ((void)0)
00451 # define dkcmNOT_ASSERT(ex) ((void)0)
00452 # define dkcmASSERT(ex) ((void)0)
00453 #endif
00454
00455 # define dkcmFORCE_NOT_ASSERT(ex) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) )
00456 # define dkcmFORCE_ASSERT(ex) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) )
00457 # define dkcmFORCE_NOT_ASSERT_MESSAGE(ex,mes) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,mes) )
00458 # define dkcmFORCE_ASSERT_MESSAGE(ex,mes) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,mes) )
00459
00461 DKC_EXTERN const char *WINAPI dkcGetPathSep();
00462
00463 DKC_EXTERN void WINAPI dkcCheckMemoryLeak(BOOL flag);
00465 DKC_EXTERN BOOL WINAPI dkcIsMMX();
00466
00467
00468
00469 #define dkcmREVERSE_ENDIAN16(x) ( (USHORT)( (x >> 8) | (x << 8) ) )
00470
00471 #define dkcmREVERSE_ENDIAN32(x) \
00472 ( (x << 24) | ( (x & 0x0000ff00) << 8) | ( (x & 0x00ff0000) >> 8 ) | (x >> 24) )
00473
00474 #ifdef WIN32
00475 # define dkcmREVERSE_ENDIAN64(x) (\
00476 (ULONGLONG)dkcReverseEndian32( (DWORD) (x & 0x00000000ffffffff) ) << 32 )\
00477 | \
00478 dkcReverseEndian32((DWORD)(x >> 32)\
00479 )
00480 #else
00481 # define dkcmREVERSE_ENDIAN64(x) dkcReverseEndian64(x)
00482
00483
00484 #endif
00485
00486 DKC_EXTERN ULONG dkcReverseEndian32(ULONG x);
00488 DKC_EXTERN ULONGLONG dkcReverseEndian64(ULONGLONG x);
00490 DKC_EXTERN USHORT dkcReverseEndian16(USHORT x);
00491
00493 DKC_EXTERN BOOL dkcIsLittleEndian();
00495 #define dkcIsBigEndian() (!dkcIsLittleEndian())
00496
00497
00499 DKC_EXTERN BOOL dkcCheckOverflowULONG(ULONG a1,ULONG a2);
00500
00501
00502
00503
00504 typedef int (WINAPIV *DKC_COMPARE_TYPE)(const void *,const void *);
00505
00529
00530 DKC_EXTERN int WINAPI dkcSelect(void *dest,const void *a_src,size_t n,int k,size_t width ,DKC_COMPARE_TYPE comp);
00531
00536 DKC_EXTERN int WINAPI dkcSelectMax(void *dest,const void *a, size_t n,size_t width ,DKC_COMPARE_TYPE comp);
00541 DKC_EXTERN int WINAPI dkcSelectMin(void *dest,const void *a, size_t n,size_t width ,DKC_COMPARE_TYPE comp);
00542
00543
00544 DKC_INLINE int dkcRotateShiftRightMemoryLogic(void *dest,size_t size,size_t n,void *workbuff,size_t worksize);
00545
00546
00547 DKC_EXTERN int WINAPI dkcRotateShiftRightMemory(void *dest,size_t size,size_t n);
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560 #endif //end of include once