1*21938Sdist /* 2*21938Sdist * Copyright (c) 1980 Regents of the University of California. 3*21938Sdist * All rights reserved. The Berkeley software License Agreement 4*21938Sdist * specifies the terms and conditions for redistribution. 5*21938Sdist */ 6*21938Sdist 717511Sedward #ifndef lint 8*21938Sdist static char sccsid[] = "@(#)misc.c 5.1 (Berkeley) 06/04/85"; 9*21938Sdist #endif not lint 101300Sbill 111300Sbill #include "sh.h" 121300Sbill 131300Sbill /* 141300Sbill * C Shell 151300Sbill */ 161300Sbill 171300Sbill letter(c) 181300Sbill register char c; 191300Sbill { 201300Sbill 211300Sbill return (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '_'); 221300Sbill } 231300Sbill 241300Sbill digit(c) 251300Sbill register char c; 261300Sbill { 271300Sbill 281300Sbill return (c >= '0' && c <= '9'); 291300Sbill } 301300Sbill 311300Sbill alnum(c) 321300Sbill register char c; 331300Sbill { 341300Sbill return (letter(c) || digit(c)); 351300Sbill } 361300Sbill 371300Sbill any(c, s) 381300Sbill register int c; 391300Sbill register char *s; 401300Sbill { 411300Sbill 421300Sbill while (*s) 431300Sbill if (*s++ == c) 441300Sbill return(1); 451300Sbill return(0); 461300Sbill } 471300Sbill 4817511Sedward onlyread(cp) 4917511Sedward char *cp; 5017511Sedward { 5117511Sedward extern char end[]; 5217511Sedward 5317511Sedward return (cp < end); 5417511Sedward } 5517511Sedward 5617511Sedward xfree(cp) 5717511Sedward char *cp; 5817511Sedward { 5917511Sedward extern char end[]; 6017511Sedward 6117511Sedward if (cp >= end && cp < (char *) &cp) 6217511Sedward free(cp); 6317511Sedward } 6417511Sedward 651300Sbill char * 6617511Sedward savestr(s) 6717511Sedward register char *s; 6817511Sedward { 6917511Sedward char *n; 7017511Sedward register char *p; 7117511Sedward 7217511Sedward if (s == 0) 7317511Sedward s = ""; 7417511Sedward for (p = s; *p++;) 7517511Sedward ; 7617511Sedward n = p = xalloc((unsigned) (p - s)); 7717511Sedward while (*p++ = *s++) 7817511Sedward ; 7917511Sedward return (n); 8017511Sedward } 8117511Sedward 8217511Sedward char * 831300Sbill calloc(i, j) 841300Sbill register unsigned i; 851300Sbill unsigned j; 861300Sbill { 871300Sbill register char *cp, *dp; 881300Sbill 891300Sbill i *= j; 9017511Sedward dp = cp = xalloc(i); 911300Sbill if (i != 0) 921300Sbill do 931300Sbill *dp++ = 0; 941300Sbill while (--i); 951300Sbill return (cp); 961300Sbill } 971300Sbill 9817511Sedward nomem(i) 9917511Sedward unsigned i; 10017511Sedward { 10117511Sedward #ifdef debug 10217511Sedward static char *av[2] = {0, 0}; 10317511Sedward #endif 10417511Sedward 10517511Sedward child++; 10617511Sedward #ifndef debug 10717511Sedward error("Out of memory"); 10817511Sedward #ifdef lint 10917511Sedward i = i; 11017511Sedward #endif 11117511Sedward #else 11217511Sedward showall(av); 11317511Sedward printf("i=%d: Out of memory\n", i); 11417511Sedward chdir("/usr/bill/cshcore"); 11517511Sedward abort(); 11617511Sedward #endif 11717511Sedward return 0; /* fool lint */ 11817511Sedward } 11917511Sedward 1201300Sbill char ** 1211300Sbill blkend(up) 1221300Sbill register char **up; 1231300Sbill { 1241300Sbill 1251300Sbill while (*up) 1261300Sbill up++; 1271300Sbill return (up); 1281300Sbill } 1291300Sbill 1301300Sbill blkpr(av) 1311300Sbill register char **av; 1321300Sbill { 1331300Sbill 1341300Sbill for (; *av; av++) { 1351300Sbill printf("%s", *av); 1361300Sbill if (av[1]) 1371300Sbill printf(" "); 1381300Sbill } 1391300Sbill } 1401300Sbill 1411300Sbill blklen(av) 1421300Sbill register char **av; 1431300Sbill { 1441300Sbill register int i = 0; 1451300Sbill 1461300Sbill while (*av++) 1471300Sbill i++; 1481300Sbill return (i); 1491300Sbill } 1501300Sbill 1511300Sbill char ** 1521300Sbill blkcpy(oav, bv) 1531300Sbill char **oav; 1541300Sbill register char **bv; 1551300Sbill { 1561300Sbill register char **av = oav; 1571300Sbill 1581300Sbill while (*av++ = *bv++) 1591300Sbill continue; 1601300Sbill return (oav); 1611300Sbill } 1621300Sbill 1631300Sbill char ** 1641300Sbill blkcat(up, vp) 1651300Sbill char **up, **vp; 1661300Sbill { 1671300Sbill 16817511Sedward (void) blkcpy(blkend(up), vp); 1691300Sbill return (up); 1701300Sbill } 1711300Sbill 1721300Sbill blkfree(av0) 1731300Sbill char **av0; 1741300Sbill { 1751300Sbill register char **av = av0; 1761300Sbill 17717511Sedward for (; *av; av++) 17817511Sedward XFREE(*av) 17917511Sedward XFREE((char *)av0) 1801300Sbill } 1811300Sbill 1821300Sbill char ** 1831300Sbill saveblk(v) 1841300Sbill register char **v; 1851300Sbill { 18617511Sedward register char **newv = 18717511Sedward (char **) calloc((unsigned) (blklen(v) + 1), sizeof (char **)); 1881300Sbill char **onewv = newv; 1891300Sbill 1901300Sbill while (*v) 1911300Sbill *newv++ = savestr(*v++); 1921300Sbill return (onewv); 1931300Sbill } 1941300Sbill 1951300Sbill char * 1961300Sbill strspl(cp, dp) 19717511Sedward char *cp, *dp; 1981300Sbill { 19917511Sedward char *ep; 20017511Sedward register char *p, *q; 2011300Sbill 20217511Sedward for (p = cp; *p++;) 20317511Sedward ; 20417511Sedward for (q = dp; *q++;) 20517511Sedward ; 20617511Sedward ep = xalloc((unsigned) ((p - cp) + (q - dp) - 1)); 20717511Sedward for (p = ep, q = cp; *p++ = *q++;) 20817511Sedward ; 20917511Sedward for (p--, q = dp; *p++ = *q++;) 21017511Sedward ; 2111300Sbill return (ep); 2121300Sbill } 2131300Sbill 2141300Sbill char ** 2151300Sbill blkspl(up, vp) 2161300Sbill register char **up, **vp; 2171300Sbill { 21817511Sedward register char **wp = 21917511Sedward (char **) calloc((unsigned) (blklen(up) + blklen(vp) + 1), 22017511Sedward sizeof (char **)); 2211300Sbill 22217511Sedward (void) blkcpy(wp, up); 2231300Sbill return (blkcat(wp, vp)); 2241300Sbill } 2251300Sbill 2261300Sbill lastchr(cp) 2271300Sbill register char *cp; 2281300Sbill { 2291300Sbill 2301300Sbill if (!*cp) 2311300Sbill return (0); 2321300Sbill while (cp[1]) 2331300Sbill cp++; 2341300Sbill return (*cp); 2351300Sbill } 2361300Sbill 2371300Sbill /* 2381300Sbill * This routine is called after an error to close up 2391300Sbill * any units which may have been left open accidentally. 2401300Sbill */ 2411300Sbill closem() 2421300Sbill { 2431300Sbill register int f; 2441300Sbill 2451300Sbill for (f = 0; f < NOFILE; f++) 2461300Sbill if (f != SHIN && f != SHOUT && f != SHDIAG && f != OLDSTD && 2471300Sbill f != FSHTTY) 24817511Sedward (void) close(f); 2491300Sbill } 2501300Sbill 2511300Sbill donefds() 2521300Sbill { 2531300Sbill 25417511Sedward (void) close(0); 25517511Sedward (void) close(1); 25617511Sedward (void) close(2); 2571300Sbill didfds = 0; 2581300Sbill } 2591300Sbill 2601300Sbill /* 2611300Sbill * Move descriptor i to j. 2621300Sbill * If j is -1 then we just want to get i to a safe place, 2631300Sbill * i.e. to a unit > 2. This also happens in dcopy. 2641300Sbill */ 2651300Sbill dmove(i, j) 2661300Sbill register int i, j; 2671300Sbill { 2681300Sbill 2691300Sbill if (i == j || i < 0) 2701300Sbill return (i); 2711300Sbill if (j >= 0) { 27217511Sedward (void) dup2(i, j); 2731300Sbill return (j); 27417511Sedward } 27517511Sedward j = dcopy(i, j); 2761300Sbill if (j != i) 27717511Sedward (void) close(i); 2781300Sbill return (j); 2791300Sbill } 2801300Sbill 2811300Sbill dcopy(i, j) 2821300Sbill register int i, j; 2831300Sbill { 2841300Sbill 2851300Sbill if (i == j || i < 0 || j < 0 && i > 2) 2861300Sbill return (i); 2871300Sbill if (j >= 0) { 28817511Sedward (void) dup2(i, j); 2891300Sbill return (j); 2901300Sbill } 29117511Sedward (void) close(j); 2921300Sbill return (renum(i, j)); 2931300Sbill } 2941300Sbill 2951300Sbill renum(i, j) 2961300Sbill register int i, j; 2971300Sbill { 2981300Sbill register int k = dup(i); 2991300Sbill 3001300Sbill if (k < 0) 3011300Sbill return (-1); 3021300Sbill if (j == -1 && k > 2) 3031300Sbill return (k); 3041300Sbill if (k != j) { 3051300Sbill j = renum(k, j); 30617511Sedward (void) close(k); 3071300Sbill return (j); 3081300Sbill } 3091300Sbill return (k); 3101300Sbill } 3111300Sbill 31216678Ssam #ifndef copy 3131300Sbill copy(to, from, size) 3141300Sbill register char *to, *from; 3151300Sbill register int size; 3161300Sbill { 3171300Sbill 3181300Sbill if (size) 3191300Sbill do 3201300Sbill *to++ = *from++; 3211300Sbill while (--size != 0); 3221300Sbill } 32316678Ssam #endif 3241300Sbill 3251300Sbill /* 3261300Sbill * Left shift a command argument list, discarding 3271300Sbill * the first c arguments. Used in "shift" commands 3281300Sbill * as well as by commands like "repeat". 3291300Sbill */ 3301300Sbill lshift(v, c) 3311300Sbill register char **v; 3321300Sbill register int c; 3331300Sbill { 3341300Sbill register char **u = v; 3351300Sbill 3361300Sbill while (*u && --c >= 0) 3371300Sbill xfree(*u++); 33817511Sedward (void) blkcpy(v, u); 3391300Sbill } 3401300Sbill 3411300Sbill number(cp) 3421300Sbill char *cp; 3431300Sbill { 3441300Sbill 3451300Sbill if (*cp == '-') { 3461300Sbill cp++; 3471300Sbill if (!digit(*cp++)) 3481300Sbill return (0); 3491300Sbill } 3501300Sbill while (*cp && digit(*cp)) 3511300Sbill cp++; 3521300Sbill return (*cp == 0); 3531300Sbill } 3541300Sbill 3551300Sbill char ** 3561300Sbill copyblk(v) 3571300Sbill register char **v; 3581300Sbill { 35917511Sedward register char **nv = 36017511Sedward (char **) calloc((unsigned) (blklen(v) + 1), sizeof (char **)); 3611300Sbill 3621300Sbill return (blkcpy(nv, v)); 3631300Sbill } 3641300Sbill 3651300Sbill char * 3661300Sbill strend(cp) 3671300Sbill register char *cp; 3681300Sbill { 3691300Sbill 3701300Sbill while (*cp) 3711300Sbill cp++; 3721300Sbill return (cp); 3731300Sbill } 3741300Sbill 3751300Sbill char * 3761300Sbill strip(cp) 3771300Sbill char *cp; 3781300Sbill { 3791300Sbill register char *dp = cp; 3801300Sbill 3811300Sbill while (*dp++ &= TRIM) 3821300Sbill continue; 3831300Sbill return (cp); 3841300Sbill } 3851300Sbill 3861300Sbill udvar(name) 3871300Sbill char *name; 3881300Sbill { 3891300Sbill 3901300Sbill setname(name); 3911300Sbill bferr("Undefined variable"); 3921300Sbill } 3931300Sbill 3941300Sbill prefix(sub, str) 3951300Sbill register char *sub, *str; 3961300Sbill { 3971300Sbill 3981300Sbill for (;;) { 3991300Sbill if (*sub == 0) 4001300Sbill return (1); 4011300Sbill if (*str == 0) 4021300Sbill return (0); 4031300Sbill if (*sub++ != *str++) 4041300Sbill return (0); 4051300Sbill } 4061300Sbill } 407