add Berkeley specific copyright notice
[unix-history] / usr / src / old / dbx / main.c
index be281dd..27c4456 100644 (file)
@@ -1,6 +1,29 @@
-/* Copyright (c) 1982 Regents of the University of California */
+/*
+ * Copyright (c) 1983 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
 
 
-static char sccsid[] = "@(#)main.c     1.10 (Berkeley) %G%";
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1983 The Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)main.c     5.6 (Berkeley) %G%";
+#endif /* not lint */
 
 /*
  * Debugger main routine.
 
 /*
  * Debugger main routine.
@@ -11,53 +34,72 @@ static      char sccsid[] = "@(#)main.c     1.10 (Berkeley) %G%";
 #include <signal.h>
 #include <errno.h>
 #include "main.h"
 #include <signal.h>
 #include <errno.h>
 #include "main.h"
+#include "tree.h"
+#include "eval.h"
+#include "debug.h"
 #include "symbols.h"
 #include "scanner.h"
 #include "symbols.h"
 #include "scanner.h"
+#include "keywords.h"
 #include "process.h"
 #include "runtime.h"
 #include "source.h"
 #include "object.h"
 #include "mappings.h"
 #include "process.h"
 #include "runtime.h"
 #include "source.h"
 #include "object.h"
 #include "mappings.h"
+#include "coredump.h"
+#include "pathnames.h"
 
 #ifndef public
 
 #define isterm(file)   (interactive or isatty(fileno(file)))
 
 
 #ifndef public
 
 #define isterm(file)   (interactive or isatty(fileno(file)))
 
-#include <sgtty.h>
-#include <fcntl.h>
-
-typedef struct {
-       struct sgttyb   sg;             /* standard sgttyb structure */
-       struct tchars   tc;             /* terminal characters */
-       struct ltchars  ltc;            /* local special characters */
-       int             ldisc;          /* line discipline */
-       int             local;          /* TIOCLGET */
-       int             fcflags;        /* fcntl(2) F_GETFL, F_SETFL */
-} Ttyinfo;
+#ifdef IRIS
+#   include <termio.h>
+
+    typedef struct termio Ttyinfo;
+#else
+#   include <sgtty.h>
+#   include <fcntl.h>
+
+    typedef struct {
+       struct sgttyb sg;               /* standard sgttyb structure */
+       struct tchars tc;               /* terminal characters */
+       struct ltchars ltc;             /* local special characters */
+       integer ldisc;                  /* line discipline */
+       integer local;                  /* TIOCLGET */
+       integer fcflags;                /* fcntl(2) F_GETFL, F_SETFL */
+    } Ttyinfo;
+#endif
 
 #endif
 
 
 #endif
 
-public Boolean coredump;               /* true if using a core dump */
-public Boolean runfirst;               /* run program immediately */
-public Boolean interactive;            /* standard input IS a terminal */
-public Boolean lexdebug;               /* trace yylex return values */
-public Boolean tracebpts;              /* trace create/delete breakpoints */
-public Boolean traceexec;              /* trace process execution */
-public Boolean tracesyms;              /* print symbols as their read */
-public Boolean traceblocks;            /* trace blocks while reading symbols */
+public boolean coredump;               /* true if using a core dump */
+public boolean runfirst;               /* run program immediately */
+public boolean interactive;            /* standard input IS a terminal */
+public boolean lexdebug;               /* trace scanner return values */
+public boolean tracebpts;              /* trace create/delete breakpoints */
+public boolean traceexec;              /* trace execution */
+public boolean tracesyms;              /* print symbols are they are read */
+public boolean traceblocks;            /* trace blocks while reading symbols */
+public boolean vaddrs;                 /* map addresses through page tables */
+public boolean quiet;                  /* don't print heading */
+public boolean autostrip;              /* strip C++ prefixes */
 
 public File corefile;                  /* File id of core dump */
 
 
 public File corefile;                  /* File id of core dump */
 
+public integer versionNumber = 4;
+
 #define FIRST_TIME 0                   /* initial value setjmp returns */
 
 private Boolean initdone = false;      /* true if initialization done */
 private jmp_buf env;                   /* setjmp/longjmp data */
 #define FIRST_TIME 0                   /* initial value setjmp returns */
 
 private Boolean initdone = false;      /* true if initialization done */
 private jmp_buf env;                   /* setjmp/longjmp data */
+private char outbuf[BUFSIZ];           /* standard output buffer */
 private char namebuf[512];             /* possible name of object file */
 private char namebuf[512];             /* possible name of object file */
