Annotation of 43BSDReno/pgrm/pascal/pdx/object/readobj.c, revision 1.1

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

unix.superglobalmegacorp.com

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