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

  1.  
  2. /*
  3.  *      arccvt.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.  *    line 97 changed 7-5-87 ja
  11.  *
  12.  */
  13.  
  14. /*
  15.  * ARC - Archive utility - ARCCVT
  16.  * 
  17.  * Version 1.16, created on 02/03/86 at 22:53:02
  18.  * 
  19.  * (C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
  20.  * 
  21.  *     Description:
  22.  *          This file contains the routines used to convert archives to use
  23.  *          newer file storage methods.
  24.  */
  25.  
  26. #include "arc.h"
  27.  
  28. static char tempname[STRLEN];          /* temp file name */
  29.  
  30. INT cvtarc(argc,argv)                  /* convert archive */
  31. INT argc;                              /* number of arguments */
  32. char *argv[];                          /* pointers to arguments */
  33. {
  34.     struct heads hdr;                  /* file header */
  35.     INT cvt;                           /* true to convert current file */
  36.     INT did[MAXARG];                   /* true when argument was used */
  37.     INT n;                             /* index */
  38.     INT cvtfile();
  39.  
  40.     sprintf(tempname,"%s.cvt",arctemp);
  41.  
  42.     openarc(1);                        /* open archive for changes */
  43.  
  44.     for (n=0; n<argc; n++)             /* for each argument */
  45.          did[n] = 0;                   /* reset usage flag */
  46.     rempath(argc,argv);                /* strip off paths */
  47.  
  48.     if (argc)                          /* if files were named */
  49.     {
  50.         while (readhdr(&hdr,arc))      /* while more files to check */
  51.         {
  52.             cvt = 0;                   /* reset convert flag */
  53.             for (n=0; n<argc; n++)     /* for each template given */
  54.             {
  55.                 if (match(hdr.name,argv[n]))
  56.                 {
  57.                     cvt = 1;           /* turn on convert flag */
  58.                     did[n] = 1;        /* turn on usage flag */
  59.                     break;             /* stop looking */
  60.                 }
  61.             }
  62.  
  63.             if (cvt)                   /* if converting this one */
  64.                 cvtfile(&hdr);         /* then do it */
  65.             else                       /* else just copy it */
  66.             {
  67.                 writehdr(&hdr,new);
  68.                 filecopy(arc,new,hdr.size);
  69.             }
  70.         }
  71.     }
  72.     else
  73.         while (readhdr(&hdr,arc))      /* else convert all files */
  74.             cvtfile(&hdr);
  75.  
  76.     hdrver = 0;                        /* archive EOF type */
  77.     writehdr(&hdr,new);                /* write out our end marker */
  78.     closearc(1);                       /* close archive after changes */
  79.  
  80.     if (note)
  81.     {
  82.         for (n=0; n<argc; n++)         /* report unused args */
  83.         {
  84.             if (!did[n])
  85.             {
  86.                 printf("File not found: %s\n",argv[n]);
  87.                 nerrs++;
  88.             }
  89.         }
  90.     }
  91. }
  92.  
  93. static INT cvtfile(hdr)                /* convert a file */
  94. struct heads *hdr;                     /* pointer to header data */
  95. {
  96.     long starts, ftell();              /* where the file goes */
  97.     FILE *tmp;                       /* temporary file */
  98.  
  99.     if (!(tmp=fopenb(tempname,"w")))               /* was fopen(w+) */
  100.         abort("Unable to create temporary file %s",tempname);
  101.  
  102.     if (note)
  103.         printf("Converting file: %-14s   reading, ",hdr->name);
  104.  
  105.     unpack(arc,tmp,hdr);               /* unpack the entry */
  106.     fseek(tmp,0L,0);                   /* reset temp for reading */
  107.     starts = ftell(new);               /* note where header goes */
  108.     hdrver = ARCVER;                   /* anything but end marker */
  109.     writehdr(hdr,new);                 /* write out header skeleton */
  110.     pack(tmp,new,hdr);                 /* pack file into archive */
  111.     fseek(new,starts,0);               /* move back to header skeleton */
  112.     writehdr(hdr,new);                 /* write out real header */
  113.     fseek(new,hdr->size,1);            /* skip over data to next header */
  114.     fclose(tmp);                       /* all done with the file */
  115.     if (unlink(tempname) && warn) {
  116.         printf("Cannot unsave %s\n",tempname);
  117.         nerrs++;
  118.     }
  119. }
  120.