1*48069Sbostic /*- 2*48069Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48069Sbostic * All rights reserved. 4*48069Sbostic * 5*48069Sbostic * %sccs.include.redist.c% 622560Sdist */ 75544Slinton 822560Sdist #ifndef lint 9*48069Sbostic static char sccsid[] = "@(#)misc.c 5.3 (Berkeley) 04/16/91"; 10*48069Sbostic #endif /* not lint */ 115544Slinton 125544Slinton /* 135544Slinton * Miscellaneous commands "edit" and "help". 145544Slinton * Also, output redirection routine "setout" and "unsetout". 155544Slinton */ 165544Slinton 175544Slinton #include "defs.h" 185544Slinton #include "tree.h" 195544Slinton #include "command.h" 205544Slinton #include "object.h" 215544Slinton #include "mappings.h" 225544Slinton #include "sym.h" 235544Slinton #include "symtab.h" 245544Slinton 255544Slinton extern char *getenv(); 265544Slinton 275544Slinton #define DEF_EDITOR "vi" 285544Slinton 295544Slinton /* 305544Slinton * Invoke an editor on the given file. Which editor to use might change 315544Slinton * installation to installation. For now, we use "vi". In any event, 325544Slinton * the environment variable "EDITOR" overrides any default. 335544Slinton */ 345544Slinton 355544Slinton edit(filename) 365544Slinton char *filename; 375544Slinton { 385544Slinton char *ed; 395544Slinton FILE *fp; 405544Slinton SYM *s; 415544Slinton ADDRESS addr; 425544Slinton char buff[10]; 435544Slinton 445544Slinton if ((ed = getenv("EDITOR")) == NIL) { 455544Slinton ed = DEF_EDITOR; 465544Slinton } 475544Slinton fp = fopen(filename, "r"); 485544Slinton if (fp == NIL) { 495544Slinton s = st_lookup(symtab, filename); 505544Slinton if (s == NIL) { 515544Slinton error("can't read \"%s\"", filename); 525544Slinton } 535544Slinton s = which(s); 545544Slinton if (!isblock(s)) { 555544Slinton error("can't read \"%s\"", filename); 565544Slinton } 575544Slinton addr = firstline(s); 585544Slinton filename = srcfilename(addr); 595544Slinton sprintf(buff, "+%d", srcline(addr)); 605544Slinton call(ed, stdin, stdout, buff, filename, NIL); 615544Slinton } else { 625544Slinton fclose(fp); 635544Slinton call(ed, stdin, stdout, filename, NIL); 645544Slinton } 655544Slinton } 665544Slinton 675544Slinton /* 685565Slinton * Send some nasty mail to the current pdx support person. 695565Slinton */ 705565Slinton 715565Slinton gripe() 725565Slinton { 7330852Smckusick char *maintainer = "4bsd-bugs@Berkeley.EDU"; 745565Slinton 755565Slinton puts("Type control-D to end your message. Be sure to include"); 765565Slinton puts("your name and the name of the file you are debugging."); 775565Slinton putchar('\n'); 785565Slinton call("Mail", stdin, stdout, maintainer, NIL); 795565Slinton puts("Thank you."); 805565Slinton } 815565Slinton 825565Slinton /* 835544Slinton * Give the user some help. 845544Slinton */ 855544Slinton 865544Slinton help() 875544Slinton { 885544Slinton puts("pdx command subset summary:"); 895544Slinton putchar('\n'); 905544Slinton puts("run - begin execution of the program"); 915544Slinton puts("cont - continue execution"); 925544Slinton puts("step - single step one line"); 935544Slinton puts("next - step to next line (skip over calls)"); 945544Slinton puts("trace <line#> - trace execution of the line"); 955544Slinton puts("trace <proc> - trace calls to the procedure"); 965544Slinton puts("trace <var> - trace changes to the variable"); 975544Slinton puts("trace <exp> at <line#> - print <exp> when <line> is reached"); 985544Slinton puts("stop at <line> - suspend execution at the line"); 995544Slinton puts("stop in <proc> - suspend execution when <proc> is called"); 1005544Slinton puts("status - print trace/stop's in effect"); 1015544Slinton puts("delete <number> - remove trace or stop of given number"); 1025544Slinton puts("call <proc> - call the procedure"); 1035544Slinton puts("where - print currently active procedures"); 1045544Slinton puts("print <exp> - print the value of the expression"); 1055544Slinton puts("whatis <name> - print the declaration of the name"); 1065591Slinton puts("list <line>, <line> - list source lines"); 1075591Slinton puts("edit <proc> - edit file containing <proc>"); 1085565Slinton puts("gripe - send mail to the person in charge of pdx"); 1095544Slinton puts("quit - exit pdx"); 1105544Slinton } 1115544Slinton 1125544Slinton /* 1135544Slinton * Divert output to the given file name. 1145544Slinton * Cannot redirect to an existing file. 1155544Slinton */ 1165544Slinton 1175544Slinton LOCAL int so_fd; 1185544Slinton LOCAL BOOLEAN notstdout; 1195544Slinton 1205544Slinton setout(filename) 1215544Slinton char *filename; 1225544Slinton { 1235544Slinton FILE *fp; 1245544Slinton 1255544Slinton if ((fp = fopen(filename, "r")) != NIL) { 1265544Slinton fclose(fp); 1275544Slinton error("%s: file already exists", filename); 1285544Slinton } else { 1295544Slinton so_fd = dup(1); 1305544Slinton close(1); 1315544Slinton if (creat(filename, 0666) == NIL) { 1325544Slinton unsetout(); 1335544Slinton error("can't create %s", filename); 1345544Slinton } 1355544Slinton notstdout = TRUE; 1365544Slinton } 1375544Slinton } 1385544Slinton 1395544Slinton /* 1405544Slinton * Revert output to standard output. 1415544Slinton */ 1425544Slinton 1435544Slinton unsetout() 1445544Slinton { 1455544Slinton fflush(stdout); 1465544Slinton close(1); 1475544Slinton if (dup(so_fd) != 1) { 1485544Slinton panic("standard out dup failed"); 1495544Slinton } 1505544Slinton close(so_fd); 1515544Slinton notstdout = FALSE; 1525544Slinton } 1535544Slinton 1545544Slinton BOOLEAN isredirected() 1555544Slinton { 1565544Slinton return(notstdout); 1575544Slinton } 158