-private int firstarg;                  /* first program argument (for -r) */
 
 private Ttyinfo ttyinfo;
 
 private Ttyinfo ttyinfo;
+private String corename;               /* name of core file */
 
 private catchintr();
 
 private catchintr();
+private char **scanargs();
 
 /*
  * Main program.
 
 /*
  * Main program.
@@ -67,26 +109,33 @@ main(argc, argv)
 int argc;
 String argv[];
 {
 int argc;
 String argv[];
 {
-    register integer i;
-    extern String date;
     extern integer versionNumber;
     extern integer versionNumber;
+    char **scanargs();
+
+    if (!(cmdname = rindex(*argv, '/')))
+       cmdname = *argv;
+    else
+       ++cmdname;
 
 
-    cmdname = argv[0];
     catcherrs();
     onsyserr(EINTR, nil);
     catcherrs();
     onsyserr(EINTR, nil);
-    setlinebuf(stderr);
-    printf("dbx version %d of %s.\nType 'help' for help.\n",
-       versionNumber, date);
-    fflush(stdout);
-    scanargs(argc, argv);
+    onsyserr(EADDRINUSE, nil);
+    onsyserr(ENXIO, nil);
+    setbuf(stdout, outbuf);
+    argv = scanargs(argc, argv);
+    if (not runfirst and not quiet) {
+       printheading();
+    }
+    openfiles();
     language_init();
     language_init();
+    symbols_init();
     process_init();
     process_init();
+    optab_init();
     if (runfirst) {
        if (setjmp(env) == FIRST_TIME) {
            arginit();
     if (runfirst) {
        if (setjmp(env) == FIRST_TIME) {
            arginit();
-           for (i = firstarg; i < argc; i++) {
-               newarg(argv[i]);
-           }
+           while (*argv)
+               newarg(*argv++);
            run();
            /* NOTREACHED */
        } else {
            run();
            /* NOTREACHED */
        } else {
@@ -99,17 +148,21 @@ String argv[];
        restoretty(stdout, &ttyinfo);
     }
     signal(SIGINT, catchintr);
        restoretty(stdout, &ttyinfo);
     }
     signal(SIGINT, catchintr);
-    if (isterm(stdin)) {
-           printf("(%s) ", cmdname);
-           fflush(stdout);
-    }
-    endshellmode();            /* after an error longjmp */
-    startaliasing();
     yyparse();
     putchar('\n');
     quit(0);
 }
 
     yyparse();
     putchar('\n');
     quit(0);
 }
 
+public printheading ()
+{
+    extern String date;
+
+    printf("dbx version 3.%d of %s.\nType 'help' for help.\n",
+       versionNumber, date
+    );
+    fflush(stdout);
+}
+
 /*
  * Initialize the world, including setting initial input file
  * if the file exists.
 /*
  * Initialize the world, including setting initial input file
  * if the file exists.
@@ -134,6 +187,11 @@ public init()
     printf("\n");
     fflush(stdout);
     if (coredump) {
     printf("\n");
     fflush(stdout);
     if (coredump) {
+       printf("[using memory image in %s]\n", corename);
+       if (vaddrs) {
+           coredump_getkerinfo();
+       }
+       getsrcpos();
        setcurfunc(whatblock(pc));
     } else {
        setcurfunc(program);
        setcurfunc(whatblock(pc));
     } else {
        setcurfunc(program);
@@ -184,10 +242,10 @@ String outfile;
     String tmpfile;
     extern String mktemp();
 
     String tmpfile;
     extern String mktemp();
 
-    tmpfile = mktemp("/tmp/dbxXXXX");
+    tmpfile = mktemp(_PATH_TMP);
     setout(tmpfile);
     status();
     setout(tmpfile);
     status();
-    print_alias(nil);
+    alias(nil, nil, nil);
     if (argv != nil) {
        printf("run");
        for (i = 1; argv[i] != nil; i++) {
     if (argv != nil) {
        printf("run");
        for (i = 1; argv[i] != nil; i++) {
@@ -204,6 +262,7 @@ String outfile;
     unsetout();
     bpfree();
     objfree();
     unsetout();
     bpfree();
     objfree();
+    symbols_init();
     process_init();
     enterkeywords();
     scanner_init();
     process_init();
     enterkeywords();
     scanner_init();
@@ -219,7 +278,8 @@ String outfile;
 }
 
 /*
 }
 
 /*
- * After a non-fatal error we jump back to command parsing.
+ * After a non-fatal error we skip the rest of the current input line, and
+ * jump back to command parsing.
  */
 
 public erecover()
  */
 
 public erecover()
