|
|
1.1 ! root 1: /* Copyright (c) 1982 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)misc.c 1.4 5/26/83"; ! 4: ! 5: /* ! 6: * Miscellaneous commands "edit" and "help". ! 7: * Also, output redirection routine "setout" and "unsetout". ! 8: */ ! 9: ! 10: #include "defs.h" ! 11: #include "tree.h" ! 12: #include "command.h" ! 13: #include "object.h" ! 14: #include "mappings.h" ! 15: #include "sym.h" ! 16: #include "symtab.h" ! 17: ! 18: extern char *getenv(); ! 19: ! 20: #define DEF_EDITOR "vi" ! 21: ! 22: /* ! 23: * Invoke an editor on the given file. Which editor to use might change ! 24: * installation to installation. For now, we use "vi". In any event, ! 25: * the environment variable "EDITOR" overrides any default. ! 26: */ ! 27: ! 28: edit(filename) ! 29: char *filename; ! 30: { ! 31: char *ed; ! 32: FILE *fp; ! 33: SYM *s; ! 34: ADDRESS addr; ! 35: char buff[10]; ! 36: ! 37: if ((ed = getenv("EDITOR")) == NIL) { ! 38: ed = DEF_EDITOR; ! 39: } ! 40: fp = fopen(filename, "r"); ! 41: if (fp == NIL) { ! 42: s = st_lookup(symtab, filename); ! 43: if (s == NIL) { ! 44: error("can't read \"%s\"", filename); ! 45: } ! 46: s = which(s); ! 47: if (!isblock(s)) { ! 48: error("can't read \"%s\"", filename); ! 49: } ! 50: addr = firstline(s); ! 51: filename = srcfilename(addr); ! 52: sprintf(buff, "+%d", srcline(addr)); ! 53: call(ed, stdin, stdout, buff, filename, NIL); ! 54: } else { ! 55: fclose(fp); ! 56: call(ed, stdin, stdout, filename, NIL); ! 57: } ! 58: } ! 59: ! 60: /* ! 61: * Send some nasty mail to the current pdx support person. ! 62: */ ! 63: ! 64: gripe() ! 65: { ! 66: char *maintainer = "linton@ucbvax"; ! 67: ! 68: puts("Type control-D to end your message. Be sure to include"); ! 69: puts("your name and the name of the file you are debugging."); ! 70: putchar('\n'); ! 71: call("Mail", stdin, stdout, maintainer, NIL); ! 72: puts("Thank you."); ! 73: } ! 74: ! 75: /* ! 76: * Give the user some help. ! 77: */ ! 78: ! 79: help() ! 80: { ! 81: puts("pdx command subset summary:"); ! 82: putchar('\n'); ! 83: puts("run - begin execution of the program"); ! 84: puts("cont - continue execution"); ! 85: puts("step - single step one line"); ! 86: puts("next - step to next line (skip over calls)"); ! 87: puts("trace <line#> - trace execution of the line"); ! 88: puts("trace <proc> - trace calls to the procedure"); ! 89: puts("trace <var> - trace changes to the variable"); ! 90: puts("trace <exp> at <line#> - print <exp> when <line> is reached"); ! 91: puts("stop at <line> - suspend execution at the line"); ! 92: puts("stop in <proc> - suspend execution when <proc> is called"); ! 93: puts("status - print trace/stop's in effect"); ! 94: puts("delete <number> - remove trace or stop of given number"); ! 95: puts("call <proc> - call the procedure"); ! 96: puts("where - print currently active procedures"); ! 97: puts("print <exp> - print the value of the expression"); ! 98: puts("whatis <name> - print the declaration of the name"); ! 99: puts("list <line>, <line> - list source lines"); ! 100: puts("edit <proc> - edit file containing <proc>"); ! 101: puts("gripe - send mail to the person in charge of pdx"); ! 102: puts("quit - exit pdx"); ! 103: } ! 104: ! 105: /* ! 106: * Divert output to the given file name. ! 107: * Cannot redirect to an existing file. ! 108: */ ! 109: ! 110: LOCAL int so_fd; ! 111: LOCAL BOOLEAN notstdout; ! 112: ! 113: setout(filename) ! 114: char *filename; ! 115: { ! 116: FILE *fp; ! 117: ! 118: if ((fp = fopen(filename, "r")) != NIL) { ! 119: fclose(fp); ! 120: error("%s: file already exists", filename); ! 121: } else { ! 122: so_fd = dup(1); ! 123: close(1); ! 124: if (creat(filename, 0666) == NIL) { ! 125: unsetout(); ! 126: error("can't create %s", filename); ! 127: } ! 128: notstdout = TRUE; ! 129: } ! 130: } ! 131: ! 132: /* ! 133: * Revert output to standard output. ! 134: */ ! 135: ! 136: unsetout() ! 137: { ! 138: fflush(stdout); ! 139: close(1); ! 140: if (dup(so_fd) != 1) { ! 141: panic("standard out dup failed"); ! 142: } ! 143: close(so_fd); ! 144: notstdout = FALSE; ! 145: } ! 146: ! 147: BOOLEAN isredirected() ! 148: { ! 149: return(notstdout); ! 150: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.