home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / prog / c / gcc233lb.lha / unranlib / unranlib.c < prev   
C/C++ Source or Header  |  1993-01-03  |  4KB  |  170 lines

  1. #include <exec/types.h>
  2. #include <clib/dos_protos.h>
  3. #include <pragmas/dos_lib.h>
  4. #include <stdio.h>
  5.  
  6. struct ar_file {
  7.     char ar_name[16];
  8.     char ar_date[12];
  9.     char ar_uid[6];
  10.     char ar_gid[6];
  11.     char ar_mode[8];
  12.     char ar_size[10];
  13.     char ar_fmag[2];
  14. };
  15.  
  16. int
  17. charsinrange(char *buf, int len, char low, char high)
  18. {
  19.     char c;
  20.     while (len) {
  21.         c = *buf++;
  22.         if (c < low || c > high)
  23.             break;
  24.         len--;
  25.     }
  26.     while (len--) {
  27.         if (c != ' ')
  28.             return 0;
  29.         c = *buf++;
  30.     }
  31.     return 1;
  32. }
  33.  
  34. int
  35. validheader(struct ar_file *h)
  36. {
  37.     if (!charsinrange(h->ar_name, 16, ' ', 127))
  38.         return 0;
  39.     if (!charsinrange(h->ar_date, 12, '0', '9'))
  40.         return 0;
  41.     if (!charsinrange(h->ar_uid, 6, '0', '9'))
  42.         return 0;
  43.     if (!charsinrange(h->ar_gid, 6, '0', '9'))
  44.         return 0;
  45.     if (!charsinrange(h->ar_mode, 8, '0', '7'))
  46.         return 0;
  47.     if (!charsinrange(h->ar_size, 10, '0', '9'))
  48.         return 0;
  49.     return 1;
  50. }
  51.  
  52. int
  53. unranlib(FILE *in, FILE *out)
  54. {
  55.     char magic[8];
  56.     struct ar_file header;
  57.     long fileoff;
  58.     int c, oldc;
  59.     char rollingbuf[sizeof(header)];
  60.     int i;
  61.     char buf[512];
  62.  
  63.     if (!fread(magic, sizeof(magic), 1, in)) {
  64.         fprintf(stderr, "Fatal: unexpected EOF reading magic number\n");
  65.         return 0;
  66.     }
  67.     if (memcmp(magic, "!<arch>\n", sizeof(magic))) {
  68.         fprintf(stderr, "Fatal: not an ar(1) archive\n");
  69.         return 0;
  70.     }
  71.     if (!fread(&header, sizeof(header), 1, in)) {
  72.         fprintf(stderr, "Fatal: unexpected EOF reading file header\n");
  73.         return 0;
  74.     }
  75.     if (header.ar_fmag[0] != '`' || header.ar_fmag[1] != '\n') {
  76.         fprintf(stderr, "Fatal: first file is corrupt\n");
  77.         return 0;
  78.     }
  79.     if (memcmp(header.ar_name, "__.SYMDEF       ", 16)) {
  80.         fprintf(stderr, "Fatal: file has no __.SYMDEF index\n");
  81.         return 0;
  82.     }
  83.     i = c = 0;
  84.     for (;;) {
  85.         oldc = c;
  86.         c = getc(in);
  87.         if (c == EOF) {
  88.             fprintf(stderr, "Fatal: unexpected EOF searching for file\n");
  89.             return 0;
  90.         }
  91.         rollingbuf[i++] = c;
  92.         if (i == sizeof(header))
  93.             i = 0;
  94.         if (c == '\n' && oldc == '`') {
  95.             memcpy(&header, rollingbuf+i, sizeof(header)-i);
  96.             memcpy((char *)(&header+1)-i, rollingbuf, i);
  97.             if (validheader(&header))
  98.                 break;
  99.         }
  100.     }
  101. /* Okay, we have a valid header = now start copying out */
  102.     if (!fwrite(magic, sizeof(magic), 1, out)) {
  103.         fprintf(stderr, "Fatal: error writing output file");
  104.         return 0;
  105.     }
  106.     if (!fwrite(&header, sizeof(header), 1, out)) {
  107.         fprintf(stderr, "Fatal: error writing output file");
  108.         return 0;
  109.     }
  110.     for (;;) {
  111.         i = fread(buf, 1, sizeof(buf), in);
  112.         if (!i)
  113.             break;
  114.         if (fwrite(buf, 1, i, out) != i) {
  115.             fprintf(stderr, "Fatal: error writing output file");
  116.             return 0;
  117.         }
  118.     }
  119.     if (!feof(in)) {
  120.         fprintf(stderr, "Error reading input file: %d\n", ferror(in));
  121.         return 0;
  122.     }
  123.     return 1;    /* Success */
  124. }
  125.  
  126. int
  127. main(int argc, char **argv)
  128. {
  129.     char filebuf[512];
  130.     char *p;
  131.     int error;
  132.     FILE *in, *out;
  133.  
  134.     while (--argc) {
  135.         argv++;
  136.         printf("Removing ranlib information from \"%s\"\n", *argv);
  137.         if (strlen(*argv) > sizeof(filebuf) - 5) {
  138.             fprintf(stderr, "Path \"%s\" too long - skipping\n", *argv);
  139.             continue;
  140.         }
  141.         strcpy(filebuf, *argv);
  142.         strcat(filebuf, ".bak");
  143.         if (!Rename((UBYTE *)*argv, (UBYTE *)filebuf)) {
  144.             fprintf(stderr, "Fatal: unable to rename to \"%s\": DOS Error %d\n", filebuf, IoErr());
  145.             return 10;
  146.         }
  147.         if (!(in = fopen(filebuf, "rb"))) {
  148.             fprintf(stderr, "Fatal: unable to open \"%s\" for input\n", filebuf);
  149.             return 10;
  150.         }
  151.         if (!(out = fopen(*argv, "wb"))) {
  152.             fprintf(stderr, "Fatal: unable to open \"%s\" for input\n", filebuf);
  153.             return 10;
  154.         }
  155.         if (!unranlib(in, out)) {
  156.             return 10;
  157.         }
  158.         if (error = fclose(in)) {
  159.             fprintf(stderr, "Unable to close \"%s\": error %d\n", filebuf, error);
  160.             return 10;
  161.         }
  162.         if (error = fclose(out)) {
  163.             fprintf(stderr, "Unable to close \"%s\": error %d\n", *argv, error);
  164.             return 10;
  165.         }
  166.     }
  167.     printf("All done.\n");
  168.     return 0;
  169. }
  170.