|
|
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 7.1 2/5/81) ! 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() ! 101: { ! 102: register char chr; ! 103: int timevec[2]; ! 104: register int controlno; ! 105: extern jmp_buf CmReset; ! 106: extern error(); ! 107: extern char *Proc_name; ! 108: extern int RubLevel; ! 109: extern rubcatch(); ! 110: ! 111: setjmp(CmReset); ! 112: initbuf(Qbuf, QbufSize, ERR_QBUF, error); ! 113: clrmem(&Ctx, sizeof Ctx); ! 114: Ctx.ctx_cmark = Ctx.ctx_pmark = markbuf(Qbuf); ! 115: Ctx.ctx_name = Proc_name = Cm.cm_myname; ! 116: Ctx.ctx_tvect = tT = FuncVect[0]->fn_tvect; ! 117: xwait(); ! 118: if (RubLevel >= 0) ! 119: signal(SIGINT, rubcatch); ! 120: ! 121: while (chr = getch()) ! 122: { ! 123: if (chr == '\\') ! 124: { ! 125: /* process control sequence */ ! 126: if ((controlno = getescape(1)) == 0) ! 127: continue; ! 128: ! 129: switch (controlno) ! 130: { ! 131: ! 132: case C_EDIT: ! 133: edit(); ! 134: continue; ! 135: ! 136: case C_PRINT: ! 137: print(); ! 138: continue; ! 139: ! 140: case C_LIST: ! 141: eval(1); ! 142: continue; ! 143: ! 144: case C_EVAL: ! 145: eval(0); ! 146: Autoclear = TRUE; ! 147: continue; ! 148: ! 149: case C_INCLUDE: ! 150: include(0); ! 151: cgprompt(); ! 152: continue; ! 153: ! 154: case C_WRITE: ! 155: writeout(); ! 156: cgprompt(); ! 157: continue; ! 158: ! 159: case C_CHDIR: ! 160: newdirec(); ! 161: cgprompt(); ! 162: continue; ! 163: ! 164: case C_RESET: ! 165: clear(1); ! 166: continue; ! 167: ! 168: case C_GO: ! 169: go(); ! 170: continue; ! 171: ! 172: case C_QUIT: ! 173: clrline(1); ! 174: quit(); ! 175: ! 176: case C_SHELL: ! 177: shell(); ! 178: continue; ! 179: ! 180: case C_TIME: ! 181: time(timevec); ! 182: printf("%s", ctime(timevec)); ! 183: clrline(0); ! 184: continue; ! 185: ! 186: case C_APPEND: ! 187: Autoclear = 0; ! 188: clrline(0); ! 189: continue; ! 190: ! 191: case C_MARK: ! 192: getfilenm(); ! 193: prompt(0); ! 194: continue; ! 195: ! 196: case C_BRANCH: ! 197: branch(); ! 198: prompt(0); ! 199: continue; ! 200: ! 201: case C_SYSTRACE: ! 202: trace(); ! 203: prompt(0); ! 204: continue; ! 205: ! 206: case C_SYSRESET: ! 207: reset(); ! 208: clrline(0); ! 209: continue; ! 210: ! 211: default: ! 212: syserr("monitor: bad code %d", controlno); ! 213: } ! 214: } ! 215: putch(chr); ! 216: } ! 217: ! 218: if (Input == stdin) ! 219: { ! 220: if (Nodayfile >= 0) ! 221: printf("\n"); ! 222: } ! 223: else ! 224: fclose(Input); ! 225: } ! 226: ! 227: getescape(copy) ! 228: int copy; ! 229: { ! 230: register struct cntrlwd *cw; ! 231: register char *word; ! 232: char *getname(); ! 233: ! 234: word = getname(); ! 235: for (cw = Controlwords; cw->name; cw++) ! 236: { ! 237: if (sequal(cw->name, word)) ! 238: return (cw->code); ! 239: } ! 240: ! 241: /* not found -- pass symbol through and return failure */ ! 242: if (copy == 0) ! 243: return (0); ! 244: putch('\\'); ! 245: while (*word != 0) ! 246: { ! 247: putch(*word++); ! 248: } ! 249: return (0); ! 250: } ! 251: ! 252: char * ! 253: getname() ! 254: { ! 255: register char *p; ! 256: static char buf[41]; ! 257: register int len; ! 258: register char c; ! 259: ! 260: p = buf; ! 261: for (len = 0; len < 40; len++) ! 262: { ! 263: c = getch(); ! 264: if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) ! 265: { ! 266: *p++ = c; ! 267: } ! 268: else if ((len == 0) && (c == '$')) /* system control command */ ! 269: { ! 270: *p++ = c; ! 271: } ! 272: else ! 273: { ! 274: ungetc(c, Input); ! 275: break; ! 276: } ! 277: } ! 278: ! 279: *p = 0; ! 280: return (buf); ! 281: } ! 282: ! 283: ! 284: ! 285: putch(ch) ! 286: char ch; ! 287: { ! 288: register char c; ! 289: ! 290: c = ch; ! 291: ! 292: Prompt = Newline = (c == '\n'); ! 293: if (c < 040 && c != '\n' && c != '\t') ! 294: { ! 295: printf("Funny character 0%o converted to blank\n", c); ! 296: c = ' '; ! 297: } ! 298: prompt(0); ! 299: if (Autoclear) ! 300: clear(0); ! 301: putc(c, Qryiop); ! 302: Notnull++; ! 303: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.