|
|
1.1 root 1: # include "monitor.h"
2: # include <ingres.h>
3: # include <aux.h>
4: # include <signal.h>
5: # include <ctlmod.h>
6: # include <sccs.h>
7:
8: SCCSID(@(#)monitor.c 8.1 12/31/84)
9:
10:
11:
12: /*
13: ** MONITOR
14: **
15: ** This routine maintains the logical query buffer in
16: ** /tmp/INGQxxxx. It in general just does a copy from input
17: ** to query buffer, unless it gets a backslash escape character
18: ** or dollarsign escape character.
19: ** It recognizes the following escapes:
20: **
21: ** \a -- force append mode (no autoclear)
22: ** \b -- branch (within an include file only)
23: ** \c -- reserved for screen clear in geoquel
24: ** \d -- change working directory
25: ** \e -- enter editor
26: ** \g -- "GO": submit query to INGRES
27: ** \i -- include (switch input to external file)
28: ** \k -- mark (for \b)
29: ** \l -- list: print query buffer after macro evaluation
30: ** \p -- print query buffer (before macro evaluation)
31: ** \q -- quit ingres
32: ** \r -- force reset (clear) of query buffer
33: ** \s -- call shell
34: ** \t -- print current time
35: ** \v -- evaluate macros, but throw away result (for side effects)
36: ** \w -- write query buffer to external file
37: ** \$t -- change setting of trace flags
38: ** \$r -- reset system
39: ** \\ -- produce a single backslash in query buffer
40: **
41: ** Uses trace flag 2
42: */
43:
44: /*
45: ** COMMAND TABLE
46: ** To add synonyms for commands, add entries to this table
47: */
48:
49: struct cntrlwd
50: {
51: char *name;
52: int code;
53: };
54:
55: struct cntrlwd Controlwords[] =
56: {
57: "a", C_APPEND,
58: "append", C_APPEND,
59: "b", C_BRANCH,
60: "branch", C_BRANCH,
61: "cd", C_CHDIR,
62: "chdir", C_CHDIR,
63: "e", C_EDIT,
64: "ed", C_EDIT,
65: "edit", C_EDIT,
66: "editor", C_EDIT,
67: "g", C_GO,
68: "go", C_GO,
69: "i", C_INCLUDE,
70: "include", C_INCLUDE,
71: "read", C_INCLUDE,
72: "k", C_MARK,
73: "mark", C_MARK,
74: "l", C_LIST,
75: "list", C_LIST,
76: "p", C_PRINT,
77: "print", C_PRINT,
78: "q", C_QUIT,
79: "quit", C_QUIT,
80: "r", C_RESET,
81: "reset", C_RESET,
82: "s", C_SHELL,
83: "sh", C_SHELL,
84: "shell", C_SHELL,
85: "t", C_TIME,
86: "time", C_TIME,
87: "date", C_TIME,
88: "v", C_EVAL,
89: "eval", C_EVAL,
90: "w", C_WRITE,
91: "write", C_WRITE,
92: "$t", C_SYSTRACE,
93: "$trace", C_SYSTRACE,
94: "$r", C_SYSRESET,
95: "$reset", C_SYSRESET,
96: 0
97: };
98:
99:
100: monitor(recurs)
101: int recurs; /* Is this a recursive call? */
102: {
103: register char chr;
104: int timevec[2];
105: register int controlno;
106: extern jmp_buf CmReset;
107: extern error();
108: extern char *Proc_name;
109: extern int RubLevel;
110: extern rubcatch();
111:
112: if ( recurs == FALSE )
113: setjmp(CmReset);
114: initbuf(Qbuf, QbufSize, ERR_QBUF, error);
115: clrmem(&Ctx, sizeof Ctx);
116: Ctx.ctx_cmark = Ctx.ctx_pmark = markbuf(Qbuf);
117: Ctx.ctx_name = Proc_name = Cm.cm_myname;
118: Ctx.ctx_tvect = tT = FuncVect[0]->fn_tvect;
119: xwait();
120: if (RubLevel >= 0)
121: signal(SIGINT, rubcatch);
122:
123: while (chr = getch())
124: {
125: if (chr == '\\')
126: {
127:
128: /*
129: ** do not process "\\" as an escape char
130: */
131: if ((chr = getch()) == '\\')
132: {
133: putch(chr);
134: putch(chr);
135: continue;
136: }
137: else
138: ungetc(chr, Input);
139:
140: /* process control sequence */
141: if ((controlno = getescape(1)) == 0)
142: continue;
143:
144: switch (controlno)
145: {
146:
147: case C_EDIT:
148: edit();
149: continue;
150:
151: case C_PRINT:
152: print();
153: continue;
154:
155: case C_LIST:
156: eval(1);
157: continue;
158:
159: case C_EVAL:
160: eval(0);
161: Autoclear = TRUE;
162: continue;
163:
164: case C_INCLUDE:
165: include(0);
166: cgprompt();
167: continue;
168:
169: case C_WRITE:
170: writeout();
171: cgprompt();
172: continue;
173:
174: case C_CHDIR:
175: newdirec();
176: cgprompt();
177: continue;
178:
179: case C_RESET:
180: clear(1);
181: continue;
182:
183: case C_GO:
184: go();
185: continue;
186:
187: case C_QUIT:
188: clrline(1);
189: quit();
190:
191: case C_SHELL:
192: shell();
193: continue;
194:
195: case C_TIME:
196: time(timevec);
197: printf("%s", ctime(timevec));
198: clrline(0);
199: continue;
200:
201: case C_APPEND:
202: Autoclear = 0;
203: clrline(0);
204: continue;
205:
206: case C_MARK:
207: getfilenm();
208: prompt(0);
209: continue;
210:
211: case C_BRANCH:
212: branch();
213: prompt(0);
214: continue;
215:
216: case C_SYSTRACE:
217: trace();
218: prompt(0);
219: continue;
220:
221: case C_SYSRESET:
222: reset();
223: clrline(0);
224: continue;
225:
226: default:
227: syserr("monitor: bad code %d", controlno);
228: }
229: }
230: putch(chr);
231: }
232:
233: if (Input == stdin)
234: {
235: if (Nodayfile >= 0)
236: printf("\n");
237: }
238: else
239: fclose(Input);
240: }
241:
242: getescape(copy)
243: int copy;
244: {
245: register struct cntrlwd *cw;
246: register char *word;
247: char *getname();
248:
249: word = getname();
250: for (cw = Controlwords; cw->name; cw++)
251: {
252: if (sequal(cw->name, word))
253: return (cw->code);
254: }
255:
256: /* not found -- pass symbol through and return failure */
257: if (copy == 0)
258: return (0);
259: putch('\\');
260: while (*word != 0)
261: {
262: putch(*word++);
263: }
264: return (0);
265: }
266:
267: char *
268: getname()
269: {
270: register char *p;
271: static char buf[41];
272: register int len;
273: register char c;
274:
275: p = buf;
276: for (len = 0; len < 40; len++)
277: {
278: c = getch();
279: if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
280: {
281: *p++ = c;
282: }
283: else if ((len == 0) && (c == '$')) /* system control command */
284: {
285: *p++ = c;
286: }
287: else
288: {
289: ungetc(c, Input);
290: break;
291: }
292: }
293:
294: *p = 0;
295: return (buf);
296: }
297:
298:
299:
300: putch(ch)
301: char ch;
302: {
303: register char c;
304:
305: c = ch;
306:
307: Prompt = Newline = (c == '\n');
308: if (c < 040 && c != '\n' && c != '\t')
309: {
310: printf("Funny character 0%o converted to blank\n", c);
311: c = ' ';
312: }
313: prompt(0);
314: if (Autoclear)
315: clear(0);
316: putc(c, Qryiop);
317: Notnull++;
318: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.