Annotation of 42BSD/ucb/pascal/pdx/object/readobj.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1982 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)readobj.c 1.6 3/24/83";
                      4: 
                      5: /*
                      6:  * Read in the namelist from the obj file.
                      7:  */
                      8: 
                      9: #include "defs.h"
                     10: #include "sym.h"
                     11: #include "symtab.h"
                     12: #include "object.h"
                     13: #include "objfmt.h"
                     14: #include "main.h"
                     15: #include "mappings.h"
                     16: #include "mappings/filetab.h"
                     17: #include "mappings/linetab.h"
                     18: #include "objsym.rep"
                     19: 
                     20: #define MAXSYMNO 6000
                     21: 
                     22: char *objname = "obj";
                     23: 
                     24: LOCAL SYM *sym[MAXSYMNO];
                     25: 
                     26: readobj(file)
                     27: char *file;
                     28: {
                     29:     register FILE *fp;
                     30:     struct pxhdr hdr;
                     31: 
                     32:     if ((fp = fopen(file, "r")) == NIL) {
                     33:        panic("can't open %s", file);
                     34:     }
                     35:     get(fp, hdr);
                     36:     if (hdr.magicnum != MAGICNUM) {
                     37:        fseek(fp, (long) (HEADER_BYTES - sizeof(struct pxhdr)), 0);
                     38:        get(fp, hdr);
                     39:        if (hdr.magicnum != MAGICNUM) {
                     40:            fatal("%s is not a Pascal object file", file);
                     41:        }
                     42:     }
                     43:     if (hdr.symtabsize == 0) {
                     44:        fatal("%s doesn't have symbolic information", file);
                     45:     }
                     46:     objsize = hdr.objsize;
                     47:     fseek(fp, (long) objsize, 1);
                     48:     if (get(fp, nlhdr) != 1) {
                     49:        panic("can't read nlhdr");
                     50:     }
                     51:     if (option('h')) {
                     52:        printf("\nHeader information:\n");
                     53:        printf("\tobject size %d\n", objsize);
                     54:        printf("\tsymtab size %d\n", hdr.symtabsize);
                     55:        printf("\tstringsize  %d\n", nlhdr.stringsize);
                     56:        printf("\tnsyms       %d\n", nlhdr.nsyms);
                     57:        printf("\tnfiles      %d\n", nlhdr.nfiles);
                     58:        printf("\tnlines      %d\n", nlhdr.nlines);
                     59:     }
                     60:     stringtab = alloc(nlhdr.stringsize, char);
                     61:     fread(stringtab, sizeof(char), nlhdr.stringsize, fp);
                     62:     readsyms(fp);
                     63:     readfiles(fp);
                     64:     readlines(fp);
                     65:     fclose(fp);
                     66: }
                     67: 
                     68: /*
                     69:  * Allocate and read in file name information table.
                     70:  */
                     71: 
                     72: LOCAL readfiles(fp)
                     73: register FILE *fp;
                     74: {
                     75:     register int i;
                     76:     register FILETAB *ftp;
                     77:     FILETAB temp;
                     78:     ADDRESS prevaddr;
                     79: 
                     80:     filetab = alloc(nlhdr.nfiles, FILETAB);
                     81:     ftp = &filetab[0];
                     82:     prevaddr = 0;
                     83:     for (i = 0; i < nlhdr.nfiles; i++) {
                     84:        fread(&temp, sizeof(FILETAB), 1, fp);
                     85:        if (temp.addr != prevaddr) {
                     86:            ftp++;
                     87:        }
                     88:        *ftp = temp;
                     89:        ftp->filename += (int) stringtab;
                     90:        prevaddr = ftp->addr;
                     91:     }
                     92:     nlhdr.nfiles = (ftp - &filetab[0]) + 1;
                     93:     skimsource(filetab[0].filename);
                     94:     dotpfile = filetab[0].filename;
                     95: }
                     96: 
                     97: /*
                     98:  * Allocate and read in line number information table.
                     99:  */
                    100: 
                    101: LOCAL readlines(fp)
                    102: FILE *fp;
                    103: {
                    104:     register LINENO oline;
                    105:     register ADDRESS oaddr;
                    106:     register LINETAB *lp;
                    107:     FILETAB *ftp;
                    108:     OBJLINE info;
                    109: 
                    110:     if (nlhdr.nlines == 0) {
                    111:        return;
                    112:     }
                    113:     linetab = alloc(nlhdr.nlines, LINETAB);
                    114:     for (lp = &linetab[0]; lp < &linetab[nlhdr.nlines]; lp++) {
                    115:        lp->line = 0;
                    116:     }
                    117:     for (ftp = &filetab[0]; ftp < &filetab[nlhdr.nfiles]; ftp++) {
                    118:        if (ftp->lineindex < nlhdr.nlines) {
                    119:            linetab[ftp->lineindex].line = ftp->line;
                    120:        }
                    121:     }
                    122:     oline = 0;
                    123:     oaddr = 0;
                    124:     for (lp = &linetab[0]; lp < &linetab[nlhdr.nlines]; lp++) {
                    125:        if (lp->line != 0) {
                    126:            oline = lp->line;
                    127:        }
                    128:        info.together = getw(fp);
                    129:        oline += info.separate.lineincr;
                    130:        oaddr += info.separate.addrincr;
                    131:        lp->line = oline;
                    132:        lp->addr = oaddr;
                    133:     }
                    134: }
                    135: 
                    136: /*
                    137:  * Read in the symbols.
                    138:  */
                    139: 
                    140: readsyms(fp)
                    141: FILE *fp;
                    142: {
                    143:     register int i;
                    144:     int symno;
                    145: 
                    146:     symtab = st_creat(nlhdr.nsyms);
                    147:     for (i = 0; i < nlhdr.nsyms; i++) {
                    148:        symno = getw(fp);
                    149:        if (symno >= MAXSYMNO) {
                    150:            panic("symbol number too large (%d)", symno);
                    151:        }
                    152:        sym[symno] = readsym(fp);
                    153:     }
                    154:     if (backpatch() != 0) {
                    155:        panic("patchlist not empty after reading namelist");
                    156:     }
                    157:     if (program == NIL) {
                    158:        panic("no program");
                    159:     }
                    160:     maketypes();
                    161: }
                    162: 
                    163: typedef struct patchinfo {
                    164:     SYM **patchsym;
                    165:     struct patchinfo *next_patch;
                    166: } PATCH;
                    167: 
                    168: LOCAL PATCH *phead;
                    169: 
                    170: /*
                    171:  * Go through patchlist looking for symbol numbers for which the
                    172:  * sym array now has a non-NIL entry.
                    173:  *
                    174:  * Afterwards, zap the sym array.
                    175:  */
                    176: 
                    177: int backpatch()
                    178: {
                    179:     register PATCH *p, *last, *next;
                    180:     register SYM *s, **t;
                    181:     int count;
                    182: 
                    183:     last = NIL;
                    184:     count = 0;
                    185:     for (p = phead; p != NIL; p = next) {
                    186:        next = p->next_patch;
                    187:        t = p->patchsym;
                    188:        if ((s = sym[(int) *t]) != NIL) {
                    189:            *t = s;
                    190:            if (last == NIL) {
                    191:                phead = next;
                    192:            } else {
                    193:                last->next_patch = next;
                    194:            }
                    195:            dispose(p);
                    196:        } else {
                    197:            last = p;
                    198:            count++;
                    199:        }
                    200:     }
                    201:     for (t = &sym[0]; t < &sym[MAXSYMNO]; t++) {
                    202:        *t = NIL;
                    203:     }
                    204:     return(count);
                    205: }
                    206: 
                    207: /*
                    208:  * Check to see if the given pointer (really symbol number) should
                    209:  * be added to the patch list.  The argument is double indirect
                    210:  * to do call by reference passing.
                    211:  */
                    212: 
                    213: chkpatch(p)
                    214: SYM **p;
                    215: {
                    216:     register SYM *s, *t;
                    217:     register PATCH *patch;
                    218: 
                    219:     if ((s = *p) != NIL) {
                    220:        if ((t = sym[(int) s]) != NIL) {
                    221:            *p = t;
                    222:        } else {
                    223:            patch = alloc(1, PATCH);
                    224:            patch->patchsym = p;
                    225:            patch->next_patch = phead;
                    226:            phead = patch;
                    227:        }
                    228:     }
                    229: }
                    230: 
                    231: /*
                    232:  * Free all the object information.
                    233:  */
                    234: 
                    235: objfree()
                    236: {
                    237:     register int i;
                    238: 
                    239:     st_destroy(symtab);
                    240:     dispose(stringtab);
                    241:     dispose(filetab);
                    242:     dispose(linetab);
                    243:     clrfunctab();
                    244:     for (i = 0; i < MAXSYMNO; i++) {
                    245:        sym[i] = NIL;
                    246:     }
                    247: }

unix.superglobalmegacorp.com

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