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

dkcOSIndependent.h

説明を見る。
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 //#define DKUTIL_C_USE_DKUTIL_CSTD
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 #ifndef uint32
00068 typedef unsigned long uint32;
00069 #endif
00070 
00071 #ifndef uint16
00072 typedef unsigned short uint16;
00073 #endif
00074 
00075 #ifndef uint8
00076 typedef unsigned char uint8;
00077 #endif
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 //reallocの関数の型
00132 typedef void *(*DKC_REALLOC_F_TYPE)(void *,size_t);
00133 
00134 typedef int BOOL;
00135 //typedef unsigned char BYTE;
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 //#define ORDER_ABCD //motorola (Macとか)
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 #ifdef WIN32
00303     typedef DKC_4BYTE_UNION_LITTLE_ENDIAN_BASE DKC_4BYTE_UNION;
00304 */
00305 
00306 
00307 
00308 #ifdef WIN32
00309 
00310     typedef void *(WINAPIV *DKC_REALLOC_F_TYPE)(void *,size_t);
00312     //typedef int (WINAPI *PROC)();
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 //limits
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 /* 何事も例外を考えるのが大切だ。って事でbufferは普通の2倍取得する・・・。(オイ 
00358     追記:
00359     見事に予想は的中してバッファサイズは約2倍無いと危ない条件がある事が分かった。
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"){//="wb"
00404     FILE *fp;
00405     fp = fopen( fname , mode ) ;//wb
00406     if(fp==NULL) return false;
00407     fwrite( data , size  , 1 , fp ) ;
00408     //fwrite( data , sizeof(size)  , 1 , fp ) ;
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" ){//="rb"
00422     FILE *fp ;
00423     fp = fopen( fname , mode ) ;//rb
00424     if(fp==NULL)return false;
00425     fread( data ,  size , 1 , fp ) ;
00426     //fread( data , sizeof(size)  , 1 , fp ) ;
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 }//end of dkutil namespace
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 @param OldSize[in] 元のメモリ領域のサイズ
00455 @param ExpandSize[in] 足りないメモリ領域のサイズ
00456 @return 多分、理想系のサイズ?カナ?
00457 @note reallocする時の最適なメモリサイズを計算する。
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 //#define dkcSwap(p1_,p2_,size) dkcSwap64(p1_,p2_,size)
00536 /*
00537 #define dkcSwapFast(p1,p2,size) dkcSwap64(p1,p2,size)
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 DKC_EXTERN void dkcSetAllocateMode(int flag);
00701 
00702 DKC_EXTERN void *dkcDebugAlloc
00703 */
00704 
00705 
00706 
00707 
00708 
00709 
00710 
00711 #endif //end of include once

dkutil_cに対してTue Feb 22 02:01:48 2005に生成されました。 doxygen 1.3.6