|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.