home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 9 Archive / 09-Archive.zip / OS2LHX.LZH / LHSCAN.C < prev    next >
C/C++ Source or Header  |  1989-04-15  |  2KB  |  117 lines

  1. /* LHSCAN.C -- Scan routine for LHX
  2.  *
  3.  * version 1.0 by Mark Armbrust, 15 April 1985   (IRS? Just say NO!)
  4.  *
  5.  * The code in this module is public domain -- do whatever you want with it */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <dos.h>
  10.  
  11. #include "lhx.h"
  12.  
  13. /* private functions */
  14.  
  15. PRIVATE void    CheckHeader (unsigned int, unsigned long);
  16.  
  17. /* private data */
  18.  
  19.  
  20. PUBLIC void        Scan    (arcfile)
  21.  
  22. FILE            *    arcfile;
  23. {
  24. unsigned int          offset, buff_len;
  25. unsigned long        file_offset;
  26.  
  27.  
  28. printf ("\nScanning file %s\n", name);
  29.  
  30. offset = 0;
  31. file_offset = 0;
  32.  
  33. for (;;) {
  34.     buff_len = offset + fread (&buffer[offset], 1, BUFF_LEN - offset, arcfile);
  35.  
  36.     offset = 0;
  37.     while (offset + 100 < buff_len) {
  38.         CheckHeader (offset, file_offset);
  39.         ++offset;
  40.         ++file_offset;
  41.         }
  42.  
  43.     if (feof (arcfile))
  44.         break;
  45.  
  46.     memcpy (buffer, &buffer[offset], buff_len - offset);
  47.     offset = buff_len - offset;
  48.     }
  49.  
  50. while (offset + 22 < buff_len) {
  51.     CheckHeader (offset, file_offset);
  52.     ++offset;
  53.     ++file_offset;
  54.     }
  55.  
  56. }
  57.  
  58.  
  59.  
  60. PRIVATE void    CheckHeader (offset, file_offset)
  61.  
  62. unsigned int              offset;
  63. unsigned long            file_offset;
  64. {
  65. struct lzhdir        *    header;
  66. char                    name[40];
  67. unsigned int              n, i;
  68. char                    type;
  69. unsigned char            sum, points;
  70.  
  71.  
  72. header = (struct lzhdir *) &buffer[offset];
  73.  
  74. points = 0;
  75.  
  76. if ( (n = header->header_len) > 22 && header->header_len <= 98) {
  77.     ++points;
  78.     for (sum = 0, i = 0; i < n; ++i)
  79.         sum += buffer[offset + 2 + i];
  80.     if (header->header_sum == sum)
  81.         ++points;
  82.     }
  83.  
  84. if (n - 22 == header->name_len) ++ points;
  85.  
  86. if (header->method[0] == '-') ++points;
  87. if (header->method[1] == 'l') ++points;
  88. if (header->method[2] == 'h') ++points;
  89. if ((type = header->method[3]) == '0' || type == '1' )
  90.     ++points;
  91. else
  92.     type = '?';
  93. if (header->method[4] == '-') ++points;
  94.  
  95. if (header->file_attr & 0xFF00 == 0) ++points;
  96. if (header->data_size <= header->file_size) ++points;
  97.  
  98. n = header->name_len;
  99. if (n > 39) n = 39;
  100. memcpy (name, header->filename, n);
  101. name[n] = 0;
  102. for (i = 0; i<n; ++i)
  103.     if (name[i] < ' ') name[i] = '?';
  104.  
  105. if (points >= 5) {
  106.     
  107.     printf ( "  @%ld,{%ld | %ld},%ld,%c  %s\n",
  108.             file_offset,
  109.             file_offset + header->header_len + 2,
  110.             file_offset + header->name_len + 24,
  111.             (header->file_size <= 99999999) ? header->file_size : 0,
  112.             type,
  113.             name);
  114.     }
  115.  
  116. }
  117.