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