doscfg.h
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:10k
源码类别:

压缩解压

开发平台:

MultiPlatform

  1. /*---------------------------------------------------------------------------
  2.     MS-DOS specific configuration section:
  3.   ---------------------------------------------------------------------------*/
  4. #ifndef __doscfg_h
  5. #define __doscfg_h
  6. #include <dos.h>           /* for REGS macro (TC) or _dos_setftime (MSC) */
  7. #ifdef __TURBOC__          /* includes Power C */
  8. #  include <sys/timeb.h>   /* for structure ftime */
  9. #  ifndef __BORLANDC__     /* there appears to be a bug (?) in Borland's */
  10. #    include <mem.h>       /*  MEM.H related to __STDC__ and far poin-   */
  11. #  endif                   /*  ters. (dpk)  [mem.h included for memcpy]  */
  12. #endif
  13. #ifdef WINDLL
  14. #  if (defined(MSC) || defined(__WATCOMC__))
  15. #    include <sys/utime.h>
  16. #  else /* !(MSC || __WATCOMC__) ==> may be BORLANDC, or GNU environment */
  17. #    include <utime.h>
  18. #  endif /* ?(MSC || __WATCOMC__) */
  19. #endif
  20. #ifdef __WATCOMC__
  21. #  define DOS_STAT_BANDAID
  22. #  ifdef __386__
  23. #    ifndef WATCOMC_386
  24. #      define WATCOMC_386
  25. #    endif
  26. #    define __32BIT__
  27. #    undef far
  28. #    define far
  29. #    undef near
  30. #    define near
  31. /* Get asm routines to link properly without using "__cdecl": */
  32. #    ifndef USE_ZLIB
  33. #      pragma aux crc32         "_*" parm caller [] value [eax] modify [eax]
  34. #      pragma aux get_crc_table "_*" parm caller [] value [eax] 
  35.                                       modify [eax ecx edx]
  36. #    endif /* !USE_ZLIB */
  37. #  else /* !__386__ */
  38. #    ifndef USE_ZLIB
  39. #      pragma aux crc32         "_*" parm caller [] value [ax dx] 
  40.                                       modify [ax cx dx bx]
  41. #      pragma aux get_crc_table "_*" parm caller [] value [ax] 
  42.                                       modify [ax cx dx bx]
  43. #    endif /* !USE_ZLIB */
  44. #  endif /* ?__386__ */
  45. #  ifndef EPIPE
  46. #    define EPIPE -1
  47. #  endif
  48. #  define PIPE_ERROR (errno == EPIPE)
  49. #endif /* __WATCOMC__ */
  50. #ifdef __EMX__
  51. #  ifndef __32BIT__
  52. #    define __32BIT__
  53. #  endif
  54. #  define far
  55. #  ifndef HAVE_MKTIME
  56. #    define HAVE_MKTIME
  57. #  endif
  58. #endif
  59. #if defined(__GO32__) || defined(__DJGPP__)    /* MS-DOS compiler, not OS/2 */
  60. #  ifndef __32BIT__
  61. #    define __32BIT__
  62. #  endif
  63. #  ifndef __GO32__
  64. #    define __GO32__
  65. #  endif
  66. #  ifndef HAVE_MKTIME
  67. #    define HAVE_MKTIME
  68. #  endif
  69. #  include <sys/timeb.h>           /* for structure ftime and ftime() */
  70. #  if (defined(__DJGPP__) && (__DJGPP__ > 1))
  71. #    include <unistd.h>            /* for prototypes for read/write etc. */
  72. #    include <dir.h>               /* for FA_LABEL */
  73. #    if ((__DJGPP__ == 2) && (__DJGPP_MINOR__ == 0))
  74. #      include <libc/dosio.h>      /* for _USE_LFN, djgpp 2.0 only */
  75. #    endif
  76. #    define USE_LFN _USE_LFN       /* runtime test:  support long filenames? */
  77. #  else
  78.      int setmode(int, int);        /* not in older djgpp's include files */
  79. #  endif
  80. #endif
  81. #ifndef __32BIT__
  82. #  define __16BIT__
  83. #endif
  84. #if (defined(M_I86CM) || defined(M_I86LM)) || defined(WINDLL)
  85. #  define MED_MEM
  86. #endif
  87. #if (defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__))
  88. #  define MED_MEM
  89. #endif
  90. #ifdef __16BIT__
  91. #  ifndef MED_MEM
  92. #    define SMALL_MEM
  93. #  endif
  94. #endif
  95. #define EXE_EXTENSION ".exe"  /* OS/2 has GetLoadPath() function instead */
  96. #ifdef __16BIT__
  97. #  if defined(MSC) || defined(__WATCOMC__)
  98. #    include <malloc.h>
  99. #    define nearmalloc _nmalloc
  100. #    define nearfree _nfree
  101. #  endif
  102. #  if defined(__TURBOC__) && defined(DYNALLOC_CRCTAB)
  103. #    if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
  104. #      undef DYNALLOC_CRCTAB
  105. #    endif
  106. #  endif
  107. #  ifndef nearmalloc
  108. #    define nearmalloc malloc
  109. #    define nearfree free
  110. #  endif
  111. #  if defined(DEBUG) && defined(MSC) && (!defined(_MSC_VER) || _MSC_VER < 600)
  112.      /* for MSC 5.1, prevent macro expansion space overflow in DEBUG mode */
  113. #    define NO_DEBUG_IN_MACROS
  114. #  endif
  115. #endif
  116. /* another stat()/fopen() bug with some 16-bit compilers on Novell drives;
  117.  * very dangerous (silently overwrites executables in other directories)
  118.  */
  119. #define NOVELL_BUG_WORKAROUND
  120. /* enables additional test and message code that directs UnZip to fail safely
  121.  * in case the "workaround" enabled above does not work as intended
  122.  */
  123. #define NOVELL_BUG_FAILSAFE
  124. /* Some implementations of stat() tend to fail on "." in root directories
  125.  * or on remote (root) directories specified by an UNC network path. This
  126.  * patch of stat() is useful for at least the WATCOM compilers. The
  127.  * stat_bandaid() wrapper detects stat failures on root directories and
  128.  * fills in suitable values.
  129.  */
  130. #ifdef DOS_STAT_BANDAID
  131. #  undef SSTAT
  132. #  ifdef WILD_STAT_BUG
  133. #    define SSTAT(path,pbuf) (iswild(path) || stat_bandaid(path,pbuf))
  134. #  else
  135. #    define SSTAT stat_bandaid
  136. #  endif
  137.    int stat_bandaid(const char *path, struct stat *buf);
  138. #endif
  139. /* the TIMESTAMP feature is now supported on MSDOS, enable it per default */
  140. #if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP))
  141. #  define TIMESTAMP
  142. #endif
  143. /* check that TZ environment variable is defined before using UTC times */
  144. #if (!defined(NO_IZ_CHECK_TZ) && !defined(IZ_CHECK_TZ))
  145. #  define IZ_CHECK_TZ
  146. #endif
  147. /* The optional "long filename" support available with some MSDOS compiler
  148.  * environments running under VFAT systems (Win95) is controlled with the
  149.  * help of the two preprocessor symbols USE_VFAT and USE_LFN:
  150.  *  - USE_VFAT is a compile time switch that selects the long filename
  151.  *             semantics in mapname()
  152.  *  - USE_LFN  is a macro equating to a boolean expression indicating
  153.  *             whether long filenames are supported. If available, this
  154.  *             macro should make use of a runtime function checking the
  155.  *             LFN support.
  156.  *
  157.  * The code in msdos.c distinguishes three cases:
  158.  * 1.) USE_VFAT is not defined:
  159.  *     No support of LFN is included; filenames are mapped to 8+3 plain FAT
  160.  *     syntax unconditionally.
  161.  *     This is achieved by ``#define MAYBE_PLAIN_FAT'' to include the plain
  162.  *     FAT name mapping code and by ``#undef USE_LFN'' to disable bypassing
  163.  *     of the FAT mapping at runtime.
  164.  * 2.) USE_VFAT is defined:
  165.  *     Support for LFN is enabled.
  166.  *  a) USE_LFN is undefined:
  167.  *     There is no (runtime) check available to distinguish between OS
  168.  *     environments that support VFAT extensions and those that do not.
  169.  *     In this case, filenames are mapped to the more liberal VFAT LFN
  170.  *     syntax unconditionally. The internal switch MAYBE_PLAIN_FAT remains
  171.  *     undefined to exclude to "map to plain FAT" code parts.
  172.  *  b) USE_LFN is defined (hopefully to a boolean runtime LFN check function):
  173.  *     "#define MAYBE_PLAIN_FAT" is applied to include the plain FAT mapping
  174.  *     code; the programs checks at runtime whether the OS supports LFN and
  175.  *     uses the appropiate mapping syntax.
  176.  */
  177. /* Some environments, like DJGPP v2, can support long filenames on VFAT
  178.  * systems and DOS 8.3 filenames on FAT systems in the same executable.  If
  179.  * such support is available, USE_LFN should be defined to an expression
  180.  * that will return non-zero when long filenames API should be used, zero
  181.  * otherwise.
  182.  */
  183. #ifndef USE_VFAT
  184. #  ifdef USE_LFN
  185. #    undef USE_LFN
  186. #  endif
  187. #  ifndef MAYBE_PLAIN_FAT
  188. #    define MAYBE_PLAIN_FAT
  189. #  endif
  190. #endif
  191. #ifdef USE_LFN
  192. #  define MAYBE_PLAIN_FAT
  193. #endif
  194. /* handlers for OEM <--> ANSI string conversions */
  195. #ifdef WINDLL
  196. #  if 1
  197.      /* C RTL's file system support assumes OEM-coded strings */
  198. #    ifdef CRTL_CP_IS_ISO
  199. #      undef CRTL_CP_IS_ISO
  200. #    endif
  201. #    ifndef CRTL_CP_IS_OEM
  202. #      define CRTL_CP_IS_OEM
  203. #    endif
  204. #  else
  205.      /* C RTL's file system support assumes ISO-coded strings */
  206. #    ifndef CRTL_CP_IS_ISO
  207. #      define CRTL_CP_IS_ISO
  208. #    endif
  209. #    ifdef CRTL_CP_IS_OEM
  210. #      undef CRTL_CP_IS_OEM
  211. #    endif
  212. #  endif /* ?(code page of 16bit Windows compilers) */
  213.    /* include Win API declarations only in sources where conversion is
  214.     * actually used (skip EXTRACT_C, extract.c includes windll.h instead)
  215.     */
  216. #  if defined(ENVARGS_C) || defined(UNZIP_C) || defined(ZCRYPT_INTERNAL)
  217. #    include <windows.h>
  218. #  endif
  219.    /* use conversion functions of Windows API */
  220. #  ifdef CRTL_CP_IS_ISO
  221. #   define ISO_TO_INTERN(src, dst)  {if ((src) != (dst)) strcpy((dst), (src));}
  222. #   define OEM_TO_INTERN(src, dst)  OemToAnsi(src, dst)
  223. #   define INTERN_TO_ISO(src, dst)  {if ((src) != (dst)) strcpy((dst), (src));}
  224. #   define INTERN_TO_OEM(src, dst)  AnsiToOem(src, dst)
  225. #  endif
  226. #  ifdef CRTL_CP_IS_OEM
  227. #   define ISO_TO_INTERN(src, dst)  AnsiToOem(src, dst)
  228. #   define OEM_TO_INTERN(src, dst)  {if ((src) != (dst)) strcpy((dst), (src));}
  229. #   define INTERN_TO_ISO(src, dst)  OemToAnsi(src, dst)
  230. #   define INTERN_TO_OEM(src, dst)  {if ((src) != (dst)) strcpy((dst), (src));}
  231. #  endif
  232. #  define _OEM_INTERN(str1) OEM_TO_INTERN(str1, str1)
  233. #  define _ISO_INTERN(str1) ISO_TO_INTERN(str1, str1)
  234.    /* UzpPassword supplies ANSI-coded string regardless of C RTL's native CP */
  235. #  define STR_TO_CP2(dst, src)  (AnsiToOem(src, dst), dst)
  236.    /* dummy defines to disable these functions, they are not needed */
  237. #  define STR_TO_ISO
  238. #  define STR_TO_OEM
  239. #else
  240.    /* use home-brewed conversion functions; internal charset is OEM */
  241. #  ifdef CRTL_CP_IS_ISO
  242. #    undef CRTL_CP_IS_ISO
  243. #  endif
  244. #  ifndef CRTL_CP_IS_OEM
  245. #    define CRTL_CP_IS_OEM
  246. #  endif
  247. #endif
  248. /* SCREENLINES macros for 16-bit and djgpp compilers */
  249. #ifdef __16BIT__
  250. #  define SCREENLINES (int)(*((unsigned char far*)0x00400084L) + 1)
  251. #  define SCREENWIDTH (int)(*(unsigned short far*)0x0040004AL)
  252. #endif
  253. #if defined(__GO32__) || defined(__DJGPP__)    /* djgpp v1.x and v2.x */
  254. #  include <pc.h>
  255. #  define SCREENLINES ScreenRows()
  256. #  define SCREENWIDTH ScreenCols()
  257. #endif
  258. #ifdef __EMX__
  259. #  define SCREENLINES screenlines()
  260. #  define SCREENWIDTH screencolumns()
  261.    int screenlines(void);
  262.    int screencolumns(void);
  263. #endif
  264. #endif /* !__doscfg_h */