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