home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / ARCHIVERS / lha208src.lzh / LHA / SRC / util.c < prev   
Text File  |  1994-02-14  |  4KB  |  169 lines

  1. /*
  2.  * util.c - part of LHx for UNIX
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <errno.h>
  7.  
  8. #ifdef __STDC__
  9. #include <stdlib.h>
  10. #endif
  11. #include "lharc.h"
  12.  
  13. #define BUFFERSIZE 2048
  14.  
  15. extern unsigned short mcrc;
  16. extern int quiet;
  17.  
  18. long copyfile(f1, f2, size, crc_flg)    /* return: size of source file */
  19. FILE *f1;
  20. FILE *f2;
  21. long size;
  22. int crc_flg;    /* 0: no crc, 1: crc check, 2: extract, 3: append */
  23. {
  24.     unsigned short xsize;
  25.     char *buf;
  26.     long rsize = 0;
  27.  
  28.     if ((buf = (char *)malloc(BUFFERSIZE)) == NULL)
  29.         fatal_error("virtual memory exhausted.\n");
  30.     mcrc = 0;
  31.     if ((crc_flg == 2 || crc_flg) && text_mode)
  32.         init_code_cache();
  33.     while (size > 0) {
  34.         /* read */
  35.         if (crc_flg == 3 && text_mode) {
  36.             xsize = fread_txt(buf, BUFFERSIZE, f1);
  37.             if (xsize == 0)
  38.                 break;
  39.             if (ferror(f1)) {
  40.                 fatal_error("file read error\n");
  41.             }
  42.         }
  43.         else {
  44.             xsize = (size > BUFFERSIZE) ? BUFFERSIZE : size;
  45.             if (fread(buf, 1, xsize, f1) != xsize) {
  46.                 fatal_error("file read error\n");
  47.             }
  48.         }
  49.         /* write */
  50.         if (f2) {
  51.             if (crc_flg == 2 && text_mode) {
  52.                 if (fwrite_txt(buf, xsize, f2)) {
  53.                     fatal_error("file write error\n");
  54.                 }
  55.             }
  56.             else {
  57.                 if (fwrite(buf, 1, xsize, f2) != xsize) {
  58.                     fatal_error("file write error\n");
  59.                 }
  60.             }
  61.         }
  62.         /* calculate crc */
  63.         if (crc_flg) {
  64.             calccrc(buf, xsize);
  65.         }
  66.         rsize += xsize;
  67.         if (crc_flg != 3 || !text_mode)
  68.             size -= xsize;
  69.     }
  70.     free(buf);
  71.     return rsize;
  72. }
  73.  
  74. int
  75. encode_stored_crc (ifp, ofp, size, original_size_var, write_size_var)
  76. FILE *ifp, *ofp;
  77. long size;
  78. long *original_size_var;
  79. long *write_size_var;
  80. {
  81.     int save_quiet;
  82.  
  83.     save_quiet = quiet;
  84.     quiet = 1;
  85.     size = copyfile (ifp,ofp,size,3);
  86.     *original_size_var = *write_size_var = size;
  87.     quiet = save_quiet;
  88.     return mcrc;
  89. }
  90.  
  91. /***************************************
  92.     convert path delimiter
  93. ****************************************
  94.     returns *filename
  95. ***************************************/
  96. unsigned char *
  97. convdelim(path, delim)
  98. unsigned char *path;
  99. unsigned char delim;
  100. {
  101.     unsigned char c;
  102.     unsigned char *p;
  103. #ifdef MULTIBYTE_CHAR
  104.     int kflg;
  105.  
  106.     kflg = 0;
  107. #endif
  108.     for (p = path; (c = *p) != 0; p++) {
  109. #ifdef MULTIBYTE_CHAR
  110.         if (kflg) {
  111.             kflg = 0;
  112.         } 
  113.         else if (iskanji(c)) {
  114.             kflg = 1;
  115.         } 
  116.         else
  117. #endif
  118.             if (c == '\\' || c == DELIM || c == DELIM2)
  119.             {
  120.                 *p = delim;
  121.                 path = p + 1;
  122.             }
  123.     }
  124.     return path;
  125. }
  126.  
  127. /* If TRUE, archive file name is msdos SFX file name. */
  128. boolean
  129. archive_is_msdos_sfx1 (name)
  130. char *name;
  131. {
  132.     int len = strlen (name);
  133.  
  134.     return ((len >= 4) &&
  135.         (strucmp (".COM",name + len - 4) == 0 ||
  136.         strucmp (".EXE",name + len - 4) == 0)) ||
  137.         ((len >= 2) &&
  138.         (strucmp (".x",name + len - 2) == 0));
  139. }
  140.  
  141. /* skip SFX header */
  142. boolean
  143. skip_msdos_sfx1_code (fp)
  144. FILE *fp;
  145. {
  146.     unsigned char buffer[4096];
  147.     unsigned char *p, *q;
  148.     int n;
  149.  
  150.     n = fread (buffer, sizeof (char), 4096, fp);
  151.  
  152.     for (p = buffer + 2, q = buffer + n - 5; p < q; p ++)
  153.     {
  154.         /* found "-l??-" keyword (as METHOD type string) */
  155.         if (p[0] == '-' && p[1] == 'l' && p[4] == '-')
  156.         {
  157.             /* size and checksum validate check */
  158.             if (p[-2] > 20 && p[-1] == calc_sum (p, p[-2]))
  159.             {
  160.                 fseek (fp, ((p - 2) - buffer) - n, SEEK_CUR);
  161.                 return TRUE;
  162.             }
  163.         }
  164.     }
  165.  
  166.     fseek (fp, -n, SEEK_CUR);
  167.     return FALSE;
  168. }
  169.