1 /* Copyright (c) 1982 Regents of the University of California */ 2 3 static char sccsid[] = "@(#)misc.c 1.3 01/20/82"; 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 = "csvax:linton"; 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 } 151