home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / directry / fff320 / proczip.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-12-07  |  3.9 KB  |  147 lines

  1. /***************************************************************************
  2.  *                                                                         *
  3.  * ZIP Processing Functions                                                *
  4.  *                                                                         *
  5.  **************************************************************************/
  6.  
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10.  
  11. #undef MAIN
  12.  
  13. #include "fff.h"
  14. #include "zip.h"
  15.  
  16. int Match (char *Str, char *Pat);
  17. void PrtVerbose (char *Path, char *Name, DOS_FILE_TIME Time, DOS_FILE_DATE Date,
  18.                  long Size);
  19. void ChkPage (void);
  20.  
  21.  
  22. extern char Pattern[66];
  23.  
  24.  void
  25. DoZip (char *Name) {
  26.     FILE *ZIPFile;
  27.  
  28.     if ( (ZIPFile = fopen(Name, "rb")) == NULL ) {
  29.         fprintf(stderr, "%s", Name);
  30.         perror("");
  31.         }
  32.     ProcessHeaders(ZIPFile, Name);
  33.     fclose(ZIPFile);
  34.     }
  35.  
  36.  
  37.  void
  38. ProcessHeaders (FILE *ZIPFile, char *Path) {
  39.     extern int TotalMatch, VerboseSwt, Spaced, PageSwt;
  40.     extern ARC_TYPE ArcType;
  41.     extern int Lnno;
  42.     extern S[6][3];
  43.  
  44.     int i, Printed;
  45.     long ZipLen, FileLen;
  46.     char *Buffer, *Name, *p;
  47.     char DireName[65];
  48.     unsigned Count;
  49.     long Offset, S_Offset, Block, Index;
  50.     unsigned long *Ptr;
  51.     unsigned long CentralSig;
  52.     END_CENTRAL_DIRECTORY_RECORD *EndPtr;
  53.     CENTRAL_DIRECTORY_FILE_HEADER *CentralHeader;
  54.  
  55.     if ( (Buffer = malloc(SEARCH_SIZE)) == NULL) {
  56.         fprintf(stderr, "Insufficient memory!\n");
  57.         exit(1);
  58.         }
  59.     fseek(ZIPFile, 0, SEEK_END);
  60.     FileLen = ZipLen = ftell(ZIPFile);
  61.     fseek(ZIPFile, 0, SEEK_SET);
  62.     if (ZipLen < SEARCH_SIZE) {
  63.         ZipLen = fread(Buffer, 1, ZipLen, ZIPFile);
  64.         }
  65.     else {
  66.         fseek(ZIPFile, -SEARCH_SIZE, SEEK_END);
  67.         ZipLen = fread(Buffer, 1, SEARCH_SIZE, ZIPFile);
  68.         }
  69.     for (i = ZipLen - 4; i >= 0; --i) {
  70.         Ptr = (unsigned long *) &Buffer[i];
  71.         if (*Ptr == END_CENTRAL_DIR_SIGNATURE) break;
  72.         }
  73.     if (i < 0) {
  74.         fprintf(stderr, "%s: Invalid ZIP format\n", Path);
  75.         fprintf(stderr, "      - No \"End-of-Central-Directory\" record!\n");
  76.         free(Buffer);
  77.         return;
  78.         }
  79.     EndPtr = (END_CENTRAL_DIRECTORY_RECORD *) &Buffer[i + 4];
  80.     Count = EndPtr->TotalEntriesCentralDirOnThisDisk;
  81.     S_Offset = Offset = EndPtr->OffsetStartCentralDirectory;
  82.     Block = FileLen - Offset;
  83.     free(Buffer);
  84.  
  85.     Buffer = malloc(Block);
  86.     fseek(ZIPFile, S_Offset, SEEK_SET);
  87.     fread(Buffer, 1, Block, ZIPFile);
  88.     Printed = 0;
  89.     for (Index = i = 0; i < Count; ++i) {
  90.         ++S[ArcType][1];
  91.         memmove(&CentralSig, &Buffer[Index], 4);
  92.         if (CentralSig != CENTRAL_FILE_HEADER_SIGNATURE) {
  93.             fprintf(stderr, "%s: Invalid ZIP format\n", Path);
  94.             fprintf(stderr, "     - bad \"Central Directory\" record!\n");
  95.             free(Buffer);
  96.             return;
  97.             }
  98.         Index += 4;
  99.         CentralHeader = (CENTRAL_DIRECTORY_FILE_HEADER *) &Buffer[Index];
  100.         Index += sizeof(CENTRAL_DIRECTORY_FILE_HEADER);
  101.         Name = malloc(CentralHeader->FileNameLength + 1);
  102.         memmove(Name, &Buffer[Index], CentralHeader->FileNameLength);
  103.         Name[CentralHeader->FileNameLength] = '\0';
  104.         Index += (CentralHeader->FileNameLength + CentralHeader->FileCommentLength);
  105.         if ( (p = strrchr(Name, '/')) != NULL) {
  106.             *p = '\0';
  107.             strcpy(DireName, Name); strcat(DireName, "/");
  108.             ++p;
  109.             }
  110.         else {
  111.             DireName[0] = '\0';
  112.             p = Name;
  113.             }
  114.         if (Match(p, Pattern) ) {
  115.             ++S[ArcType][2];
  116.             ++TotalMatch;
  117.             if (PageSwt) ChkPage();
  118.             if (VerboseSwt) {
  119.                 if (!Printed) {
  120.                     if (!Spaced) {
  121.                         if (PageSwt) ChkPage();
  122.                         printf("\n");
  123.                         ++Lnno;
  124.                         }
  125.                     if (PageSwt) ChkPage();
  126.                     printf("%s\n", Path);
  127.                     ++Lnno;
  128.                     Printed = 1;
  129.                     }
  130.                 fputs("* ", stdout);
  131.                 PrtVerbose(DireName, p, CentralHeader->LastModFileTime,
  132.                            CentralHeader->LastModFileDate,
  133.                            CentralHeader->UncompressedSize);
  134.                 }
  135.             else printf("%s--> (%s/%s)\n", Path, DireName, p);
  136.             ++Lnno;
  137.             }
  138.         free(Name);
  139.         }
  140.     free(Buffer);
  141.     if (Printed) {
  142.         if (PageSwt) ChkPage();
  143.         printf("\n");
  144.         ++Lnno;
  145.         Spaced = 1;
  146.         }
  147.     }