Annotation of coherent/b/bin/db_400/trace6.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     trace6.c
        !             3:  *
        !             4:  *     The information contained herein is a trade secret of Mark Williams
        !             5:  *     Company, and  is confidential information.  It is provided  under a
        !             6:  *     license agreement,  and may be  copied or disclosed  only under the
        !             7:  *     terms of  that agreement.  Any  reproduction or disclosure  of this
        !             8:  *     material without the express written authorization of Mark Williams
        !             9:  *     Company or persuant to the license agreement is unlawful.
        !            10:  *
        !            11:  *     COHERENT Version 2.3.35
        !            12:  *     Copyright (c) 1982, 1983, 1984.
        !            13:  *     An unpublished work by Mark Williams Company, Chicago.
        !            14:  *     All rights reserved.
        !            15:  *
        !            16:  *     Miscellaneous routines.
        !            17:  */
        !            18: #include <stdio.h>
        !            19: #include <ctype.h>
        !            20: #include <canon.h>
        !            21: #include <l.out.h>
        !            22: #include "trace.h"
        !            23: 
        !            24: #define MYPRINTF(x)    printf(x)
        !            25: #define DEBUG          0
        !            26: 
        !            27: unsigned short getMagic();
        !            28: caddr_t                initn();
        !            29: off_t          initb();
        !            30: off_t          incb();
        !            31: off_t          incb();
        !            32: off_t          getseekoff();
        !            33: 
        !            34: /*
        !            35:  * Save the rest of the input line in `miscbuf'.  If line is
        !            36:  * not given, save the default, `cp'.
        !            37:  */
        !            38: getline(cp)
        !            39: register char *cp;
        !            40: {
        !            41:        register int c;
        !            42:        register char *bp;
        !            43: 
        !            44:        bp = miscbuf;
        !            45:        if ((c=getn()) != '\n') {
        !            46:                while (c != '\n') {
        !            47:                        if (c == '\\')
        !            48:                                if ((c=getn())!='\n' && c!='\\')
        !            49:                                        *bp++ = '\\';
        !            50:                        *bp++ = c;
        !            51:                        c = getn();
        !            52:                }
        !            53:        } else {
        !            54:                while (*cp != '\0')
        !            55:                        *bp++ = *cp++;
        !            56:        }
        !            57:        *bp++ = '\n';
        !            58:        *bp = '\0';
        !            59: }
        !            60: 
        !            61: /*
        !            62:  * Add a string onto the input stream.
        !            63:  * Make a node for string "cp" and insert it at the front of "inpp".
        !            64:  */
        !            65: addstrp(cp)
        !            66: char *cp;
        !            67: {
        !            68:        register INP *ip;
        !            69: 
        !            70:        ip = nalloc(sizeof (INP));
        !            71:        ip->i_st2.i_next = inpp;
        !            72:        ip->i_st2.i_type = ICORE;
        !            73:        ip->i_st2.i_strp = cp;
        !            74:        inpp = ip;
        !            75: }
        !            76: 
        !            77: /*
        !            78:  * Add a file pointer onto the input stack.
        !            79:  */
        !            80: addfilp(fp)
        !            81: FILE *fp;
        !            82: {
        !            83:        register INP *ip;
        !            84: 
        !            85:        ip = nalloc(sizeof (INP));
        !            86:        ip->i_st1.i_next = inpp;
        !            87:        ip->i_st1.i_type = IFILE;
        !            88:        ip->i_st1.i_filp = fp;
        !            89:        inpp = ip;
        !            90: }
        !            91: 
        !            92: /*
        !            93:  * Get the next character from the input stream.
        !            94:  */
        !            95: getn()
        !            96: {
        !            97:        register INP *ip;
        !            98:        register int c;
        !            99: 
        !           100:        if (lastc != '\0') {
        !           101:                c = lastc;
        !           102:                lastc = '\0';
        !           103:                return (c);
        !           104:        }
        !           105:        while ((ip=inpp) != NULL) {
        !           106:                switch (ip->i_st1.i_type) {
        !           107:                case ICORE:
        !           108:                        if ((c=*ip->i_st2.i_strp++) != '\0')
        !           109:                                return (c);
        !           110:                        break;
        !           111:                case IFILE:
        !           112:                        if ((c=getc(ip->i_st1.i_filp)) != EOF)
        !           113:                                return (c);
        !           114:                        if (ip->i_st1.i_filp == stdin) {
        !           115:                                if (testint())
        !           116:                                        continue;
        !           117:                                leave();
        !           118:                        }
        !           119:                        fclose(ip->i_st1.i_filp);
        !           120:                        break;
        !           121:                }
        !           122:                inpp = inpp->i_st1.i_next;
        !           123:                nfree(ip);
        !           124:        }
        !           125:        return (EOF);
        !           126: }
        !           127: 
        !           128: /*
        !           129:  * Put back a character onto the current input stream.
        !           130:  */
        !           131: ungetn(c)
        !           132: {
        !           133:        lastc = c;
        !           134: }
        !           135: 
        !           136: /*
        !           137:  * Put out an address.  `t' is the tolerance allowed.
        !           138:  */
        !           139: putaddr(s, l, t)
        !           140: long l;
        !           141: {
        !           142:        register char *sp;
        !           143: 
        !           144:        sp = conaddr(miscbuf, s, l, t);
        !           145:        *sp = '\0';
        !           146:        printx("%s", miscbuf);
        !           147: }
        !           148: 
        !           149: /*
        !           150:  * Read `n' bytes from the current position in segment `seg'
        !           151:  * and store it in the buffer `bp'.
        !           152:  */
        !           153: getb(segn, bp, n)
        !           154: char *bp;
        !           155: unsigned n;
        !           156: {
        !           157:        if (getputb(segn, bp, n, 0) == 0)
        !           158:                return (0);
        !           159:        canon(bp, n);
        !           160: 
        !           161: #if DEBUG
        !           162: {
        !           163:        int i;
        !           164:        for (i=0; i<n; i++) printf("bp = %x\n", (unsigned char)bp[i]);
        !           165: }
        !           166: #endif
        !           167:        return (1);
        !           168: }
        !           169: 
        !           170: /*
        !           171:  * Put `n' bytes from the buffer `bp' into segment `seg'.
        !           172:  */
        !           173: putb(segn, bp, n)
        !           174: char *bp;
        !           175: unsigned n;
        !           176: {
        !           177:        canon(bp, n);
        !           178:        return (getputb(segn, bp, n, 1));
        !           179: }
        !           180: 
        !           181: /*
        !           182:  * Canonize the buffer `bp' of length `n' according to `cantype'.
        !           183:  */
        !           184: canon(bp, n)
        !           185: register char *bp;
        !           186: unsigned n;
        !           187: {
        !           188:        register int i;
        !           189:        register int t;
        !           190: 
        !           191:        if (cantype == 1) {
        !           192:                if ((n&1) != 0)
        !           193:                        return;
        !           194:                for (i=0; i<n; i+=2) {
        !           195:                        t = bp[i];
        !           196:                        bp[i] = bp[i+1];
        !           197:                        bp[i+1] = t;
        !           198:                }
        !           199:        }
        !           200: }
        !           201: 
        !           202: /*
        !           203:  * Move `n' bytes between the buffer `bp' and the segment `segn'.
        !           204:  * The flag `d' controls the direction.
        !           205:  */
        !           206: getputb(segn, bp, n, d)
        !           207: char *bp;
        !           208: unsigned n;
        !           209: {
        !           210:        register MAP *mp;
        !           211:        register unsigned l;
        !           212:        register unsigned s;
        !           213:        register int (*f)();
        !           214:        off_t a;
        !           215: 
        !           216:        s = n;
        !           217:        a = add;
        !           218:        while (s) {
        !           219:                if ((mp=mapaddr(segn, a)) == NULL) {
        !           220:                        return 0;
        !           221:                }
        !           222:                l = s;
        !           223:                if (a+l > mp->m_bend)
        !           224:                        l = mp->m_bend-a+1;
        !           225:                f = d ? mp->m_putf : mp->m_getf;
        !           226:                if ((*f)(mp->m_segi, mp->m_offt+(a-mp->m_base), bp, l) == 0) {
        !           227:                        return 0;
        !           228:                }
        !           229:                bp += l;
        !           230:                a += l;
        !           231:                s -= l;
        !           232:        }
        !           233:        add += n;
        !           234:        return (1);
        !           235: }
        !           236: 
        !           237: /*
        !           238:  * Given a segment number and an address, return the segment map
        !           239:  * in which the address falls.
        !           240:  */
        !           241: MAP *
        !           242: mapaddr(n, a)
        !           243: off_t a;
        !           244: {
        !           245:        register MAP *mp;
        !           246: 
        !           247:        for (mp=segmapl[n]; mp; mp=mp->m_next) {
        !           248:                if (mp->m_base<=a && a<mp->m_bend)
        !           249:                        break;
        !           250:        }
        !           251:        return (mp);
        !           252: }
        !           253: 
        !           254: /*
        !           255:  * Read a symbol and return its value in the given `VAL' structure.
        !           256:  */
        !           257: getsval(vp)
        !           258: VAL *vp;
        !           259: {
        !           260:        register int n;
        !           261:        register int c;
        !           262:        struct LDSYM lds;
        !           263: 
        !           264:        n = 0;
        !           265:        c = getn();
        !           266:        while (isascii(c) && (isalnum(c)||c=='_')) {
        !           267:                if (n < NCPLN)
        !           268:                        lds.ls_id[n++] = c;
        !           269:                c = getn();
        !           270:        }
        !           271:        ungetn(c);
        !           272:        while (n < NCPLN)
        !           273:                lds.ls_id[n++] = '\0';
        !           274:        if (specsym(&lds)==0 && regaddr(&lds)==0 && nameval(&lds)==0) {
        !           275:                printe("Symbol not found");
        !           276:                return (0);
        !           277:        }
        !           278:        switch (lds.ls_type&LR_SEG) {
        !           279:        case L_SHRI:
        !           280:        case L_PRVI:
        !           281:        case L_BSSI:
        !           282:                vp->v_segn = 1;
        !           283:                vp->v_flag = VLVAL;
        !           284:                break;
        !           285:        case L_SHRD:
        !           286:        case L_PRVD:
        !           287:        case L_BSSD:
        !           288:        case L_ABS:
        !           289:                vp->v_segn = 0;
        !           290:                vp->v_flag = VLVAL;
        !           291:                break;
        !           292: 
        !           293:        case L_REF:
        !           294:                printe("Symbol not defined");
        !           295:                return (0);
        !           296:        case L_REG:
        !           297:                vp->v_segn = 2;
        !           298:                vp->v_flag = VLVAL;
        !           299:                break;
        !           300:        }
        !           301:        vp->v_nval = lds.ls_addr;
        !           302:        return (1);
        !           303: }
        !           304: 
        !           305: /*
        !           306:  * See if the given symbol is a special symbol.
        !           307:  */
        !           308: specsym(ldp)
        !           309: register struct LDSYM *ldp;
        !           310: {
        !           311:        if (ldp->ls_id[1] != '\0')
        !           312:                return (0);
        !           313:        switch (ldp->ls_id[0]) {
        !           314:        case 'd':
        !           315:                ldp->ls_type = L_SHRD;
        !           316:                break;
        !           317:        case 'i':
        !           318:                ldp->ls_type = L_SHRI;
        !           319:                break;
        !           320:        case 'u':
        !           321:                ldp->ls_type = L_REG;
        !           322:                break;
        !           323:        default:
        !           324:                return (0);
        !           325:        }
        !           326:        ldp->ls_addr = 0;
        !           327:        return (1);
        !           328: }
        !           329: 
        !           330: /*
        !           331:  * Convert a value to an address.  `t' is the tolerance
        !           332:  * allowed.
        !           333:  */
        !           334: char *
        !           335: conaddr(sp, s, l, t)
        !           336: register char *sp;
        !           337: unsigned long l;
        !           338: {
        !           339: /* Bug in PDP11 compiler
        !           340:        register unsigned d;
        !           341: */
        !           342:        unsigned d;
        !           343:        struct LDSYM ldsym;
        !           344: 
        !           345: 
        !           346: /* Bug in 8086 compiler
        !           347:        if (t<0 || valname(s, l, &ldsym)==0 || (d=l-ldsym.ls_addr)>t)
        !           348: */
        !           349:        if (t<0 || valname(s, l, &ldsym)==0 ||
        !           350:            (d=(unsigned)l-ldsym.ls_addr)>t)
        !           351:                concons(sp, l);
        !           352:        else {
        !           353:                sprintf(sp, "%.*s", NCPLN, ldsym.ls_id);
        !           354:                while (*sp)
        !           355:                        sp++;
        !           356:                if (d != 0) {
        !           357:                        *sp++ = '+';
        !           358:                        sprintf(sp, "%u", d);
        !           359:                }
        !           360:        }
        !           361:        while (*sp)
        !           362:                sp++;
        !           363:        return (sp);
        !           364: }
        !           365: 
        !           366: /*
        !           367:  * Find the value of a symbol.
        !           368:  */
        !           369: nameval(ldp)
        !           370: struct LDSYM *ldp;
        !           371: {
        !           372:        register int u;
        !           373:        register caddr_t n;
        !           374:        register SYM *sp;
        !           375:        register int r;
        !           376:        register int h;
        !           377:        register off_t b;
        !           378:        struct LDSYM lds;
        !           379:        struct LDSYM ldu;
        !           380:        
        !           381:        u = 0;
        !           382:        h = hash(ldp);
        !           383:        evalhdrinfo(lfp);
        !           384:        for (n=initn(), sp=ssymp, b=initb(); n--
        !           385:                                ; sp++, b=incb(b, ((caddr_t)sngblsym-n))) {
        !           386:                if (ssymp!=NULL && sp->s_hash!=h) {
        !           387:                        continue;
        !           388:                }
        !           389: 
        !           390:                if (hdrinfo.magic == L_MAGIC) {
        !           391:                        if (!rdldSym(sfp, (long)b, &lds))
        !           392:                                return(0);
        !           393:                }
        !           394:                else 
        !           395:                        if (!rdcoff_to_loutSym(sfp, (long)b, &lds))
        !           396:                                return(0);
        !           397: 
        !           398:                if ((r=namecmp(ldp, &lds)) > 0) {
        !           399:                        *ldp = lds;
        !           400:                        return (1);
        !           401:                }
        !           402:                if (r < 0) {
        !           403:                        ldu = lds;
        !           404:                        u = 1;
        !           405:                }
        !           406:        }
        !           407:        if (u) {
        !           408:                *ldp = ldu;
        !           409:                return (1);
        !           410:        }
        !           411:        return (0);
        !           412: }
        !           413: 
        !           414: /*
        !           415:  * Compare the names of two symbol table entries.  If the compare
        !           416:  * fails and the name of the first entry doesn't already end with
        !           417:  * an '_', the compare is effectively tried again after appending
        !           418:  * an '_', to the end of the first symbol name.
        !           419:  */
        !           420: namecmp(ldp1, ldp2)
        !           421: struct LDSYM *ldp1;
        !           422: struct LDSYM *ldp2;
        !           423: {
        !           424:        register char *cp1;
        !           425:        register char *cp2;
        !           426:        register int n;
        !           427: 
        !           428:        n = CCSSIZE;
        !           429:        cp1 = ldp1->ls_id;
        !           430:        cp2 = ldp2->ls_id;
        !           431:        do {
        !           432:                if (*cp1 != *cp2++) {
        !           433:                        if (*cp2!='\0' || *--cp2!='_')
        !           434:                                return (0);
        !           435:                        if (*cp1!='\0' || *--cp1=='_')
        !           436:                                return (0);
        !           437:                        return (-1);
        !           438:                }
        !           439:                if (*cp1++ == '\0')
        !           440:                        return (1);
        !           441:        } while (--n);
        !           442:        return (1);
        !           443: }
        !           444: 
        !           445: #define        NEW     1
        !           446: 
        !           447: /*
        !           448:  * Given a value, find the closest symbol below.
        !           449:  */
        !           450: valname(s, m, ldp)
        !           451: off_t m;
        !           452: struct LDSYM *ldp;
        !           453: {
        !           454:        register int    n;
        !           455:        register off_t  a;
        !           456:        register SYM    *sp;
        !           457:        register int    t;
        !           458:        register int    n1;
        !           459:        register off_t  a1;
        !           460:        struct LDSYM    lds;
        !           461:        off_t           b, seekoff;
        !           462: 
        !           463:        strncpy(ldp->ls_id, "", NCPLN);
        !           464:        if (sfp == NULL)
        !           465:                return (0);
        !           466:        a1 = 0;
        !           467:        n1 = -1;
        !           468:        if (ssymp == NULL)
        !           469:                fseek(sfp, (long)sbase, 0);
        !           470:        hdrinfo.magic = getMagic(lfp);
        !           471:        for (n=0, sp=ssymp, b=initb(); n<initn()
        !           472:                                ; n++, sp++, b=incb(b, ((caddr_t)n))) {
        !           473:                if (ssymp != NULL) {
        !           474:                        a = sp->s_sval;
        !           475:                        t = sp->s_type;
        !           476:                }
        !           477:                else {
        !           478:                        if (hdrinfo.magic == L_MAGIC) {
        !           479:                                if (!rdldSym(sfp, (long)b, &lds))
        !           480:                                        return(0);
        !           481:                        }
        !           482:                        else { 
        !           483:                                if (!rdcoff_to_loutSym(sfp, (long)b, &lds))
        !           484:                                        return(0);
        !           485:                        }
        !           486:                        a = (off_t)lds.ls_addr;
        !           487:                        t = lds.ls_type;
        !           488:                }
        !           489:                if (hdrinfo.magic == L_MAGIC) {
        !           490:                        switch (t&LR_SEG) {
        !           491:                        case L_SHRI:
        !           492:                        case L_PRVI:
        !           493:                        case L_BSSI:
        !           494:                                if (s == 0)
        !           495:                                        continue;
        !           496:                                break;
        !           497:                        case L_SHRD:
        !           498:                        case L_PRVD:
        !           499:                        case L_BSSD:
        !           500:                                if (s == 1)
        !           501:                                        continue;
        !           502:                                break;
        !           503:                        default:
        !           504:                                continue;
        !           505:                        }
        !           506:                }
        !           507:                if ( ((unsigned long)a <= (unsigned long)m) ) {
        !           508:                        if (a1==0 || (unsigned long)a > (unsigned long)a1) {
        !           509:                                a1 = a;
        !           510:                                n1 = n;
        !           511:                        }
        !           512:                }
        !           513:        }
        !           514: 
        !           515:        if (n1 >= 0) {
        !           516:                seekoff = sbase + getseekoff(n1);
        !           517:                if (hdrinfo.magic == L_MAGIC) {
        !           518:                        if (!rdldSym(sfp, seekoff, ldp))
        !           519:                                return(0);
        !           520:                }
        !           521:                else {
        !           522:                        if (!rdcoff_to_loutSym(sfp, seekoff, ldp))
        !           523:                                return(0);
        !           524:                }
        !           525:                return (1);
        !           526:        }
        !           527:        return (0);
        !           528: }
        !           529: 
        !           530: rdldSym(fp, seekoff, LDSP)
        !           531: FILE           *fp;
        !           532: long           seekoff;
        !           533: struct LDSYM   *LDSP;
        !           534: {
        !           535:        register int    i;
        !           536:        struct  ldsym   lds;
        !           537: 
        !           538:        fseek(fp, seekoff, 0);
        !           539:        if (fread(&lds, sizeof(struct ldsym), 1, fp) != 1)
        !           540:                return (0);
        !           541:        canint(lds.ls_type);
        !           542:        canvaddr(lds.ls_addr);
        !           543:        for (i=0; i<NCPLN; i++)
        !           544:                LDSP->ls_id[i] = lds.ls_id[i];
        !           545:        LDSP->ls_type = lds.ls_type;
        !           546:        LDSP->ls_addr = (long)lds.ls_addr;
        !           547:        return(1);
        !           548: }
        !           549: 
        !           550: /*
        !           551:  * Read `n' bytes from the file specified by `f' starting at
        !           552:  * address `seek'.
        !           553:  */
        !           554: getf(f, seek, bp, n)
        !           555: long seek;
        !           556: char *bp;
        !           557: {
        !           558:        register FILE *fp;
        !           559: 
        !           560:        fp = f ? cfp : lfp;
        !           561:        fseek(fp, (long)seek, 0);
        !           562:        return (fread(bp, n, 1, fp));
        !           563: }
        !           564: 
        !           565: /*
        !           566:  * Write `n' bytes into the files specified by `f' starting at
        !           567:  * address `seek'.
        !           568:  */
        !           569: putf(f, seek, bp, n)
        !           570: long seek;
        !           571: char *bp;
        !           572: {
        !           573:        register FILE *fp;
        !           574:        int ret = 1;
        !           575: 
        !           576:        fp = f ? cfp : lfp;
        !           577:        fseek(fp, (long)seek, 0);
        !           578:        if (fwrite(bp, n, 1, fp) != 1) {
        !           579:                ret = 0;
        !           580:        }
        !           581:        if (ret) {
        !           582:                if (fflush(fp)!=EOF) {
        !           583:                        ret = 0;
        !           584:                }
        !           585:        }
        !           586:        return ret;
        !           587: }
        !           588: 
        !           589: /*
        !           590:  * Allocate `n' bytes.
        !           591:  */
        !           592: char *
        !           593: nalloc(n)
        !           594: {
        !           595:        register char *cp;
        !           596: 
        !           597:        if ((cp=malloc(n)) == NULL)
        !           598:                panic("No memory");
        !           599:        return (cp);
        !           600: }
        !           601: 
        !           602: /*
        !           603:  * Free up storage.
        !           604:  */
        !           605: nfree(cp)
        !           606: char *cp;
        !           607: {
        !           608:        free(cp);
        !           609: }
        !           610: 
        !           611: /*
        !           612:  * Print out an error message and exit.
        !           613:  */
        !           614: panic(a1)
        !           615: char *a1;
        !           616: {
        !           617:        fprintf(stderr, "%r", &a1);
        !           618:        putc('\n', stderr);
        !           619:        exit(1);
        !           620: }
        !           621: 
        !           622: /*
        !           623:  * Print out a breakpoint error message.
        !           624:  */
        !           625: printb(a)
        !           626: caddr_t a;
        !           627: {
        !           628:        fprintf(stderr, "Breakpoint error at ");
        !           629:        fprintf(stderr, DAFMT, (long)a);
        !           630:        putc('\n', stderr);
        !           631: }
        !           632: 
        !           633: /*
        !           634:  * Print out a fatal error message.
        !           635:  */
        !           636: printr(a1)
        !           637: char *a1;
        !           638: {
        !           639:        fprintf(stderr, "%r", &a1);
        !           640:        putc('\n', stderr);
        !           641: }
        !           642: 
        !           643: /*
        !           644:  * Print out an error message.
        !           645:  */
        !           646: printe(sp)
        !           647: char *sp;
        !           648: {
        !           649:        errrstr = sp;
        !           650:        fprintf(stderr, "%s?\n", errrstr);
        !           651: }
        !           652: 
        !           653: /*
        !           654:  * Print formatted.
        !           655:  */
        !           656: printx(a1)
        !           657: char *a1;
        !           658: {
        !           659:        printf("%r", &a1);
        !           660: }
        !           661: 
        !           662: /*
        !           663:  * Put out a character.
        !           664:  */
        !           665: putx(c)
        !           666: {
        !           667:        putchar(c);
        !           668: }
        !           669: 
        !           670: 
        !           671: /******************************************************************************
        !           672:  *
        !           673:  * Note some #defines in these include files interferes with
        !           674:  * items in preceeding include files. Hence the strange
        !           675:  * program order.
        !           676:  *
        !           677:  ******************************************************************************/
        !           678: 
        !           679: #include <coff.h>
        !           680: 
        !           681: static FILEHDR coffh;
        !           682: 
        !           683: evalhdrinfo(fp)
        !           684: FILE   *fp;
        !           685: {
        !           686:        hdrinfo.magic = getMagic(fp);
        !           687:        if (hdrinfo.magic == C_386_MAGIC)
        !           688:                hdrinfo.defsegatt = DSA32;
        !           689:        else
        !           690:                hdrinfo.defsegatt = DSA16;
        !           691: }
        !           692: 
        !           693: unsigned short
        !           694: getMagic(fp)
        !           695: FILE   *fp;
        !           696: {
        !           697:        fseek(fp,0L,0);
        !           698:        if ( fread(&coffh, sizeof(FILEHDR), 1, fp) != 1 )
        !           699:                panic("Cannot read object file");
        !           700:        if (coffh.f_magic == C_386_MAGIC)
        !           701:                return(C_386_MAGIC);
        !           702:        else {
        !           703:                canint(coffh.f_magic);
        !           704:                if ( coffh.f_magic == L_MAGIC )
        !           705:                        return(L_MAGIC);
        !           706:                else
        !           707:                        panic("Bad object file");
        !           708:        }
        !           709:        return(0);
        !           710: }
        !           711: 
        !           712: rdcoff_to_loutSym(fp, seekoff, ldsp)
        !           713: FILE           *fp;
        !           714: long           seekoff;
        !           715: struct LDSYM   *ldsp;
        !           716: {
        !           717:        SYMENT  coffsym;
        !           718:        char    *str_tabp;
        !           719:        SCNHDR  *scnhp;
        !           720: 
        !           721:        str_tabp = (char *)read_str_tab(fp, snsym, sbase);
        !           722: 
        !           723:        fseek(fp, seekoff, 0);
        !           724:        if (fread(&coffsym, sizeof(SYMENT), 1, fp) != 1) {
        !           725:                printf("Unable to read coff symbols\n");
        !           726:                return(0);
        !           727:        }
        !           728: 
        !           729:        scnhp = (SCNHDR *)read_scns(fp, coffh.f_nscns
        !           730:                                , sizeof(FILEHDR)+coffh.f_opthdr);
        !           731:        if (scnhp == NULL) {
        !           732:                printf("Unable to read section headers\n");
        !           733:                return(0);
        !           734:        }
        !           735: 
        !           736:        coff_to_lout(&coffsym, ldsp, str_tabp, scnhp);
        !           737: 
        !           738:        nfree(str_tabp);
        !           739:        nfree(scnhp);
        !           740:        return(1);
        !           741: }
        !           742: 
        !           743: 
        !           744: caddr_t
        !           745: initn()
        !           746: {
        !           747:        
        !           748:        return(hdrinfo.magic == C_386_MAGIC ? (caddr_t)sngblsym : (caddr_t)snsym);
        !           749: }
        !           750: 
        !           751: off_t
        !           752: initb()
        !           753: {
        !           754:        off_t   b;
        !           755: 
        !           756:        b = (hdrinfo.magic == C_386_MAGIC 
        !           757:                ? ( sbase+(gblsymMap[0]*(off_t)sizeof(SYMENT)) )
        !           758:                  : sbase);
        !           759:        return(b);
        !           760: }
        !           761: 
        !           762: off_t
        !           763: incb(b, i)
        !           764: off_t  b;
        !           765: int i;
        !           766: {
        !           767:        b += ( hdrinfo.magic == C_386_MAGIC 
        !           768:                ? ( (gblsymMap[i] - gblsymMap[i-1L]) * sizeof(SYMENT) )
        !           769:                  : sizeof(struct ldsym) );
        !           770:        return(b);
        !           771: }
        !           772: 
        !           773: off_t
        !           774: getseekoff(n1)
        !           775: {
        !           776:        off_t   b;
        !           777: 
        !           778:        b = ( hdrinfo.magic == C_386_MAGIC 
        !           779:                ? ( (gblsymMap[n1]) * sizeof(SYMENT) )
        !           780:                  : (n1 * sizeof(struct ldsym)) );
        !           781:        return(b);
        !           782: }
        !           783: 
        !           784: /* end of trace6.c */

unix.superglobalmegacorp.com

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