Annotation of coherent/d/bin/db/trace6.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * A debugger.
                      3:  * Miscellaneous routines.
                      4:  */
                      5: #include <stdio.h>
                      6: #include <ctype.h>
                      7: #include <canon.h>
                      8: #include "trace.h"
                      9: #if NOUT
                     10: #include <n.out.h>
                     11: #else
                     12: #include <l.out.h>
                     13: #endif
                     14: 
                     15: /*
                     16:  * Save the rest of the input line in `miscbuf'.  If line is
                     17:  * not given, save the default, `cp'.
                     18:  */
                     19: getline(cp)
                     20: register char *cp;
                     21: {
                     22:        register int c;
                     23:        register char *bp;
                     24: 
                     25:        bp = miscbuf;
                     26:        if ((c=getn()) != '\n') {
                     27:                while (c != '\n') {
                     28:                        if (c == '\\')
                     29:                                if ((c=getn())!='\n' && c!='\\')
                     30:                                        *bp++ = '\\';
                     31:                        *bp++ = c;
                     32:                        c = getn();
                     33:                }
                     34:        } else {
                     35:                while (*cp != '\0')
                     36:                        *bp++ = *cp++;
                     37:        }
                     38:        *bp++ = '\n';
                     39:        *bp = '\0';
                     40: }
                     41: 
                     42: /*
                     43:  * Add a string onto the input stream.
                     44:  */
                     45: addstrp(cp)
                     46: char *cp;
                     47: {
                     48:        register INP *ip;
                     49: 
                     50:        ip = nalloc(sizeof (INP));
                     51:        ip->i_next = inpp;
                     52:        ip->i_type = ICORE;
                     53:        ip->i_strp = cp;
                     54:        inpp = ip;
                     55: }
                     56: 
                     57: /*
                     58:  * Add a file pointer onto the input stack.
                     59:  */
                     60: addfilp(fp)
                     61: FILE *fp;
                     62: {
                     63:        register INP *ip;
                     64: 
                     65:        ip = nalloc(sizeof (INP));
                     66:        ip->i_next = inpp;
                     67:        ip->i_type = IFILE;
                     68:        ip->i_filp = fp;
                     69:        inpp = ip;
                     70: }
                     71: 
                     72: /*
                     73:  * Get the next character from the input stream.
                     74:  */
                     75: getn()
                     76: {
                     77:        register INP *ip;
                     78:        register int c;
                     79: 
                     80:        if (lastc != '\0') {
                     81:                c = lastc;
                     82:                lastc = '\0';
                     83:                return (c);
                     84:        }
                     85:        while ((ip=inpp) != NULL) {
                     86:                switch (ip->i_type) {
                     87:                case ICORE:
                     88:                        if ((c=*ip->i_strp++) != '\0')
                     89:                                return (c);
                     90:                        break;
                     91:                case IFILE:
                     92:                        if ((c=getc(ip->i_filp)) != EOF)
                     93:                                return (c);
                     94:                        if (ip->i_filp == stdin) {
                     95:                                if (testint())
                     96:                                        continue;
                     97:                                leave();
                     98:                        }
                     99:                        fclose(ip->i_filp);
                    100:                        break;
                    101:                }
                    102:                inpp = inpp->i_next;
                    103:                nfree(ip);
                    104:        }
                    105:        return (EOF);
                    106: }
                    107: 
                    108: /*
                    109:  * Put back a character onto the current input stream.
                    110:  */
                    111: ungetn(c)
                    112: {
                    113:        lastc = c;
                    114: }
                    115: 
                    116: /*
                    117:  * Put out an address.  `t' is the tolerance allowed.
                    118:  */
                    119: putaddr(s, l, t)
                    120: long l;
                    121: {
                    122:        register char *sp;
                    123: 
                    124:        sp = conaddr(miscbuf, s, l, t);
                    125:        *sp = '\0';
                    126:        printx("%s", miscbuf);
                    127: }
                    128: 
                    129: /*
                    130:  * Read `n' bytes from the current position in segment `seg'
                    131:  * and store it in the buffer `bp'.
                    132:  */
                    133: getb(segn, bp, n)
                    134: char *bp;
                    135: unsigned n;
                    136: {
                    137:        if (getputb(segn, bp, n, 0) == 0)
                    138:                return (0);
                    139:        canon(bp, n);
                    140:        return (1);
                    141: }
                    142: 
                    143: /*
                    144:  * Put `n' bytes from the buffer `bp' into segment `seg'.
                    145:  */
                    146: putb(segn, bp, n)
                    147: char *bp;
                    148: unsigned n;
                    149: {
                    150:        canon(bp, n);
                    151:        return (getputb(segn, bp, n, 1));
                    152: }
                    153: 
                    154: /*
                    155:  * Canonize the buffer `bp' of length `n' according to `cantype'.
                    156:  */
                    157: canon(bp, n)
                    158: register char *bp;
                    159: unsigned n;
                    160: {
                    161:        register int i;
                    162:        register int t;
                    163: 
                    164:        if (cantype == 1) {
                    165:                if ((n&1) != 0)
                    166:                        return;
                    167:                for (i=0; i<n; i+=2) {
                    168:                        t = bp[i];
                    169:                        bp[i] = bp[i+1];
                    170:                        bp[i+1] = t;
                    171:                }
                    172:        }
                    173: }
                    174: 
                    175: /*
                    176:  * Move `n' bytes between the buffer `bp' and the segment `segn'.
                    177:  * The flag `d' controls the direction.
                    178:  */
                    179: getputb(segn, bp, n, d)
                    180: char *bp;
                    181: unsigned n;
                    182: {
                    183:        register MAP *mp;
                    184:        register unsigned l;
                    185:        register unsigned s;
                    186:        register int (*f)();
                    187:        fsize_t a;
                    188: 
                    189:        s = n;
                    190:        a = add;
                    191:        while (s) {
                    192:                if ((mp=mapaddr(segn, a)) == NULL)
                    193:                        return (0);
                    194:                l = s;
                    195:                if (a+l > mp->m_bend)
                    196:                        l = mp->m_bend-a+1;
                    197:                f = d ? mp->m_putf : mp->m_getf;
                    198:                if( (*f)( mp->m_segi, mp->m_offt+
                    199:                          ( fflag ? a - mp->m_base : size( a - mp->m_base))
                    200:                          , bp, l) == 0)
                    201:                        return (0);
                    202:                bp += l;
                    203:                a += l;
                    204:                s -= l;
                    205:        }
                    206:        add += n;
                    207:        return (1);
                    208: }
                    209: 
                    210: /*
                    211:  * Given a segment number and an address, return the segment map
                    212:  * in which the address falls.
                    213:  */
                    214: MAP *
                    215: mapaddr(n, a)
                    216: fsize_t a;
                    217: {
                    218:        register MAP *mp;
                    219: 
                    220:        for (mp=segmapl[n]; mp != NULL; mp=mp->m_next)
                    221:                if (mp->m_base<=a && a<mp->m_bend)
                    222:                        break;
                    223:        return (mp);
                    224: }
                    225: 
                    226: /*
                    227:  * Read a symbol and return it's value in the given `VAL' structure.
                    228:  */
                    229: getsval(vp)
                    230: VAL *vp;
                    231: {
                    232:        register int n;
                    233:        register int c;
                    234:        struct ldsym lds;
                    235: 
                    236:        n = 0;
                    237:        c = getn();
                    238:        while (isascii(c) && (isalnum(c)||c=='_')) {
                    239:                if (n < NCPLN)
                    240:                        lds.ls_id[n++] = c;
                    241:                c = getn();
                    242:        }
                    243:        ungetn(c);
                    244:        while (n < NCPLN)
                    245:                lds.ls_id[n++] = '\0';
                    246:        if (specsym(&lds)==0 && regaddr(&lds)==0 && nameval(&lds)==0) {
                    247:                printe("Symbol not found");
                    248:                return (0);
                    249:        }
                    250:        switch (lds.ls_type&LR_SEG) {
                    251:        case L_SHRI:
                    252:        case L_PRVI:
                    253:        case L_BSSI:
                    254:                vp->v_segn = 1;
                    255:                vp->v_flag = VLVAL;
                    256:                break;
                    257:        case L_SHRD:
                    258:        case L_PRVD:
                    259:        case L_BSSD:
                    260:        case L_ABS:
                    261:                vp->v_segn = 0;
                    262:                vp->v_flag = VLVAL;
                    263:                break;
                    264: 
                    265:        case L_REF:
                    266:                printe("Symbol not defined");
                    267:                return (0);
                    268:        case L_REG:
                    269:                vp->v_segn = 2;
                    270:                vp->v_flag = VLVAL;
                    271:                break;
                    272:        }
                    273:        vp->v_nval = lds.ls_addr;
                    274:        return (1);
                    275: }
                    276: 
                    277: /*
                    278:  * See if the given symbol is a special symbol.
                    279:  */
                    280: specsym(ldp)
                    281: register struct ldsym *ldp;
                    282: {
                    283:        if (ldp->ls_id[1] != '\0')
                    284:                return (0);
                    285:        switch (ldp->ls_id[0]) {
                    286:        case 'd':
                    287:                ldp->ls_type = L_SHRD;
                    288:                break;
                    289:        case 'i':
                    290:                ldp->ls_type = L_SHRI;
                    291:                break;
                    292:        case 'u':
                    293:                ldp->ls_type = L_REG;
                    294:                break;
                    295:        default:
                    296:                return (0);
                    297:        }
                    298:        ldp->ls_addr = 0;
                    299:        return (1);
                    300: }
                    301: 
                    302: /*
                    303:  * Convert a value to an address.  `t' is the tolerance
                    304:  * allowed.
                    305:  */
                    306: char *
                    307: conaddr(sp, s, l, t)
                    308: register char *sp;
                    309: unsigned long l;
                    310: {
                    311: /* Bug in PDP11 compiler
                    312:        register unsigned d;
                    313: */
                    314:        unsigned d;
                    315:        struct ldsym ldsym;
                    316: 
                    317: /* Bug in 8086 compiler
                    318:        if (t<0 || valname(s, (tvaddr)l, &ldsym)==0 || (d=l-ldsym.ls_addr)>t)
                    319: */
                    320:        if (t<0 || valname(s, (tvaddr)l, &ldsym)==0 ||
                    321:            (d=(unsigned)l-ldsym.ls_addr)>t)
                    322: #if FORZ8001
                    323:                conaddnum( sp, l);
                    324: #else
                    325:                concons(sp, l);
                    326: #endif
                    327:        else {
                    328:                sprintf(sp, "%.*s", NCPLN, ldsym.ls_id);
                    329:                while (*sp)
                    330:                        sp++;
                    331:                if (d != 0) {
                    332:                        *sp++ = '+';
                    333:                        concons( sp, (long)d);
                    334:                }
                    335:        }
                    336:        while (*sp)
                    337:                sp++;
                    338:        return (sp);
                    339: }
                    340: 
                    341: /*
                    342:  * Find the value of a symbol.
                    343:  */
                    344: nameval(ldp)
                    345: struct ldsym *ldp;
                    346: {
                    347:        register int u;
                    348:        register fsize_t n;
                    349:        register SYM *sp;
                    350:        register int r;
                    351:        register int h;
                    352:        register fsize_t b;
                    353:        struct ldsym lds;
                    354:        struct ldsym ldu;
                    355: 
                    356:        u = 0;
                    357:        h = hash(ldp);
                    358:        for (n=snsym, sp=ssymp, b=sbase; n--; sp++, b+=sizeof(lds)) {
                    359:                if (ssymp!=NULL && sp->s_hash!=h)
                    360:                        continue;
                    361:                fseek(sfp, (long)b, 0);
                    362:                if (fread(&lds, sizeof(lds), 1, sfp) != 1)
                    363:                        return (0);
                    364: #if NOUT
                    365:                canshort( lds.ls_type);
                    366:                canlong( lds.ls_addr);
                    367: #else
                    368:                canint(lds.ls_type);
                    369:                canvaddr(lds.ls_addr);
                    370: #endif
                    371:                if ((r=namecmp(ldp, &lds)) > 0) {
                    372:                        *ldp = lds;
                    373:                        return (1);
                    374:                }
                    375:                if (r < 0) {
                    376:                        ldu = lds;
                    377:                        u = 1;
                    378:                }
                    379:        }
                    380:        if (u) {
                    381:                *ldp = ldu;
                    382:                return (1);
                    383:        }
                    384:        return (0);
                    385: }
                    386: 
                    387: /*
                    388:  * Compare the names of two symbol table entries.  If the compare
                    389:  * fails and the name of the first entry doesn't already end with
                    390:  * an '_', the compare is effectively tried again after appending
                    391:  * an '_', to the end of the first symbol name.
                    392:  */
                    393: namecmp(ldp1, ldp2)
                    394: struct ldsym *ldp1;
                    395: struct ldsym *ldp2;
                    396: {
                    397:        register char *cp1;
                    398:        register char *cp2;
                    399:        register int n;
                    400: 
                    401:        n = CCSSIZE;
                    402:        cp1 = ldp1->ls_id;
                    403:        cp2 = ldp2->ls_id;
                    404:        do {
                    405:                if (*cp1 != *cp2++) {
                    406:                        if (*cp2!='\0' || *--cp2!='_')
                    407:                                return (0);
                    408:                        if (*cp1!='\0' || *--cp1=='_')
                    409:                                return (0);
                    410:                        return (-1);
                    411:                }
                    412:                if (*cp1++ == '\0')
                    413:                        return (1);
                    414:        } while (--n);
                    415:        return (1);
                    416: }
                    417: 
                    418: /*
                    419:  * Given a value, find the closest symbol below.
                    420:  * Searches in segment s; if s = -1 looks in all segments.
                    421:  */
                    422: valname(s, m, ldp)
                    423: tvaddr m;
                    424: struct ldsym *ldp;
                    425: {
                    426:        register int n;
                    427:        register tvaddr a;
                    428:        register SYM *sp;
                    429:        register int t;
                    430:        register int n1;
                    431:        register tvaddr a1;
                    432:        struct ldsym lds;
                    433: 
                    434:        strncpy(ldp->ls_id, "", NCPLN);
                    435:        if (sfp == NULL)
                    436:                return (0);
                    437:        a1 = 0;
                    438:        n1 = -1;
                    439:        if (ssymp == NULL)
                    440:                fseek(sfp, (long)sbase, 0);
                    441:        for (n=0, sp=ssymp; n<snsym; n++, sp++) {
                    442:                if (ssymp != NULL) {
                    443:                        a = sp->s_sval;
                    444:                        t = sp->s_type;
                    445:                } else {
                    446:                        if (fread(&lds, sizeof(lds), 1, sfp) != 1)
                    447:                                return (0);
                    448: #if NOUT
                    449:                        canshort( lds.ls_type);
                    450:                        canlong( lds.ls_addr);
                    451: #else
                    452:                        canint(lds.ls_type);
                    453:                        canvaddr(lds.ls_addr);
                    454: #endif
                    455:                        a = lds.ls_addr;
                    456:                        t = lds.ls_type;
                    457:                }
                    458:                switch (t&LR_SEG) {
                    459:                case L_SHRI:
                    460:                case L_PRVI:
                    461:                case L_BSSI:
                    462:                        if (s == 0)
                    463:                                continue;
                    464:                        break;
                    465:                case L_SHRD:
                    466:                case L_PRVD:
                    467:                case L_BSSD:
                    468:                        if (s == 1)
                    469:                                continue;
                    470:                        break;
                    471:                default:
                    472:                        continue;
                    473:                }
                    474:                if (a <= m) {
                    475:                        if (a1==0 || a>a1) {
                    476:                                a1 = a;
                    477:                                n1 = n;
                    478:                        }
                    479:                }
                    480:        }
                    481:        if (n1 >= 0) {
                    482:                fseek(sfp, (long)sbase + n1*sizeof(struct ldsym), 0);
                    483:                if (fread(ldp, sizeof(*ldp), 1, sfp) != 1)
                    484:                        return (0);
                    485: #if NOUT
                    486:                canshort( lds.ls_type);
                    487:                canlong( lds.ls_addr);
                    488: #else
                    489:                canint(ldp->ls_type);
                    490:                canvaddr(ldp->ls_addr);
                    491: #endif
                    492:                return (1);
                    493:        }
                    494:        return (0);
                    495: }
                    496: 
                    497: /*
                    498:  * Read `n' bytes from the file specified by `f' starting at
                    499:  * address `seek'.
                    500:  */
                    501: getf(f, seek, bp, n)
                    502: long seek;
                    503: char *bp;
                    504: {
                    505:        register FILE *fp;
                    506: 
                    507:        fp = f ? cfp : lfp;
                    508:        fseek(fp, (long)seek, 0);
                    509:        return (fread(bp, n, 1, fp));
                    510: }
                    511: 
                    512: /*
                    513:  * Write `n' bytes into the files specified by `f' starting at
                    514:  * address `seek'.
                    515:  */
                    516: putf(f, seek, bp, n)
                    517: long seek;
                    518: char *bp;
                    519: {
                    520:        register FILE *fp;
                    521: 
                    522:        fp = f ? cfp : lfp;
                    523:        fseek(fp, (long)seek, 0);
                    524:        return (fwrite(bp, n, 1, fp) && fflush(fp)!=EOF);
                    525: }
                    526: 
                    527: /*
                    528:  * Allocate `n' bytes.
                    529:  */
                    530: char *
                    531: nalloc(n)
                    532: {
                    533:        register char *cp;
                    534: 
                    535:        if ((cp=malloc(n)) == NULL)
                    536:                panic("No memory");
                    537:        return (cp);
                    538: }
                    539: 
                    540: /*
                    541:  * Print out an error message and exit.
                    542:  */
                    543: panic(a1)
                    544: char *a1;
                    545: {
                    546:        fprintf(stderr, "%r", &a1);
                    547:        putc('\n', stderr);
                    548:        exit(1);
                    549: }
                    550: 
                    551: /*
                    552:  * Print out a breakpoint error message.
                    553:  */
                    554: printb(a)
                    555: vaddr_t a;
                    556: {
                    557:        fprintf(stderr, "Breakpoint error at ");
                    558:        fprintf(stderr, DAFMT, (long)a);
                    559:        putc('\n', stderr);
                    560: }
                    561: 
                    562: /*
                    563:  * Print out a fatal error message.
                    564:  */
                    565: printr(a1)
                    566: char *a1;
                    567: {
                    568:        fprintf(stderr, "%r", &a1);
                    569:        putc('\n', stderr);
                    570: }
                    571: 
                    572: /*
                    573:  * Print out an error message.
                    574:  */
                    575: printe(sp)
                    576: char *sp;
                    577: {
                    578:        errrstr = sp;
                    579:        fprintf(stderr, "?\n");
                    580: }
                    581: 
                    582: /*
                    583:  * Print formatted.
                    584:  */
                    585: printx(a1)
                    586: char *a1;
                    587: {
                    588:        printf("%r", &a1);
                    589: }
                    590: 
                    591: putaddnum( a)
                    592: long   a;
                    593: {
                    594:        char    buf[40];
                    595: 
                    596:        conaddnum( buf, a);
                    597:        printx( "%s", buf);
                    598: }
                    599: 
                    600: putnum( a)
                    601: long( a);
                    602: {
                    603:        char    buf[20];
                    604: 
                    605:        concons( buf, a);
                    606:        printx( "%s", buf);
                    607: }
                    608: 
                    609: char *
                    610: concons( sp, a)
                    611: char *sp;
                    612: long a;
                    613: {
                    614:        register char *cp = sp;
                    615: 
                    616:        switch( dbase) {
                    617:                case 8: sprintf( cp, "%lo", a); break;
                    618:                case 10: sprintf( cp, "%ld", a); break;
                    619:                case 16: sprintf( cp, "%lx", a); break;
                    620:        }
                    621:        while( *++cp) ;
                    622:        return( cp);
                    623: }

unix.superglobalmegacorp.com

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