home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / cpm68k / arc68k.arc / ARCEXT.C < prev    next >
Text File  |  1987-11-27  |  5KB  |  131 lines

  1.  
  2. /*
  3.  *      arcext.c        1.1
  4.  *
  5.  *      Author: Thom Henderson
  6.  *      Original System V port: Mike Stump
  7.  *      Enhancements, Bug fixes, and cleanup: Chris Seaman
  8.  *      Date: Fri Mar 20 09:57:02 1987
  9.  *      Last Mod.       3/21/87
  10.  *    lines 117, 138 changed fopen to fopenb 7-5-87 ja
  11.  *
  12.  */
  13.  
  14. /*
  15.  * ARC - Archive utility - ARCEXT
  16.  * 
  17.  * Version 2.18, created on 02/03/86 at 22:55:19
  18.  * 
  19.  * (C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
  20.  * 
  21.  *     Description:
  22.  *          This file contains the routines used to extract files from
  23.  *          an archive.
  24.  */
  25.  
  26. #include "arc.h"
  27. INT extarc(argc,argv,prt)              /* extract files from archive */
  28. INT argc;                              /* number of arguments */
  29. char *argv[];                          /* pointers to arguments */
  30. INT prt;                               /* true if printing */
  31. {
  32.     struct heads hdr;                  /* file header */
  33.     INT save;                          /* true if current entry matches */
  34.     INT did[MAXARG];                   /* true when argument was used */
  35.     char *i, *strrchr();               /* string index */
  36.     char *fbuf;                        /* temporary storage for name */
  37.     INT n;                             /* index */
  38.     INT extfile();
  39.  
  40.     for (n=0; n<argc; n++)             /* for each argument */
  41.         did[n] = 0;                    /* reset usage flag */
  42.     openarc(0);                        /* open archive for reading */
  43.     if (argc) {                        /* if files were named */
  44.         while (readhdr(&hdr,arc)) {    /* while more files to check */
  45.             save = 0;
  46.             for (n=0; n<argc; n++) {   /* for each template given */
  47.                 fbuf = argv[n];
  48.                 if (i = strrchr(argv[n],'/')) 
  49.             fbuf = i + 1;
  50.                 if (match(hdr.name,fbuf)) {
  51.                     save = 1;          /* turn on save flag */
  52.                     did[n] = 1;        /* turn on usage flag */
  53.                     extfile(&hdr,argv[n],prt); /* extract the file */
  54.                     break;             /* stop looking */
  55.                 }
  56.             }
  57.             if (!(save))               /* if not extracted, advance */
  58.                 fseek(arc,hdr.size,1); /* to next file */
  59.         }
  60.     } else 
  61.     while (readhdr(&hdr,arc))     /* else extract all files */
  62.         extfile(&hdr,"",prt);
  63.     closearc(0);                       /* close archive after reading */
  64.     if (note) {
  65.         for (n=0; n<argc; n++) {       /* report unused args */
  66.             if (!did[n]) {
  67.                 fprintf(stderr,"File not found: %s\n",argv[n]);
  68.                 nerrs++;
  69.             }
  70.         }
  71.     }
  72. }
  73.  
  74. INT extfile(hdr,path,prt)              /* extract a file */
  75. struct heads *hdr;                     /* pointer to header data */
  76. char *path;                            /* pointer to path name */
  77. INT prt;                               /* true if printing */
  78. {
  79.     FILE *f;                         /* extracted file, opener */
  80.     char buf[STRLEN];                  /* input buffer */
  81.     char fix[STRLEN];                  /* fixed name buffer */
  82.     char *fbuf;                        /* temporary pointer to path */
  83.     char *i, *strrchr();               /* string index */
  84.  
  85.     if (prt) {                         /* printing is much easier */
  86.         unpack(arc,stdout,hdr);        /* unpack file from archive */
  87.         printf("\n");
  88.         return;
  89.     }
  90.     strcpy(fix,path);                  /* note path name template */
  91.     fbuf = path;
  92.     if (i=strrchr(fbuf,'/')) {            /* find start of name */
  93.         fbuf = i + 1;
  94.         fix[strlen(path)-strlen(fbuf)] = '\0';
  95.         strcat(fix,hdr->name);         /* replace template with name */
  96.     } else
  97.         strcpy(fix,hdr->name);         /* replace template with name */
  98.     if (note)
  99.         fprintf(stderr,"Extracting file: %s\n",fix);
  100.     if (warn) {
  101.         if (f=fopenb(fix,"r")) {        /* see if it exists */
  102.             fclose(f);
  103.             fprintf(stderr,"WARNING: File %s already exists!",fix);
  104.             while (1) {
  105.                 fprintf(stderr,"  Overwrite it (y/n)? ");
  106.                 fgets(buf,STRLEN,stdin);
  107.                 *buf = toupper(*buf);
  108.                 if (*buf=='Y' || *buf=='N')
  109.                     break;
  110.             }
  111.             if (*buf=='N') {
  112.                 fprintf(stderr,"%s not extracted.\n",fix);
  113.                 fseek(arc,hdr->size,1);
  114.                 return;
  115.             }
  116.         }
  117.     }
  118.     if (!(f=fopenb(fix,"w"))) {
  119.         if (warn) {
  120.             fprintf(stderr,"Cannot create %s\n",fix);
  121.             nerrs++;
  122.         }
  123.         fseek(arc,hdr->size,1);
  124.         return;
  125.     }
  126.     /* now unpack the file */
  127.     unpack(arc,f,hdr);                 /* unpack file from archive */
  128.     fclose(f);                         /* all done writing to file */
  129.     setstamp(fix,hdr->date,hdr->time); /* set the proper date/time stamp */
  130. }
  131.