home *** CD-ROM | disk | FTP | other *** search
/ ftp.update.uu.se / ftp.update.uu.se.2014.03.zip / ftp.update.uu.se / pub / rainbow / msdos / decus / RB122 / arc510sr.arc / ARCEXT.MAC < prev    next >
Text File  |  1986-04-14  |  6KB  |  167 lines

  1. $define(arc,$ifdef(xarc,off,on))#      macro switch for ARC only code
  2. $define(xarc,$ifdef(xarc,on,off))#     macro switch for XARC only code
  3. $emit($arc)#
  4. /*  ARC - Archive utility - ARCEXT
  5.  
  6. $define(tag,$$segment(@1,$$index(@1,=)+1))#
  7. $define(version,Version $tag(
  8. TED_VERSION DB =2.18), created on $tag(
  9. TED_DATE DB =02/03/86) at $tag(
  10. TED_TIME DB =22:55:19))#
  11. $undefine(tag)#
  12.     $version
  13.  
  14. (C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
  15.  
  16.     By:  Thom Henderson
  17.  
  18.     Description:
  19.          This file contains the routines used to extract files from
  20.          an archive.
  21.  
  22.     Language:
  23.          Computer Innovations Optimizing C86
  24. */
  25. #include <stdio.h>
  26. #include "arc.h"
  27.  
  28. extarc(num,arg,prt)                    /* extract files from archive */
  29. int num;                               /* number of arguments */
  30. char *arg[];                           /* pointers to arguments */
  31. int prt;                               /* true if printing */
  32. $emit($xarc)#
  33. extarc()                               /* extract files from archive */
  34. $emit(on)#
  35. {
  36.     struct heads hdr;                  /* file header */
  37. $emit($arc)#
  38.     int save;                          /* true to save current file */
  39.     int did[$maxarg];                  /* true when argument was used */
  40.     char *i, *rindex();                /* string index */
  41.     char **name, *alloc();             /* name pointer list, allocator */
  42.     int n;                             /* index */
  43.  
  44.     name = alloc(num*sizeof(char *));  /* get storage for name pointers */
  45.  
  46.     for(n=0; n<num; n++)               /* for each argument */
  47.     {    did[n] = 0;                   /* reset usage flag */
  48.          if(!(i=rindex(arg[n],'\\')))  /* find start of name */
  49.               if(!(i=rindex(arg[n],'/')))
  50.                    if(!(i=rindex(arg[n],':')))
  51.                         i = arg[n]-1;
  52.          name[n] = i+1;
  53.     }
  54.  
  55. $emit(on)#
  56.  
  57.     openarc(0);                        /* open archive for reading */
  58.  
  59. $emit($arc)#
  60.     if(num)                            /* if files were named */
  61.     {    while(readhdr(&hdr,arc))      /* while more files to check */
  62.          {    save = 0;                /* reset save flag */
  63.               for(n=0; n<num; n++)     /* for each template given */
  64.               {    if(match(hdr.name,name[n]))
  65.                    {    save = 1;      /* turn on save flag */
  66.                         did[n] = 1;    /* turn on usage flag */
  67.                         break;         /* stop looking */
  68.                    }
  69.               }
  70.  
  71.               if(save)                 /* extract if desired, else skip */
  72.                    extfile(&hdr,arg[n],prt);
  73.               else fseek(arc,hdr.size,1);
  74.          }
  75.     }
  76.  
  77.     else while(readhdr(&hdr,arc))      /* else extract all files */
  78.          extfile(&hdr,"",prt);
  79. $emit($xarc)#
  80.     while(readhdr(&hdr,arc))           /* extract all files */
  81.          extfile(&hdr);
  82. $emit(on)#
  83.  
  84.     closearc(0);                       /* close archive after reading */
  85. $emit($arc)#
  86.  
  87.     if(note)
  88.     {    for(n=0; n<num; n++)          /* report unused args */
  89.          {    if(!did[n])
  90.               {    printf("File not found: %s\n",arg[n]);
  91.                    nerrs++;
  92.               }
  93.          }
  94.     }
  95.  
  96.     free(name);
  97. $emit(on)#
  98. }
  99.  
  100. $emit($arc)#
  101. static extfile(hdr,path,prt)           /* extract a file */
  102. struct heads *hdr;                     /* pointer to header data */
  103. char *path;                            /* pointer to path name */
  104. int prt;                               /* true if printing */
  105. $emit($xarc)#
  106. static extfile(hdr)                    /* extract a file */
  107. $emit(on)#
  108. $define(use,$ife($arc,on,fix,hdr->name))#
  109. {
  110.     FILE *f, *fopen();                 /* extracted file, opener */
  111.     char buf[$strlen];                 /* input buffer */
  112. $emit($arc)#
  113.     char fix[$strlen];                 /* fixed name buffer */
  114.     char *i, *rindex();                /* string index */
  115.  
  116.     if(prt)                            /* printing is much easier */
  117.     {    unpack(arc,stdout,hdr);       /* unpack file from archive */
  118.          printf("\f");                 /* eject the form */
  119.          return;                       /* see? I told you! */
  120.     }
  121.  
  122.     strcpy(fix,path);                  /* note path name template */
  123.     if(!(i=rindex(fix,'\\')))          /* find start of name */
  124.          if(!(i=rindex(fix,'/')))
  125.               if(!(i=rindex(fix,':')))
  126.                    i = fix-1;
  127.     strcpy(i+1,hdr->name);             /* replace template with name */
  128. $emit(on)#
  129.  
  130.     if(note)
  131.          printf("Extracting file: %s\n",$use);
  132.  
  133.     if(warn)
  134.     {    if(f=fopen($use,"rb"))        /* see if it exists */
  135.          {    fclose(f);
  136.               printf("WARNING: File %s already exists!",$use);
  137.               while(1)
  138.               {    printf("  Overwrite it (y/n)? ");
  139.                    fgets(buf,$strlen,stdin);
  140.                    *buf = toupper(*buf);
  141.                    if(*buf=='Y' || *buf=='N')
  142.                         break;
  143.               }
  144.               if(*buf=='N')
  145.               {    printf("%s not extracted.\n",$use);
  146.                    fseek(arc,hdr->size,1);
  147.                    return;
  148.               }
  149.          }
  150.     }
  151.  
  152.     if(!(f=fopen($use,"wb")))
  153.     {    if(warn)
  154.          {    printf("Cannot create %s\n",$use);
  155.               nerrs++;
  156.          }
  157.          fseek(arc,hdr->size,1);
  158.          return;
  159.     }
  160.  
  161.     /* now unpack the file */
  162.  
  163.     unpack(arc,f,hdr);                 /* unpack file from archive */
  164.     setstamp(f,hdr->date,hdr->time);   /* set the proper date/time stamp */
  165.     fclose(f);                         /* all done writing to file */
  166. }
  167.