Annotation of researchv10no/cmd/sdb/sub.c, revision 1.1.1.1

1.1       root        1: static char sccsid[] = "@(#)sub.c 4.1 10/9/80";
                      2: #include "head.h"
                      3: #include <a.out.h>
                      4: #include <stab.h>
                      5: #include "cdefs.h"
                      6: #include <stdio.h>
                      7: struct user u;
                      8: 
                      9: char *
                     10: readline(f)
                     11: FILE *f; {
                     12:        static char buff[128];
                     13:        
                     14:        register char *p;
                     15:        register int i;
                     16:        
                     17:        p = buff;
                     18:        do {
                     19:                if ((i = getc(f)) == EOF) {
                     20:                        *p++ = '\004';
                     21:                        *p = '\n';
                     22:                        clearerr(f);
                     23:                }
                     24:                else *p = i;
                     25:        } while (*p++ != '\n');
                     26:        
                     27:        return(buff);
                     28: }
                     29: 
                     30: char *
                     31: cpname(p, q)
                     32: char *p, *q; {
                     33:        while(varchar(*q) || number(*q))
                     34:                *p++ = *q++;
                     35:        *p = '\0';
                     36:        return(q);
                     37: }
                     38: 
                     39: char *
                     40: cpall(p, q)
                     41: char *p, *q; {
                     42:        while (*q != '\n') 
                     43:                *p++ = *q++;
                     44:        *p = '\0';
                     45:        return(q);
                     46: }
                     47: 
                     48: eqany(c, s)
                     49: char c, *s; {
                     50:        while(*s != '\0')
                     51:                if (c == *s++) return(1);
                     52:        return(0);
                     53: }
                     54: 
                     55: error(s)
                     56: char *s; {
                     57:        printf("%s\n", s);
                     58: }
                     59: 
                     60: char *
                     61: cpstr(p,q)
                     62: char *p, *q; {
                     63:        do {
                     64:                *p++ = *q++;
                     65:        } while (*q != '\0');
                     66:        *p = '\0';
                     67: }
                     68: L_INT
                     69: round(a,b)
                     70: REG L_INT a, b;
                     71: {
                     72:        REG L_INT w;
                     73:        w = (a/b)*b;
                     74:        IF a!=w THEN w += b; FI
                     75:        return(w);
                     76: }
                     77: 
                     78: /* error handling */
                     79: 
                     80: chkerr()
                     81: {
                     82:        IF errflg ORF mkfault
                     83:        THEN    error(errflg);
                     84:                longjmp(env, 0);
                     85:        FI
                     86: }
                     87: 
                     88: eqstr(s1, s2)
                     89:        REG STRING      s1, s2;
                     90: {
                     91: #ifndef FLEXNAMES
                     92:        REG STRING       es1;
                     93: #endif
                     94:        if (s2 == (STRING) -1) return(0);
                     95: #ifndef FLEXNAMES
                     96:        es1 = s1+8;
                     97: #endif
                     98:        WHILE *s1++ == *s2
                     99: #ifndef FLEXNAMES
                    100:        DO IF *s2++ == 0 ORF s1>=es1
                    101: #else
                    102:        DO IF *s2++ == 0
                    103: #endif
                    104:           THEN return(1);
                    105:           FI
                    106:        OD
                    107:        return(0);
                    108: }
                    109: 
                    110: longseek(f, a)
                    111: L_INT a;
                    112: {
                    113:        return(lseek(f,(long) a,0) != -1);
                    114: }
                    115: 
                    116: 
                    117: /* descriptor format to length */
                    118: dtol(d)
                    119: char d; {
                    120:        switch(d) {
                    121:        
                    122:        case 'a':
                    123:        case 's':
                    124:                return(0);
                    125:                
                    126:        case 'b':
                    127:        case 'c':
                    128:                return(1);
                    129:                
                    130:        case 'h':
                    131:                return(2);
                    132:                
                    133:        case 'l':
                    134:        case 'f':
                    135:                return(4);
                    136: 
                    137:        case 'g':
                    138:                return(8);
                    139: 
                    140:        default:
                    141:                return(WORDSIZE);
                    142:        }
                    143: }
                    144: 
                    145: /*
                    146:  * checks equality of pattern pat with str,
                    147:  * assuming str is tructaed at length 8
                    148:  */
                    149: eqpat(pat, str)
                    150: char *pat, *str; {
                    151: #ifndef FLEXNAMES
                    152:        return(eqpatr(pat, str, 0));
                    153: #else
                    154:        return(eqpatr(pat, str));
                    155: #endif
                    156: }
                    157: 
                    158: #ifndef FLEXNAMES
                    159: eqpatr(pat, str, cnt)
                    160: #else
                    161: eqpatr(pat, str)
                    162: #endif
                    163: char *pat, *str; {
                    164:        register int i;
                    165:        register char p, s;
                    166:        
                    167:        p = pat[0];
                    168:        s = str[0];
                    169: #ifndef FLEXNAMES
                    170:        if (cnt == 8) return(1);
                    171: #endif
                    172:        if (p == '?') {
                    173:                if (s == '\0') return(0);
                    174: #ifndef FLEXNAMES
                    175:                return(eqpatr(pat+1, str+1, cnt+1));
                    176: #else
                    177:                return(eqpatr(pat+1, str+1));
                    178: #endif
                    179:        }
                    180:        if (p == '*') {
                    181:                if (pat[1] == '\0') return(1);
                    182: #ifndef FLEXNAMES
                    183:                for(i=1; i<8-cnt; i++) {
                    184:                        if (eqpatr(pat+1, str+i, cnt+i)) return(1);
                    185: #else
                    186:                for(i=1; ; i++) {
                    187:                        if (eqpatr(pat+1, str+i)) return(1);
                    188: #endif
                    189:                        if (str[i] == '\0') return(0);
                    190:                }
                    191: #ifndef FLEXNAMES
                    192:                return(0);
                    193: #else
                    194:                /*NOTREACHED*/
                    195: #endif
                    196:        }
                    197:        if ((eqany(p, ".[->") || p == '\0') && s == '\0') return(1);
                    198:        if (p != s) return(0);
                    199: #ifndef FLEXNAMES
                    200:        return(eqpatr(pat+1, str+1, cnt+1));
                    201: #else
                    202:        return(eqpatr(pat+1, str+1));
                    203: #endif
                    204: }
                    205: 
                    206: /* gets indirect address for pointers and subscripts */
                    207: getindir(class, addr, type) 
                    208: ADDR addr; {
                    209:        if (ISARY(type)) return(addr);
                    210:        if (class == N_RSYM)
                    211:                return(*(ADDR *)(((ADDR) &u) + R0 + (WORDSIZE)*addr));
                    212:        return(getval(addr, 'd', DSP));
                    213: }
                    214: 
                    215: long
                    216: readint(p)
                    217: char **p; {
                    218:        int sign;
                    219: 
                    220:        if (**p == '-') {
                    221:                sign = -1;
                    222:                (*p)++;
                    223:        } else {
                    224:                sign = 1;
                    225:        }
                    226:        if (**p == '0') {
                    227:                (*p)++;
                    228:                if (**p == 'x' || **p == 'X') {
                    229:                        (*p)++;
                    230:                        return(sign * rint(p, 16, hexdigit, hexconv));
                    231:                }
                    232:                else return(sign * rint(p, 8, octdigit, octconv));
                    233:        }
                    234:        else return(sign * rint(p, 10, decdigit, decconv));
                    235: }
                    236: 
                    237: long
                    238: rint(p, base, digit, conv)
                    239: char **p;
                    240: int (*digit)(), (*conv)(); {
                    241:        long value;
                    242:        
                    243:        value = 0;
                    244:        while ((*digit)(**p)) value = base*value + (*conv)(*(*p)++);  
                    245:        return(value);
                    246: }
                    247: 
                    248: octdigit(c) 
                    249: char c; {
                    250:        return(c >= '0' && c <= '7');
                    251: }
                    252: 
                    253: octconv(c)
                    254: char c; {
                    255:        return(c - '0');
                    256: }
                    257: 
                    258: decdigit(c)
                    259: char c; {
                    260:        return(c >= '0' && c <= '9');
                    261: }
                    262: 
                    263: decconv(c)
                    264: char c; {
                    265:        return(c - '0');
                    266: }
                    267: 
                    268: hexdigit(c)
                    269: char c; {
                    270:        return((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||
                    271:                (c >= 'A' && c <= 'F'));
                    272: }
                    273: 
                    274: hexconv(c)
                    275: char c; {
                    276:        if (c >= '0' && c <= '9') return(c - '0');
                    277:        if (c >= 'a' && c <= 'f') return(c - 'a' + 10);
                    278:        if (c >= 'A' && c <= 'F') return(c - 'A' + 10);
                    279:        error("hex conversion error");
                    280:        return(0);
                    281: }
                    282: 
                    283: /* decodes number, character or variable */
                    284: long
                    285: argvalue(p)
                    286: char *p; {
                    287:        register char ch;
                    288:        register long value;
                    289:        register ADDR j;
                    290:        char var[30];
                    291: 
                    292:        ch = *p;
                    293:        if (ch == '\'') {
                    294:                value = *(p+1);
                    295:        } else if ((ch >= '0' && ch <= '9') || ch == '-') {
                    296:                value = readint(&p);
                    297:        } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
                    298:                ch == '_') {
                    299:                cpname(var, p);
                    300:                j = varaddr(curproc()->pname, var);
                    301:                if (j == -1) {
                    302:                        printf("Unknown variable: %s\n", argsp);
                    303:                        return(-1);
                    304:                }
                    305:                value = getval(j, typetodesc(sl_type, 0)[0], DSP);
                    306:                do {
                    307:                        p++;
                    308:                } while (varchar(*p) || number(*p));
                    309:        }
                    310:        return(value);
                    311: }
                    312: 
                    313: prhex(v) 
                    314: long v; {
                    315:        if (v < 0)  {
                    316:                v = -v;
                    317:                printf("-");
                    318:        }
                    319:        if (v <= 9)
                    320:                printf("%d", v);
                    321:        else
                    322:                printf("0x%x", v);
                    323: }
                    324: 
                    325: /* print hex number in field of length 12 */
                    326: prhex12(v) 
                    327: long v; {
                    328:        if (v >= -9 && v <= 9)
                    329:                printf("%-12d", v);
                    330:        else
                    331:                printf("0x%-12x", v);
                    332: }
                    333: 
                    334: /* print line number followed by offset */
                    335: prlnoff(procp, v)
                    336: struct proct *procp; ADDR v; {
                    337:        int lineno, diff;
                    338:        char *name;
                    339:        name = procp->pname;
                    340:        if (name[0] == '_') {
                    341: #ifndef FLEXNAMES
                    342:                printf("%.7s", name+1);
                    343: #else
                    344:                printf("%s", name+1);
                    345: #endif
                    346:                lineno = -1;
                    347:        } else {
                    348: #ifndef FLEXNAMES
                    349:                printf("%8s", name);
                    350: #else
                    351:                printf("%s", name);
                    352: #endif
                    353:                lineno = adrtolineno((ADDR) v);
                    354:        }
                    355:        if (lineno == -1)
                    356:                diff = v - procp->paddr;
                    357:        else {
                    358:                printf(":%d", lineno);
                    359:                diff = v - lnfaddr;  /* set by adrtolineno() */
                    360:        }
                    361:        if (diff) {
                    362:                printf("+");
                    363:                prhex(diff);
                    364:        }
                    365: }

unix.superglobalmegacorp.com

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