@@ -236,6 +296,10 @@ public erecover()
 
 private catchintr()
 {
 
 private catchintr()
 {
+    if (isredirected()) {
+       fflush(stdout);
+       unsetout();
+    }
     putchar('\n');
     longjmp(env, 1);
 }
     putchar('\n');
     longjmp(env, 1);
 }
@@ -244,14 +308,13 @@ private catchintr()
  * Scan the argument list.
  */
 
  * Scan the argument list.
  */
 
-private scanargs(argc, argv)
+private char **scanargs (argc, argv)
 int argc;
 String argv[];
 {
 int argc;
 String argv[];
 {
-    register int i, j;
-    register Boolean foundfile;
-    register File f;
-    char *tmp;
+    extern char *optarg;
+    extern integer optind;
+    integer ch;
 
     runfirst = false;
     interactive = false;
 
     runfirst = false;
     interactive = false;
@@ -260,41 +323,84 @@ String argv[];
     traceexec = false;
     tracesyms = false;
     traceblocks = false;
     traceexec = false;
     tracesyms = false;
     traceblocks = false;
-    foundfile = false;
+    vaddrs = false;
+    quiet = false;
+    autostrip = true;
     corefile = nil;
     coredump = true;
     sourcepath = list_alloc();
     list_append(list_item("."), nil, sourcepath);
     corefile = nil;
     coredump = true;
     sourcepath = list_alloc();
     list_append(list_item("."), nil, sourcepath);
-    i = 1;
-    while (i < argc and (not foundfile or corefile == nil)) {
-       if (argv[i][0] == '-') {
-           if (streq(argv[i], "-I")) {
-               ++i;
-               if (i >= argc) {
-                   fatal("missing directory for -I");
-               }
-               list_append(list_item(argv[i]), nil, sourcepath);
-           } else {
-               for (j = 1; argv[i][j] != '\0'; j++) {
-                   setoption(argv[i][j]);
-               }
-           }
-       } else if (not foundfile) {
-           objname = argv[i];
-           foundfile = true;
-       } else if (coredump and corefile == nil) {
-           corefile = fopen(argv[i], "r");
-           if (corefile == nil) {
+
+    while ((ch = getopt(argc, argv, "I:abc:eiklnqrs")) != EOF)
+    switch((char)ch) {
+       case 'I':
+               list_append(list_item(optarg), nil, sourcepath);
+               break;
+       case 'a':
+               autostrip = false;
+               break;
+       case 'b':
+               tracebpts = true;
+               break;
+       case 'c':
+               initfile = optarg;
+               break;
+       case 'e':
+               traceexec = true;
+               break;
+       case 'i':
+               interactive = true;
+               break;
+       case 'k':
+               vaddrs = true;
+               break;
+       case 'l':
+#ifdef LEXDEBUG
+               lexdebug = true;
+#else
+               fatal("\"-l\" only applicable when compiled with LEXDEBUG");
+#endif
+               break;
+       case 'n':
+               traceblocks = true;
+               break;
+       case 'q':
+               quiet = true;
+               break;
+       case 'r':       /* run program before accepting commands */
+               runfirst = true;
                coredump = false;
                coredump = false;
-           }
+               break;
+       case 's':
+               tracesyms = true;
+               break;
+       case '?':
+       default:
+               fatal("unknown option");
+    }
+    argv += optind;
+    if (*argv) {
+       objname = *argv;
+       if (*++argv && coredump) {
+               corename = *argv;
+               corefile = fopen(*argv, "r");
+               if (corefile == nil)
+                       coredump = false;
+               ++argv;
        }
        }
-       ++i;
     }
     }
-    if (i < argc and not runfirst) {
-       fatal("extraneous argument %s", argv[i]);
+    if (*argv and not runfirst) {
+       fatal("extraneous argument %s", *argv);
     }
     }
-    firstarg = i;
-    if (not foundfile and isatty(0)) {
+    return argv;
+}
+
+private openfiles ()
+{
+    File f;
+    char *tmp;
+
+    if (objname == nil and isatty(0)) {
        printf("enter object file name (default is `%s'): ", objname);
        fflush(stdout);
        gets(namebuf);
        printf("enter object file name (default is `%s'): ", objname);
        fflush(stdout);
        gets(namebuf);
@@ -314,55 +420,22 @@ String argv[];
        list_append(list_item(tmp), nil, sourcepath);
     }
     if (coredump and corefile == nil) {
        list_append(list_item(tmp), nil, sourcepath);
     }
     if (coredump and corefile == nil) {
-       corefile = fopen("core", "r");
-       if (corefile == nil) {
-           coredump = false;
+       if (vaddrs) {
+           corename = _PATH_MEM;
+           corefile = fopen(corename, "r");
+           if (corefile == nil) {
+               panic("can't open %s", _PATH_MEM);
+           }
+       } else {
+           corename = "core";
+           corefile = fopen(corename, "r");
+           if (corefile == nil) {
+               coredump = false;
+           }
        }
     }
 }
 
        }
     }
 }
 
