|
|
1.1 ! root 1: #include <misc.h> ! 2: #include <canon.h> ! 3: #include <n.out.h> ! 4: #include <coff.h> ! 5: #include <setjmp.h> ! 6: #include <errno.h> ! 7: #include <dir.h> ! 8: #include <arcoff.h> ! 9: #include <ar.h> ! 10: ! 11: #define xread(x, m) if(1 != fread(&x, sizeof(x), 1, ifp)) fatal(rmsg, m); ! 12: ! 13: static char rmsg[] = "Error reading %s"; ! 14: static FILE *ifp; ! 15: static jmp_buf env; ! 16: static char namesw; ! 17: static char cfile[100]; ! 18: ! 19: static int errors = 0; /* keep track of errors from fatal() */ ! 20: ! 21: /* ! 22: * Put message and longjmp to next file. ! 23: */ ! 24: void ! 25: fatal(s) ! 26: char *s; ! 27: { ! 28: fprintf(stderr, "size: %s: %r\n", cfile, &s); ! 29: ++errors; ! 30: longjmp(env, 1); ! 31: } ! 32: ! 33: /* ! 34: * Print members of archive. ! 35: */ ! 36: archive(filen, at) ! 37: char *filen; ! 38: long at; ! 39: { ! 40: long arhend; ! 41: struct ar_hdr coff_arh; ! 42: struct old_ar_hdr arh; ! 43: char *strchr(); ! 44: char *p; ! 45: ! 46: namesw = 0; ! 47: for (arhend = at + SARMAG; ; ) { ! 48: fseek(ifp, arhend, 0); ! 49: if (1 != fread(&coff_arh, sizeof(coff_arh), 1, ifp)) ! 50: break; ! 51: memset(&arh, '\0', sizeof(arh)); ! 52: memcpy(arh.ar_name, coff_arh.ar_name, DIRSIZ); ! 53: if (NULL != (p = strchr(arh.ar_name, '/'))) ! 54: *p = '\0'; ! 55: ! 56: sscanf(coff_arh.ar_date, "%ld %d %d %o %ld", ! 57: &arh.ar_date, &arh.ar_uid, ! 58: &arh.ar_gid, &arh.ar_mode, &arh.ar_size); ! 59: ! 60: arhend += sizeof(coff_arh); ! 61: if (arh.ar_name[0]) { ! 62: sprintf(cfile, "%s(%s): ", filen, arh.ar_name); ! 63: printf("%s", cfile); ! 64: printSize(arh.ar_name, arhend); ! 65: } ! 66: arhend += arh.ar_size; ! 67: if (arhend & 1) ! 68: arhend++; ! 69: } ! 70: namesw = 1; ! 71: } ! 72: ! 73: /* ! 74: * Process old n.out files. ! 75: */ ! 76: old_nout(filen, at) ! 77: char *filen; ! 78: long at; ! 79: { ! 80: struct ldheader ldh; ! 81: register i; ! 82: long total; ! 83: ! 84: if (namesw) ! 85: printf("%s: ", filen); ! 86: ! 87: fseek(ifp, at, 0); ! 88: xread(ldh, "n.out header"); ! 89: for (total = i = 0; i < L_DEBUG; i++) { ! 90: cansize(ldh.l_ssize[i]); ! 91: if (i) ! 92: putchar('+'); ! 93: printf("%ld", ldh.l_ssize[i]); ! 94: total += ldh.l_ssize[i]; ! 95: } ! 96: printf(" %ld (%lx)\n", total, total); ! 97: } ! 98: ! 99: /* ! 100: * Process old ar files. ! 101: */ ! 102: old_ar(filen, at) ! 103: char *filen; ! 104: long at; ! 105: { ! 106: long arhend; ! 107: struct old_ar_hdr arh; ! 108: ! 109: namesw = 0; ! 110: for (arhend = at + sizeof(short); ; ) { ! 111: fseek(ifp, arhend, 0); ! 112: if (1 != fread(&arh, sizeof(arh), 1, ifp)) ! 113: break; ! 114: arhend += sizeof(arh); ! 115: arh.ar_date = 0; /* terminate name */ ! 116: if (strcmp(arh.ar_name, HDRNAME)) { ! 117: sprintf(cfile, "%s(%s): ", filen, arh.ar_name); ! 118: printf("%s", cfile); ! 119: printSize(arh.ar_name, arhend); ! 120: } ! 121: cansize(arh.ar_size); ! 122: arhend += arh.ar_size; ! 123: } ! 124: } ! 125: ! 126: /* ! 127: * Print size of coff file or call friends. ! 128: */ ! 129: printSize(filen, at) ! 130: char *filen; ! 131: long at; ! 132: { ! 133: FILEHDR fh; ! 134: long total; ! 135: int i; ! 136: ! 137: xread(fh, "file header"); ! 138: if (fh.f_magic != C_386_MAGIC) { ! 139: if (!memcmp(ARMAG, &fh, SARMAG)) ! 140: return (archive(filen, at)); ! 141: ! 142: /* Check old file types */ ! 143: canshort(fh.f_magic); ! 144: if (fh.f_magic == OLD_ARMAG) ! 145: return (old_ar(filen, at)); ! 146: if (fh.f_magic == L_MAGIC) ! 147: return (old_nout(filen, at)); ! 148: fatal("Unknown filetype 0x%x", fh.f_magic); ! 149: } ! 150: ! 151: if (namesw) ! 152: printf("%s: ", filen); ! 153: ! 154: fseek(ifp, at + sizeof(FILEHDR) + fh.f_opthdr, 0); ! 155: for (total = i = 0; i < fh.f_nscns; i++) { ! 156: SCNHDR sh; ! 157: ! 158: xread(sh, "section"); ! 159: if (i) ! 160: putchar('+'); ! 161: printf("%ld", sh.s_size); ! 162: total += sh.s_size; ! 163: } ! 164: printf(" %ld (%lx)\n", total, total); ! 165: } ! 166: ! 167: main(argc, argv) ! 168: char *argv[]; ! 169: { ! 170: char *filen; ! 171: int i; ! 172: ! 173: for (i = 1; i < argc; i++) { ! 174: /* fatal() longjmp()s here for next file */ ! 175: if (setjmp(env)) { ! 176: if (NULL != ifp) { ! 177: fclose(ifp); ! 178: ifp = NULL; ! 179: } ! 180: continue; ! 181: } ! 182: strcpy(cfile, filen = argv[i]); ! 183: ifp = xopen(filen, "rb"); ! 184: ! 185: namesw = argc > 2; ! 186: ! 187: printSize(filen, 0L); ! 188: ! 189: fclose(ifp); ! 190: ifp = NULL; ! 191: } ! 192: exit(errors); ! 193: } ! 194:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.