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