-/*
- * Take appropriate action for recognized command argument.
- */
-
-private setoption(c)
-char c;
-{
-    switch (c) {
-       case 'r':   /* run program before accepting commands */
-           runfirst = true;
-           coredump = false;
-           break;
-
-       case 'i':
-           interactive = true;
-           break;
-
-       case 'b':
-           tracebpts = true;
-           break;
-
-       case 'e':
-           traceexec = true;
-           break;
-
-       case 's':
-           tracesyms = true;
-           break;
-
-       case 'n':
-           traceblocks = true;
-           break;
-
-       case 'l':
-               lexdebug = true;
-           break;
-
-       default:
-           fatal("unknown option '%c'", c);
-    }
-}
-
 /*
  * Save/restore the state of a tty.
  */
 /*
  * Save/restore the state of a tty.
  */
@@ -371,24 +444,40 @@ public savetty(f, t)
 File f;
 Ttyinfo *t;
 {
 File f;
 Ttyinfo *t;
 {
-    ioctl(fileno(f), TIOCGETP, &(t->sg));
-    ioctl(fileno(f), TIOCGETC, &(t->tc));
-    ioctl(fileno(f), TIOCGLTC, &(t->ltc));
-    ioctl(fileno(f), TIOCGETD, &(t->ldisc));
-    ioctl(fileno(f), TIOCLGET, &(t->local));
-    t->fcflags = fcntl(fileno(f), F_GETFL, 0);
+#   ifdef IRIS
+       ioctl(fileno(f), TCGETA, t);
+#   else
+       ioctl(fileno(f), TIOCGETP, &(t->sg));
+       ioctl(fileno(f), TIOCGETC, &(t->tc));
+       ioctl(fileno(f), TIOCGLTC, &(t->ltc));
+       ioctl(fileno(f), TIOCGETD, &(t->ldisc));
+       ioctl(fileno(f), TIOCLGET, &(t->local));
+       t->fcflags = fcntl(fileno(f), F_GETFL, 0);
+       if ((t->fcflags&FASYNC) != 0) {
+           /* fprintf(stderr, "[async i/o found set -- reset]\n"); */
+           t->fcflags &= ~FASYNC;
+       }
+#   endif
 }
 
 public restoretty(f, t)
 File f;
 Ttyinfo *t;
 {
 }
 
 public restoretty(f, t)
 File f;
 Ttyinfo *t;
 {
-    ioctl(fileno(f), TIOCSETN, &(t->sg));
-    ioctl(fileno(f), TIOCSETC, &(t->tc));
-    ioctl(fileno(f), TIOCSLTC, &(t->ltc));
-    ioctl(fileno(f), TIOCSETD, &(t->ldisc));
-    ioctl(fileno(f), TIOCLSET, &(t->local));
-    (void) fcntl(fileno(f), F_SETFL, t->fcflags);
+#   ifdef IRIS
+       ioctl(fileno(f), TCSETA, t);
+#   else
+       ioctl(fileno(f), TIOCSETN, &(t->sg));
+       ioctl(fileno(f), TIOCSETC, &(t->tc));
+       ioctl(fileno(f), TIOCSLTC, &(t->ltc));
+       ioctl(fileno(f), TIOCSETD, &(t->ldisc));
+       ioctl(fileno(f), TIOCLSET, &(t->local));
+       if ((t->fcflags&FASYNC) != 0) {
+           /* fprintf(stderr, "[async i/o not set]\n"); */
+           t->fcflags &= ~FASYNC;
+       }
+       (void) fcntl(fileno(f), F_SETFL, t->fcflags);
+#   endif
 }
 
 /*
 }
 
 /*