|
|
1.1 root 1: #include <stdio.h>
2: #include "ctype.h"
3: #include "typedef.h"
4: #include "basic.h"
5: #include "tokens.h"
6: #include <signal.h>
7: #include <sys/types.h>
8: #include <sys/stat.h>
9:
10: #define RENBASE 100
11: #define RENINCR 10
12: #define MAXWORD 16
13:
14: char *tempfile = "_basicedit";
15: static char *cmds[] = {
16: "old", "save", "bye", "dump", "edit", "vi", "!", "fp",
17: "int", "load", "renumber", "list", "del", "scr", "run",
18: "clear", "auto", "catalog", "unsave", "bsave", "ren", "new",
19: "spool", 0
20: };
21:
22: Linep findline();
23: Lnr cvtlnr();
24:
25:
26: /*
27: * moncmd --- determine if the current line contains a monitor command
28: */
29:
30: moncmd()
31: {
32: register int i;
33: register char *s;
34: char *file, word[MAXWORD];
35: int line1, line2, line3, line4;
36:
37: inptr = line;
38: skipbl();
39: getword(word, MAXWORD);
40: for (i = 0; s = cmds[i]; ++i) {
41: if (*word == *s && strcmp(word, s) == 0) {
42: inptr += strlen(s);
43: skipbl();
44: switch (i) {
45: case 0: /* old */
46: case 9: /* load */
47: old(inptr);
48: fprintf(stderr, "%d lines\n",linecnt);
49: break;
50: case 22: /* spool - listing & run on lp
51: file = (*inptr == 0)? curfile : inptr;
52: exec("/bin/spool", "spool", file, 0); */
53: break;
54: case 1: /* save */
55: case 19: /* bsave */
56: file = (*inptr == 0)? curfile : inptr;
57: if (i == 1) /* save */
58: save(file);
59: else /* bsave */
60: fastsave(file);
61: fprintf(stderr, "%s saved\n", file);
62: break;
63: case 2: /* bye */
64: exit(0);
65: case 3: /* dump */
66: dumpsym();
67: break;
68: case 4: /* edit */
69: edit("/usr/ucb/edit");
70: break;
71: case 5: /* vi */
72: edit("/usr/ucb/vi");
73: break;
74: case 6: /* ! */
75: exec("/bin/sh", "sh", "-c", inptr, 0);
76: break;
77: case 7: /* fp */
78: apple();
79: prompt = "]";
80: break;
81: case 8: /* int */
82: apple();
83: prompt = ">";
84: break;
85: case 20: /* ren */
86: case 10: /* renumber */
87: line1 = RENBASE;
88: line2 = RENINCR;
89: getlnrs2(&line1, &line2, DEFAULTLNRS);
90: if (line1 == 0)
91: line1 = RENBASE;
92: if (line2 == 0)
93: line2 = RENINCR;
94: getlnrs(&line3, &line4, LISTLNRS);
95: renumber(line1, line2, line3, line4);
96: break;
97: case 11: /* list */
98: getlnrs(&line1, &line2, LISTLNRS);
99: list(line1, line2, stdout);
100: break;
101: case 12: /* delete */
102: getlnrs(&line1, &line2, LISTLNRS);
103: delete(line1, line2);
104: break;
105: case 21:
106: case 13: /* scratch */
107: delete(MINLNR, MAXLNR);
108: clrstk();
109: clrsym();
110: break;
111: case 14: /* run */
112: run();
113: break;
114: case 15: /* clear */
115: clrstk();
116: clrsym();
117: break;
118: case 16: /* auto */
119: line1 = RENBASE;
120: line2 = RENINCR;
121: getlnrs(&line1, &line2, DEFAULTLNRS);
122: autonumber(line1, line2);
123: break;
124: case 17: /* catalog */
125: exec("/bin/ls", "ls", inptr, 0);
126: break;
127: case 18: /* unsave */
128: exec("/bin/rm", "rm", inptr, 0);
129: break;
130: default:
131: return (NO);
132: }
133: return (YES);
134: }
135: }
136: return (NO);
137: }
138:
139:
140: /*
141: * getword --- fetch next word from input line
142: */
143:
144: getword(word, len)
145: char *word;
146: {
147: register char *p, *w;
148: register int c;
149:
150: p = inptr;
151: w = word;
152: if (*p == '!')
153: *w++ = *p;
154: else
155: do {
156: c = *p++;
157: if (isupper(c))
158: c = tolower(c);
159: if (islower(c))
160: *w++ = c;
161: else
162: break;
163: } while (--len > 0);
164: *w = 0;
165: }
166:
167:
168: /*
169: * apple ---
170: */
171:
172: apple()
173: {
174:
175: fprintf(stderr, "Now in Apple mode\n");
176: }
177:
178:
179: /*
180: * edit --- invoke and editor on the current program
181: */
182:
183: edit(file)
184: char *file;
185: {
186: struct stat statb;
187: long now;
188:
189: save(tempfile);
190: time(&now);
191: exec(file, file, tempfile, 0);
192: stat(tempfile, &statb);
193: if (statb.st_mtime > now)
194: old(tempfile);
195: unlink(tempfile);
196: }
197:
198:
199: /*
200: * exec --- execute the given command
201: */
202:
203: exec(file, args)
204: char *file, **args;
205: {
206: int status;
207: register int pid, i, (*oldattn)();
208:
209: if ((pid = fork()) == 0) {
210: closeall();
211: execv(file, &args);
212: fprintf(stderr, "no %s\n", file);
213: exit(1);
214: }
215: oldattn = signal(SIGINT, SIG_IGN);
216: while ((i = wait(&status)) != -1 && i != pid)
217: ;
218: signal(SIGINT, oldattn);
219: return (status);
220: }
221:
222:
223: /*
224: * chain --- replace the current program with a new one and execute it
225: */
226:
227: chain()
228: {
229: int len;
230: char *ptr, file[32];
231: Lnr lnr;
232:
233: expr();
234: popstring(&ptr, &len);
235: move(len, ptr, file);
236: file[len] = 0;
237: if (*inptr == COMMA) {
238: ++inptr;
239: lnr = cvtlnr();
240: }
241: else
242: lnr = MINLNR;
243: endchk();
244: old(file);
245: curline = findline(lnr, NEXTLNR);
246: inptr = NULL;
247: }
248:
249:
250: /*
251: * notimpl --- report an unimplemented construct
252: */
253:
254: notimpl()
255: {
256:
257: err("not implemented");
258: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.