|
|
1.1 ! root 1: #include <stdio.h> ! 2: ! 3: #ifdef vax ! 4: #include <ssdef.h> ! 5: #include <stsdef.h> ! 6: #define NNAME 500 ! 7: #define NSEG 500 ! 8: #define NBREC 10000 ! 9: #define SRMODE "r" ! 10: #define OK (STS$M_INHIB_MSG|SS$_NORMAL) ! 11: #define BAD (STS$M_INHIB_MSG|SS$_ABORT) ! 12: #else ! 13: #define NNAME 250 ! 14: #define NSEG 250 ! 15: #define NBREC 5000 ! 16: #define SRMODE "rb" ! 17: #define OK 0 ! 18: #define BAD 1 ! 19: #endif ! 20: ! 21: #define LNAMES 0x96 ! 22: #define SEGDEF 0x98 ! 23: #define MODEND 0x8A ! 24: ! 25: typedef struct SEG { ! 26: int s_index; /* Index into LNAMES */ ! 27: long s_size; /* Size */ ! 28: } SEG; ! 29: ! 30: typedef struct REC { ! 31: int r_type; /* Type code */ ! 32: int r_length; /* Length of data (no checksum) */ ! 33: char r_data[NBREC]; /* Data */ ! 34: } REC; ! 35: ! 36: REC rec; /* OMF record */ ! 37: char *name[NNAME]; /* Names, indexed by LNAMES index */ ! 38: int nname; /* Highest name index */ ! 39: SEG seg[NSEG]; /* Segments */ ! 40: int nseg; /* Highest segment index */ ! 41: FILE *ifp; /* Input file */ ! 42: ! 43: extern char *malloc(); ! 44: ! 45: main(argc, argv) ! 46: char *argv[]; ! 47: { ! 48: register char *np; ! 49: register SEG *sp; ! 50: register long total; ! 51: ! 52: if (argc < 2) ! 53: fatal(NULL, "Usage: size file\n"); ! 54: if ((ifp=fopen(argv[1], SRMODE)) == NULL) ! 55: fatal(argv[1], "cannot open input file"); ! 56: while (getrec()!=0 && rec.r_type!=MODEND) { ! 57: if (rec.r_type == LNAMES) ! 58: lnames(); ! 59: else if (rec.r_type == SEGDEF) ! 60: segdef(); ! 61: } ! 62: total = 0; ! 63: for (sp = &seg[0]; sp < &seg[nseg]; ++sp) { ! 64: printf("\t0x%04lx\t", sp->s_size); ! 65: if (sp->s_index>nname || (np=name[sp->s_index-1])==NULL) ! 66: np = "[Bonzo]"; ! 67: printf("%s\n", np); ! 68: total += sp->s_size; ! 69: } ! 70: if (nseg > 1) { ! 71: printf("\t0x%04lx\tTotal (hex)\n", total); ! 72: printf("\t%6ld\tTotal (decimal)\n", total); ! 73: } ! 74: exit(OK); ! 75: } ! 76: ! 77: fatal(fn, msg) ! 78: char *fn; ! 79: char *msg; ! 80: { ! 81: fprintf(stderr, "size: "); ! 82: if (fn != NULL) ! 83: fprintf(stderr, "%s: ", fn); ! 84: fprintf(stderr, "%s\n", msg); ! 85: exit(BAD); ! 86: } ! 87: ! 88: getrec() ! 89: { ! 90: register int b1; ! 91: register int b2; ! 92: register int i; ! 93: register int nbytes; ! 94: register int checksum; ! 95: ! 96: if ((rec.r_type=getc(ifp)) == EOF) ! 97: return (0); ! 98: checksum = rec.r_type; ! 99: if ((b1=getc(ifp))==EOF || (b2=getc(ifp))==EOF) ! 100: fatal(NULL, "eof in length"); ! 101: checksum += b1; ! 102: checksum += b2; ! 103: nbytes = (b2<<8) | b1; ! 104: if (nbytes >= NBREC) ! 105: fatal("omf item too long"); ! 106: rec.r_length = nbytes-1; ! 107: for (i=0; i<nbytes; ++i) { ! 108: if ((b1=getc(ifp)) == EOF) ! 109: fatal(NULL, "eof in data"); ! 110: rec.r_data[i] = b1; ! 111: checksum += b1; ! 112: } ! 113: if ((checksum&0xFF) != 0) ! 114: fatal(NULL, "checksum error"); ! 115: return (1); ! 116: } ! 117: ! 118: lnames() ! 119: { ! 120: register char *namep; ! 121: register int length; ! 122: register int index; ! 123: ! 124: index = 0; ! 125: while (index < rec.r_length) { ! 126: if (nname >= NNAME) ! 127: fatal(NULL, "too many LNAMES items"); ! 128: length = rec.r_data[index++]; ! 129: if ((namep=malloc(length+1)) == NULL) ! 130: fatal(NULL, "out of space for LNAMES strings"); ! 131: name[nname++] = namep; ! 132: while (length--) ! 133: *namep++ = rec.r_data[index++]; ! 134: *namep = 0; ! 135: } ! 136: } ! 137: ! 138: segdef() ! 139: { ! 140: register int acbp; ! 141: register int index; ! 142: register int segindex; ! 143: register long segsize; ! 144: ! 145: if (nseg >= NSEG) ! 146: fatal(NULL, "too many SEGDEF items"); ! 147: index = 0; ! 148: acbp = rec.r_data[index++]; ! 149: if ((acbp&0xE0)==0 || (acbp&0xE0)==0xA0) /* Has FRAME */ ! 150: index += 3; ! 151: if ((acbp&0xE0) == 0xC0) /* LTL */ ! 152: index += 5; ! 153: if ((acbp&0x02) != 0) /* "Big" */ ! 154: segsize = 65536L; ! 155: else ! 156: segsize = (unsigned)((rec.r_data[index+0]&0xFF) ! 157: | ((rec.r_data[index+1]&0xFF) << 8)); ! 158: index += 2; ! 159: segindex = rec.r_data[index++]&0xFF; ! 160: if ((segindex&0x80) != 0) { ! 161: segindex = (segindex&0x7F) << 8; ! 162: segindex |= rec.r_data[index++]&0xFF; ! 163: } ! 164: seg[nseg].s_index = segindex; ! 165: seg[nseg].s_size = segsize; ! 166: ++nseg; ! 167: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.