Annotation of 42BSD/bin/csh/sh.misc.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)sh.misc.c 4.1 10/9/80";
                      2: 
                      3: #include "sh.h"
                      4: 
                      5: /*
                      6:  * C Shell
                      7:  */
                      8: 
                      9: letter(c)
                     10:        register char c;
                     11: {
                     12: 
                     13:        return (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '_');
                     14: }
                     15: 
                     16: digit(c)
                     17:        register char c;
                     18: {
                     19: 
                     20:        return (c >= '0' && c <= '9');
                     21: }
                     22: 
                     23: alnum(c)
                     24:        register char c;
                     25: {
                     26:        return (letter(c) || digit(c));
                     27: }
                     28: 
                     29: any(c, s)
                     30:        register int c;
                     31:        register char *s;
                     32: {
                     33: 
                     34:        while (*s)
                     35:                if (*s++ == c)
                     36:                        return(1);
                     37:        return(0);
                     38: }
                     39: 
                     40: char *
                     41: calloc(i, j)
                     42:        register unsigned i;
                     43:        unsigned j;
                     44: {
                     45:        register char *cp, *dp;
                     46: #ifdef debug
                     47:        static char *av[2] = {0, 0};
                     48: #endif
                     49: 
                     50:        i *= j;
                     51:        cp = (char *) malloc(i);
                     52:        if (cp == 0) {
                     53:                child++;
                     54: #ifndef debug
                     55:                error("Out of memory");
                     56: #else
                     57:                showall(av);
                     58:                printf("i=%d, j=%d: ", i/j, j);
                     59:                printf("Out of memory\n");
                     60:                chdir("/usr/bill/cshcore");
                     61:                abort();
                     62: #endif
                     63:        }
                     64:        dp = cp;
                     65:        if (i != 0)
                     66:                do
                     67:                        *dp++ = 0;
                     68:                while (--i);
                     69:        return (cp);
                     70: }
                     71: 
                     72: cfree(p)
                     73:        char *p;
                     74: {
                     75: 
                     76:        free(p);
                     77: }
                     78: 
                     79: char **
                     80: blkend(up)
                     81:        register char **up;
                     82: {
                     83: 
                     84:        while (*up)
                     85:                up++;
                     86:        return (up);
                     87: }
                     88:  
                     89: blkpr(av)
                     90:        register char **av;
                     91: {
                     92: 
                     93:        for (; *av; av++) {
                     94:                printf("%s", *av);
                     95:                if (av[1])
                     96:                        printf(" ");
                     97:        }
                     98: }
                     99: 
                    100: blklen(av)
                    101:        register char **av;
                    102: {
                    103:        register int i = 0;
                    104: 
                    105:        while (*av++)
                    106:                i++;
                    107:        return (i);
                    108: }
                    109: 
                    110: char **
                    111: blkcpy(oav, bv)
                    112:        char **oav;
                    113:        register char **bv;
                    114: {
                    115:        register char **av = oav;
                    116: 
                    117:        while (*av++ = *bv++)
                    118:                continue;
                    119:        return (oav);
                    120: }
                    121: 
                    122: char **
                    123: blkcat(up, vp)
                    124:        char **up, **vp;
                    125: {
                    126: 
                    127:        blkcpy(blkend(up), vp);
                    128:        return (up);
                    129: }
                    130: 
                    131: blkfree(av0)
                    132:        char **av0;
                    133: {
                    134:        register char **av = av0;
                    135: 
                    136:        while (*av)
                    137:                xfree(*av++);
                    138:        xfree((char *)av0);
                    139: }
                    140: 
                    141: char **
                    142: saveblk(v)
                    143:        register char **v;
                    144: {
                    145:        register int len = blklen(v) + 1;
                    146:        register char **newv = (char **) calloc(len, sizeof (char **));
                    147:        char **onewv = newv;
                    148: 
                    149:        while (*v)
                    150:                *newv++ = savestr(*v++);
                    151:        return (onewv);
                    152: }
                    153: 
                    154: char *
                    155: strspl(cp, dp)
                    156:        register char *cp, *dp;
                    157: {
                    158:        register char *ep = calloc(1, strlen(cp) + strlen(dp) + 1);
                    159: 
                    160:        strcpy(ep, cp);
                    161:        strcat(ep, dp);
                    162:        return (ep);
                    163: }
                    164: 
                    165: char **
                    166: blkspl(up, vp)
                    167:        register char **up, **vp;
                    168: {
                    169:        register char **wp = (char **) calloc(blklen(up) + blklen(vp) + 1, sizeof (char **));
                    170: 
                    171:        blkcpy(wp, up);
                    172:        return (blkcat(wp, vp));
                    173: }
                    174: 
                    175: lastchr(cp)
                    176:        register char *cp;
                    177: {
                    178: 
                    179:        if (!*cp)
                    180:                return (0);
                    181:        while (cp[1])
                    182:                cp++;
                    183:        return (*cp);
                    184: }
                    185: 
                    186: /*
                    187:  * This routine is called after an error to close up
                    188:  * any units which may have been left open accidentally.
                    189:  */
                    190: closem()
                    191: {
                    192:        register int f;
                    193: 
                    194:        for (f = 0; f < NOFILE; f++)
                    195:                if (f != SHIN && f != SHOUT && f != SHDIAG && f != OLDSTD &&
                    196:                    f != FSHTTY)
                    197:                        close(f);
                    198: }
                    199: 
                    200: /*
                    201:  * Close files before executing a file.
                    202:  * We could be MUCH more intelligent, since (on a version 7 system)
                    203:  * we need only close files here during a source, the other
                    204:  * shell fd's being in units 16-19 which are closed automatically!
                    205:  */
                    206: closech()
                    207: {
                    208:        register int f;
                    209: 
                    210:        if (didcch)
                    211:                return;
                    212:        didcch = 1;
                    213:        SHIN = 0; SHOUT = 1; SHDIAG = 2; OLDSTD = 0;
                    214:        for (f = 3; f < NOFILE; f++)
                    215:                close(f);
                    216: }
                    217: 
                    218: donefds()
                    219: {
                    220: 
                    221:        close(0), close(1), close(2);
                    222:        didfds = 0;
                    223: }
                    224: 
                    225: /*
                    226:  * Move descriptor i to j.
                    227:  * If j is -1 then we just want to get i to a safe place,
                    228:  * i.e. to a unit > 2.  This also happens in dcopy.
                    229:  */
                    230: dmove(i, j)
                    231:        register int i, j;
                    232: {
                    233: 
                    234:        if (i == j || i < 0)
                    235:                return (i);
                    236: #ifdef V7
                    237:        if (j >= 0) {
                    238:                dup2(i, j);
                    239:                return (j);
                    240:        } else
                    241: #endif
                    242:                j = dcopy(i, j);
                    243:        if (j != i)
                    244:                close(i);
                    245:        return (j);
                    246: }
                    247: 
                    248: dcopy(i, j)
                    249:        register int i, j;
                    250: {
                    251: 
                    252:        if (i == j || i < 0 || j < 0 && i > 2)
                    253:                return (i);
                    254: #ifdef V7
                    255:        if (j >= 0) {
                    256:                dup2(i, j);
                    257:                return (j);
                    258:        }
                    259: #endif
                    260:        close(j);
                    261:        return (renum(i, j));
                    262: }
                    263: 
                    264: renum(i, j)
                    265:        register int i, j;
                    266: {
                    267:        register int k = dup(i);
                    268: 
                    269:        if (k < 0)
                    270:                return (-1);
                    271:        if (j == -1 && k > 2)
                    272:                return (k);
                    273:        if (k != j) {
                    274:                j = renum(k, j);
                    275:                close(k);
                    276:                return (j);
                    277:        }
                    278:        return (k);
                    279: }
                    280: 
                    281: copy(to, from, size)
                    282:        register char *to, *from;
                    283:        register int size;
                    284: {
                    285: 
                    286:        if (size)
                    287:                do
                    288:                        *to++ = *from++;
                    289:                while (--size != 0);
                    290: }
                    291: 
                    292: /*
                    293:  * Left shift a command argument list, discarding
                    294:  * the first c arguments.  Used in "shift" commands
                    295:  * as well as by commands like "repeat".
                    296:  */
                    297: lshift(v, c)
                    298:        register char **v;
                    299:        register int c;
                    300: {
                    301:        register char **u = v;
                    302: 
                    303:        while (*u && --c >= 0)
                    304:                xfree(*u++);
                    305:        blkcpy(v, u);
                    306: }
                    307: 
                    308: number(cp)
                    309:        char *cp;
                    310: {
                    311: 
                    312:        if (*cp == '-') {
                    313:                cp++;
                    314:                if (!digit(*cp++))
                    315:                        return (0);
                    316:        }
                    317:        while (*cp && digit(*cp))
                    318:                cp++;
                    319:        return (*cp == 0);
                    320: }
                    321: 
                    322: char **
                    323: copyblk(v)
                    324:        register char **v;
                    325: {
                    326:        register char **nv = (char **) calloc(blklen(v) + 1, sizeof (char **));
                    327: 
                    328:        return (blkcpy(nv, v));
                    329: }
                    330: 
                    331: char *
                    332: strend(cp)
                    333:        register char *cp;
                    334: {
                    335: 
                    336:        while (*cp)
                    337:                cp++;
                    338:        return (cp);
                    339: }
                    340: 
                    341: char *
                    342: strip(cp)
                    343:        char *cp;
                    344: {
                    345:        register char *dp = cp;
                    346: 
                    347:        while (*dp++ &= TRIM)
                    348:                continue;
                    349:        return (cp);
                    350: }
                    351: 
                    352: udvar(name)
                    353:        char *name;
                    354: {
                    355: 
                    356:        setname(name);
                    357:        bferr("Undefined variable");
                    358: }
                    359: 
                    360: prefix(sub, str)
                    361:        register char *sub, *str;
                    362: {
                    363: 
                    364:        for (;;) {
                    365:                if (*sub == 0)
                    366:                        return (1);
                    367:                if (*str == 0)
                    368:                        return (0);
                    369:                if (*sub++ != *str++)
                    370:                        return (0);
                    371:        }
                    372: }

unix.superglobalmegacorp.com

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