home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #3 / amigamamagazinepolishissue1998.iso / ppc / lha_ppc / src / lharc.h < prev    next >
C/C++ Source or Header  |  1997-12-13  |  16KB  |  602 lines

  1. /*----------------------------------------------------------------------*/
  2. /*        LHarc Archiver Driver for UNIX                */
  3. /*                                    */
  4. /*        Copyright(C) MCMLXXXIX  Yooichi.Tagawa            */
  5. /*                                    */
  6. /*  V1.00  Fixed                1989.09.22  Y.Tagawa    */
  7. /*  V0.03  LHa for UNIX                1991.12.18  M.Oki    */
  8. /*----------------------------------------------------------------------*/
  9.  
  10. #ifndef _LHARC_H_
  11. #define _LHARC_H_
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <ctype.h>
  16. #include <sys/types.h>
  17. #include <signal.h>
  18. #include <time.h>
  19. #include "stat.h"
  20.  
  21. /*----------------------------------------------------------------------*/
  22. /*            DIRECTORY ACCESS STUFF                */
  23. /*----------------------------------------------------------------------*/
  24. #include <dirent.h>
  25. #define DIRENTRY    struct dirent
  26. #define NAMLEN(p)    strlen (p->d_name)
  27.  
  28. #include <unistd.h>
  29.  
  30. /*----------------------------------------------------------------------*/
  31. /*                FILE ATTRIBUTES                */
  32. /*----------------------------------------------------------------------*/
  33.  
  34. /* If file mode is not compatible between your Machine/OS and
  35.    LHarc standard UNIX file mode.
  36.    (See UNIX Manual stat(1), <sys/stat.h>,
  37.    and/or below UNIX_* definitions. ) */
  38. /* #define NOT_COMPATIBLE_MODE */
  39. #define is_directory(statp)    (((statp)->st_mode & S_IFMT) == S_IFDIR)
  40. #define is_regularfile(statp)    (((statp)->st_mode & S_IFMT) == S_IFREG)
  41.  
  42. /* #define WRITE_BINARY    "wb" */
  43. /* #define READ_BINARy    "rb" */
  44. #define WRITE_BINARY    "w"
  45. #define READ_BINARY    "r"
  46.  
  47. /*----------------------------------------------------------------------*/
  48. /*            MEMORY AND STRING FUNCTIONS            */
  49. /*----------------------------------------------------------------------*/
  50.  
  51. #ifndef USG
  52. #include <strings.h>
  53. #else
  54. #include <string.h>
  55. #endif    /* USG */
  56.  
  57. #ifdef NOINDEX
  58. #define index strchr
  59. #define rindex strrchr
  60. #endif    /* NOINDEX */
  61.  
  62. #ifdef NOBSTRING
  63. #define bcmp(a,b,n) memcmp ((a),(b),(n))
  64. #define bzero(d,n) memset((d),0,(n))
  65. #define bcopy(s,d,n) memmove((d),(s),(n))
  66. #endif    /* NOBSTRING */
  67.  
  68. #define strucmp(p,q) stricmp((p),(q))
  69.  
  70. /*----------------------------------------------------------------------*/
  71. /*                YOUR CUSTOMIZIES            */
  72. /*----------------------------------------------------------------------*/
  73. /* These definitions are changable to you like.             */
  74. /* #define ARCHIVENAME_EXTENTION        ".LZH"            */
  75. /* #define BACKUPNAME_EXTENTION            ".BAK"            */
  76. /* #define TMP_FILENAME_TEMPLATE        "/usr/tmp/lhXXXXXX"    */
  77. /* #define MULTIBYTE_CHAR                        */
  78. /* #define USE_PROF                            */
  79.  
  80. #ifndef ARCHIVENAME_EXTENTION
  81. #define ARCHIVENAME_EXTENTION    ".lzh"
  82. #endif
  83. #ifndef BACKUPNAME_EXTENTION
  84. #define BACKUPNAME_EXTENTION    ".bak"
  85. #endif
  86. #ifndef TMP_FILENAME_TEMPLATE
  87. #define TMP_FILENAME_TEMPLATE    "/tmp/lhXXXXXX"
  88. #endif
  89.  
  90. #define SJC_FIRST_P(c)            \
  91.   (((unsigned char)(c) >= 0x80) &&    \
  92.    (((unsigned char)(c) < 0xa0) ||    \
  93.     ((unsigned char)(c) >= 0xe0) &&    \
  94.     ((unsigned char)(c) < 0xfd)))
  95. #define SJC_SECOND_P(c)            \
  96.   (((unsigned char)(c) >= 0x40) &&    \
  97.    ((unsigned char)(c) < 0xfd) &&    \
  98.    ((ungigned char)(c) != 0x7f))
  99.  
  100. #ifdef MULTIBYTE_CHAR
  101. #define MULTIBYTE_FIRST_P    SJC_FIRST_P
  102. #define MULTIBYTE_SECOND_P    SJC_SECOND_P
  103. #endif /* MULTIBYTE_CHAR */
  104.  
  105. /*----------------------------------------------------------------------*/
  106. /*            OTHER DIFINITIONS                */
  107. /*----------------------------------------------------------------------*/
  108.  
  109. /* Your C-Compiler has no 'void' */
  110. #ifdef NO_VOID
  111. #define void
  112. #endif
  113.  
  114. #ifndef SEEK_SET
  115. #define SEEK_SET    0
  116. #define SEEK_CUR    1
  117. #define SEEK_END    2
  118. #endif
  119.  
  120. #define FILENAME_LENGTH    1024
  121.  
  122.  
  123. /* non-integral functions */
  124. extern struct tm *localtime ();
  125. extern char *getenv ();
  126.  
  127. /* external variables */
  128. extern int errno;
  129.  
  130.  
  131. #define    FALSE    0
  132. #define TRUE    1
  133. typedef int boolean;
  134.  
  135.  
  136. /*----------------------------------------------------------------------*/
  137. /*            LHarc FILE DEFINITIONS                */
  138. /*----------------------------------------------------------------------*/
  139. #define METHOD_TYPE_STRAGE    5
  140. #define LZHUFF0_METHOD        "-lh0-"
  141. #define LZHUFF1_METHOD        "-lh1-"
  142. #define LZHUFF2_METHOD        "-lh2-"
  143. #define LZHUFF3_METHOD        "-lh3-"
  144. #define LZHUFF4_METHOD        "-lh4-"
  145. #define LZHUFF5_METHOD        "-lh5-"
  146. #define LARC4_METHOD        "-lz4-"
  147. #define LARC5_METHOD        "-lz5-"
  148. #define LZHDIRS_METHOD        "-lhd-"
  149.  
  150. #define I_HEADER_SIZE            0
  151. #define I_HEADER_CHECKSUM        1
  152. #define I_METHOD            2
  153. #define I_PACKED_SIZE            7
  154. #define I_ORIGINAL_SIZE            11
  155. #define I_LAST_MODIFIED_STAMP        15
  156. #define I_ATTRIBUTE            19
  157. #define I_HEADER_LEVEL            20
  158. #define I_NAME_LENGTH            21
  159. #define I_NAME                22
  160.  
  161. #define I_CRC                22 /* + name_length */
  162. #define I_EXTEND_TYPE            24 /* + name_length */
  163. #define I_MINOR_VERSION            25 /* + name_length */
  164. #define I_UNIX_LAST_MODIFIED_STAMP    26 /* + name_length */
  165. #define I_UNIX_MODE            30 /* + name_length */
  166. #define I_UNIX_UID            32 /* + name_length */
  167. #define I_UNIX_GID            34 /* + name_length */
  168. #define I_UNIX_EXTEND_BOTTOM        36 /* + name_length */
  169.  
  170. #define I_GENERIC_HEADER_BOTTOM        I_EXTEND_TYPE
  171.  
  172.  
  173.  
  174. #define EXTEND_GENERIC        0
  175. #define EXTEND_UNIX        'U'
  176. #define EXTEND_MSDOS        'M'
  177. #define EXTEND_MACOS        'm'
  178. #define EXTEND_OS9        '9'
  179. #define EXTEND_OS2        '2'
  180. #define EXTEND_OS68K        'K'
  181. #define EXTEND_OS386        '3'        /* OS-9000??? */
  182. #define EXTEND_HUMAN        'H'
  183. #define EXTEND_CPM        'C'
  184. #define EXTEND_FLEX        'F'
  185. #define EXTEND_RUNSER        'R'
  186. /*    this OS type is not official */
  187. #define EXTEND_TOWNSOS        'T'
  188. #define EXTEND_XOSK        'X'
  189. /*------------------------------*/
  190.  
  191. #define GENERIC_ATTRIBUTE            0x20
  192. #define GENERIC_DIRECTORY_ATTRIBUTE        0x10
  193. #define HEADER_LEVEL0                0x00
  194. #define HEADER_LEVEL1                0x01
  195. #define HEADER_LEVEL2                0x02
  196.  
  197. #define CURRENT_UNIX_MINOR_VERSION        0x00
  198.  
  199. #define DELIM ('/')
  200. #define DELIM2 (0xff)
  201. #define DELIMSTR "/"
  202.  
  203.  
  204. typedef struct LzHeader {
  205.   unsigned char        header_size;
  206.   char            method[METHOD_TYPE_STRAGE];
  207.   long            packed_size;
  208.   long            original_size;
  209.   long            last_modified_stamp;
  210.   unsigned char    attribute;
  211.   unsigned char header_level;
  212.   char            name[256];
  213.   unsigned short    crc;
  214.   boolean        has_crc;
  215.   unsigned char        extend_type;
  216.   unsigned char        minor_version;
  217.   /*  extend_type == EXTEND_UNIX  and convert from other type. */
  218.   time_t        unix_last_modified_stamp;
  219.   unsigned short    unix_mode;
  220.   unsigned short    unix_uid;
  221.   unsigned short    unix_gid;
  222. } LzHeader;
  223.  
  224. #define OSK_RW_RW_RW            0000033
  225. #define OSK_FILE_REGULAR        0000000
  226. #define OSK_DIRECTORY_PERM        0000200
  227. #define OSK_SHARED_PERM            0000100
  228. #define OSK_OTHER_EXEC_PERM        0000040
  229. #define OSK_OTHER_WRITE_PERM        0000020
  230. #define OSK_OTHER_READ_PERM        0000010
  231. #define OSK_OWNER_EXEC_PERM        0000004
  232. #define OSK_OWNER_WRITE_PERM        0000002
  233. #define OSK_OWNER_READ_PERM        0000001
  234.  
  235. #define UNIX_FILE_TYPEMASK        0170000
  236. #define UNIX_FILE_REGULAR        0100000
  237. #define UNIX_FILE_DIRECTORY        0040000
  238. #define UNIX_SETUID            0004000
  239. #define UNIX_SETGID            0002000
  240. #define UNIX_STYCKYBIT            0001000
  241. #define UNIX_OWNER_READ_PERM        0000400
  242. #define UNIX_OWNER_WRITE_PERM        0000200
  243. #define UNIX_OWNER_EXEC_PERM        0000100
  244. #define UNIX_GROUP_READ_PERM        0000040
  245. #define UNIX_GROUP_WRITE_PERM        0000020
  246. #define UNIX_GROUP_EXEC_PERM        0000010
  247. #define UNIX_OTHER_READ_PERM        0000004
  248. #define UNIX_OTHER_WRITE_PERM        0000002
  249. #define UNIX_OTHER_EXEC_PERM        0000001
  250. #define UNIX_RW_RW_RW            0000666
  251.  
  252. #define LZHEADER_STRAGE            4096
  253.  
  254. #ifdef S_IFLNK
  255. #define GETSTAT lstat
  256. #else
  257. #define GETSTAT stat
  258. #endif
  259.  
  260. /* used by qsort() for alphabetic-sort */
  261. #define STRING_COMPARE(a,b) strcmp((a),(b))
  262.  
  263. struct string_pool {
  264.   int used;
  265.   int size;
  266.   int n;
  267.   char *buffer;
  268. };
  269.  
  270.  
  271. /*----------------------------------------------------------------------*/
  272. /*                OPTIONS                    */
  273. /*----------------------------------------------------------------------*/
  274.  
  275. /* command line options (common options) */
  276. extern boolean    quiet;
  277. extern boolean    text_mode;
  278. extern boolean    verbose;
  279. extern boolean    noexec;        /* debugging option */
  280. extern boolean    force;
  281. extern boolean    prof;
  282. extern boolean    delete_after_append;
  283.  
  284. /* list command flags */
  285. extern boolean    verbose_listing;
  286.  
  287. /* extract/print command flags */
  288. extern boolean    output_to_stdout;
  289.  
  290. /* add/update/delete command flags */
  291. extern boolean    new_archive;
  292. extern boolean    update_if_newer;
  293. extern boolean    generic_format;
  294.  
  295.  
  296. /*----------------------------------------------------------------------*/
  297. /*                VARIABLES                */
  298. /*----------------------------------------------------------------------*/
  299.  
  300. extern char    **cmd_filev;
  301. extern int    cmd_filec;
  302.  
  303. extern char    *archive_name;
  304. extern char    expanded_archive_name[FILENAME_LENGTH];
  305. extern char    temporary_name[FILENAME_LENGTH];
  306. extern char    backup_archive_name[FILENAME_LENGTH];
  307.  
  308. extern char *reading_filename, *writting_filename;
  309. extern boolean    remove_temporary_at_error;
  310. extern boolean    recover_archive_when_interrupt;
  311. extern boolean    remove_extracting_file_when_interrupt;
  312.  
  313. extern int    archive_file_mode;
  314. extern int    archive_file_gid;
  315.  
  316. /*----------------------------------------------------------------------*/
  317. /*                Functions                */
  318. /*----------------------------------------------------------------------*/
  319.  
  320. #ifdef __STDC__
  321. /* Prototypes for functions defined in append.c */
  322.  
  323. int encode_lzhuf(FILE *infp,
  324.                  FILE *outfp,
  325.                  long size,
  326.                  long *original_size_var,
  327.                  long *packed_size_var,
  328.                  char *name,
  329.                  char *hdr_method);
  330. void start_indicator(char *name,
  331.                      long size,
  332.                      char *msg,
  333.                      long def_indicator_threshold);
  334. void finish_indicator2(char *name,
  335.                        char *msg,
  336.                        int pcnt);
  337. void finish_indicator(char *name,
  338.                       char *msg);
  339.  
  340.  
  341. /* Prototypes for functions defined in crcio.c */
  342.  
  343. void make_crctable(void);
  344. unsigned short calccrc(unsigned char *p,
  345.                        unsigned int n);
  346. void fillbuf(unsigned char n);
  347. unsigned short getbits(unsigned char n);
  348. void putcode(unsigned char n,
  349.              unsigned short x);
  350. void putbits(unsigned char n,
  351.              unsigned short x);
  352. int fread_crc(unsigned char *p,
  353.               int n,
  354.               FILE *fp);
  355. void fwrite_crc(unsigned char *p,
  356.                 int n,
  357.                 FILE *fp);
  358. void init_code_cache(void);
  359. void init_getbits(void);
  360. void init_putbits(void);
  361. int fwrite_txt(unsigned char *p,
  362.                int n,
  363.                FILE *fp);
  364. int fread_txt(unsigned char *p,
  365.               int n,
  366.               FILE *fp);
  367.  
  368.  
  369. /* Prototypes for functions defined in dhuf.c */
  370.  
  371. void start_c_dyn(void);
  372. void decode_start_dyn(void);
  373. unsigned short decode_c_dyn(void);
  374. unsigned short decode_p_dyn(void);
  375. void output_dyn(int code,
  376.                 unsigned int pos);
  377. void encode_end_dyn(void);
  378.  
  379.  
  380. /* Prototypes for functions defined in extract.c */
  381.  
  382. int decode_lzhuf(FILE *infp,
  383.                  FILE *outfp,
  384.                  long original_size,
  385.                  long packed_size,
  386.                  char *name,
  387.                  int method);
  388.  
  389.  
  390. /* Prototypes for functions defined in header.c */
  391.  
  392. int calc_sum(char *p,
  393.              int len);
  394. boolean get_header(FILE *fp,
  395.                    LzHeader *hdr);
  396. void init_header(char *name,
  397.                  struct stat *v_stat,
  398.                  LzHeader *hdr);
  399. void write_header(FILE *nafp,
  400.                   LzHeader *hdr);
  401.  
  402.  
  403. /* Prototypes for functions defined in huf.c */
  404.  
  405. void output_st1(int c,
  406.                 int p);
  407. unsigned char *alloc_buf(void);
  408. void encode_start_st1(void);
  409. void encode_end_st1(void);
  410. unsigned short decode_c_st1(void);
  411. unsigned short decode_p_st1(void);
  412. void decode_start_st1(void);
  413.  
  414.  
  415. /* Prototypes for functions defined in larc.c */
  416.  
  417. unsigned short decode_c_lzs(void);
  418. unsigned short decode_p_lzs(void);
  419. void decode_start_lzs(void);
  420. unsigned short decode_c_lz5(void);
  421. unsigned short decode_p_lz5(void);
  422. void decode_start_lz5(void);
  423.  
  424.  
  425. /* Prototypes for functions defined in lhadd.c */
  426.  
  427. FILE *append_it(char *name,
  428.                  FILE *oafp,
  429.                  FILE *nafp);
  430. void temporary_to_new_archive_file(long new_archive_size);
  431. void cmd_add(void);
  432. void cmd_delete(void);
  433.  
  434.  
  435. /* Prototypes for functions defined in lharc.c */
  436.  
  437. void main(int argc,
  438.           char **argv);
  439. void message(char *subject,
  440.              char *name);
  441. void warning(char *subject,
  442.              char *name);
  443. void error(char *subject,
  444.            char *msg);
  445. void fatal_error(char *msg);
  446. void write_error(void);
  447. void read_error(void);
  448. void interrupt(int signo);
  449. char *xmalloc(int size);
  450. char *xrealloc(char *old,
  451.                 int size);
  452. void init_sp(struct string_pool *sp);
  453. void add_sp(struct string_pool *sp,
  454.             char *name,
  455.             int len);
  456. void finish_sp(struct string_pool *sp,
  457.                int *v_count,
  458.                char ***v_vector);
  459. void free_sp(char **vector);
  460. void cleaning_files(int *v_filec,
  461.                     char ***v_filev);
  462. boolean find_files(char *name,
  463.                    int *v_filec,
  464.                    char ***v_filev);
  465. void free_files(int filec,
  466.                 char **filev);
  467. void build_temporary_name(void);
  468. void build_backup_name(char *buffer,
  469.                        char *original);
  470. void build_standard_archive_name(char *buffer,
  471.                                  char *orginal);
  472. boolean need_file(char *name);
  473. FILE *xfopen(char *name,
  474.               char *mode);
  475. FILE *open_old_archive(void);
  476. int inquire(char *msg,
  477.             char *name,
  478.             char *selective);
  479. void write_archive_tail(FILE *nafp);
  480. void copy_old_one(FILE *oafp,
  481.                   FILE *nafp,
  482.                   LzHeader *hdr);
  483.  
  484.  
  485. /* Prototypes for functions defined in lhdir.c */
  486.  
  487. #ifndef SYSV_SYSTEM_DIR
  488. DIR *opendir(char *name);
  489. struct direct *readdir(DIR *dirp);
  490. int closedir(DIR *dirp);
  491. #endif
  492.  
  493.  
  494. /* Prototypes for functions defined in lhext.c */
  495.  
  496. void cmd_extract(void);
  497.  
  498.  
  499. /* Prototypes for functions defined in lhlist.c */
  500.  
  501. void cmd_list(void);
  502.  
  503.  
  504. /* Prototypes for functions defined in maketbl.c */
  505.  
  506. void make_table(int nchar,
  507.                 unsigned char *bitlen,
  508.                 int tablebits,
  509.                 unsigned short *table);
  510.  
  511.  
  512. /* Prototypes for functions defined in maketree.c */
  513.  
  514. void make_code(int n,
  515.                unsigned char *len,
  516.                unsigned short *code);
  517. short make_tree(int nparm,
  518.                 unsigned short *freqparm,
  519.                 unsigned char *lenparm,
  520.                 unsigned short *codeparm);
  521.  
  522.  
  523. /* Prototypes for functions defined in patmatch.c */
  524.  
  525. int patmatch(char *p,
  526.              char *s,
  527.              int f);
  528.  
  529.  
  530. /* Prototypes for functions defined in shuf.c */
  531.  
  532. void decode_start_st0(void);
  533. void encode_p_st0(unsigned short j);
  534. void encode_start_fix(void);
  535. void decode_start_fix(void);
  536. unsigned short decode_c_st0(void);
  537. unsigned short decode_p_st0(void);
  538.  
  539.  
  540. /* Prototypes for functions defined in slide.c */
  541.  
  542. int encode_alloc(int method);
  543. void get_next_match(void);
  544. void encode(struct interfacing *interface);
  545. void decode(struct interfacing *interface);
  546.  
  547.  
  548. /* Prototypes for functions defined in util.c */
  549.  
  550. long copyfile(FILE *, FILE *, long, int);
  551. int encode_stored_crc(FILE *, FILE *, long, long *, long *);
  552. unsigned char *convdelim(unsigned char *, unsigned char);
  553. boolean archive_is_msdos_sfx1(char *);
  554. boolean skip_msdos_sfx1_code(FILE *);
  555.  
  556. #else
  557. extern void interrupt ();
  558.  
  559. extern void message ();
  560. extern void warning ();
  561. extern void error ();
  562. extern void fatal_error ();
  563.  
  564. extern boolean need_file ();
  565. extern int inquire ();
  566. extern FILE *xfopen ();
  567.  
  568. extern boolean find_files ();
  569. extern void free_files ();
  570.  
  571. extern void init_sp ();
  572. extern void add_sp ();
  573. extern void finish_sp ();
  574. extern void free_sp ();
  575. extern void cleaning_files ();
  576.  
  577. extern void build_temporary_name ();
  578. extern void build_backup_file_name ();
  579. extern void build_standard_archive_name ();
  580.  
  581. extern FILE *open_old_archive ();
  582. extern void init_header ();
  583. extern boolean get_header ();
  584. extern boolean archive_is_msdos_sfx1 ();
  585. extern boolean skip_msdos_sfx1_code ();
  586. extern void write_header ();
  587. extern void write_archive_tail ();
  588. extern void copy_old_one ();
  589. extern unsigned char *convdelim ();
  590. extern long copyfile ();
  591.  
  592. extern void cmd_list (), cmd_extract (), cmd_add (), cmd_delete ();
  593. #endif
  594.  
  595. extern boolean ignore_directory;
  596. extern boolean compress_method;
  597. extern boolean verify_mode;
  598.  
  599. extern char *extract_directory;
  600. extern FILE *temporary_fp;
  601.  
  602. #endif /* _LHARC_H_ */