Annotation of 43BSDReno/contrib/emacs-18.55/gdb/main.c, revision 1.1.1.1

1.1       root        1: /* Top level for GDB, the GNU debugger.
                      2:    Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc.
                      3: 
                      4: GDB is distributed in the hope that it will be useful, but WITHOUT ANY
                      5: WARRANTY.  No author or distributor accepts responsibility to anyone
                      6: for the consequences of using it or for whether it serves any
                      7: particular purpose or works at all, unless he says so in writing.
                      8: Refer to the GDB General Public License for full details.
                      9: 
                     10: Everyone is granted permission to copy, modify and redistribute GDB,
                     11: but only under the conditions described in the GDB General Public
                     12: License.  A copy of this license is supposed to have been given to you
                     13: along with GDB so you can know your rights and responsibilities.  It
                     14: should be in a file named COPYING.  Among other things, the copyright
                     15: notice and this notice must be preserved on all copies.
                     16: 
                     17: In other words, go ahead and share GDB, but don't try to stop
                     18: anyone else from sharing it farther.  Help stamp out software hoarding!
                     19: */
                     20: 
                     21: #include <sys/file.h>
                     22: #include <stdio.h>
                     23: #include <setjmp.h>
                     24: #include <signal.h>
                     25: #include <sys/param.h>
                     26: #include "defs.h"
                     27: #include "command.h"
                     28: #include "param.h"
                     29: 
                     30: #ifdef SET_STACK_LIMIT_HUGE
                     31: #include <sys/time.h>
                     32: #include <sys/resource.h>
                     33: #endif
                     34: 
                     35: /* Version number of GDB, as a string.  */
                     36: 
                     37: extern char *version;
                     38: 
                     39: /* Chain containing all defined commands.  */
                     40: 
                     41: struct cmd_list_element *cmdlist;
                     42: 
                     43: /* Chain containing all defined info subcommands.  */
                     44: 
                     45: struct cmd_list_element *infolist;
                     46: 
                     47: /* stdio stream that command input is being read from.  */
                     48: 
                     49: FILE *instream;
                     50: 
                     51: /* Current working directory.  */
                     52: 
                     53: char *current_directory;
                     54: 
                     55: /* The directory name is actually stored here (usually).  */
                     56: static char dirbuf[MAXPATHLEN];
                     57: 
                     58: /* Nonzero if we should refrain from using an X window.  */
                     59: 
                     60: int inhibit_windows = 0;
                     61: 
                     62: /* Hook for window manager argument parsing.  */
                     63: 
                     64: int *win_argc;
                     65: char **win_argv;
                     66: char *win_prgm;
                     67: 
                     68: /* Function to call before reading a command, if nonzero.
                     69:    The function receives two args: an input stream,
                     70:    and a prompt string.  */
                     71:    
                     72: void (*window_hook) ();
                     73: 
                     74: extern int frame_file_full_name;
                     75: 
                     76: void free_command_lines ();
                     77: char *read_line ();
                     78: static void initialize_main ();
                     79: void command_loop ();
                     80: static void source_command ();
                     81: void print_gdb_version ();
                     82: 
                     83: /* gdb prints this when reading a command interactively */
                     84: static char *prompt;
                     85: 
                     86: /* Buffer used for reading command lines, and the size
                     87:    allocated for it so far.  */
                     88: 
                     89: char *line;
                     90: int linesize;
                     91: 
                     92: /* This is how `error' returns to command level.  */
                     93: 
                     94: jmp_buf to_top_level;
                     95: 
                     96: return_to_top_level ()
                     97: {
                     98:   quit_flag = 0;
                     99:   immediate_quit = 0;
                    100:   clear_breakpoint_commands ();
                    101:   clear_momentary_breakpoints ();
                    102:   delete_current_display ();
                    103:   do_cleanups (0);
                    104:   longjmp (to_top_level, 1);
                    105: }
                    106: 
                    107: /* Call FUNC with arg ARG, catching any errors.
                    108:    If there is no error, return the value returned by FUNC.
                    109:    If there is an error, return zero after printing ERRSTRING
                    110:     (which is in addition to the specific error message already printed).  */
                    111: 
                    112: int
                    113: catch_errors (func, arg, errstring)
                    114:      int (*func) ();
                    115:      int arg;
                    116:      char *errstring;
                    117: {
                    118:   jmp_buf saved;
                    119:   int val;
                    120: 
                    121:   bcopy (to_top_level, saved, sizeof (jmp_buf));
                    122: 
                    123:   if (setjmp (to_top_level) == 0)
                    124:     val = (*func) (arg);
                    125:   else
                    126:     {
                    127:       fprintf (stderr, "%s\n", errstring);
                    128:       val = 0;
                    129:     }
                    130: 
                    131:   bcopy (saved, to_top_level, sizeof (jmp_buf));
                    132:   return val;
                    133: }
                    134: 
                    135: /* Handler for SIGHUP.  */
                    136: 
                    137: static void
                    138: disconnect ()
                    139: {
                    140:   kill_inferior_fast ();
                    141:   signal (SIGHUP, SIG_DFL);
                    142:   kill (getpid (), SIGHUP);
                    143: }
                    144: 
                    145: main (argc, argv, envp)
                    146:      int argc;
                    147:      char **argv;
                    148:      char **envp;
                    149: {
                    150:   extern void request_quit ();
                    151:   int count;
                    152:   int inhibit_gdbinit = 0;
                    153:   int quiet = 0;
                    154:   int batch = 0;
                    155:   register int i;
                    156: 
                    157:   quit_flag = 0;
                    158:   linesize = 100;
                    159:   line = (char *) xmalloc (linesize);
                    160:   instream = stdin;
                    161: 
                    162:   getwd (dirbuf);
                    163:   current_directory = dirbuf;
                    164: 
                    165:   win_argc = &argc;
                    166:   win_argv = argv;
                    167:   win_prgm = argv[0];
                    168: 
                    169: #ifdef SET_STACK_LIMIT_HUGE
                    170:   {
                    171:     struct rlimit rlim;
                    172: 
                    173:     /* Set the stack limit huge so that alloca (particularly stringtab
                    174:      * in dbxread.c) does not fail. */
                    175:     getrlimit (RLIMIT_STACK, &rlim);
                    176:     rlim.rlim_cur = rlim.rlim_max;
                    177:     setrlimit (RLIMIT_STACK, &rlim);
                    178:   }
                    179: #endif /* SET_STACK_LIMIT_HUGE */
                    180: 
                    181:   /* Look for flag arguments.  */
                    182: 
                    183:   for (i = 1; i < argc; i++)
                    184:     {
                    185:       if (!strcmp (argv[i], "-q") || !strcmp (argv[i], "-quiet"))
                    186:        quiet = 1;
                    187:       else if (!strcmp (argv[i], "-nx"))
                    188:        inhibit_gdbinit = 1;
                    189:       else if (!strcmp (argv[i], "-nw"))
                    190:        inhibit_windows = 1;
                    191:       else if (!strcmp (argv[i], "-batch"))
                    192:        batch = 1, quiet = 1;
                    193:       else if (!strcmp (argv[i], "-fullname"))
                    194:        frame_file_full_name = 1;
                    195:       else if (argv[i][0] == '-')
                    196:        i++;
                    197:     }
                    198: 
                    199:   /* Run the init function of each source file */
                    200: 
                    201:   initialize_all_files ();
                    202:   initialize_main ();          /* But that omits this file!  Do it now */
                    203: 
                    204:   signal (SIGINT, request_quit);
                    205:   signal (SIGQUIT, SIG_IGN);
                    206:   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
                    207:     signal (SIGHUP, disconnect);
                    208: 
                    209:   if (!quiet)
                    210:     print_gdb_version ();
                    211: 
                    212:   /* Process the command line arguments.  */
                    213: 
                    214:   count = 0;
                    215:   for (i = 1; i < argc; i++)
                    216:     {
                    217:       register char *arg = argv[i];
                    218:       /* Args starting with - say what to do with the following arg
                    219:         as a filename.  */
                    220:       if (arg[0] == '-')
                    221:        {
                    222:          extern void exec_file_command (), symbol_file_command ();
                    223:          extern void core_file_command (), directory_command ();
                    224:          extern void tty_command ();
                    225: 
                    226:          if (!strcmp (arg, "-q") || !strcmp (arg, "-nx")
                    227:              || !strcmp (arg, "-quiet") || !strcmp (arg, "-batch")
                    228:              || !strcmp (arg, "-fullname"))
                    229:            /* Already processed above */
                    230:            continue;
                    231: 
                    232:          if (++i == argc)
                    233:            fprintf (stderr, "No argument follows \"%s\".\n", arg);
                    234:          if (!setjmp (to_top_level))
                    235:            {
                    236:              /* -s foo: get syms from foo.  -e foo: execute foo.
                    237:                 -se foo: do both with foo.  -c foo: use foo as core dump.  */
                    238:              if (!strcmp (arg, "-se"))
                    239:                {
                    240:                  exec_file_command (argv[i], !batch);
                    241:                  symbol_file_command (argv[i], !batch);
                    242:                }
                    243:              else if (!strcmp (arg, "-s") || !strcmp (arg, "-symbols"))
                    244:                symbol_file_command (argv[i], !batch);
                    245:              else if (!strcmp (arg, "-e") || !strcmp (arg, "-exec"))
                    246:                exec_file_command (argv[i], !batch);
                    247:              else if (!strcmp (arg, "-c") || !strcmp (arg, "-core"))
                    248:                core_file_command (argv[i], !batch);
                    249:              /* -x foo: execute commands from foo.  */
                    250:              else if (!strcmp (arg, "-x") || !strcmp (arg, "-command")
                    251:                       || !strcmp (arg, "-commands"))
                    252:                source_command (argv[i]);
                    253:              /* -d foo: add directory `foo' to source-file directory
                    254:                         search-list */
                    255:              else if (!strcmp (arg, "-d") || !strcmp (arg, "-dir")
                    256:                       || !strcmp (arg, "-directory"))
                    257:                directory_command (argv[i], 0);
                    258:              /* -cd FOO: specify current directory as FOO.
                    259:                 GDB remembers the precise string FOO as the dirname.  */
                    260:              else if (!strcmp (arg, "-cd"))
                    261:                {
                    262:                  int len = strlen (argv[i]);
                    263:                  current_directory = argv[i];
                    264:                  if (len > 1 && current_directory[len - 1] == '/')
                    265:                    current_directory = savestring (current_directory, len-1);
                    266:                  chdir (current_directory);
                    267:                  init_source_path ();
                    268:                }
                    269:              /* -t /def/ttyp1: use /dev/ttyp1 for inferior I/O.  */
                    270:              else if (!strcmp (arg, "-t") || !strcmp (arg, "-tty"))
                    271:                tty_command (argv[i], 0);
                    272:              else
                    273:                error ("Unknown command-line switch: \"%s\"\n", arg);
                    274:            }
                    275:        }
                    276:       else
                    277:        {
                    278:          /* Args not thus accounted for
                    279:             are treated as, first, the symbol/executable file
                    280:             and, second, the core dump file.  */
                    281:          count++;
                    282:          if (!setjmp (to_top_level))
                    283:            switch (count)
                    284:              {
                    285:              case 1:
                    286:                exec_file_command (arg, !batch);
                    287:                symbol_file_command (arg, !batch);
                    288:                break;
                    289: 
                    290:              case 2:
                    291:                core_file_command (arg, !batch);
                    292:                break;
                    293: 
                    294:              case 3:
                    295:                fprintf (stderr, "Excess command line args ignored. (%s%s)\n",
                    296:                         arg, (i == argc - 1) ? "" : " ...");
                    297:              }
                    298:        }
                    299:     }
                    300: 
                    301:   /* Read init file, if it exists in home directory  */
                    302:   if (getenv ("HOME"))
                    303:     {
                    304:       char *s;
                    305:       s = (char *) xmalloc (strlen (getenv ("HOME")) + 10);
                    306:       strcpy (s, getenv ("HOME"));
                    307:       strcat (s, "/.gdbinit");
                    308:       if (!inhibit_gdbinit && access (s, R_OK) == 0)
                    309:        if (!setjmp (to_top_level))
                    310:          source_command (s);
                    311:     }
                    312: 
                    313:   /* Read init file, if it exists in current directory.  */
                    314:   if (!inhibit_gdbinit && access (".gdbinit", R_OK) == 0)
                    315:     if (!setjmp (to_top_level))
                    316:       source_command (".gdbinit");
                    317: 
                    318:   if (batch)
                    319:     fatal ("Attempt to read commands from stdin in batch mode.");
                    320: 
                    321:   if (!quiet)
                    322:     printf ("Type \"help\" for a list of commands.\n");
                    323: 
                    324:   /* The command loop.  */
                    325: 
                    326:   while (1)
                    327:     {
                    328:       if (!setjmp (to_top_level))
                    329:        command_loop ();
                    330:       clearerr (stdin);                /* Don't get hung if C-d is typed.  */
                    331:     }
                    332: }
                    333: 
                    334: /* Execute the line P as a command.
                    335:    Pass FROM_TTY as second argument to the defining function.  */
                    336: 
                    337: void
                    338: execute_command (p, from_tty)
                    339:      char *p;
                    340:      int from_tty;
                    341: {
                    342:   register struct cmd_list_element *c;
                    343:   register struct command_line *cmdlines;
                    344: 
                    345:   free_all_values ();
                    346:   while (*p == ' ' || *p == '\t') p++;
                    347:   if (*p)
                    348:     {
                    349:       c = lookup_cmd (&p, cmdlist, "", 0);
                    350:       if (c->function == 0)
                    351:        error ("That is not a command, just a help topic.");
                    352:       else if (c->class == (int) class_user)
                    353:        {
                    354:          if (*p)
                    355:            error ("User-defined commands cannot take arguments.");
                    356:          cmdlines = (struct command_line *) c->function;
                    357:          if (cmdlines == (struct command_line *) 0)
                    358:            /* Null command */
                    359:            return;
                    360:          while (cmdlines)
                    361:            {
                    362:              execute_command (cmdlines->line, 0);
                    363:              cmdlines = cmdlines->next;
                    364:            }
                    365:        }
                    366:       else
                    367:        /* Pass null arg rather than an empty one.  */
                    368:        (*c->function) (*p ? p : 0, from_tty);
                    369:     }
                    370: }
                    371: 
                    372: static void
                    373: do_nothing ()
                    374: {
                    375: }
                    376: 
                    377: /* Read commands from `instream' and execute them
                    378:    until end of file.  */
                    379: void
                    380: command_loop ()
                    381: {
                    382:   struct cleanup *old_chain;
                    383:   while (!feof (instream))
                    384:     {
                    385:       if (instream == stdin)
                    386:        printf ("%s", prompt);
                    387:       fflush (stdout);
                    388: 
                    389:       if (window_hook && instream == stdin)
                    390:        (*window_hook) (instream, prompt);
                    391: 
                    392:       quit_flag = 0;
                    393:       old_chain = make_cleanup (do_nothing, 0);
                    394:       execute_command (read_line (instream == stdin), instream == stdin);
                    395:       /* Do any commands attached to breakpoint we stopped at.  */
                    396:       do_breakpoint_commands ();
                    397:       do_cleanups (old_chain);
                    398:     }
                    399: }
                    400: 
                    401: #ifdef SIGTSTP
                    402: static void
                    403: stop_sig ()
                    404: {
                    405:   signal (SIGTSTP, SIG_DFL);
                    406:   sigsetmask (0);
                    407:   kill (getpid (), SIGTSTP);
                    408:   signal (SIGTSTP, stop_sig);
                    409:   printf ("%s", prompt);
                    410:   fflush (stdout);
                    411: 
                    412:   /* Forget about any previous command -- null line now will do nothing.  */
                    413:   *line = 0;
                    414: }
                    415: #endif /* SIGTSTP */
                    416: 
                    417: /* Commands call this if they do not want to be repeated by null lines.  */
                    418: 
                    419: void
                    420: dont_repeat ()
                    421: {
                    422:   *line = 0;
                    423: }
                    424: 
                    425: /* Read one line from the command input stream `instream'
                    426:    into the buffer `line' (whose current length is `linesize').
                    427:    The buffer is made bigger as necessary.
                    428:    Returns the address of the start of the line.  */
                    429: 
                    430: char *
                    431: read_line (repeat)
                    432:      int repeat;
                    433: {
                    434:   register char *p = line;
                    435:   register char *p1;
                    436:   register int c;
                    437:   char *nline;
                    438: 
                    439:   /* Control-C quits instantly if typed while in this loop
                    440:      since it should not wait until the user types a newline.  */
                    441:   immediate_quit++;
                    442: #ifdef SIGTSTP
                    443:   signal (SIGTSTP, stop_sig);
                    444: #endif
                    445: 
                    446:   while (1)
                    447:     {
                    448:       c = fgetc (instream);
                    449:       if (c == -1 || c == '\n')
                    450:        break;
                    451:       /* Ignore backslash-newline; keep adding to the same line.  */
                    452:       else if (c == '\\')
                    453:        {
                    454:          int c1 = fgetc (instream);
                    455:          if (c1 == '\n')
                    456:            continue;
                    457:          else
                    458:            ungetc (c1, instream);
                    459:        }
                    460: 
                    461:       if (p - line == linesize - 1)
                    462:        {
                    463:          linesize *= 2;
                    464:          nline = (char *) xrealloc (line, linesize);
                    465:          p += nline - line;
                    466:          line = nline;
                    467:        }
                    468:       *p++ = c;
                    469:     }
                    470: 
                    471: #ifdef SIGTSTP
                    472:   signal (SIGTSTP, SIG_DFL);
                    473: #endif
                    474:   immediate_quit--;
                    475: 
                    476:   /* If we just got an empty line, and that is supposed
                    477:      to repeat the previous command, leave the last input unchanged.  */
                    478:   if (p == line && repeat)
                    479:     return line;
                    480: 
                    481:   /* If line is a comment, clear it out.  */
                    482:   p1 = line;
                    483:   while ((c = *p1) == ' ' || c == '\t') p1++;
                    484:   if (c == '#')
                    485:     p = line;
                    486: 
                    487:   *p = 0;
                    488: 
                    489:   return line;
                    490: }
                    491: 
                    492: /* Read lines from the input stream
                    493:    and accumulate them in a chain of struct command_line's
                    494:    which is then returned.  */
                    495: 
                    496: struct command_line *
                    497: read_command_lines ()
                    498: {
                    499:   struct command_line *first = 0;
                    500:   register struct command_line *next, *tail = 0;
                    501:   register char *p, *p1;
                    502:   struct cleanup *old_chain = 0;
                    503: 
                    504:   while (1)
                    505:     {
                    506:       dont_repeat ();
                    507:       p = read_line (1);
                    508:       /* Remove leading and trailing blanks.  */
                    509:       while (*p == ' ' || *p == '\t') p++;
                    510:       p1 = p + strlen (p);
                    511:       while (p1 != p && (p1[-1] == ' ' || p1[-1] == '\t')) p1--;
                    512: 
                    513:       /* Is this "end"?  */
                    514:       if (p1 - p == 3 && !strncmp (p, "end", 3))
                    515:        break;
                    516: 
                    517:       /* No => add this line to the chain of command lines.  */
                    518:       next = (struct command_line *) xmalloc (sizeof (struct command_line));
                    519:       next->line = savestring (p, p1 - p);
                    520:       next->next = 0;
                    521:       if (tail)
                    522:        {
                    523:          tail->next = next;
                    524:        }
                    525:       else
                    526:        {
                    527:          /* We just read the first line.
                    528:             From now on, arrange to throw away the lines we have
                    529:             if we quit or get an error while inside this function.  */
                    530:          first = next;
                    531:          old_chain = make_cleanup (free_command_lines, &first);
                    532:        }
                    533:       tail = next;
                    534:     }
                    535: 
                    536:   dont_repeat ();
                    537: 
                    538:   /* Now we are about to return the chain to our caller,
                    539:      so freeing it becomes his responsibility.  */
                    540:   if (first)
                    541:     discard_cleanups (old_chain);
                    542:   return first;
                    543: }
                    544: 
                    545: /* Free a chain of struct command_line's.  */
                    546: 
                    547: void
                    548: free_command_lines (lptr)
                    549:       struct command_line **lptr;
                    550: {
                    551:   register struct command_line *l = *lptr;
                    552:   register struct command_line *next;
                    553: 
                    554:   while (l)
                    555:     {
                    556:       next = l->next;
                    557:       free (l->line);
                    558:       free (l);
                    559:       l = next;
                    560:     }
                    561: }
                    562: 
                    563: /* Add an element to the list of info subcommands.  */
                    564: 
                    565: void
                    566: add_info (name, fun, doc)
                    567:      char *name;
                    568:      void (*fun) ();
                    569:      char *doc;
                    570: {
                    571:   add_cmd (name, 0, fun, doc, &infolist);
                    572: }
                    573: 
                    574: /* Add an alias to the list of info subcommands.  */
                    575: 
                    576: void
                    577: add_info_alias (name, oldname, abbrev_flag)
                    578:      char *name;
                    579:      char *oldname;
                    580:      int abbrev_flag;
                    581: {
                    582:   add_alias_cmd (name, oldname, 0, abbrev_flag, &infolist);
                    583: }
                    584: 
                    585: /* The "info" command is defined as a prefix, with allow_unknown = 0.
                    586:    Therefore, its own definition is called only for "info" with no args.  */
                    587: 
                    588: static void
                    589: info_command ()
                    590: {
                    591:   printf ("\"info\" must be followed by the name of an info command.\n");
                    592:   help_cmd (0, infolist, "info ", -1, stdout);
                    593: }
                    594: 
                    595: /* Add an element to the list of commands.  */
                    596: 
                    597: void
                    598: add_com (name, class, fun, doc)
                    599:      char *name;
                    600:      int class;
                    601:      void (*fun) ();
                    602:      char *doc;
                    603: {
                    604:   add_cmd (name, class, fun, doc, &cmdlist);
                    605: }
                    606: 
                    607: /* Add an alias or abbreviation command to the list of commands.  */
                    608: 
                    609: void
                    610: add_com_alias (name, oldname, class, abbrev_flag)
                    611:      char *name;
                    612:      char *oldname;
                    613:      int class;
                    614:      int abbrev_flag;
                    615: {
                    616:   add_alias_cmd (name, oldname, class, abbrev_flag, &cmdlist);
                    617: }
                    618: 
                    619: void
                    620: error_no_arg (why)
                    621:      char *why;
                    622: {
                    623:   error ("Argument required (%s).", why);
                    624: }
                    625: 
                    626: static void
                    627: help_command (command, from_tty)
                    628:      char *command;
                    629:      int from_tty; /* Ignored */
                    630: {
                    631:   help_cmd (command, cmdlist, "", -2, stdout);
                    632: }
                    633: 
                    634: static void
                    635: validate_comname (comname)
                    636:      char *comname;
                    637: {
                    638:   register char *p;
                    639: 
                    640:   if (comname == 0)
                    641:     error_no_arg ("name of command to define");
                    642: 
                    643:   p = comname;
                    644:   while (*p)
                    645:     {
                    646:       if (!(*p >= 'A' && *p <= 'Z')
                    647:          && !(*p >= 'a' && *p <= 'z')
                    648:          && !(*p >= '0' && *p <= '9')
                    649:          && *p != '-')
                    650:        error ("Junk in argument list: \"%s\"", p);
                    651:       p++;
                    652:     }
                    653: }
                    654: 
                    655: static void
                    656: define_command (comname, from_tty)
                    657:      char *comname;
                    658:      int from_tty;
                    659: {
                    660:   register struct command_line *cmds;
                    661:   register struct cmd_list_element *c;
                    662:   char *tem = comname;
                    663: 
                    664:   validate_comname (comname);
                    665: 
                    666:   c = lookup_cmd (&tem, cmdlist, "", -1);
                    667:   if (c)
                    668:     {
                    669:       if (c->class == (int) class_user || c->class == (int) class_alias)
                    670:        tem = "Redefine command \"%s\"? ";
                    671:       else
                    672:        tem = "Really redefine built-in command \"%s\"? ";
                    673:       if (!query (tem, comname))
                    674:        error ("Command \"%s\" not redefined.", comname);
                    675:     }
                    676: 
                    677:   if (from_tty)
                    678:     printf ("Type commands for definition of \"%s\".\n\
                    679: End with a line saying just \"end\".\n", comname);
                    680: 
                    681:   comname = savestring (comname, strlen (comname));
                    682: 
                    683:   cmds = read_command_lines ();
                    684: 
                    685:   if (c && c->class == (int) class_user)
                    686:     free_command_lines (&c->function);
                    687: 
                    688:   add_com (comname, class_user, cmds,
                    689:           (c && c->class == (int) class_user)
                    690:           ? c->doc : savestring ("User-defined.", 13));
                    691: }
                    692: 
                    693: static void
                    694: document_command (comname, from_tty)
                    695:      char *comname;
                    696:      int from_tty;
                    697: {
                    698:   struct command_line *doclines;
                    699:   register struct cmd_list_element *c;
                    700:   char *tem = comname;
                    701: 
                    702:   validate_comname (comname);
                    703: 
                    704:   c = lookup_cmd (&tem, cmdlist, "", 0);
                    705: 
                    706:   if (c->class != (int) class_user)
                    707:     error ("Command \"%s\" is built-in.", comname);
                    708: 
                    709:   if (from_tty)
                    710:     printf ("Type documentation for \"%s\".\n\
                    711: End with a line saying just \"end\".\n", comname);
                    712: 
                    713:   doclines = read_command_lines ();
                    714: 
                    715:   if (c->doc) free (c->doc);
                    716: 
                    717:   {
                    718:     register struct command_line *cl1;
                    719:     register int len = 0;
                    720: 
                    721:     for (cl1 = doclines; cl1; cl1 = cl1->next)
                    722:       len += strlen (cl1->line) + 1;
                    723: 
                    724:     c->doc = (char *) xmalloc (len + 1);
                    725:     *c->doc = 0;
                    726: 
                    727:     for (cl1 = doclines; cl1; cl1 = cl1->next)
                    728:       {
                    729:        strcat (c->doc, cl1->line);
                    730:        if (cl1->next)
                    731:          strcat (c->doc, "\n");
                    732:       }
                    733:   }
                    734: 
                    735:   free_command_lines (&doclines);
                    736: }
                    737: 
                    738: static void
                    739: copying_info ()
                    740: {
                    741:   immediate_quit++;
                    742:   printf ("                GDB GENERAL PUBLIC LICENSE\n\
                    743:                    (Clarified 11 Feb 1988)\n\
                    744: \n\
                    745:  Copyright (C) 1988 Richard M. Stallman\n\
                    746:  Everyone is permitted to copy and distribute verbatim copies\n\
                    747:  of this license, but changing it is not allowed.\n\
                    748:  You can also use this wording to make the terms for other programs.\n\
                    749: \n\
                    750:   The license agreements of most software companies keep you at the\n\
                    751: mercy of those companies.  By contrast, our general public license is\n\
                    752: intended to give everyone the right to share GDB.  To make sure that\n\
                    753: you get the rights we want you to have, we need to make restrictions\n\
                    754: that forbid anyone to deny you these rights or to ask you to surrender\n\
                    755: the rights.  Hence this license agreement.\n\
                    756: \n\
                    757:   Specifically, we want to make sure that you have the right to give\n\
                    758: away copies of GDB, that you receive source code or else can get it\n\
                    759: if you want it, that you can change GDB or use pieces of it in new\n\
                    760: free programs, and that you know you can do these things.\n\
                    761: --Type Return to print more--");
                    762:   fflush (stdout);
                    763:   read_line ();
                    764: 
                    765:   printf ("\
                    766:   To make sure that everyone has such rights, we have to forbid you to\n\
                    767: deprive anyone else of these rights.  For example, if you distribute\n\
                    768: copies of GDB, you must give the recipients all the rights that you\n\
                    769: have.  You must make sure that they, too, receive or can get the\n\
                    770: source code.  And you must tell them their rights.\n\
                    771: \n\
                    772:   Also, for our own protection, we must make certain that everyone\n\
                    773: finds out that there is no warranty for GDB.  If GDB is modified by\n\
                    774: someone else and passed on, we want its recipients to know that what\n\
                    775: they have is not what we distributed, so that any problems introduced\n\
                    776: by others will not reflect on our reputation.\n\
                    777: \n\
                    778:   Therefore we (Richard Stallman and the Free Software Foundation,\n\
                    779: Inc.) make the following terms which say what you must do to be\n\
                    780: allowed to distribute or change GDB.\n\
                    781: --Type Return to print more--");
                    782:   fflush (stdout);
                    783:   read_line ();
                    784: 
                    785:   printf ("\
                    786:                        COPYING POLICIES\n\
                    787: \n\
                    788:   1. You may copy and distribute verbatim copies of GDB source code as\n\
                    789: you receive it, in any medium, provided that you conspicuously and\n\
                    790: appropriately publish on each copy a valid copyright notice \"Copyright\n\
                    791: \(C) 1988 Free Software Foundation, Inc.\" (or with whatever year is\n\
                    792: appropriate); keep intact the notices on all files that refer\n\
                    793: to this License Agreement and to the absence of any warranty; and give\n\
                    794: any other recipients of the GDB program a copy of this License\n\
                    795: Agreement along with the program.  You may charge a distribution fee\n\
                    796: for the physical act of transferring a copy.\n\
                    797: \n\
                    798:   2. You may modify your copy or copies of GDB or any portion of it,\n\
                    799: and copy and distribute such modifications under the terms of\n\
                    800: Paragraph 1 above, provided that you also do the following:\n\
                    801: \n\
                    802:     a) cause the modified files to carry prominent notices stating\n\
                    803:     that you changed the files and the date of any change; and\n\
                    804: --Type Return to print more--");
                    805:   fflush (stdout);
                    806:   read_line ();
                    807: 
                    808:   printf ("\
                    809:     b) cause the whole of any work that you distribute or publish,\n\
                    810:     that in whole or in part contains or is a derivative of GDB\n\
                    811:     or any part thereof, to be licensed to all third parties on terms\n\
                    812:     identical to those contained in this License Agreement (except that\n\
                    813:     you may choose to grant more extensive warranty protection to some\n\
                    814:     or all third parties, at your option).\n\
                    815: \n");
                    816:   printf ("\
                    817:     c) if the modified program serves as a debugger, cause it\n\
                    818:     when started running in the simplest and usual way, to print\n\
                    819:     an announcement including a valid copyright notice\n\
                    820:     \"Copyright (C) 1988 Free Software Foundation, Inc.\" (or with\n\
                    821:     the year that is appropriate), saying that there is no warranty\n\
                    822:     (or else, saying that you provide a warranty) and that users may\n\
                    823:     redistribute the program under these conditions, and telling the user\n\
                    824:     how to view a copy of this License Agreement.\n\
                    825: \n\
                    826:     d) You may charge a distribution fee for the physical act of\n\
                    827:     transferring a copy, and you may at your option offer warranty\n\
                    828:     protection in exchange for a fee.\n\
                    829: \n\
                    830: Mere aggregation of another unrelated program with this program (or its\n\
                    831: derivative) on a volume of a storage or distribution medium does not bring\n\
                    832: the other program under the scope of these terms.\n\
                    833: --Type Return to print more--");
                    834:   fflush (stdout);
                    835:   read_line ();
                    836: 
                    837:   printf ("\
                    838:   3. You may copy and distribute GDB (or a portion or derivative of it,\n\
                    839: under Paragraph 2) in object code or executable form under the terms of\n\
                    840: Paragraphs 1 and 2 above provided that you also do one of the following:\n\
                    841: \n\
                    842:     a) accompany it with the complete corresponding machine-readable\n\
                    843:     source code, which must be distributed under the terms of\n\
                    844:     Paragraphs 1 and 2 above; or,\n\
                    845: \n\
                    846:     b) accompany it with a written offer, valid for at least three\n\
                    847:     years, to give any third party free (except for a nominal\n\
                    848:     shipping charge) a complete machine-readable copy of the\n\
                    849:     corresponding source code, to be distributed under the terms of\n\
                    850:     Paragraphs 1 and 2 above; or,\n\n");
                    851: 
                    852:   printf ("\
                    853:     c) accompany it with the information you received as to where the\n\
                    854:     corresponding source code may be obtained.  (This alternative is\n\
                    855:     allowed only for noncommercial distribution and only if you\n\
                    856:     received the program in object code or executable form alone.)\n\
                    857: \n\
                    858: For an executable file, complete source code means all the source code for\n\
                    859: all modules it contains; but, as a special exception, it need not include\n\
                    860: source code for modules which are standard libraries that accompany the\n\
                    861: operating system on which the executable file runs.\n\
                    862: --Type Return to print more--");
                    863:   fflush (stdout);
                    864:   read_line ();
                    865: 
                    866:   printf ("\
                    867:   4. You may not copy, sublicense, distribute or transfer GDB\n\
                    868: except as expressly provided under this License Agreement.  Any attempt\n\
                    869: otherwise to copy, sublicense, distribute or transfer GDB is void and\n\
                    870: your rights to use the program under this License agreement shall be\n\
                    871: automatically terminated.  However, parties who have received computer\n\
                    872: software programs from you with this License Agreement will not have\n\
                    873: their licenses terminated so long as such parties remain in full compliance.\n\
                    874: \n\
                    875:   5. If you wish to incorporate parts of GDB into other free\n\
                    876: programs whose distribution conditions are different, write to the Free\n\
                    877: Software Foundation at 675 Mass Ave, Cambridge, MA 02139.  We have not yet\n\
                    878: worked out a simple rule that can be stated here, but we will often permit\n\
                    879: this.  We will be guided by the two goals of preserving the free status of\n\
                    880: all derivatives of our free software and of promoting the sharing and reuse\n\
                    881: of software.\n\
                    882: \n\
                    883: In other words, go ahead and share GDB, but don't try to stop\n\
                    884: anyone else from sharing it farther.  Help stamp out software hoarding!\n\
                    885: ");
                    886:   immediate_quit--;
                    887: }
                    888: 
                    889: static void
                    890: warranty_info ()
                    891: {
                    892:   immediate_quit++;
                    893:   printf ("                     NO WARRANTY\n\
                    894: \n\
                    895:   BECAUSE GDB IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY NO\n\
                    896: WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW.  EXCEPT\n\
                    897: WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC,\n\
                    898: RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE GDB \"AS IS\" WITHOUT\n\
                    899: WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT\n\
                    900: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\
                    901: A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND\n\
                    902: PERFORMANCE OF GDB IS WITH YOU.  SHOULD GDB PROVE DEFECTIVE, YOU\n\
                    903: ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n");
                    904: 
                    905:   printf ("\
                    906:  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M.\n\
                    907: STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY\n\
                    908: WHO MAY MODIFY AND REDISTRIBUTE GDB, BE LIABLE TO\n\
                    909: YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER\n\
                    910: SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR\n\
                    911: INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA\n\
                    912: BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR A\n\
                    913: FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) GDB, EVEN\n\
                    914: IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR\n\
                    915: ANY CLAIM BY ANY OTHER PARTY.\n");
                    916:   immediate_quit--;
                    917: }
                    918: 
                    919: static void
                    920: print_gdb_version ()
                    921: {
                    922:   printf ("GDB %s, Copyright (C) 1988 Free Software Foundation, Inc.\n\
                    923: There is ABSOLUTELY NO WARRANTY for GDB; type \"info warranty\" for details.\n\
                    924: GDB is free software and you are welcome to distribute copies of it\n\
                    925:  under certain conditions; type \"info copying\" to see the conditions.\n",
                    926:          version);
                    927: }
                    928: 
                    929: static void
                    930: version_info ()
                    931: {
                    932:   immediate_quit++;
                    933:   print_gdb_version ();
                    934:   immediate_quit--;
                    935: }
                    936: 
                    937: /* xgdb calls this to reprint the usual GDB prompt.  */
                    938: 
                    939: void
                    940: print_prompt ()
                    941: {
                    942:   printf ("%s", prompt);
                    943:   fflush (stdout);
                    944: }
                    945: 
                    946: /* Command to specify a prompt string instead of "(gdb) ".  */
                    947: 
                    948: static void
                    949: set_prompt_command (text)
                    950:      char *text;
                    951: {
                    952:   char *p, *q;
                    953:   register int c;
                    954:   char *new;
                    955: 
                    956:   if (text == 0)
                    957:     error_no_arg ("string to which to set prompt");
                    958: 
                    959:   new = (char *) xmalloc (strlen (text) + 2);
                    960:   p = text; q = new;
                    961:   while (c = *p++)
                    962:     {
                    963:       if (c == '\\')
                    964:        {
                    965:          /* \ at end of argument is used after spaces
                    966:             so they won't be lost.  */
                    967:          if (*p == 0)
                    968:            break;
                    969:          c = parse_escape (&p);
                    970:          if (c == 0)
                    971:            break; /* C loses */
                    972:          else if (c > 0)
                    973:            *q++ = c;
                    974:        }
                    975:       else
                    976:        *q++ = c;
                    977:     }
                    978:   if (*(p - 1) != '\\')
                    979:     *q++ = ' ';
                    980:   *q++ = '\0';
                    981:   new = (char *) xrealloc (new, q - new);
                    982:   free (prompt);
                    983:   prompt = new;
                    984: }
                    985: 
                    986: static void
                    987: quit_command ()
                    988: {
                    989:   if (have_inferior_p ())
                    990:     {
                    991:       if (query ("The program is running.  Quit anyway? "))
                    992:        {
                    993:          /* Prevent any warning message from reopen_exec_file, in case
                    994:             we have a core file that's inconsistent with the exec file.  */
                    995:          exec_file_command (0, 0);
                    996:          kill_inferior ();
                    997:        }
                    998:       else
                    999:        error ("Not confirmed.");
                   1000:     }
                   1001:   exit (0);
                   1002: }
                   1003: 
                   1004: int
                   1005: input_from_terminal_p ()
                   1006: {
                   1007:   return instream == stdin;
                   1008: }
                   1009: 
                   1010: static void
                   1011: pwd_command (arg, from_tty)
                   1012:      char *arg;
                   1013:      int from_tty;
                   1014: {
                   1015:   if (arg) error ("The \"pwd\" command does not take an argument: %s", arg);
                   1016:   getwd (dirbuf);
                   1017: 
                   1018:   if (strcmp (dirbuf, current_directory))
                   1019:     printf ("Working directory %s\n (canonically %s).\n",
                   1020:            current_directory, dirbuf);
                   1021:   else
                   1022:     printf ("Working directory %s.\n", current_directory);
                   1023: }
                   1024: 
                   1025: static void
                   1026: cd_command (dir, from_tty)
                   1027:      char *dir;
                   1028:      int from_tty;
                   1029: {
                   1030:   int len;
                   1031:   int change;
                   1032: 
                   1033:   if (dir == 0)
                   1034:     error_no_arg ("new working directory");
                   1035: 
                   1036:   len = strlen (dir);
                   1037:   dir = savestring (dir, len - (len > 1 && dir[len-1] == '/'));
                   1038:   if (dir[0] == '/')
                   1039:     current_directory = dir;
                   1040:   else
                   1041:     {
                   1042:       current_directory = concat (current_directory, "/", dir);
                   1043:       free (dir);
                   1044:     }
                   1045: 
                   1046:   /* Now simplify any occurrences of `.' and `..' in the pathname.  */
                   1047: 
                   1048:   change = 1;
                   1049:   while (change)
                   1050:     {
                   1051:       char *p;
                   1052:       change = 0;
                   1053: 
                   1054:       for (p = current_directory; *p;)
                   1055:        {
                   1056:          if (!strncmp (p, "/./", 2)
                   1057:              && (p[2] == 0 || p[2] == '/'))
                   1058:            strcpy (p, p + 2);
                   1059:          else if (!strncmp (p, "/..", 3)
                   1060:                   && (p[3] == 0 || p[3] == '/')
                   1061:                   && p != current_directory)
                   1062:            {
                   1063:              char *q = p;
                   1064:              while (q != current_directory && q[-1] != '/') q--;
                   1065:              if (q != current_directory)
                   1066:                {
                   1067:                  strcpy (q-1, p+3);
                   1068:                  p = q-1;
                   1069:                }
                   1070:            }
                   1071:          else p++;
                   1072:        }
                   1073:     }
                   1074: 
                   1075:   if (chdir (dir) < 0)
                   1076:     perror_with_name (dir);
                   1077: 
                   1078:   if (from_tty)
                   1079:     pwd_command ((char *) 0, 1);
                   1080: }
                   1081: 
                   1082: /* Clean up on error during a "source" command.
                   1083:    Close the file opened by the command
                   1084:    and restore the previous input stream.  */
                   1085: 
                   1086: static void
                   1087: source_cleanup (stream)
                   1088:      FILE *stream;
                   1089: {
                   1090:   fclose (instream);
                   1091:   instream = stream;
                   1092: }
                   1093: 
                   1094: static void
                   1095: source_command (file)
                   1096:      char *file;
                   1097: {
                   1098:   FILE *stream;
                   1099:   struct cleanup *cleanups;
                   1100: 
                   1101:   if (file == 0)
                   1102:     error_no_arg ("file to read commands from");
                   1103: 
                   1104:   stream = fopen (file, "r");
                   1105:   if (stream == 0)
                   1106:     perror_with_name (file);
                   1107: 
                   1108:   cleanups = make_cleanup (source_cleanup, instream);
                   1109: 
                   1110:   instream = stream;
                   1111: 
                   1112:   command_loop ();
                   1113: 
                   1114:   do_cleanups (cleanups);
                   1115: }
                   1116: 
                   1117: static void
                   1118: echo_command (text)
                   1119:      char *text;
                   1120: {
                   1121:   char *p = text;
                   1122:   register int c;
                   1123: 
                   1124:   if (text)
                   1125:     while (c = *p++)
                   1126:       {
                   1127:        if (c == '\\')
                   1128:          {
                   1129:            /* \ at end of argument is used after spaces
                   1130:               so they won't be lost.  */
                   1131:            if (*p == 0)
                   1132:              return;
                   1133: 
                   1134:            c = parse_escape (&p);
                   1135:            if (c >= 0)
                   1136:              fputc (c, stdout);
                   1137:          }
                   1138:        else
                   1139:          fputc (c, stdout);
                   1140:       }
                   1141: }
                   1142: 
                   1143: static void
                   1144: dump_me_command ()
                   1145: {
                   1146:   if (query ("Should GDB dump core? "))
                   1147:     {
                   1148:       signal (SIGQUIT, SIG_DFL);
                   1149:       kill (getpid (), SIGQUIT);
                   1150:     }
                   1151: }
                   1152: 
                   1153: static void
                   1154: initialize_main ()
                   1155: {
                   1156:   prompt = savestring ("(gdb) ", 6);
                   1157: 
                   1158:   /* Define the classes of commands.
                   1159:      They will appear in the help list in the reverse of this order.  */
                   1160: 
                   1161:   add_cmd ("obscure", class_obscure, 0, "Obscure features.", &cmdlist);
                   1162:   add_cmd ("alias", class_alias, 0, "Aliases of other commands.", &cmdlist);
                   1163:   add_cmd ("user", class_user, 0, "User-defined commands.\n\
                   1164: The commands in this class are those defined by the user.\n\
                   1165: Use the \"define\" command to define a command.", &cmdlist);
                   1166:   add_cmd ("support", class_support, 0, "Support facilities.", &cmdlist);
                   1167:   add_cmd ("status", class_info, 0, "Status inquiries.", &cmdlist);
                   1168:   add_cmd ("files", class_files, 0, "Specifying and examining files.", &cmdlist);
                   1169:   add_cmd ("breakpoints", class_breakpoint, 0, "Making program stop at certain points.", &cmdlist);
                   1170:   add_cmd ("data", class_vars, 0, "Examining data.", &cmdlist);
                   1171:   add_cmd ("stack", class_stack, 0, "Examining the stack.\n\
                   1172: The stack is made up of stack frames.  Gdb assigns numbers to stack frames\n\
                   1173: counting from zero for the innermost (currently executing) frame.\n\n\
                   1174: At any time gdb identifies one frame as the \"selected\" frame.\n\
                   1175: Variable lookups are done with respect to the selected frame.\n\
                   1176: When the program being debugged stops, gdb selects the innermost frame.\n\
                   1177: The commands below can be used to select other frames by number or address.",
                   1178:           &cmdlist);
                   1179:   add_cmd ("running", class_run, 0, "Running the program.", &cmdlist);
                   1180: 
                   1181:   add_com ("pwd", class_files, pwd_command,
                   1182:           "Print working directory.  This is used for your program as well.");
                   1183:   add_com ("cd", class_files, cd_command,
                   1184:           "Set working directory to DIR for debugger and program being debugged.\n\
                   1185: The change does not take effect for the program being debugged\n\
                   1186: until the next time it is started.");
                   1187: 
                   1188:   add_com ("set-prompt", class_support, set_prompt_command,
                   1189:           "Change gdb's prompt from the default of \"(gdb)\"");
                   1190:   add_com ("echo", class_support, echo_command,
                   1191:           "Print a constant string.  Give string as argument.\n\
                   1192: C escape sequences may be used in the argument.\n\
                   1193: No newline is added at the end of the argument;\n\
                   1194: use \"\\n\" if you want a newline to be printed.\n\
                   1195: Since leading and trailing whitespace are ignored in command arguments,\n\
                   1196: if you want to print some you must use \"\\\" before leading whitespace\n\
                   1197: to be printed or after trailing whitespace.");
                   1198:   add_com ("document", class_support, document_command,
                   1199:           "Document a user-defined command.\n\
                   1200: Give command name as argument.  Give documentation on following lines.\n\
                   1201: End with a line of just \"end\".");
                   1202:   add_com ("define", class_support, define_command,
                   1203:           "Define a new command name.  Command name is argument.\n\
                   1204: Definition appears on following lines, one command per line.\n\
                   1205: End with a line of just \"end\".\n\
                   1206: Use the \"document\" command to give documentation for the new command.\n\
                   1207: Commands defined in this way do not take arguments.");
                   1208: 
                   1209:   add_com ("source", class_support, source_command,
                   1210:           "Read commands from a file named FILE.\n\
                   1211: Note that the file \".gdbinit\" is read automatically in this way\n\
                   1212: when gdb is started.");
                   1213:   add_com ("quit", class_support, quit_command, "Exit gdb.");
                   1214:   add_com ("help", class_support, help_command, "Print list of commands.");
                   1215:   add_com_alias ("q", "quit", class_support, 1);
                   1216:   add_com_alias ("h", "help", class_support, 1);
                   1217: 
                   1218:   add_com ("dump-me", class_obscure, dump_me_command,
                   1219:           "Get fatal error; make debugger dump its core.");
                   1220: 
                   1221:   add_prefix_cmd ("info", class_info, info_command,
                   1222:                  "Generic command for printing status.",
                   1223:                  &infolist, "info ", 0, &cmdlist);
                   1224:   add_com_alias ("i", "info", class_info, 1);
                   1225: 
                   1226:   add_info ("copying", copying_info, "Conditions for redistributing copies of GDB.");
                   1227:   add_info ("warranty", warranty_info, "Various kinds of warranty you do not have.");
                   1228:   add_info ("version", version_info, "Report what version of GDB this is.");
                   1229: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.