Annotation of 3BSD/cmd/sdb/sub.c, revision 1.1.1.1

1.1       root        1: #include "head.h"
                      2: #include <a.out.h>
                      3: #include "cdefs.h"
                      4: #include <stdio.h>
                      5: struct user u;
                      6: 
                      7: char *
                      8: readline(f)
                      9: FILE *f; {
                     10:        static char buff[128];
                     11:        
                     12:        register char *p;
                     13:        register int i;
                     14:        
                     15:        p = buff;
                     16:        do {
                     17:                if ((i = getc(f)) == EOF) {
                     18:                        *p++ = '\004';
                     19:                        *p = '\n';
                     20:                }
                     21:                else *p = i;
                     22:        } while (*p++ != '\n');
                     23:        
                     24:        return(buff);
                     25: }
                     26: 
                     27: char *
                     28: cpname(p, q)
                     29: char *p, *q; {
                     30:        while(varchar(*q) || number(*q))
                     31:                *p++ = *q++;
                     32:        *p = '\0';
                     33:        return(q);
                     34: }
                     35: 
                     36: char *
                     37: cpall(p, q)
                     38: char *p, *q; {
                     39:        while (*q != '\n') 
                     40:                *p++ = *q++;
                     41:        *p = '\0';
                     42:        return(q);
                     43: }
                     44: 
                     45: eqany(c, s)
                     46: char c, *s; {
                     47:        while(*s != '\0')
                     48:                if (c == *s++) return(1);
                     49:        return(0);
                     50: }
                     51: 
                     52: error(s)
                     53: char *s; {
                     54:        printf("%s\n", s);
                     55: }
                     56: 
                     57: char *
                     58: cpstr(p,q)
                     59: char *p, *q; {
                     60:        do {
                     61:                *p++ = *q++;
                     62:        } while (*q != '\0');
                     63:        *p = '\0';
                     64: }
                     65: L_INT
                     66: round(a,b)
                     67: REG L_INT a, b;
                     68: {
                     69:        REG L_INT w;
                     70:        w = (a/b)*b;
                     71:        IF a!=w THEN w += b; FI
                     72:        return(w);
                     73: }
                     74: 
                     75: /* error handling */
                     76: 
                     77: chkerr()
                     78: {
                     79:        IF errflg ORF mkfault
                     80:        THEN    error(errflg);
                     81:                longjmp(env, 0);
                     82:        FI
                     83: }
                     84: 
                     85: eqstr(s1, s2)
                     86:        REG STRING      s1, s2;
                     87: {
                     88:        REG STRING       es1;
                     89:        if (s2 == (STRING) -1) return(0);
                     90:        es1 = s1+8;
                     91:        WHILE *s1++ == *s2
                     92:        DO IF *s2++ == 0 ORF s1>=es1
                     93:           THEN return(1);
                     94:           FI
                     95:        OD
                     96:        return(0);
                     97: }
                     98: 
                     99: longseek(f, a)
                    100: L_INT a;
                    101: {
                    102:        return(lseek(f,(long) a,0) != -1);
                    103: }
                    104: 
                    105: 
                    106: /* descriptor format to length */
                    107: dtol(d)
                    108: char d; {
                    109:        switch(d) {
                    110:        
                    111:        case 'a':
                    112:        case 's':
                    113:                return(0);
                    114:                
                    115:        case 'b':
                    116:        case 'c':
                    117:                return(1);
                    118:                
                    119:        case 'h':
                    120:                return(2);
                    121:                
                    122:        case 'l':
                    123:        case 'f':
                    124:                return(4);
                    125: 
                    126:        case 'g':
                    127:                return(8);
                    128: 
                    129:        default:
                    130:                return(WORDSIZE);
                    131:        }
                    132: }
                    133: 
                    134: /*
                    135:  * checks equality of pattern pat with str,
                    136:  * assuming str is tructaed at length 8
                    137:  */
                    138: eqpat(pat, str)
                    139: char *pat, *str; {
                    140:        return(eqpatr(pat, str, 0));
                    141: }
                    142: 
                    143: eqpatr(pat, str, cnt)
                    144: char *pat, *str; {
                    145:        register int i;
                    146:        register char p, s;
                    147:        
                    148:        p = pat[0];
                    149:        s = str[0];
                    150:        if (cnt == 8) return(1);
                    151:        if (p == '?') {
                    152:                if (s == '\0') return(0);
                    153:                return(eqpatr(pat+1, str+1, cnt+1));
                    154:        }
                    155:        if (p == '*') {
                    156:                if (pat[1] == '\0') return(1);
                    157:                for(i=1; i<8-cnt; i++) {
                    158:                        if (eqpatr(pat+1, str+i, cnt+i)) return(1);
                    159:                        if (str[i] == '\0') return(0);
                    160:                }
                    161:                return(0);
                    162:        }
                    163:        if ((eqany(p, ".[->") || p == '\0') && s == '\0') return(1);
                    164:        if (p != s) return(0);
                    165:        return(eqpatr(pat+1, str+1, cnt+1));
                    166: }
                    167: 
                    168: /* gets indirect address for pointers and subscripts */
                    169: getindir(class, addr, type) 
                    170: ADDR addr; {
                    171:        if (ISARY(type)) return(addr);
                    172:        if (class == N_RSYM)
                    173:                return(*(ADDR *)(((ADDR) &u) + R0 + (WORDSIZE)*addr));
                    174:        return(getval(addr, 'd'));
                    175: }
                    176: 
                    177: long
                    178: readint(p)
                    179: char **p; {
                    180:        int sign;
                    181: 
                    182:        if (**p == '-') {
                    183:                sign = -1;
                    184:                (*p)++;
                    185:        } else {
                    186:                sign = 1;
                    187:        }
                    188:        if (**p == '0') {
                    189:                (*p)++;
                    190:                if (**p == 'x' || **p == 'X') {
                    191:                        (*p)++;
                    192:                        return(sign * rint(p, 16, hexdigit, hexconv));
                    193:                }
                    194:                else return(sign * rint(p, 8, octdigit, octconv));
                    195:        }
                    196:        else return(sign * rint(p, 10, decdigit, decconv));
                    197: }
                    198: 
                    199: long
                    200: rint(p, base, digit, conv)
                    201: char **p;
                    202: int (*digit)(), (*conv)(); {
                    203:        long value;
                    204:        
                    205:        value = 0;
                    206:        while ((*digit)(**p)) value = base*value + (*conv)(*(*p)++);  
                    207:        return(value);
                    208: }
                    209: 
                    210: octdigit(c) 
                    211: char c; {
                    212:        return(c >= '0' && c <= '7');
                    213: }
                    214: 
                    215: octconv(c)
                    216: char c; {
                    217:        return(c - '0');
                    218: }
                    219: 
                    220: decdigit(c)
                    221: char c; {
                    222:        return(c >= '0' && c <= '9');
                    223: }
                    224: 
                    225: decconv(c)
                    226: char c; {
                    227:        return(c - '0');
                    228: }
                    229: 
                    230: hexdigit(c)
                    231: char c; {
                    232:        return((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||
                    233:                (c >= 'A' && c <= 'F'));
                    234: }
                    235: 
                    236: hexconv(c)
                    237: char c; {
                    238:        if (c >= '0' && c <= '9') return(c - '0');
                    239:        if (c >= 'a' && c <= 'f') return(c - 'a' + 10);
                    240:        if (c >= 'A' && c <= 'F') return(c - 'A' + 10);
                    241:        error("hex conversion error");
                    242:        return(0);
                    243: }
                    244: 
                    245: /* decodes number, character or variable */
                    246: long
                    247: argvalue(p)
                    248: char *p; {
                    249:        register char ch;
                    250:        register long value;
                    251:        register ADDR j;
                    252:        char var[30];
                    253: 
                    254:        ch = *p;
                    255:        if (ch == '\'') {
                    256:                value = *(p+1);
                    257:        } else if ((ch >= '0' && ch <= '9') || ch == '-') {
                    258:                value = readint(&p);
                    259:        } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
                    260:                ch == '_') {
                    261:                cpname(var, p);
                    262:                j = varaddr(curproc()->pname, var);
                    263:                if (j == -1) {
                    264:                        printf("Unknown variable: %s\n", argsp);
                    265:                        return(-1);
                    266:                }
                    267:                value = getval(j, typetodesc(sl_type, 0)[0]);
                    268:                do {
                    269:                        p++;
                    270:                } while (varchar(*p) || number(*p));
                    271:        }
                    272:        return(value);
                    273: }

unix.superglobalmegacorp.com

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