home *** CD-ROM | disk | FTP | other *** search
- /* ARC - Archive utility - ARCEXT
-
- Version 2.19, created on 10/24/86 at 14:53:32
-
- (C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
-
- By: Thom Henderson
-
- Description:
- This file contains the routines used to extract files from
- an archive.
-
- Language:
- Computer Innovations Optimizing C86
- */
- #include <stdio.h>
- #include "arc.h"
-
- extarc(num,arg,prt) /* extract files from archive */
- int num; /* number of arguments */
- char *arg[]; /* pointers to arguments */
- int prt; /* true if printing */
- {
- struct heads hdr; /* file header */
- int save; /* true to save current file */
- int did[25]; /* true when argument was used */
- char *i, *rindex(); /* string index */
- char **name, *alloc(); /* name pointer list, allocator */
- int n; /* index */
-
- name = alloc(num*sizeof(char *)); /* get storage for name pointers */
-
- for(n=0; n<num; n++) /* for each argument */
- { did[n] = 0; /* reset usage flag */
- if(!(i=rindex(arg[n],'\\'))) /* find start of name */
- if(!(i=rindex(arg[n],'/')))
- if(!(i=rindex(arg[n],':')))
- i = arg[n]-1;
- name[n] = i+1;
- }
-
-
- openarc(0); /* open archive for reading */
-
- if(num) /* if files were named */
- { while(readhdr(&hdr,arc)) /* while more files to check */
- { save = 0; /* reset save flag */
- for(n=0; n<num; n++) /* for each template given */
- { if(match(hdr.name,name[n]))
- { save = 1; /* turn on save flag */
- did[n] = 1; /* turn on usage flag */
- break; /* stop looking */
- }
- }
-
- if(save) /* extract if desired, else skip */
- extfile(&hdr,arg[n],prt);
- else fseek(arc,hdr.size,1);
- }
- }
-
- else while(readhdr(&hdr,arc)) /* else extract all files */
- extfile(&hdr,"",prt);
-
- closearc(0); /* close archive after reading */
-
- if(note)
- { for(n=0; n<num; n++) /* report unused args */
- { if(!did[n])
- { printf("File not found: %s\n",arg[n]);
- nerrs++;
- }
- }
- }
-
- free(name);
- }
-
- static extfile(hdr,path,prt) /* extract a file */
- struct heads *hdr; /* pointer to header data */
- char *path; /* pointer to path name */
- int prt; /* true if printing */
- {
- FILE *f, *fopen(); /* extracted file, opener */
- char buf[100]; /* input buffer */
- char fix[100]; /* fixed name buffer */
- char *i, *rindex(); /* string index */
-
- if(prt) /* printing is much easier */
- { unpack(arc,stdout,hdr); /* unpack file from archive */
- printf("\f"); /* eject the form */
- return; /* see? I told you! */
- }
-
- strcpy(fix,path); /* note path name template */
- if(!(i=rindex(fix,'\\'))) /* find start of name */
- if(!(i=rindex(fix,'/')))
- if(!(i=rindex(fix,':')))
- i = fix-1;
- strcpy(i+1,hdr->name); /* replace template with name */
-
- if(note)
- printf("Extracting file: %s\n",fix);
-
- if(warn && !overlay)
- { if(f=fopen(fix,"rb")) /* see if it exists */
- { fclose(f);
- printf("WARNING: File %s already exists!",fix);
- while(1)
- { printf(" Overwrite it (y/n)? ");
- fgets(buf,100,stdin);
- *buf = toupper(*buf);
- if(*buf=='Y' || *buf=='N')
- break;
- }
- if(*buf=='N')
- { printf("%s not extracted.\n",fix);
- fseek(arc,hdr->size,1);
- return;
- }
- }
- }
-
- if(!(f=fopen(fix,"wb")))
- { if(warn)
- { printf("Cannot create %s\n",fix);
- nerrs++;
- }
- fseek(arc,hdr->size,1);
- return;
- }
-
- /* now unpack the file */
-
- unpack(arc,f,hdr); /* unpack file from archive */
- setstamp(f,hdr->date,hdr->time); /* set the proper date/time stamp */
- fclose(f); /* all done writing to file */
- }
-