Annotation of cci/usr/src/usr.bin/cdb/transBsd/tables.c, revision 1.1

1.1     ! root        1: /* $Header: tables.c,v 1.1 86/03/24 16:19:23 rcs Exp $ */
        !             2: /* (C) Copyright 1985 Third Eye Software, Inc. - All Rights Reserved */
        !             3: 
        !             4: #include "tes42.h"
        !             5: 
        !             6: #include <stab.h>
        !             7: 
        !             8: 
        !             9: /* E N D   P R O C */
        !            10: 
        !            11: export void EndProc(adr)
        !            12: ADRT   adr;
        !            13: {
        !            14:     pSYMR      sym;
        !            15: 
        !            16:     sym = SymFInsert();
        !            17:     sym->st = stEnd;
        !            18:     sym->sc = scText;
        !            19:     sym->index = IsymFSym(vsymProc);
        !            20:     sym->value = adr;
        !            21:     ChangeAux(vsymProc->index, visym+1);
        !            22:     vsymProc = symNil;
        !            23: 
        !            24:     sym = SymFIsym(visym-1);   /* check previous guy, too */
        !            25:     if (sym->st == stEnd)
        !            26:        sym->value = adr;
        !            27: } /* EndProc */
        !            28: 
        !            29: 
        !            30: /* D O   P R O C  */
        !            31: 
        !            32: export void DoProc(nlist)
        !            33: pNLISTR        nlist;
        !            34: {
        !            35:     if (vsymProc != symNil)
        !            36:        EndProc(nlist->n_value);
        !            37: 
        !            38:     vsymProc = SymFInsert();
        !            39:     vsymProc->st = stProc;
        !            40:     vsymProc->index = AddAux(-1);
        !            41:     ProcInsert(IsymFSym(vsymProc), nlist->n_value, vilineMac);
        !            42:     vcLinesInProc = 0;
        !            43: } /* DoProc */
        !            44: 
        !            45: 
        !            46: /* P S B H   F   H A S H   S B */
        !            47: 
        !            48: local pSBHR PsbhFHashSb(sb)
        !            49: register char  *sb;
        !            50: {
        !            51:     register int       sum = 0;
        !            52: 
        !            53:     while (sb && *sb)
        !            54:        sum += *sb++;
        !            55: 
        !            56:     return(&vpsbhBucket [sum % hashMod]);
        !            57: } /* PsbhFHashSb */
        !            58: 
        !            59: 
        !            60: /* I S S   F   S B   I N S E R T */
        !            61: 
        !            62: export long IssFSbInsert(sb)
        !            63: register char  *sb;
        !            64: {
        !            65:     register pSBHR     psbh;
        !            66:     register pSBHR     psbhPrev;
        !            67:     register char      *sbT;
        !            68:     register int       sum;
        !            69: 
        !            70:     sum = 0;
        !            71:     if (sb != 0) {
        !            72:        sbT = sb;
        !            73:        while (*sbT)
        !            74:            sum += *sbT++;
        !            75:     } /* if */
        !            76:     psbh = vpsbhBucket + (sum % hashMod);
        !            77: 
        !            78:     while (psbh) {
        !            79:        if ( (psbh->sb != 0)
        !            80:           && (!strcmp(sb, psbh->sb)) ) {
        !            81:            return(psbh->iss);
        !            82:        } /* if */
        !            83:        psbhPrev = psbh;
        !            84:        psbh = psbh->psbh;
        !            85:     } /* while */
        !            86: 
        !            87:     psbh = psbhPrev;
        !            88:     psbh->psbh = (pSBHR) malloc (cbSBHR);
        !            89:     psbh = psbh->psbh;
        !            90:     sbT = psbh->sb = vsbMax;
        !            91:     psbh->iss = vissMac;
        !            92:     while (*(sbT++) = *(sb++))
        !            93:        ;
        !            94: 
        !            95:     vsbMax = sbT;
        !            96:     vissMac = vsbMax - vsbNewStr;
        !            97:     if (vissMac > vissMax)
        !            98:        panic("Ran out of string space - use scaling factor");
        !            99: 
        !           100:     vissMac++;
        !           101:     *(vsbMax++) = '\0';
        !           102:     psbh->psbh = (pSBHR) 0;
        !           103: 
        !           104:     return (psbh->iss);
        !           105: } /* IssFSbInsert */
        !           106: 
        !           107: 
        !           108: /* D O   L I N E */
        !           109: 
        !           110: export void DoLine(nlist)
        !           111: pNLISTR        nlist;
        !           112: {
        !           113:     pLINER     line;
        !           114:     static ADRT        adrSecondLine;
        !           115: 
        !           116:     if (vcLinesInProc == 1) {
        !           117:        /* If there is more than one line in a proc, we ignore the first.
        !           118:         * This is correct for all cases except:
        !           119:         *      foo() {int x = 1;
        !           120:         *         .... etc.
        !           121:         *
        !           122:         * Which is brain damaged and life is tough, so there.
        !           123:         */
        !           124:        vilineMac--;
        !           125:        adrSecondLine = nlist->n_value;
        !           126:     } else if ((vcLinesInProc >= 2) && (nlist->n_value == adrSecondLine)) {
        !           127:        /* throw away previous line */
        !           128:        vilineMac--;
        !           129:     } /* if */
        !           130: 
        !           131:     if (vilineMac >= vilineMax)
        !           132:        panic ("line table overflow");
        !           133:     viline = vilineMac++;
        !           134: 
        !           135:     line= vrgLine + viline;
        !           136:     line->iln= nlist->n_desc;
        !           137:     line->dadr= nlist->n_value - vrgPd[vipd].adr;
        !           138:     vdot = nlist->n_value;
        !           139:     vcLinesInProc++;
        !           140: } /* DoLine */
        !           141: 
        !           142: 
        !           143: /* E N D   F I L E */
        !           144: 
        !           145: export void EndFile(adr)
        !           146: ADRT   adr;
        !           147: {
        !           148:     register pSYMR     sym;
        !           149: 
        !           150:     if (vsymProc != symNil)
        !           151:        EndProc(adr);
        !           152: 
        !           153:     vrgFd[vifd].ilnMac = vrgLine[viline].iln; /* kludge? */
        !           154:     sym = SymFInsert();
        !           155:     sym->st = stEnd;
        !           156:     sym->sc = scText;
        !           157:     sym->index = IsymFSym (vsymFile);
        !           158:     vsymFile->index = IsymFSym(sym) + 1;       /* forward link */
        !           159:     sym->value = (vdot == vsymFile->value) ? adr : vdot;
        !           160: } /* EndFile */
        !           161: 
        !           162: 
        !           163: /* D O   F I L E */
        !           164: 
        !           165: export void DoFile (nlist, sbName)
        !           166: pNLISTR        nlist;
        !           167: char           *sbName;
        !           168: {
        !           169:     register pFDR      fd;
        !           170:     register pSYMR     sym;
        !           171:     ADRT       adr;
        !           172:     int                cb;
        !           173: 
        !           174:     if (vsymFile != symNil)
        !           175:        EndFile(nlist->n_value);
        !           176: 
        !           177:     adr = (nlist == nlistNil) ? -1L : nlist->n_value;
        !           178: 
        !           179:    /* The weird chack for ending character of the filename
        !           180:     * is to see if a file of pure data came before us.
        !           181:     */
        !           182:     if ((vifd > 0)
        !           183:        && (sbName[strlen(sbName)-1] != 'o')
        !           184:        && (vrgFd[vifd].adr == adr)) {
        !           185:        /* this is the TRUE source file after Loader freebie symbol */
        !           186:        fd= vrgFd  + vifd;
        !           187:        visymMac = IsymFSym(vsymFile);  /* one more time! */
        !           188:     } else {
        !           189:        if (vifdMac >= vifdMax)
        !           190:            panic ("file table overflow");
        !           191:        vifd = vifdMac++;
        !           192:        fd= vrgFd + vifd;
        !           193:     } /* if */
        !           194: 
        !           195:     cb = strlen(sbName);
        !           196:     fd->iss = IssFSbInsert(sbName);
        !           197:     fd->adr = adr;
        !           198:     fd->isym = visymMac;
        !           199:     fd->iline = vilineMac;
        !           200: 
        !           201:     vsymFile = sym = SymFInsert();
        !           202:     sym->iss = fd->iss;
        !           203:     sym->st = stFile;
        !           204:     sym->sc = scText;
        !           205:     vdot = sym->value = adr;
        !           206: 
        !           207:     /* reinit mapping array */
        !           208:     ZeroBlock(&vrgTesF42 [tesF42Low],
        !           209:        ((vites42Max + 1) - tesF42Low) * sizeof(int) );
        !           210:     vites42Max = tesF42Low;
        !           211: } /* DoFile */
        !           212: 
        !           213: 
        !           214: /* P R O C   I N S E R T */
        !           215: 
        !           216: export void ProcInsert(isym, adr, iline)
        !           217: register int   isym;
        !           218: register long  adr;
        !           219: register int   iline;
        !           220: {
        !           221:     register pPDR      pd, pd2;
        !           222: 
        !           223:     if (vipdMac >= vipdMax)
        !           224:        panic("proc table overflow");
        !           225: 
        !           226:     vipd = vipdMac++;
        !           227: 
        !           228:     if ((vipd > 0) && (adr < vrgPd [vipd - 1].adr)) {
        !           229:        /* we need to INSERT - not Append */
        !           230: 
        !           231:        /* find the proc we come AFTER */
        !           232:        for (pd = vrgPd + vipd - 1; (pd >= vrgPd) && (pd->adr > adr); pd--)
        !           233:                ;
        !           234:        /* move everything below it DOWN one */
        !           235:        for (pd2 = vrgPd + vipd - 1; pd2 > pd; pd2--)
        !           236:            pd2[1] = *pd2;
        !           237:        pd++;   /* point at new empty slot */
        !           238:     } else {
        !           239:        pd = vrgPd + vipd;
        !           240:     } /* if */
        !           241: 
        !           242:     pd->isym = isym;
        !           243:     pd->adr = adr;
        !           244:     pd->iline = iline;
        !           245: } /* ProcInsert */
        !           246: 
        !           247: strcmp(sb1, sb2)
        !           248: char *sb1, *sb2;
        !           249: {
        !           250:     if (sb1 == 0 || sb2 == 0)
        !           251:        return(1);
        !           252:     while (*sb1 == *sb2) {
        !           253:        if (*sb1 == '\0')
        !           254:            return(0);
        !           255:        sb1++;
        !           256:        sb2++;
        !           257:     } /* while */
        !           258:     return(1);
        !           259: } /* strcmp */

unix.superglobalmegacorp.com

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