00001
00008 #ifndef DKUTIL_C_OS_INDEPENDENT_H
00009 #define DKUTIL_C_OS_INDEPENDENT_H
00010
00011
00012
00013
00014
00015 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
00016 # pragma once
00017 #else
00018
00019
00020 #endif
00021
00022 #ifdef __cplusplus //C++のみ
00023
00024 # include <limits>
00025
00026
00027 #endif
00028
00029
00030 #include "dkcDefined.h"
00031 #include <limits.h>
00032 #include <float.h>
00033 #include <assert.h>
00034
00035
00036
00037 #ifdef DKUTIL_C_USE_DKUTIL_CSTD
00038 # include <dkutil_cstd/stdlib.h>
00039 #else
00040 # include <stdlib.h>
00041 #endif
00042
00043 #ifdef __BORLANDC__
00044 # include <dir.h>
00045 #else
00046 # include <direct.h>
00047 #endif
00048
00049 #if defined(_WIN32) || defined(__WIN32__)
00050 # ifndef WIN32
00051 # define WIN32
00052 # endif
00053 #endif
00054
00055
00056
00057
00058 #if defined(_MSC_VER) || defined(WIN32)
00059 typedef unsigned __int64 QWORD;
00060 #else
00061 typedef unsigned long long QWORD;
00062 #endif
00063
00065 typedef unsigned char dkctBOOL;
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 #ifndef WIN32
00081
00082
00083
00084 #ifndef DWORD
00085 # define DWORD uint32
00086 #endif
00087 #ifndef WORD
00088 # define WORD uint16
00089 #endif
00090 #ifndef BYTE
00091 # define BYTE uint8
00092 #endif
00093
00094
00095 #ifndef ULONGLONG
00096 # define ULONGLONG unsigned long long int
00097 #endif
00098
00099 #ifndef LONGLONG
00100 # define LONGLONG long long int
00101 #endif
00102
00103
00104 #ifndef TRUE
00105 # define TRUE 1
00106 #endif
00107 #ifndef FALSE
00108 # define FALSE 0
00109 #endif
00110
00111 #ifndef NULL
00112 # define NULL 0
00113 #endif
00114
00115 # define dkcdPATH_SEP '/'
00116 # define dkcdPATH_SEP_STR "/"
00117 # define dkcdPATH_LIST_SEP ':'
00118 # define dkcdPATH_LIST_SEP_STR ":"
00119 # define dkcmIS_PATH_SEP(c) (dkcdPATH_SEP==(c))
00120
00121 # define dkcmIS_INVALID_FILENAME_CHAR(c) ( ((c) =='\\') || ((c)=='/') || ((c)=='*') || ((c)=='?') \
00122 || ((c)== '"') || ((c) == '<') || ((c) == '>') || ((c) == '|') )
00123
00124 # define dkcmIS_INVALID_FOLDERNAME_CHAR(c) \
00125 dkcmIS_INVALID_FILENAME_CHAR(c)
00126
00127 #define dkcmIS_INVALID_PATH_CHAR(c) \
00128 ( ( (c)=='\\') || ((c)=='*') || ((c)=='?') || ((c)== '"') || \
00129 ((c) == '<') || ((c) == '>') || ((c) == '|') )
00130
00131
00132 typedef void *(*DKC_REALLOC_F_TYPE)(void *,size_t);
00133
00134 typedef int BOOL;
00135
00136
00137
00138
00139
00140 #ifndef CALLBACK
00141 # define CALLBACK
00142 #endif
00143 #ifndef WINAPI
00144 # define WINAPI
00145 #endif
00146
00147 #else //else of WIN32
00148
00149 #ifdef _MSC_VER
00150 # ifdef _DEBUG
00151 # ifndef DEBUG
00152 # define DEBUG
00153 # endif
00154 # else
00155 # ifndef NDEBUG
00156 # define NDEBUG
00157 # endif
00158 # endif
00159
00160 # pragma warning(disable:4115)//union{ } struct{ }
00161 # pragma warning(disable:4100)//引数が関数の本体で 1 度も参照されません。
00162 # pragma warning(disable:4206)//プリプロセス後のファイルが空です。 #if 0 #endif
00163 # pragma warning(disable:4710)//場合によってはインライン処理を行いません。
00164 # pragma warning(disable:4505)//参照されていないローカル関数は削除されました。
00165 #endif
00166
00167 # include <windows.h>
00168
00169
00170
00171
00172 # ifndef CALLBACK
00173 # define CALLBACK __stdcall
00174 # endif
00175 # ifndef WINAPI
00176 # define WINAPI __stdcall
00177 # endif
00178
00179
00180
00181 # define dkcdPATH_SEP '\\'
00182 # define dkcdPATH_SEP_STR "\\"
00183 # define dkcdPATH_LIST_SEP ';'
00184 # define dkcdPATH_LIST_SEP_STR ";"
00185 # define dkcmIS_PATH_SEP(c) (dkcdPATH_SEP==(c) || '/'==(c))
00186
00188 # define dkcmIS_INVALID_FILENAME_CHAR(c) ( ((c) =='\\') || ((c)=='/') || ((c)=='*') || ((c)=='?') \
00189 || ((c)== '"') || ((c) == '<') || ((c) == '>') || ((c) == '|') || (':'== (c)) )
00190
00191 # define dkcmIS_INVALID_FOLDERNAME_CHAR(c) \
00192 dkcmIS_INVALID_FILENAME_CHAR(c)
00193
00195 # define dkcmIS_INVALID_PATH_CHAR(c) \
00196 ((c)=='*') || ((c)=='?') || ((c)== '"') || \
00197 ((c) == '<') || ((c) == '>') || ((c) == '|')
00198
00199 #ifdef _MT
00200 # define dkcdMultiThread
00201 #endif
00202
00203 #ifdef _MSC_VER
00204 # include <crtdbg.h>
00205 # ifdef DEBUG
00206 # pragma comment(linker,"/NODEFAULTLIB:LIBC")
00207 # pragma comment(linker,"/NODEFAULTLIB:LIBCMT")
00208 # ifdef dkcdMultiThread
00209 # pragma comment(linker,"/NODEFAULTLIB:LIBCD")
00210 # else
00211 # pragma comment(linker,"/NODEFAULTLIB:LIBCMTD")
00212 # endif
00213 #else
00214 # pragma comment(linker,"/NODEFAULTLIB:LIBCD")
00215 # pragma comment(linker,"/NODEFAULTLIB:LIBCMTD")
00216 # ifdef dkcdMultiThread
00217 # pragma comment(linker,"/NODEFAULTLIB:LIBC")
00218 # else
00219 # pragma comment(linker,"/NODEFAULTLIB:LIBCMT")
00220 # endif
00221 #endif
00222 #endif //end of _MSC_VER
00223
00224 #endif //end of #ifndef WIN32
00225
00226
00227
00228 #ifdef WIN32
00229
00230 #define ORDER_DCBA // chosing Intel in this case
00231
00232 #else
00233
00234
00235 #endif
00236
00237 #ifdef ORDER_DCBA // DCBA - little endian - intel
00238
00239 union aword {
00240 DWORD dword;
00241 BYTE byte [4];
00242 struct {
00243 unsigned int byte3:8;
00244 unsigned int byte2:8;
00245 unsigned int byte1:8;
00246 unsigned int byte0:8;
00247 } w;
00248 };
00249
00250 union dkc4ByteUnionLittleEndianBase{
00251 DWORD dword;
00252 BYTE byte [4];
00253 struct {
00254 unsigned int byte0:8;
00255 unsigned int byte1:8;
00256 unsigned int byte2:8;
00257 unsigned int byte3:8;
00258 } w;
00259 };
00260 #endif
00261
00262 #ifdef ORDER_ABCD // ABCD - big endian - motorola
00263 union aword {
00264 DWORD dword;
00265 BYTE byte [4];
00266 struct {
00267 unsigned int byte0:8;
00268 unsigned int byte1:8;
00269 unsigned int byte2:8;
00270 unsigned int byte3:8;
00271 } w;
00272 };
00273 union dkc4ByteUnionLittleEndianBase{
00274 DWORD dword;
00275 BYTE byte [4];
00276 struct {
00277 unsigned int byte3:8;
00278 unsigned int byte2:8;
00279 unsigned int byte1:8;
00280 unsigned int byte0:8;
00281 } w;
00282 };
00283 #endif
00284
00285 #ifdef ORDER_BADC // BADC - vax
00286 union aword {
00287 DWORD dword;
00288 BYTE byte [4];
00289 struct {
00290 unsigned int byte1:8;
00291 unsigned int byte0:8;
00292 unsigned int byte3:8;
00293 unsigned int byte2:8;
00294 } w;
00295 };
00296 #endif
00297
00298 typedef union aword DKC_4BYTE_UNION_BIG_ENDIAN_BASE;
00299
00300 typedef union dkc4ByteUnionLittleEndianBase DKC_4BYTE_UNION_LITTLE_ENDIAN_BASE;
00301
00302
00303
00304
00305
00306
00307
00308 #ifdef WIN32
00309
00310 typedef void *(WINAPIV *DKC_REALLOC_F_TYPE)(void *,size_t);
00312
00313 typedef PROC DKC_WINAPI_PROC_F_TYPE ;
00314 #else
00315
00316 typedef void *(*DKC_REALLOC_F_TYPE)(void *,size_t);
00317 typedef void *DKC_WINAPI_PROC_F_TYPE;
00318 #endif
00319
00320
00321
00322
00323
00324
00325
00326 #ifndef ULONGLONG_MAX
00327 # define ULONGLONG_MAX DKINGYO_ULONGLONG_MAX
00328 #endif
00329 #ifndef LONGLONG_MAX
00330 # define LONGLONG_MAX DKINGYO_LONGLONG_MAX
00331 #endif
00332 #ifndef LONGLONG_MIN
00333 # define LONGLONG_MIN DKINGYO_LONGLONG_MIN
00334 #endif
00335
00336
00337 #ifndef dkcdMAXPATH
00338 # if defined(PATH_MAX)
00339 # define dkcdMAXPATH PATH_MAX
00340
00341 # elif defined(MAX_PATH)
00342 # define dkcdMAXPATH MAX_PATH
00343
00344 # elif defined(_MAX_PATH)
00345 # define dkcdMAXPATH _MAX_PATH
00346
00347 # else
00348 # define dkcdMAXPATH 1024
00349
00350 # endif
00351 #endif
00352
00353 #ifndef dkcdMAXPATH_LEN
00354 # define dkcdMAXPATH_LEN dkcdMAXPATH
00355 #endif
00356
00357
00358
00359
00360
00361
00362
00363 #ifndef dkcdMAXPATH_BUFFER
00364
00365 # define dkcdMAXPATH_BUFFER dkcdMAXPATH * 2
00366 #endif
00367
00368
00369
00370 #ifndef MAYBE
00371 # define MAYBE 2
00372 #endif
00373
00374
00376 #define dkcmGETBYTE(x, y) ((x)>>(8*(y)))
00377 #define dkcmGETBYTE8(x,y) (uint8)dkcmGETBYTE(x,y)
00378 #define dkcmGETBYTE32(x,y) (uint32)dkcmGETBYTE8(x,y)
00379
00380
00381 typedef struct dkc_4char{
00382 signed char mode1,mode2,mode3,mode4;
00383 }DKC_4CHAR;
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 fwrite( data , size , 1 , fp ) ;
00408
00409 fclose( fp ) ;
00410 return true;
00411 }
00412
00420
00421 inline bool LoadBinary(void *data,size_t size,const char *fname,const char *mode="rb" ){
00422 FILE *fp ;
00423 fp = fopen( fname , mode ) ;
00424 if(fp==NULL)return false;
00425 fread( data , size , 1 , fp ) ;
00426
00427 fclose( fp ) ;
00428 return true;
00429 }
00430
00431 inline bool SaveText(const char *text,size_t length,const char *fname,const char *mode="wt"){
00432 return SaveBinary(text,length,fname,mode);
00433 }
00434 inline bool LoadText(char *text,size_t length,const char *fname,const char *mode="rt"){
00435 return LoadBinary(text,length,fname,mode);
00436 }
00437
00438
00439
00440 }
00441
00442
00443 #else //for c lang
00444
00445
00446 #endif //end of __cplusplus
00447
00449 DKC_EXTERN BOOL WINAPI dkcIsNativePathString(const char *s,size_t size);
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461 DKC_EXTERN size_t dkcReallocateSizeFunction(size_t OldSize,size_t ExpandSize);
00462
00464 typedef void *( WINAPIV *DKC_ALLOC_FUNC_TYPE)(size_t);
00466 typedef void (WINAPIV *DKC_FREE_FUNC_TYPE)(void *);
00467
00468 DKC_EXTERN void *WINAPIV dkcMallocAdapter(size_t);
00469
00470 DKC_EXTERN void WINAPIV dkcFreeAdapter(void *);
00471
00472 DKC_EXTERN void* WINAPIV dkcAllocate(size_t size);
00473
00474 DKC_EXTERN int WINAPIV dkcFree(void **p);
00475
00476 DKC_EXTERN void *WINAPIV dkcAllocateFast(size_t size);
00477
00478 DKC_EXTERN void *WINAPIV dkcAllocateFill(size_t size,BYTE fill);
00479
00480 DKC_EXTERN int WINAPI dkcReallocate(
00481 void **NewPtr,size_t NewSize,void **OldPtr
00482 );
00483
00491
00492 DKC_EXTERN int WINAPI dkcReallocateEx(
00493 DKC_REALLOC_F_TYPE your_realloc,void **NewPtr,size_t NewSize,
00494 void **OldPtr
00495 );
00496
00506 DKC_EXTERN int WINAPI dkcReallocateAutoExpand(
00507 DKC_REALLOC_F_TYPE your_realloc,void **NewPtr,
00508 void **OldPtr,size_t OldSize,size_t *reallocated_size
00509 );
00510
00514 DKC_EXTERN void WINAPI
00515 dkcSwap(void *p1,void *p2,size_t size);
00522 DKC_EXTERN void WINAPI dkcSwapFast(void *p1,void *p2,size_t size);
00523
00531 DKC_EXTERN void WINAPI dkcSwap64(ULONGLONG *p1,ULONGLONG *p2,size_t size);
00532
00533
00534
00535
00536
00537
00538
00539
00540
00542 DKC_EXTERN BOOL dkcIs_foepn_mode(const char *s);
00544 DKC_EXTERN FILE * WINAPI dkcFOpen(const char *filename,const char *mode);
00546 DKC_EXTERN int WINAPI dkcFClose(FILE **ptr);
00547
00549 DKC_EXTERN size_t WINAPI dkcFReadAll(void *,size_t size,FILE *fp);
00551 DKC_EXTERN size_t WINAPI dkcFWriteAll(void *,size_t size,FILE *fp);
00552
00553
00555 DKC_EXTERN int WINAPI dkcSaveBinary(const void *data,size_t size,const char *fname);
00557 DKC_EXTERN int WINAPI dkcLoadBinary(void *data,size_t size,const char *fname,size_t *readsize);
00559 DKC_EXTERN int WINAPI dkcSaveText(const char *text,size_t length,const char *fname);
00561 DKC_EXTERN int WINAPI dkcLoadText(char *text,size_t length,const char *fname,size_t *readsize);
00563 DKC_EXTERN BOOL WINAPI dkcCreateEmptyFile(const char *filename);
00564
00565
00566 DKC_EXTERN void WINAPI dkcTwoDWORDToULONGLONG(ULONGLONG *dest,DWORD high,DWORD low);
00567
00568 DKC_EXTERN void WINAPI dkcULONGLONGToTwoDWORD(DWORD *dhigh,DWORD *dlow,ULONGLONG src);
00569
00570 DKC_EXTERN void WINAPI dkcLONGLONGToTwoLONG(LONG *high,LONG *low,LONGLONG src);
00571
00572 DKC_EXTERN void WINAPI dkcTwoLONGToLONGLONG(LONGLONG *dest,LONG high,LONG low);
00573
00574
00578 DKC_EXTERN int WINAPI dkcErrorMessage(const char *expression,
00579 const char *filename,size_t line,const char *message,...);
00580
00581
00582
00583 #if defined(DEBUG) || defined(DKUTIL_DEBUG)
00584 # define dkcmNOT_ASSERT(ex) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) )
00585 # define dkcmASSERT(ex) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) )
00586 # define dkcmNOT_ASSERT_MESSAGE(ex,mes) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,mes) )
00587 # define dkcmASSERT_MESSAGE(ex,mes) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,mes) )
00588 #else
00589 # define dkcmNOT_ASSERT_MESSAGE(ex,mes) ((void)0)
00590 # define dkcmASSERT_MESSAGE(ex,mes) ((void)0)
00591 # define dkcmNOT_ASSERT(ex) ((void)0)
00592 # define dkcmASSERT(ex) ((void)0)
00593 #endif
00594
00595 # define dkcmFORCE_NOT_ASSERT(ex) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) )
00596 # define dkcmFORCE_ASSERT(ex) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,NULL) )
00597 # define dkcmFORCE_NOT_ASSERT_MESSAGE(ex,mes) ( (ex) && dkcErrorMessage(#ex,__FILE__,__LINE__,mes) )
00598 # define dkcmFORCE_ASSERT_MESSAGE(ex,mes) ( (ex) || dkcErrorMessage(#ex,__FILE__,__LINE__,mes) )
00599
00601 DKC_EXTERN const char *WINAPI dkcGetPathSep();
00602
00607 DKC_EXTERN int dkcDynamicCheckEnvironment(BOOL isForceExit);
00609 DKC_EXTERN void WINAPI dkcCheckMemoryLeak(BOOL flag);
00611 DKC_EXTERN BOOL WINAPI dkcIsMMX();
00612
00613
00614
00615 #define dkcmREVERSE_ENDIAN16(x) ( (USHORT)( (x >> 8) | (x << 8) ) )
00616
00617 #define dkcmREVERSE_ENDIAN32(x) \
00618 ( (x << 24) | ( (x & 0x0000ff00) << 8) | ( (x & 0x00ff0000) >> 8 ) | (x >> 24) )
00619
00620 #ifdef WIN32
00621 # define dkcmREVERSE_ENDIAN64(x) (\
00622 (ULONGLONG)dkcReverseEndian32( (DWORD) (x & 0x00000000ffffffff) ) << 32 )\
00623 | \
00624 dkcReverseEndian32((DWORD)(x >> 32)\
00625 )
00626 #else
00627 # define dkcmREVERSE_ENDIAN64(x) dkcReverseEndian64(x)
00628
00629 #endif
00630
00631 DKC_EXTERN ULONG dkcReverseEndian32(ULONG x);
00633 DKC_EXTERN ULONGLONG dkcReverseEndian64(ULONGLONG x);
00635 DKC_EXTERN USHORT dkcReverseEndian16(USHORT x);
00636
00638 DKC_EXTERN BOOL dkcIsLittleEndian();
00640 #define dkcIsBigEndian() (!dkcIsLittleEndian())
00641
00642
00644 DKC_EXTERN BOOL dkcCheckOverflowULONG(ULONG a1,ULONG a2);
00645
00647
00650 DKC_EXTERN size_t dkcNumOfBits(uint32 bits);
00651
00652
00653
00654 typedef int (WINAPIV *DKC_COMPARE_TYPE)(const void *,const void *);
00655
00679
00680 DKC_EXTERN int WINAPI dkcSelect(void *dest,const void *a_src,size_t n,int k,size_t width ,DKC_COMPARE_TYPE comp);
00681
00686 DKC_EXTERN int WINAPI dkcSelectMax(void *dest,const void *a, size_t n,size_t width ,DKC_COMPARE_TYPE comp);
00691 DKC_EXTERN int WINAPI dkcSelectMin(void *dest,const void *a, size_t n,size_t width ,DKC_COMPARE_TYPE comp);
00692
00693
00694 DKC_INLINE int dkcRotateShiftRightMemoryLogic(void *dest,size_t size,size_t n,void *workbuff,size_t worksize);
00695
00696
00697 DKC_EXTERN int WINAPI dkcRotateShiftRightMemory(void *dest,size_t size,size_t n);
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711 #endif //end of include once