home *** CD-ROM | disk | FTP | other *** search
/ The California Collection / TheCaliforniaCollection.cdr / his008 / unarj220.exe / UNARJ.H < prev   
C/C++ Source or Header  |  1991-07-08  |  11KB  |  387 lines

  1. /* UNARJ.H, UNARJ, R JUNG, 07/08/91
  2.  * Include file
  3.  * Copyright (c) 1990 by Robert K Jung.  All rights reserved.
  4.  *
  5.  *   This code may be freely used in programs that are NOT ARJ archivers
  6.  *   (both compress and extract ARJ archives).
  7.  *
  8.  *   If you wish to distribute a modified version of this program, you
  9.  *   MUST indicate that it is a modified version both in the program and
  10.  *   source code.
  11.  *
  12.  *   If you modify this program, I would appreciate a copy of the new
  13.  *   source code.  I am holding the copyright on the source code, so
  14.  *   please do not delete my name from the program files or from the
  15.  *   documentation.
  16.  *
  17.  * Modification history:
  18.  * Date      Programmer  Description of modification.
  19.  * 04/05/91  R. Jung     Rewrote code.
  20.  * 04/23/91  M. Adler     Portabilized.
  21.  * 04/29/91  R. Jung     Added volume label support.
  22.  * 05/30/91  R. Jung     Added SEEK_END definition.
  23.  * 06/03/91  R. Jung     Changed arguments in get_mode_str() and
  24.  *                       set_ftime_mode().
  25.  * 06/28/91  R. Jung     Added new HOST OS numbers.
  26.  * 07/08/91  R. Jung     Added default_case_path() and strlower().
  27.  *
  28.  */
  29.  
  30. #ifndef _ARH_DEF_
  31. #define _ARH_DEF_
  32.  
  33. /* Use prototypes and ANSI libraries if __STDC__ */
  34. #ifdef __STDC__
  35. #  define MODERN
  36. #endif /* __STDC__ */
  37.  
  38. /* Use prototypes and ANSI libraries if __TURBOC__ */
  39. #ifdef __TURBOC__
  40. #  define MODERN
  41. #endif /* __TURBOC__ */
  42.  
  43. /* Use prototypes and ANSI libraries if _QC */
  44. #ifdef _QC
  45. #  define MODERN
  46. #endif /* __TURBOC__ */
  47.  
  48. /* Use prototypes and ANSI libraries if _OS2 */
  49. #ifdef _OS2
  50. #  define MODERN
  51. #endif /* _OS2 */
  52.  
  53. /* Used to remove arguments in function prototypes for non-ANSI C */
  54. #ifdef MODERN
  55. #  define OF(a) a
  56. #else /* !MODERN */
  57. #  define OF(a) ()
  58. #endif /* ?MODERN */
  59.  
  60. #ifdef MODERN
  61.    typedef void voidp;
  62. #else /* !MODERN */
  63. #  define void int
  64.    typedef char voidp;
  65. #endif /* ?MODERN */
  66.  
  67. #include <stdio.h>
  68. #ifdef MODERN
  69. #  include <limits.h>
  70. #else /* !MODERN */
  71. #  ifndef UCHAR_MAX
  72. #    define UCHAR_MAX (255)
  73. #  endif
  74. #  ifndef CHAR_BIT
  75. #    define CHAR_BIT  (8)
  76. #  endif
  77. #  ifndef LONG_MAX
  78. #    define LONG_MAX  (0x7FFFFFFFL)
  79. #  endif
  80. #endif /* ?MODERN */
  81.  
  82. #ifndef SEEK_SET
  83. #  define SEEK_SET 0
  84. #endif
  85.  
  86. #ifndef SEEK_CUR
  87. #  define SEEK_CUR 1
  88. #endif
  89.  
  90. #ifndef SEEK_END
  91. #  define SEEK_END 2
  92. #endif
  93.  
  94. typedef unsigned char  uchar;    /*  8 bits or more */
  95. typedef unsigned int   uint;    /* 16 - 32 bits or more */
  96. typedef unsigned short ushort;    /* 16 bits or more */
  97. typedef unsigned long  ulong;    /* 32 bits or more */
  98.  
  99. #define USHRT_BIT   (CHAR_BIT * sizeof(ushort))
  100.  
  101. /* ********************************************************* */
  102. /* Environment definitions (implementation dependent)         */
  103. /* ********************************************************* */
  104.  
  105. #ifdef _QC
  106. #define __MSDOS__
  107. #endif
  108.  
  109. #ifdef __MSDOS__
  110. #define OS            0
  111. #define PATH_SEPARATORS     "\\:"
  112. #define PATH_CHAR        '\\'
  113. #define MAXSFX            25000L
  114. #define ARJ_SUFFIX        ".ARJ"
  115. #endif
  116.  
  117. #ifdef _OS2
  118. #define OS            0        /* ??? */
  119. #define PATH_SEPARATORS     "\\:"
  120. #define PATH_CHAR        '\\'
  121. #define SWITCH_CHARS        "-/"
  122. #define MAXSFX            25000L
  123. #define ARJ_SUFFIX        ".ARJ"
  124. #endif
  125.  
  126. #ifdef __CI
  127. #define PRIME            1
  128. #define OS            1
  129. #define PATH_SEPARATORS     ">"
  130. #define PATH_CHAR        '>'
  131. #define FIX_PARITY(c)        c |= ~ASCII_MASK
  132. #define DEFAULT_DIR        "*>"
  133. #define ARJ_SUFFIX        ".ARJ"
  134. #endif
  135.  
  136. /* Error levels */
  137.  
  138. #ifndef ERROR_DEFINES
  139.  
  140. #define ERROR_OK    0    /* success */
  141. #define ERROR_WARN    1    /* minor problem (file not found) */
  142. #define ERROR_FAIL    2    /* fatal error */
  143. #define ERROR_CRC    3    /* CRC error */
  144. #define ERROR_SECURE    4    /* ARJ security invalid or not found */
  145. #define ERROR_WRITE    5    /* disk full */
  146. #define ERROR_OPEN    6    /* can't open file */
  147. #define ERROR_USER    7    /* user specified bad parameters */
  148. #define ERROR_MEMORY    8    /* not enough memory */
  149.  
  150. #endif
  151.  
  152. #ifndef MAXSFX            /* size of self-extracting prefix */
  153. #define MAXSFX            500000L
  154. #endif
  155. #ifndef FNAME_MAX
  156. #define FNAME_MAX        512
  157. #endif
  158. #ifndef SWITCH_CHARS
  159. #define SWITCH_CHARS        "-"
  160. #endif
  161. #ifndef FIX_PARITY
  162. #define FIX_PARITY(c)        c &= ASCII_MASK
  163. #endif
  164. #ifndef ARJ_SUFFIX
  165. #define ARJ_SUFFIX        ".arj"
  166. #endif
  167. #ifndef ARJ_DOT
  168. #define ARJ_DOT         '.'
  169. #endif
  170. #ifndef DEFAULT_DIR
  171. #define DEFAULT_DIR        ""
  172. #endif
  173. #ifndef OS
  174. #define OS            2
  175. #endif
  176. #ifndef PATH_SEPARATORS
  177. #define PATH_SEPARATORS     "/"
  178. #endif
  179. #ifndef PATH_CHAR
  180. #define PATH_CHAR        '/'
  181. #endif
  182.  
  183. /* ********************************************************* */
  184. /* end of environmental defines                  */
  185. /* ********************************************************* */
  186.  
  187. /* ********************************************************* */
  188. /*
  189.  * Structure of archive block (low order byte first):
  190.  *
  191.  *  2  header id (comment and local file) = 0xEA60 or 60000U
  192.  *  2  basic header size (from 'first_hdr_size' thru 'comment' below)
  193.  *         = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1
  194.  *         = 0 if end of archive
  195.  *
  196.  *  1  first_hdr_size (size up to 'extra data')
  197.  *  1  archiver version number
  198.  *  1  minimum archiver version to extract
  199.  *  1  host OS   (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MAC-OS)
  200.  *               (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT)
  201.  *               (9 = VAX VMS)
  202.  *  1  arj flags (0x01 = GARBLED_FLAG, 0x02 = RESERVED)
  203.  *         (0x04 = VOLUME_FLAG,  0x08 = EXTFILE_FLAG)
  204.  *         (0x10 = PATHSYM_FLAG)
  205.  *  1  method     (0 = stored, 1 = compressed most ... 4 compressed fastest)
  206.  *  1  file type (0 = binary, 1 = text, 2 = comment header)
  207.  *         (3 = directory, 4 = volume label)
  208.  *  1  reserved
  209.  *  4  date time stamp modified
  210.  *  4  compressed size
  211.  *  4  original size
  212.  *  4  original file's CRC
  213.  *  2  entryname position in filename
  214.  *  2  file access mode
  215.  *  2  host data
  216.  *  ?  extra data
  217.  *     4 bytes for extended file position
  218.  *
  219.  *  ?  filename (null-terminated)
  220.  *  ?  comment    (null-terminated)
  221.  *
  222.  *  4  basic header CRC
  223.  *
  224.  *  2  1st extended header size (0 if none)
  225.  *  ?  1st extended header
  226.  *  4  1st extended header's CRC (not present if 0 extended header size)
  227.  *  ...
  228.  *  ?  compressed file
  229.  *
  230.  * ********************************************************* */
  231.  
  232. /* ********************************************************* */
  233. /*                                 */
  234. /*     Time stamp format:                     */
  235. /*                                 */
  236. /*    31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16      */
  237. /*     |<---- year-1980 --->|<- month ->|<--- day ---->|     */
  238. /*                                 */
  239. /*    15 14 13 12 11 10  9  8  7  6  5  4  3    2  1  0      */
  240. /*     |<--- hour --->|<---- minute --->|<- second/2 ->|     */
  241. /*                                 */
  242. /* ********************************************************* */
  243.  
  244. #define CODE_BIT      16
  245.  
  246. #define NULL_CHAR    '\0'
  247. #define MAXMETHOD       4
  248.  
  249. #define ARJ_VERSION       3
  250. #define ARJ_X_VERSION       3    /* decoder version */
  251. #define ARJ_X1_VERSION       1
  252. #define DEFAULT_METHOD       1
  253. #define DEFAULT_TYPE       0    /* if type_sw is selected */
  254. #define HEADER_ID     0xEA60
  255. #define HEADER_ID_HI    0xEA
  256. #define HEADER_ID_LO    0x60
  257. #define FIRST_HDR_SIZE      30
  258. #define FIRST_HDR_SIZE_V  34
  259. #define COMMENT_MAX    2048
  260. #define HEADERSIZE_MAX     (FIRST_HDR_SIZE + 10 + FNAME_MAX + COMMENT_MAX)
  261. #define BINARY_TYPE       0    /* This must line up with binary/text strings */
  262. #define TEXT_TYPE       1
  263. #define COMMENT_TYPE       2
  264. #define DIR_TYPE       3
  265. #define LABEL_TYPE       4
  266.  
  267. #define GARBLE_FLAG    0x01
  268. #define VOLUME_FLAG    0x04
  269. #define EXTFILE_FLAG    0x08
  270. #define PATHSYM_FLAG    0x10
  271.  
  272. typedef ulong UCRC;    /* CRC-32 */
  273.  
  274. #define CRC_MASK    0xFFFFFFFFL
  275.  
  276. #define ARJ_PATH_CHAR    '/'
  277.  
  278. #define FA_RDONLY    0x01        /* Read only attribute */
  279. #define FA_HIDDEN    0x02        /* Hidden file */
  280. #define FA_SYSTEM    0x04        /* System file */
  281. #define FA_LABEL    0x08        /* Volume label */
  282. #define FA_DIREC    0x10        /* Directory */
  283. #define FA_ARCH     0x20        /* Archive */
  284.  
  285. #define HOST_OS_NAMES { "MS-DOS","PRIMOS","UNIX","AMIGA","MAC-OS","OS/2",NULL }
  286.  
  287. /* Timestamp macros */
  288.  
  289. #define get_tx(m,d,h,n) (((ulong)m<<21)+((ulong)d<<16)+((ulong)h<<11)+(n<<5))
  290. #define get_tstamp(y,m,d,h,n,s) ((((ulong)(y-1980))<<25)+get_tx(m,d,h,n)+(s/2))
  291.  
  292. #define ts_year(ts)  ((uint)((ts >> 25) & 0x7f) + 1980)
  293. #define ts_month(ts) ((uint)(ts >> 21) & 0x0f)        /* 1..12 means Jan..Dec */
  294. #define ts_day(ts)   ((uint)(ts >> 16) & 0x1f)        /* 1..31 means 1st..31st */
  295. #define ts_hour(ts)  ((uint)(ts >> 11) & 0x1f)
  296. #define ts_min(ts)   ((uint)(ts >> 5) & 0x3f)
  297. #define ts_sec(ts)   ((uint)((ts & 0x1f) * 2))
  298.  
  299. /* unarj.c */
  300.  
  301. extern long origsize;
  302. extern long compsize;
  303.  
  304. extern UCRC crc;
  305.  
  306. extern FILE *arcfile;
  307. extern FILE *outfile;
  308.  
  309. extern ushort bitbuf;
  310.  
  311. extern uchar subbitbuf;
  312. extern uchar header[HEADERSIZE_MAX];
  313.  
  314. extern char arc_name[FNAME_MAX];
  315.  
  316. extern int bitcount;
  317. extern int file_type;
  318. extern int error_count;
  319.  
  320. /* Global functions */
  321.  
  322. /* unarj.c */
  323.  
  324. void   strlower OF((char *str));
  325. void   strupper OF((char *str));
  326. voidp  *malloc_msg OF((int size));
  327. void   disp_clock OF((void));
  328. void   error OF((char *fmt, char *arg));
  329. void   fillbuf OF((int n));
  330. ushort getbits OF((int n));
  331. void   fwrite_txt_crc OF((uchar *p, int n));
  332. void   init_getbits OF((void));
  333.  
  334. /* environ.c */
  335.  
  336. FILE   *file_open OF((char *name, char *mode));
  337. int    file_read OF((char *buf, int size, int nitems, FILE *stream));
  338. int    file_seek OF((FILE *stream, long offset, int mode));
  339. long   file_tell OF((FILE *stream));
  340. int    file_write OF((char *buf, int size, int nitems, FILE *stream));
  341. voidp  *xmalloc OF((int size));
  342. void   case_path OF((char *name));
  343. void   default_case_path OF((char *name));
  344. int    file_exists OF((char *name));
  345. void   get_mode_str OF((char *str, uint fmode));
  346. int    set_ftime_mode OF((char *name, ulong timestamp, uint fmode, uint host));
  347.  
  348. /* decode.c */
  349.  
  350. void    decode OF((void));
  351. void    decode_f OF((void));
  352.  
  353. /* Message strings */
  354.  
  355. extern char M_VERSION [];
  356.  
  357. extern char M_ARCDATE [];
  358. extern char M_BADCOMND[];
  359. extern char M_BADCOMNT[];
  360. extern char M_BADHEADR[];
  361. extern char M_BADTABLE[];
  362. extern char M_CANTOPEN[];
  363. extern char M_CANTREAD[];
  364. extern char M_CANTWRIT[];
  365. extern char M_CRCERROR[];
  366. extern char M_CRCOK   [];
  367. extern char M_DIFFHOST[];
  368. extern char M_ENCRYPT [];
  369. extern char M_ERRORCNT[];
  370. extern char M_EXTRACT [];
  371. extern char M_FEXISTS [];
  372. extern char M_HEADRCRC[];
  373. extern char M_NBRFILES[];
  374. extern char M_NOMEMORY[];
  375. extern char M_NOTARJ  [];
  376. extern char M_PROCARC [];
  377. extern char M_SKIPPED [];
  378. extern char M_SUFFIX  [];
  379. extern char M_TESTING [];
  380. extern char M_UNKNMETH[];
  381. extern char M_UNKNTYPE[];
  382. extern char M_UNKNVERS[];
  383.  
  384. #endif
  385.  
  386. /* end UNARJ.H */
  387.