Annotation of coherent/b/bin/zip/zipnote.c, revision 1.1

1.1     ! root        1: /*
        !             2: 
        !             3:  Copyright (C) 1990-1992 Mark Adler, Richard B. Wales, Jean-loup Gailly,
        !             4:  Kai Uwe Rommel and Igor Mandrichenko.
        !             5:  Permission is granted to any individual or institution to use, copy, or
        !             6:  redistribute this software so long as all of the original files are included
        !             7:  unmodified, that it is not sold for profit, and that this copyright notice
        !             8:  is retained.
        !             9: 
        !            10: */
        !            11: 
        !            12: /*
        !            13:  *  zipnote.c by Mark Adler.
        !            14:  */
        !            15: 
        !            16: #define UTIL
        !            17: #include "revision.h"
        !            18: #include "zip.h"
        !            19: #include <signal.h>
        !            20: 
        !            21: 
        !            22: /* Character to mark zip entry names in the comment file */
        !            23: #define MARK '@'
        !            24: 
        !            25: /* Temporary zip file name and file pointer */
        !            26: local char *tempzip;
        !            27: local FILE *tempzf;
        !            28: 
        !            29: 
        !            30: /* Local functions */
        !            31: #ifdef PROTO
        !            32:    local void handler(int);
        !            33:    local void license(void);
        !            34:    local void help(void);
        !            35:    local void putclean(char *, int);
        !            36:    local int catalloc(char * far *, char *);
        !            37:    void main(int, char **);
        !            38: #endif /* PROTO */
        !            39: 
        !            40: 
        !            41: 
        !            42: void err(c, h)
        !            43: int c;                  /* error code from the ZE_ class */
        !            44: char *h;                /* message about how it happened */
        !            45: /* Issue a message for the error, clean up files and memory, and exit. */
        !            46: {
        !            47:   if (PERR(c))
        !            48:     perror("zipnote error");
        !            49:   fprintf(stderr, "zipnote error: %s (%s)\n", errors[c-1], h);
        !            50:   if (tempzf != NULL)
        !            51:     fclose(tempzf);
        !            52:   if (tempzip != NULL)
        !            53:   {
        !            54:     destroy(tempzip);
        !            55:     free((voidp *)tempzip);
        !            56:   }
        !            57:   if (zipfile != NULL)
        !            58:     free((voidp *)zipfile);
        !            59: #ifdef VMS
        !            60:   exit(0);
        !            61: #else /* !VMS */
        !            62:   exit(c);
        !            63: #endif /* ?VMS */
        !            64: }
        !            65: 
        !            66: 
        !            67: local void handler(s)
        !            68: int s;                  /* signal number (ignored) */
        !            69: /* Upon getting a user interrupt, abort cleanly using err(). */
        !            70: {
        !            71: #ifndef MSDOS
        !            72:   putc('\n', stderr);
        !            73: #endif /* !MSDOS */
        !            74:   err(ZE_ABORT, "aborting");
        !            75:   s++;                                  /* keep some compilers happy */
        !            76: }
        !            77: 
        !            78: 
        !            79: void warn(a, b)
        !            80: char *a, *b;            /* message strings juxtaposed in output */
        !            81: /* Print a warning message to stderr and return. */
        !            82: {
        !            83:   fprintf(stderr, "zipnote warning: %s%s\n", a, b);
        !            84: }
        !            85: 
        !            86: 
        !            87: local void license()
        !            88: /* Print license information to stdout. */
        !            89: {
        !            90:   extent i;             /* counter for copyright array */
        !            91: 
        !            92:   for (i = 0; i < sizeof(copyright)/sizeof(char *); i++) {
        !            93:     printf(copyright[i], "zipnote");
        !            94:     putchar('\n');
        !            95:   }
        !            96:   for (i = 0; i < sizeof(disclaimer)/sizeof(char *); i++)
        !            97:     puts(disclaimer[i]);
        !            98: }
        !            99: 
        !           100: 
        !           101: local void help()
        !           102: /* Print help (along with license info) to stdout. */
        !           103: {
        !           104:   extent i;             /* counter for help array */
        !           105: 
        !           106:   /* help array */
        !           107:   static char *text[] = {
        !           108: "",
        !           109: "ZipNote %d.%d (%s)",
        !           110: "Usage:  zipnote [-w] [-b path] zipfile",
        !           111: "  the default action is to write the comments in zipfile to stdout",
        !           112: "  -w   write the zipfile comments from stdin",
        !           113: "  -b   use \"path\" for the temporary zip file",
        !           114: "  -h   show this help               -L   show software license",
        !           115: "",
        !           116: "Example:",
        !           117: #ifdef VMS
        !           118: "     define/user sys$output foo.tmp",
        !           119: "     zipnote foo.zip",
        !           120: "     edit foo.tmp",
        !           121: "     ... then you edit the comments, save, and exit ...",
        !           122: "     define/user sys$input foo.tmp",
        !           123: "     zipnote -w foo.zip"
        !           124: #else /* !VMS */
        !           125: "     zipnote foo.zip > foo.tmp",
        !           126: "     ed foo.tmp",
        !           127: "     ... then you edit the comments, save, and exit ...",
        !           128: "     zipnote -w foo.zip < foo.tmp"
        !           129: #endif /* ?VMS */
        !           130:   };
        !           131: 
        !           132:   for (i = 0; i < sizeof(copyright)/sizeof(char *); i++) {
        !           133:     printf(copyright[i], "zipnote");
        !           134:     putchar('\n');
        !           135:   }
        !           136:   for (i = 0; i < sizeof(text)/sizeof(char *); i++)
        !           137:   {
        !           138:     printf(text[i], REVISION / 10, REVISION % 10, REVDATE);
        !           139:     putchar('\n');
        !           140:   }
        !           141: }
        !           142: 
        !           143: 
        !           144: local void putclean(s, n)
        !           145: char *s;                /* string to write to stdout */
        !           146: int n;                  /* length of string */
        !           147: /* Write the string s to stdout, filtering out control characters that are
        !           148:    not tab or newline (mainly to remove carriage returns), and prefix MARK's
        !           149:    and backslashes with a backslash.  Also, terminate with a newline if
        !           150:    needed. */
        !           151: {
        !           152:   int c;                /* next character in string */
        !           153:   int e;                /* last character written */
        !           154: 
        !           155:   e = '\n';                     /* if empty, write nothing */
        !           156:   while (n--)
        !           157:   {
        !           158:     c = *(uch *)s++;
        !           159:     if (c == MARK || c == '\\')
        !           160:       putchar('\\');
        !           161:     if (c >= ' ' || c == '\t' || c == '\n')
        !           162:       putchar(e = c);
        !           163:   }
        !           164:   if (e != '\n')
        !           165:     putchar('\n');
        !           166: }
        !           167: 
        !           168: 
        !           169: local int catalloc(a, s)
        !           170: char * far *a;          /* pointer to a pointer to a malloc'ed string */
        !           171: char *s;                /* string to concatenate on a */
        !           172: /* Concatentate the string s to the malloc'ed string pointed to by a.
        !           173:    Preprocess s by removing backslash escape characters. */
        !           174: {
        !           175:   char *p;              /* temporary pointer */
        !           176:   char *q;              /* temporary pointer */
        !           177: 
        !           178:   for (p = q = s; *q; *p++ = *q++)
        !           179:     if (*q == '\\' && *(q+1))
        !           180:       q++;
        !           181:   *p = 0;
        !           182:   if ((p = malloc(strlen(*a) + strlen(s) + 3)) == NULL)
        !           183:     return ZE_MEM;
        !           184:   strcat(strcat(strcpy(p, *a), **a ? "\r\n" : ""), s);
        !           185:   free((voidp *)*a);
        !           186:   *a = p;
        !           187:   return ZE_OK;
        !           188: }
        !           189: 
        !           190: 
        !           191: void main(argc, argv)
        !           192: int argc;               /* number of tokens in command line */
        !           193: char **argv;            /* command line tokens */
        !           194: /* Write the comments in the zipfile to stdout, or read them from stdin. */
        !           195: {
        !           196:   char a[FNMAX+1];      /* input line buffer */
        !           197:   ulg c;                /* start of central directory */
        !           198:   int k;                /* next argument type */
        !           199:   char *q;              /* steps through option arguments */
        !           200:   int r;                /* arg counter, temporary variable */
        !           201:   ulg s;                /* length of central directory */
        !           202:   int t;                /* attributes of zip file */
        !           203:   int w;                /* true if updating zip file from stdin */
        !           204:   FILE *x, *y;          /* input and output zip files */
        !           205:   struct zlist far *z;  /* steps through zfiles linked list */
        !           206: 
        !           207: 
        !           208:   /* If no args, show help */
        !           209:   if (argc == 1)
        !           210:   {
        !           211:     help();
        !           212:     exit(0);
        !           213:   }
        !           214: 
        !           215:   init_upper();           /* build case map table */
        !           216: 
        !           217:   /* Go through args */
        !           218:   zipfile = tempzip = NULL;
        !           219:   tempzf = NULL;
        !           220:   signal(SIGINT, handler);
        !           221:   signal(SIGTERM, handler);
        !           222:   k = w = 0;
        !           223:   for (r = 1; r < argc; r++)
        !           224:     if (*argv[r] == '-')
        !           225:       if (argv[r][1])
        !           226:         for (q = argv[r]+1; *q; q++)
        !           227:           switch(*q)
        !           228:           {
        !           229:             case 'b':   /* Specify path for temporary file */
        !           230:               if (k)
        !           231:                 err(ZE_PARMS, "use -b before zip file name");
        !           232:               else
        !           233:                 k = 1;          /* Next non-option is path */
        !           234:               break;
        !           235:             case 'h':   /* Show help */
        !           236:               help();  exit(0);
        !           237:             case 'l':  case 'L':  /* Show copyright and disclaimer */
        !           238:               license();  exit(0);
        !           239:             case 'w':
        !           240:               w = 1;  break;
        !           241:             default:
        !           242:               err(ZE_PARMS, "unknown option");
        !           243:           }
        !           244:       else
        !           245:         err(ZE_PARMS, "zip file cannot be stdin");
        !           246:     else
        !           247:       if (k == 0)
        !           248:         if (zipfile == NULL)
        !           249:         {
        !           250:           if ((zipfile = ziptyp(argv[r])) == NULL)
        !           251:             err(ZE_MEM, "was processing arguments");
        !           252:         }
        !           253:         else
        !           254:           err(ZE_PARMS, "can only specify one zip file");
        !           255:       else
        !           256:       {
        !           257:         tempath = argv[r];
        !           258:         k = 0;
        !           259:       }
        !           260:   if (zipfile == NULL)
        !           261:     err(ZE_PARMS, "need to specify zip file");
        !           262: 
        !           263:   /* Read zip file */
        !           264:   if ((r = readzipfile()) != ZE_OK)
        !           265:     err(r, zipfile);
        !           266:   if (zfiles == NULL)
        !           267:     err(ZE_NAME, zipfile);
        !           268: 
        !           269:   /* Put comments to stdout, if not -w */
        !           270:   if (!w)
        !           271:   {
        !           272:     for (z = zfiles; z != NULL; z = z->nxt)
        !           273:     {
        !           274:       printf("%c %s\n", MARK, z->zname);
        !           275:       putclean(z->comment, z->com);
        !           276:       putchar(MARK);  putchar('\n');
        !           277:     }
        !           278:     putchar(MARK);  putchar('\n');
        !           279:     putclean(zcomment, zcomlen);
        !           280:     exit(ZE_OK);
        !           281:   }
        !           282: 
        !           283:   /* If updating comments, make sure zip file is writeable */
        !           284:   if ((x = fopen(zipfile, "a")) == NULL)
        !           285:     err(ZE_CREAT, zipfile);
        !           286:   fclose(x);
        !           287:   t = getfileattr(zipfile);
        !           288: 
        !           289:   /* Process stdin, replacing comments */
        !           290:   for (z = zfiles; z != NULL; z = z->nxt)
        !           291:   {
        !           292:     if (gets(a) == NULL || a[0] != MARK || a[1] != ' ' ||
        !           293:         strcmp(a + 2, z->zname))
        !           294:       err(ZE_NOTE, "missing entry name");
        !           295:     if (z->com)
        !           296:       free((voidp *)z->comment);
        !           297:     z->comment = malloc(1);  *(z->comment) = 0;
        !           298:     while (gets(a) != NULL && *a != MARK)
        !           299:       if ((r = catalloc(&(z->comment), a)) != ZE_OK)
        !           300:         err(r, "was building new comments");
        !           301:     if (a[1])
        !           302:       err(ZE_NOTE, "missing comment end line");
        !           303:     z->com = strlen(z->comment);
        !           304:   }
        !           305:   if (gets(a) == NULL || a[0] != MARK || a[1])
        !           306:     err(ZE_NOTE, "missing zip file comment marker line");
        !           307:   zcomment = malloc(1);  *zcomment = 0;
        !           308:   while (gets(a) != NULL)
        !           309:     if ((r = catalloc(&zcomment, a)) != ZE_OK)
        !           310:       err(r, "was building new comments");
        !           311:   zcomlen = strlen(zcomment);
        !           312: 
        !           313:   /* Open output zip file for writing */
        !           314:   if ((tempzf = y = fopen(tempzip = tempname(zipfile), FOPW)) == NULL)
        !           315:     err(ZE_TEMP, tempzip);
        !           316: 
        !           317:   /* Open input zip file again, copy preamble if any */
        !           318:   if ((x = fopen(zipfile, FOPR)) == NULL)
        !           319:     err(ZE_NAME, zipfile);
        !           320:   if (zipbeg && (r = fcopy(x, y, zipbeg)) != ZE_OK)
        !           321:     err(r, r == ZE_TEMP ? tempzip : zipfile);
        !           322: 
        !           323:   /* Go through local entries, copying them over as is */
        !           324:   for (z = zfiles; z != NULL; z = z->nxt)
        !           325:     if ((r = zipcopy(z, x, y)) != ZE_OK)
        !           326:       err(r, "was copying an entry");
        !           327:   fclose(x);
        !           328: 
        !           329:   /* Write central directory and end of central directory with new comments */
        !           330:   if ((c = ftell(y)) == -1L)    /* get start of central */
        !           331:     err(ZE_TEMP, tempzip);
        !           332:   for (z = zfiles; z != NULL; z = z->nxt)
        !           333:     if ((r = putcentral(z, y)) != ZE_OK)
        !           334:       err(r, tempzip);
        !           335:   if ((s = ftell(y)) == -1L)    /* get end of central */
        !           336:     err(ZE_TEMP, tempzip);
        !           337:   s -= c;                       /* compute length of central */
        !           338:   if ((r = putend((int)zcount, s, c, zcomlen, zcomment, y)) != ZE_OK)
        !           339:     err(r, tempzip);
        !           340:   tempzf = NULL;
        !           341:   if (fclose(y))
        !           342:     err(ZE_TEMP, tempzip);
        !           343:   if ((r = replace(zipfile, tempzip)) != ZE_OK)
        !           344:   {
        !           345:     warn("new zip file left as: ", tempzip);
        !           346:     free((voidp *)tempzip);
        !           347:     tempzip = NULL;
        !           348:     err(r, "was replacing the original zip file");
        !           349:   }
        !           350:   free((voidp *)tempzip);
        !           351:   tempzip = NULL;
        !           352:   setfileattr(zipfile, t);
        !           353:   free((voidp *)zipfile);
        !           354:   zipfile = NULL;
        !           355: 
        !           356:   /* Done! */
        !           357:   exit(ZE_OK);
        !           358: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.