home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume34 / unpackmaps / part02 / docomp.c < prev    next >
C/C++ Source or Header  |  1992-11-29  |  3KB  |  106 lines

  1. /* Copyright 1992, Chris Lewis.  All Rights Reserved
  2.    Please see the README for the terms of the copyright.
  3.    1.2 92/08/14
  4.  */
  5.  
  6. #ifndef lint
  7. static char SCCSid[] = "@(#)docomp.c 1.2 92/08/14 20:48:28";
  8. #endif
  9. #define    UNPACKMAPS
  10. #include "unpack.h"
  11. #define    ARMAX    10
  12.  
  13. #ifdef    COMPFLAG
  14. #define    FF    2
  15. #else
  16. #define    FF    1
  17. #endif
  18.  
  19. /*    Buffers up files to compress in big chunks */
  20. docompress(file)
  21. register char *file; {
  22.     char tb[16];
  23.     static char *arglist[ARMAX + 3] = {"COMPRESS"
  24. #ifdef    COMPFLAG
  25.     , COMPFLAG
  26. #endif
  27.     };
  28.     static char **ap = &arglist[FF];
  29.  
  30.     /* If maps are coming in two different newsgroups (not x-posted),
  31.        it is possible that you'll get the same name twice.  If you
  32.        don't ignore the duplicates, compress will complain that it
  33.        couldn't find the subsequent instances.  While this is harmless,
  34.        it is somewhat disturbing.  We simply ignore the
  35.        second or subsequent mention of the same file name.
  36.  
  37.        [The scenario happens with the Canadian maps.  Both Rutgers and
  38.        the Canadian map authority post the Canadian maps simultaneously.
  39.        The former in comp.mail.maps, the latter in can.uucp.maps.
  40.        The logic behind this is relatively sound, but too long to reproduce
  41.        here.  They're not cross-posted because it breaks uuhosts (but not
  42.        unpackmaps! ;-).]
  43.      */
  44.  
  45.     if (file && ap > &arglist[FF]) {
  46.     char **p;
  47.     
  48.     for (p = &arglist[FF]; p < ap; p++)
  49.         if (strcmp(file, *p) == 0)
  50.         return;
  51.     }
  52.  
  53. #if    (FILELENGTH == 0) || (FILELENGTH == 1)
  54. # define MAXCOMPLEN 12
  55. #else
  56. # define MAXCOMPLEN (FILELENGTH - 2)
  57. #endif
  58.  
  59.     /* To avoid compress complaints on systems with file name restrictions */
  60.     if (file && strlen(file) > MAXCOMPLEN)
  61.     return;
  62.  
  63.     if (file) {
  64.     (void) strcpy(tb, file);
  65.     (void) strcat(tb, ".Z");
  66.     (void) unlink(tb);
  67.     }
  68.  
  69.     if (!compflag)
  70.     return;
  71.  
  72.     if (debug)
  73.     (void) fprintf(stderr, "docompress %s (%d)\n", file, ap - arglist);
  74.  
  75.     if ((!file || ap > &arglist[ARMAX]) && ap > &arglist[FF]) {
  76.     int pid, wpid, waitloc;
  77.     if (debug)
  78.         (void) fprintf(stderr, "Firing off compress (fc = %d)\n",
  79.         ap - arglist);
  80.  
  81.     if (debug)
  82.         for (ap = arglist; *ap; ap++)
  83.         (void) fprintf(stderr, "%d: %s\n", ap-arglist, *ap);
  84.  
  85.     fflush(stderr);
  86.     if ((pid = fork()) == 0) {
  87.         (void) execv(compress, arglist);
  88.         fatal(1, "Can't exec compress");
  89.     }
  90.     while((wpid = wait(&waitloc)) != pid && wpid > 0)
  91.         continue;
  92.     if (waitloc) {
  93.         (void) fprintf(stderr, "%s: compress failed, returned 0x%x (pid: %d)\n",
  94.         progname, waitloc, wpid);
  95.     }
  96.     for (ap = &arglist[FF]; *ap; ap++)
  97.         free(*ap);
  98.     ap = &arglist[FF];
  99.     }
  100.     if (file) {
  101.     *ap = (char *) malloc(strlen(file)+1);
  102.     (void) strcpy(*ap++, file);
  103.     *ap = (char *) NULL;
  104.     }
  105. }
  106.