OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [command.c] - Blame information for rev 1773

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* Handle lists of commands, their decoding and documentation, for GDB.
2
   Copyright 1986, 1989, 1990, 1991, 1998, 2000 Free Software Foundation, Inc.
3
 
4
   This program is free software; you can redistribute it and/or modify
5
   it under the terms of the GNU General Public License as published by
6
   the Free Software Foundation; either version 2 of the License, or
7
   (at your option) any later version.
8
 
9
   This program is distributed in the hope that it will be useful,
10
   but WITHOUT ANY WARRANTY; without even the implied warranty of
11
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
   GNU General Public License for more details.
13
 
14
   You should have received a copy of the GNU General Public License
15
   along with this program; if not, write to the Free Software
16
   Foundation, Inc., 59 Temple Place - Suite 330,
17
   Boston, MA 02111-1307, USA.  */
18
 
19
#include "defs.h"
20
#include "gdbcmd.h"
21
#include "symtab.h"
22
#include "value.h"
23
#include <ctype.h>
24
#include "gdb_string.h"
25
#ifdef UI_OUT
26
#include "ui-out.h"
27
#endif
28
 
29
#include "gdb_wait.h"
30
#include "gnu-regex.h"
31
/* FIXME: this should be auto-configured!  */
32
#ifdef __MSDOS__
33
# define CANT_FORK
34
#endif
35
 
36
/* Prototypes for local functions */
37
 
38
static void undef_cmd_error PARAMS ((char *, char *));
39
 
40
static void show_user PARAMS ((char *, int));
41
 
42
static void show_user_1 (struct cmd_list_element *, struct ui_file *);
43
 
44
static void make_command PARAMS ((char *, int));
45
 
46
static void shell_escape PARAMS ((char *, int));
47
 
48
static int parse_binary_operation PARAMS ((char *));
49
 
50
static void print_doc_line (struct ui_file *, char *);
51
 
52
static struct cmd_list_element *find_cmd PARAMS ((char *command,
53
                                                  int len,
54
                                            struct cmd_list_element * clist,
55
                                                  int ignore_help_classes,
56
                                                  int *nfound));
57
static void apropos_cmd_helper (struct ui_file *, struct cmd_list_element *,
58
                                struct re_pattern_buffer *, char *);
59
 
60
void apropos_command (char *, int);
61
 
62
void _initialize_command PARAMS ((void));
63
 
64
/* Add element named NAME.
65
   CLASS is the top level category into which commands are broken down
66
   for "help" purposes.
67
   FUN should be the function to execute the command;
68
   it will get a character string as argument, with leading
69
   and trailing blanks already eliminated.
70
 
71
   DOC is a documentation string for the command.
72
   Its first line should be a complete sentence.
73
   It should start with ? for a command that is an abbreviation
74
   or with * for a command that most users don't need to know about.
75
 
76
   Add this command to command list *LIST.
77
 
78
   Returns a pointer to the added command (not necessarily the head
79
   of *LIST). */
80
 
81
struct cmd_list_element *
82
add_cmd (name, class, fun, doc, list)
83
     char *name;
84
     enum command_class class;
85
     void (*fun) PARAMS ((char *, int));
86
     char *doc;
87
     struct cmd_list_element **list;
88
{
89
  register struct cmd_list_element *c
90
  = (struct cmd_list_element *) xmalloc (sizeof (struct cmd_list_element));
91
  struct cmd_list_element *p;
92
 
93
  delete_cmd (name, list);
94
 
95
  if (*list == NULL || STRCMP ((*list)->name, name) >= 0)
96
    {
97
      c->next = *list;
98
      *list = c;
99
    }
100
  else
101
    {
102
      p = *list;
103
      while (p->next && STRCMP (p->next->name, name) <= 0)
104
        {
105
          p = p->next;
106
        }
107
      c->next = p->next;
108
      p->next = c;
109
    }
110
 
111
  c->name = name;
112
  c->class = class;
113
  c->function.cfunc = fun;
114
  c->doc = doc;
115
  c->flags = 0;
116
  c->replacement = NULL;
117
  c->hook = NULL;
118
  c->prefixlist = NULL;
119
  c->prefixname = NULL;
120
  c->allow_unknown = 0;
121
  c->abbrev_flag = 0;
122
  c->completer = make_symbol_completion_list;
123
  c->type = not_set_cmd;
124
  c->var = NULL;
125
  c->var_type = var_boolean;
126
  c->enums = NULL;
127
  c->user_commands = NULL;
128
  c->hookee = NULL;
129
  c->cmd_pointer = NULL;
130
 
131
  return c;
132
}
133
 
134
 
135
/* Deprecates a command CMD.
136
   REPLACEMENT is the name of the command which should be used in place
137
   of this command, or NULL if no such command exists.
138
 
139
   This function does not check to see if command REPLACEMENT exists
140
   since gdb may not have gotten around to adding REPLACEMENT when this
141
   function is called.
142
 
143
   Returns a pointer to the deprecated command.  */
144
 
145
struct cmd_list_element *
146
deprecate_cmd (cmd, replacement)
147
     struct cmd_list_element *cmd;
148
     char *replacement;
149
{
150
  cmd->flags |= (CMD_DEPRECATED | DEPRECATED_WARN_USER);
151
 
152
  if (replacement != NULL)
153
    cmd->replacement = replacement;
154
  else
155
    cmd->replacement = NULL;
156
 
157
  return cmd;
158
}
159
 
160
 
161
/* Same as above, except that the abbrev_flag is set. */
162
 
163
#if 0                           /* Currently unused */
164
 
165
struct cmd_list_element *
166
add_abbrev_cmd (name, class, fun, doc, list)
167
     char *name;
168
     enum command_class class;
169
     void (*fun) PARAMS ((char *, int));
170
     char *doc;
171
     struct cmd_list_element **list;
172
{
173
  register struct cmd_list_element *c
174
  = add_cmd (name, class, fun, doc, list);
175
 
176
  c->abbrev_flag = 1;
177
  return c;
178
}
179
 
180
#endif
181
 
182
struct cmd_list_element *
183
add_alias_cmd (name, oldname, class, abbrev_flag, list)
184
     char *name;
185
     char *oldname;
186
     enum command_class class;
187
     int abbrev_flag;
188
     struct cmd_list_element **list;
189
{
190
  /* Must do this since lookup_cmd tries to side-effect its first arg */
191
  char *copied_name;
192
  register struct cmd_list_element *old;
193
  register struct cmd_list_element *c;
194
  copied_name = (char *) alloca (strlen (oldname) + 1);
195
  strcpy (copied_name, oldname);
196
  old = lookup_cmd (&copied_name, *list, "", 1, 1);
197
 
198
  if (old == 0)
199
    {
200
      delete_cmd (name, list);
201
      return 0;
202
    }
203
 
204
  c = add_cmd (name, class, old->function.cfunc, old->doc, list);
205
  c->prefixlist = old->prefixlist;
206
  c->prefixname = old->prefixname;
207
  c->allow_unknown = old->allow_unknown;
208
  c->abbrev_flag = abbrev_flag;
209
  c->cmd_pointer = old;
210
  return c;
211
}
212
 
213
/* Like add_cmd but adds an element for a command prefix:
214
   a name that should be followed by a subcommand to be looked up
215
   in another command list.  PREFIXLIST should be the address
216
   of the variable containing that list.  */
217
 
218
struct cmd_list_element *
219
add_prefix_cmd (name, class, fun, doc, prefixlist, prefixname,
220
                allow_unknown, list)
221
     char *name;
222
     enum command_class class;
223
     void (*fun) PARAMS ((char *, int));
224
     char *doc;
225
     struct cmd_list_element **prefixlist;
226
     char *prefixname;
227
     int allow_unknown;
228
     struct cmd_list_element **list;
229
{
230
  register struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
231
  c->prefixlist = prefixlist;
232
  c->prefixname = prefixname;
233
  c->allow_unknown = allow_unknown;
234
  return c;
235
}
236
 
237
/* Like add_prefix_cmd but sets the abbrev_flag on the new command. */
238
 
239
struct cmd_list_element *
240
add_abbrev_prefix_cmd (name, class, fun, doc, prefixlist, prefixname,
241
                       allow_unknown, list)
242
     char *name;
243
     enum command_class class;
244
     void (*fun) PARAMS ((char *, int));
245
     char *doc;
246
     struct cmd_list_element **prefixlist;
247
     char *prefixname;
248
     int allow_unknown;
249
     struct cmd_list_element **list;
250
{
251
  register struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
252
  c->prefixlist = prefixlist;
253
  c->prefixname = prefixname;
254
  c->allow_unknown = allow_unknown;
255
  c->abbrev_flag = 1;
256
  return c;
257
}
258
 
259
/* This is an empty "cfunc".  */
260
void
261
not_just_help_class_command (args, from_tty)
262
     char *args;
263
     int from_tty;
264
{
265
}
266
 
267
/* This is an empty "sfunc".  */
268
static void empty_sfunc PARAMS ((char *, int, struct cmd_list_element *));
269
 
270
static void
271
empty_sfunc (args, from_tty, c)
272
     char *args;
273
     int from_tty;
274
     struct cmd_list_element *c;
275
{
276
}
277
 
278
/* Add element named NAME to command list LIST (the list for set
279
   or some sublist thereof).
280
   CLASS is as in add_cmd.
281
   VAR_TYPE is the kind of thing we are setting.
282
   VAR is address of the variable being controlled by this command.
283
   DOC is the documentation string.  */
284
 
285
struct cmd_list_element *
286
add_set_cmd (name, class, var_type, var, doc, list)
287
     char *name;
288
     enum command_class class;
289
     var_types var_type;
290
     char *var;
291
     char *doc;
292
     struct cmd_list_element **list;
293
{
294
  struct cmd_list_element *c
295
  = add_cmd (name, class, NO_FUNCTION, doc, list);
296
 
297
  c->type = set_cmd;
298
  c->var_type = var_type;
299
  c->var = var;
300
  /* This needs to be something besides NO_FUNCTION so that this isn't
301
     treated as a help class.  */
302
  c->function.sfunc = empty_sfunc;
303
  return c;
304
}
305
 
306
/* Add element named NAME to command list LIST (the list for set
307
   or some sublist thereof).
308
   CLASS is as in add_cmd.
309
   ENUMLIST is a list of strings which may follow NAME.
310
   VAR is address of the variable which will contain the matching string
311
   (from ENUMLIST).
312
   DOC is the documentation string.  */
313
 
314
struct cmd_list_element *
315
add_set_enum_cmd (name, class, enumlist, var, doc, list)
316
     char *name;
317
     enum command_class class;
318
     char *enumlist[];
319
     char *var;
320
     char *doc;
321
     struct cmd_list_element **list;
322
{
323
  struct cmd_list_element *c
324
  = add_set_cmd (name, class, var_enum, var, doc, list);
325
  c->enums = enumlist;
326
 
327
  return c;
328
}
329
 
330
/* Where SETCMD has already been added, add the corresponding show
331
   command to LIST and return a pointer to the added command (not
332
   necessarily the head of LIST).  */
333
struct cmd_list_element *
334
add_show_from_set (setcmd, list)
335
     struct cmd_list_element *setcmd;
336
     struct cmd_list_element **list;
337
{
338
  struct cmd_list_element *showcmd =
339
  (struct cmd_list_element *) xmalloc (sizeof (struct cmd_list_element));
340
  struct cmd_list_element *p;
341
 
342
  memcpy (showcmd, setcmd, sizeof (struct cmd_list_element));
343
  delete_cmd (showcmd->name, list);
344
  showcmd->type = show_cmd;
345
 
346
  /* Replace "set " at start of docstring with "show ".  */
347
  if (setcmd->doc[0] == 'S' && setcmd->doc[1] == 'e'
348
      && setcmd->doc[2] == 't' && setcmd->doc[3] == ' ')
349
    showcmd->doc = concat ("Show ", setcmd->doc + 4, NULL);
350
  else
351
    fprintf_unfiltered (gdb_stderr, "GDB internal error: Bad docstring for set command\n");
352
 
353
  if (*list == NULL || STRCMP ((*list)->name, showcmd->name) >= 0)
354
    {
355
      showcmd->next = *list;
356
      *list = showcmd;
357
    }
358
  else
359
    {
360
      p = *list;
361
      while (p->next && STRCMP (p->next->name, showcmd->name) <= 0)
362
        {
363
          p = p->next;
364
        }
365
      showcmd->next = p->next;
366
      p->next = showcmd;
367
    }
368
 
369
  return showcmd;
370
}
371
 
372
/* Remove the command named NAME from the command list.  */
373
 
374
void
375
delete_cmd (name, list)
376
     char *name;
377
     struct cmd_list_element **list;
378
{
379
  register struct cmd_list_element *c;
380
  struct cmd_list_element *p;
381
 
382
  while (*list && STREQ ((*list)->name, name))
383
    {
384
      if ((*list)->hookee)
385
        (*list)->hookee->hook = 0;       /* Hook slips out of its mouth */
386
      p = (*list)->next;
387
      free ((PTR) * list);
388
      *list = p;
389
    }
390
 
391
  if (*list)
392
    for (c = *list; c->next;)
393
      {
394
        if (STREQ (c->next->name, name))
395
          {
396
            if (c->next->hookee)
397
              c->next->hookee->hook = 0; /* hooked cmd gets away.  */
398
            p = c->next->next;
399
            free ((PTR) c->next);
400
            c->next = p;
401
          }
402
        else
403
          c = c->next;
404
      }
405
}
406
/* Recursively walk the commandlist structures, and print out the
407
   documentation of commands that match our regex in either their
408
   name, or their documentation.
409
*/
410
static void
411
apropos_cmd_helper (struct ui_file *stream, struct cmd_list_element *commandlist,
412
                         struct re_pattern_buffer *regex, char *prefix)
413
{
414
  register struct cmd_list_element *c;
415
  int returnvalue=1; /*Needed to avoid double printing*/
416
  /* Walk through the commands */
417
  for (c=commandlist;c;c=c->next)
418
    {
419
      if (c->name != NULL)
420
        {
421
          /* Try to match against the name*/
422
          returnvalue=re_search(regex,c->name,strlen(c->name),0,strlen(c->name),NULL);
423
          if (returnvalue >= 0)
424
            {
425
              /* Stolen from help_cmd_list. We don't directly use
426
               * help_cmd_list because it doesn't let us print out
427
               * single commands
428
               */
429
              fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
430
              print_doc_line (stream, c->doc);
431
              fputs_filtered ("\n", stream);
432
              returnvalue=0; /*Set this so we don't print it again.*/
433
            }
434
        }
435
      if (c->doc != NULL && returnvalue != 0)
436
        {
437
          /* Try to match against documentation */
438
          if (re_search(regex,c->doc,strlen(c->doc),0,strlen(c->doc),NULL) >=0)
439
            {
440
              /* Stolen from help_cmd_list. We don't directly use
441
               * help_cmd_list because it doesn't let us print out
442
               * single commands
443
               */
444
              fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
445
              print_doc_line (stream, c->doc);
446
              fputs_filtered ("\n", stream);
447
            }
448
        }
449
      /* Check if this command has subcommands */
450
      if (c->prefixlist != NULL)
451
        {
452
          /* Recursively call ourselves on the subcommand list,
453
             passing the right prefix in.
454
          */
455
          apropos_cmd_helper(stream,*c->prefixlist,regex,c->prefixname);
456
        }
457
    }
458
}
459
/* Search through names of commands and documentations for a certain
460
   regular expression.
461
*/
462
void
463
apropos_command (char *searchstr, int from_tty)
464
{
465
  extern struct cmd_list_element *cmdlist; /*This is the main command list*/
466
  regex_t pattern;
467
  char *pattern_fastmap;
468
  char errorbuffer[512];
469
  pattern_fastmap=calloc(256,sizeof(char));
470
  if (searchstr == NULL)
471
      error("REGEXP string is empty");
472
 
473
  if (regcomp(&pattern,searchstr,REG_ICASE) == 0)
474
    {
475
      pattern.fastmap=pattern_fastmap;
476
      re_compile_fastmap(&pattern);
477
      apropos_cmd_helper(gdb_stdout,cmdlist,&pattern,"");
478
    }
479
  else
480
    {
481
      regerror(regcomp(&pattern,searchstr,REG_ICASE),NULL,errorbuffer,512);
482
      error("Error in regular expression:%s",errorbuffer);
483
    }
484
  free(pattern_fastmap);
485
}
486
 
487
 
488
/* This command really has to deal with two things:
489
 *     1) I want documentation on *this string* (usually called by
490
 * "help commandname").
491
 *     2) I want documentation on *this list* (usually called by
492
 * giving a command that requires subcommands.  Also called by saying
493
 * just "help".)
494
 *
495
 *   I am going to split this into two seperate comamnds, help_cmd and
496
 * help_list.
497
 */
498
 
499
void
500
help_cmd (command, stream)
501
     char *command;
502
     struct ui_file *stream;
503
{
504
  struct cmd_list_element *c;
505
  extern struct cmd_list_element *cmdlist;
506
 
507
  if (!command)
508
    {
509
      help_list (cmdlist, "", all_classes, stream);
510
      return;
511
    }
512
 
513
  c = lookup_cmd (&command, cmdlist, "", 0, 0);
514
 
515
  if (c == 0)
516
    return;
517
 
518
  /* There are three cases here.
519
     If c->prefixlist is nonzero, we have a prefix command.
520
     Print its documentation, then list its subcommands.
521
 
522
     If c->function is nonzero, we really have a command.
523
     Print its documentation and return.
524
 
525
     If c->function is zero, we have a class name.
526
     Print its documentation (as if it were a command)
527
     and then set class to the number of this class
528
     so that the commands in the class will be listed.  */
529
 
530
  fputs_filtered (c->doc, stream);
531
  fputs_filtered ("\n", stream);
532
 
533
  if (c->prefixlist == 0 && c->function.cfunc != NULL)
534
    return;
535
  fprintf_filtered (stream, "\n");
536
 
537
  /* If this is a prefix command, print it's subcommands */
538
  if (c->prefixlist)
539
    help_list (*c->prefixlist, c->prefixname, all_commands, stream);
540
 
541
  /* If this is a class name, print all of the commands in the class */
542
  if (c->function.cfunc == NULL)
543
    help_list (cmdlist, "", c->class, stream);
544
 
545
  if (c->hook)
546
    fprintf_filtered (stream, "\nThis command has a hook defined: %s\n",
547
                      c->hook->name);
548
}
549
 
550
/*
551
 * Get a specific kind of help on a command list.
552
 *
553
 * LIST is the list.
554
 * CMDTYPE is the prefix to use in the title string.
555
 * CLASS is the class with which to list the nodes of this list (see
556
 * documentation for help_cmd_list below),  As usual, ALL_COMMANDS for
557
 * everything, ALL_CLASSES for just classes, and non-negative for only things
558
 * in a specific class.
559
 * and STREAM is the output stream on which to print things.
560
 * If you call this routine with a class >= 0, it recurses.
561
 */
562
void
563
help_list (list, cmdtype, class, stream)
564
     struct cmd_list_element *list;
565
     char *cmdtype;
566
     enum command_class class;
567
     struct ui_file *stream;
568
{
569
  int len;
570
  char *cmdtype1, *cmdtype2;
571
 
572
  /* If CMDTYPE is "foo ", CMDTYPE1 gets " foo" and CMDTYPE2 gets "foo sub"  */
573
  len = strlen (cmdtype);
574
  cmdtype1 = (char *) alloca (len + 1);
575
  cmdtype1[0] = 0;
576
  cmdtype2 = (char *) alloca (len + 4);
577
  cmdtype2[0] = 0;
578
  if (len)
579
    {
580
      cmdtype1[0] = ' ';
581
      strncpy (cmdtype1 + 1, cmdtype, len - 1);
582
      cmdtype1[len] = 0;
583
      strncpy (cmdtype2, cmdtype, len - 1);
584
      strcpy (cmdtype2 + len - 1, " sub");
585
    }
586
 
587
  if (class == all_classes)
588
    fprintf_filtered (stream, "List of classes of %scommands:\n\n", cmdtype2);
589
  else
590
    fprintf_filtered (stream, "List of %scommands:\n\n", cmdtype2);
591
 
592
  help_cmd_list (list, class, cmdtype, (int) class >= 0, stream);
593
 
594
  if (class == all_classes)
595
    fprintf_filtered (stream, "\n\
596
Type \"help%s\" followed by a class name for a list of commands in that class.",
597
                      cmdtype1);
598
 
599
  fprintf_filtered (stream, "\n\
600
Type \"help%s\" followed by %scommand name for full documentation.\n\
601
Command name abbreviations are allowed if unambiguous.\n",
602
                    cmdtype1, cmdtype2);
603
}
604
 
605
/* Print only the first line of STR on STREAM.  */
606
static void
607
print_doc_line (stream, str)
608
     struct ui_file *stream;
609
     char *str;
610
{
611
  static char *line_buffer = 0;
612
  static int line_size;
613
  register char *p;
614
 
615
  if (!line_buffer)
616
    {
617
      line_size = 80;
618
      line_buffer = (char *) xmalloc (line_size);
619
    }
620
 
621
  p = str;
622
  while (*p && *p != '\n' && *p != '.' && *p != ',')
623
    p++;
624
  if (p - str > line_size - 1)
625
    {
626
      line_size = p - str + 1;
627
      free ((PTR) line_buffer);
628
      line_buffer = (char *) xmalloc (line_size);
629
    }
630
  strncpy (line_buffer, str, p - str);
631
  line_buffer[p - str] = '\0';
632
  if (islower (line_buffer[0]))
633
    line_buffer[0] = toupper (line_buffer[0]);
634
#ifdef UI_OUT
635
  ui_out_text (uiout, line_buffer);
636
#else
637
  fputs_filtered (line_buffer, stream);
638
#endif
639
}
640
 
641
/*
642
 * Implement a help command on command list LIST.
643
 * RECURSE should be non-zero if this should be done recursively on
644
 * all sublists of LIST.
645
 * PREFIX is the prefix to print before each command name.
646
 * STREAM is the stream upon which the output should be written.
647
 * CLASS should be:
648
 *      A non-negative class number to list only commands in that
649
 * class.
650
 *      ALL_COMMANDS to list all commands in list.
651
 *      ALL_CLASSES  to list all classes in list.
652
 *
653
 *   Note that RECURSE will be active on *all* sublists, not just the
654
 * ones selected by the criteria above (ie. the selection mechanism
655
 * is at the low level, not the high-level).
656
 */
657
void
658
help_cmd_list (list, class, prefix, recurse, stream)
659
     struct cmd_list_element *list;
660
     enum command_class class;
661
     char *prefix;
662
     int recurse;
663
     struct ui_file *stream;
664
{
665
  register struct cmd_list_element *c;
666
 
667
  for (c = list; c; c = c->next)
668
    {
669
      if (c->abbrev_flag == 0 &&
670
          (class == all_commands
671
           || (class == all_classes && c->function.cfunc == NULL)
672
           || (class == c->class && c->function.cfunc != NULL)))
673
        {
674
          fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
675
          print_doc_line (stream, c->doc);
676
          fputs_filtered ("\n", stream);
677
        }
678
      if (recurse
679
          && c->prefixlist != 0
680
          && c->abbrev_flag == 0)
681
        help_cmd_list (*c->prefixlist, class, c->prefixname, 1, stream);
682
    }
683
}
684
 
685
 
686
/* Search the input clist for 'command'.  Return the command if
687
   found (or NULL if not), and return the number of commands
688
   found in nfound */
689
 
690
static struct cmd_list_element *
691
find_cmd (command, len, clist, ignore_help_classes, nfound)
692
     char *command;
693
     int len;
694
     struct cmd_list_element *clist;
695
     int ignore_help_classes;
696
     int *nfound;
697
{
698
  struct cmd_list_element *found, *c;
699
 
700
  found = (struct cmd_list_element *) NULL;
701
  *nfound = 0;
702
  for (c = clist; c; c = c->next)
703
    if (!strncmp (command, c->name, len)
704
        && (!ignore_help_classes || c->function.cfunc))
705
      {
706
        found = c;
707
        (*nfound)++;
708
        if (c->name[len] == '\0')
709
          {
710
            *nfound = 1;
711
            break;
712
          }
713
      }
714
  return found;
715
}
716
 
717
/* This routine takes a line of TEXT and a CLIST in which to start the
718
   lookup.  When it returns it will have incremented the text pointer past
719
   the section of text it matched, set *RESULT_LIST to point to the list in
720
   which the last word was matched, and will return a pointer to the cmd
721
   list element which the text matches.  It will return NULL if no match at
722
   all was possible.  It will return -1 (cast appropriately, ick) if ambigous
723
   matches are possible; in this case *RESULT_LIST will be set to point to
724
   the list in which there are ambiguous choices (and *TEXT will be set to
725
   the ambiguous text string).
726
 
727
   If the located command was an abbreviation, this routine returns the base
728
   command of the abbreviation.
729
 
730
   It does no error reporting whatsoever; control will always return
731
   to the superior routine.
732
 
733
   In the case of an ambiguous return (-1), *RESULT_LIST will be set to point
734
   at the prefix_command (ie. the best match) *or* (special case) will be NULL
735
   if no prefix command was ever found.  For example, in the case of "info a",
736
   "info" matches without ambiguity, but "a" could be "args" or "address", so
737
   *RESULT_LIST is set to the cmd_list_element for "info".  So in this case
738
   RESULT_LIST should not be interpeted as a pointer to the beginning of a
739
   list; it simply points to a specific command.  In the case of an ambiguous
740
   return *TEXT is advanced past the last non-ambiguous prefix (e.g.
741
   "info t" can be "info types" or "info target"; upon return *TEXT has been
742
   advanced past "info ").
743
 
744
   If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise
745
   affect the operation).
746
 
747
   This routine does *not* modify the text pointed to by TEXT.
748
 
749
   If IGNORE_HELP_CLASSES is nonzero, ignore any command list elements which
750
   are actually help classes rather than commands (i.e. the function field of
751
   the struct cmd_list_element is NULL).  */
752
 
753
struct cmd_list_element *
754
lookup_cmd_1 (text, clist, result_list, ignore_help_classes)
755
     char **text;
756
     struct cmd_list_element *clist, **result_list;
757
     int ignore_help_classes;
758
{
759
  char *p, *command;
760
  int len, tmp, nfound;
761
  struct cmd_list_element *found, *c;
762
  char *line = *text;
763
 
764
  while (**text == ' ' || **text == '\t')
765
    (*text)++;
766
 
767
  /* Treating underscores as part of command words is important
768
     so that "set args_foo()" doesn't get interpreted as
769
     "set args _foo()".  */
770
  for (p = *text;
771
       *p && (isalnum (*p) || *p == '-' || *p == '_' ||
772
              (tui_version &&
773
               (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
774
              (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
775
       p++)
776
    ;
777
 
778
  /* If nothing but whitespace, return 0.  */
779
  if (p == *text)
780
    return 0;
781
 
782
  len = p - *text;
783
 
784
  /* *text and p now bracket the first command word to lookup (and
785
     it's length is len).  We copy this into a local temporary */
786
 
787
 
788
  command = (char *) alloca (len + 1);
789
  for (tmp = 0; tmp < len; tmp++)
790
    {
791
      char x = (*text)[tmp];
792
      command[tmp] = x;
793
    }
794
  command[len] = '\0';
795
 
796
  /* Look it up.  */
797
  found = 0;
798
  nfound = 0;
799
  found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
800
 
801
  /*
802
     ** We didn't find the command in the entered case, so lower case it
803
     ** and search again.
804
   */
805
  if (!found || nfound == 0)
806
    {
807
      for (tmp = 0; tmp < len; tmp++)
808
        {
809
          char x = command[tmp];
810
          command[tmp] = isupper (x) ? tolower (x) : x;
811
        }
812
      found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
813
    }
814
 
815
  /* If nothing matches, we have a simple failure.  */
816
  if (nfound == 0)
817
    return 0;
818
 
819
  if (nfound > 1)
820
    {
821
      if (result_list != NULL)
822
        /* Will be modified in calling routine
823
           if we know what the prefix command is.  */
824
        *result_list = 0;
825
      return (struct cmd_list_element *) -1;    /* Ambiguous.  */
826
    }
827
 
828
  /* We've matched something on this list.  Move text pointer forward. */
829
 
830
  *text = p;
831
 
832
  if (found->cmd_pointer)
833
    {
834
      /* We drop the alias (abbreviation) in favor of the command it is
835
       pointing to.  If the alias is deprecated, though, we need to
836
       warn the user about it before we drop it.  Note that while we
837
       are warning about the alias, we may also warn about the command
838
       itself and we will adjust the appropriate DEPRECATED_WARN_USER
839
       flags */
840
 
841
      if (found->flags & DEPRECATED_WARN_USER)
842
      deprecated_cmd_warning (&line);
843
      found = found->cmd_pointer;
844
    }
845
  /* If we found a prefix command, keep looking.  */
846
 
847
  if (found->prefixlist)
848
    {
849
      c = lookup_cmd_1 (text, *found->prefixlist, result_list,
850
                        ignore_help_classes);
851
      if (!c)
852
        {
853
          /* Didn't find anything; this is as far as we got.  */
854
          if (result_list != NULL)
855
            *result_list = clist;
856
          return found;
857
        }
858
      else if (c == (struct cmd_list_element *) -1)
859
        {
860
          /* We've gotten this far properly, but the next step
861
             is ambiguous.  We need to set the result list to the best
862
             we've found (if an inferior hasn't already set it).  */
863
          if (result_list != NULL)
864
            if (!*result_list)
865
              /* This used to say *result_list = *found->prefixlist
866
                 If that was correct, need to modify the documentation
867
                 at the top of this function to clarify what is supposed
868
                 to be going on.  */
869
              *result_list = found;
870
          return c;
871
        }
872
      else
873
        {
874
          /* We matched!  */
875
          return c;
876
        }
877
    }
878
  else
879
    {
880
      if (result_list != NULL)
881
        *result_list = clist;
882
      return found;
883
    }
884
}
885
 
886
/* All this hair to move the space to the front of cmdtype */
887
 
888
static void
889
undef_cmd_error (cmdtype, q)
890
     char *cmdtype, *q;
891
{
892
  error ("Undefined %scommand: \"%s\".  Try \"help%s%.*s\".",
893
         cmdtype,
894
         q,
895
         *cmdtype ? " " : "",
896
         strlen (cmdtype) - 1,
897
         cmdtype);
898
}
899
 
900
/* Look up the contents of *LINE as a command in the command list LIST.
901
   LIST is a chain of struct cmd_list_element's.
902
   If it is found, return the struct cmd_list_element for that command
903
   and update *LINE to point after the command name, at the first argument.
904
   If not found, call error if ALLOW_UNKNOWN is zero
905
   otherwise (or if error returns) return zero.
906
   Call error if specified command is ambiguous,
907
   unless ALLOW_UNKNOWN is negative.
908
   CMDTYPE precedes the word "command" in the error message.
909
 
910
   If INGNORE_HELP_CLASSES is nonzero, ignore any command list
911
   elements which are actually help classes rather than commands (i.e.
912
   the function field of the struct cmd_list_element is 0).  */
913
 
914
struct cmd_list_element *
915
lookup_cmd (line, list, cmdtype, allow_unknown, ignore_help_classes)
916
     char **line;
917
     struct cmd_list_element *list;
918
     char *cmdtype;
919
     int allow_unknown;
920
     int ignore_help_classes;
921
{
922
  struct cmd_list_element *last_list = 0;
923
  struct cmd_list_element *c =
924
  lookup_cmd_1 (line, list, &last_list, ignore_help_classes);
925
#if 0
926
  /* This is wrong for complete_command.  */
927
  char *ptr = (*line) + strlen (*line) - 1;
928
 
929
  /* Clear off trailing whitespace.  */
930
  while (ptr >= *line && (*ptr == ' ' || *ptr == '\t'))
931
    ptr--;
932
  *(ptr + 1) = '\0';
933
#endif
934
 
935
  if (!c)
936
    {
937
      if (!allow_unknown)
938
        {
939
          if (!*line)
940
            error ("Lack of needed %scommand", cmdtype);
941
          else
942
            {
943
              char *p = *line, *q;
944
 
945
              while (isalnum (*p) || *p == '-')
946
                p++;
947
 
948
              q = (char *) alloca (p - *line + 1);
949
              strncpy (q, *line, p - *line);
950
              q[p - *line] = '\0';
951
              undef_cmd_error (cmdtype, q);
952
            }
953
        }
954
      else
955
        return 0;
956
    }
957
  else if (c == (struct cmd_list_element *) -1)
958
    {
959
      /* Ambigous.  Local values should be off prefixlist or called
960
         values.  */
961
      int local_allow_unknown = (last_list ? last_list->allow_unknown :
962
                                 allow_unknown);
963
      char *local_cmdtype = last_list ? last_list->prefixname : cmdtype;
964
      struct cmd_list_element *local_list =
965
      (last_list ? *(last_list->prefixlist) : list);
966
 
967
      if (local_allow_unknown < 0)
968
        {
969
          if (last_list)
970
            return last_list;   /* Found something.  */
971
          else
972
            return 0;            /* Found nothing.  */
973
        }
974
      else
975
        {
976
          /* Report as error.  */
977
          int amb_len;
978
          char ambbuf[100];
979
 
980
          for (amb_len = 0;
981
               ((*line)[amb_len] && (*line)[amb_len] != ' '
982
                && (*line)[amb_len] != '\t');
983
               amb_len++)
984
            ;
985
 
986
          ambbuf[0] = 0;
987
          for (c = local_list; c; c = c->next)
988
            if (!strncmp (*line, c->name, amb_len))
989
              {
990
                if (strlen (ambbuf) + strlen (c->name) + 6 < (int) sizeof ambbuf)
991
                  {
992
                    if (strlen (ambbuf))
993
                      strcat (ambbuf, ", ");
994
                    strcat (ambbuf, c->name);
995
                  }
996
                else
997
                  {
998
                    strcat (ambbuf, "..");
999
                    break;
1000
                  }
1001
              }
1002
          error ("Ambiguous %scommand \"%s\": %s.", local_cmdtype,
1003
                 *line, ambbuf);
1004
          return 0;              /* lint */
1005
        }
1006
    }
1007
  else
1008
    {
1009
      /* We've got something.  It may still not be what the caller
1010
         wants (if this command *needs* a subcommand).  */
1011
      while (**line == ' ' || **line == '\t')
1012
        (*line)++;
1013
 
1014
      if (c->prefixlist && **line && !c->allow_unknown)
1015
        undef_cmd_error (c->prefixname, *line);
1016
 
1017
      /* Seems to be what he wants.  Return it.  */
1018
      return c;
1019
    }
1020
  return 0;
1021
}
1022
 
1023
/* We are here presumably because an alias or command in *TEXT is
1024
   deprecated and a warning message should be generated.  This function
1025
   decodes *TEXT and potentially generates a warning message as outlined
1026
   below.
1027
 
1028
   Example for 'set endian big' which has a fictitious alias 'seb'.
1029
 
1030
   If alias wasn't used in *TEXT, and the command is deprecated:
1031
   "warning: 'set endian big' is deprecated."
1032
 
1033
   If alias was used, and only the alias is deprecated:
1034
   "warning: 'seb' an alias for the command 'set endian big' is deprecated."
1035
 
1036
   If alias was used and command is deprecated (regardless of whether the
1037
   alias itself is deprecated:
1038
 
1039
   "warning: 'set endian big' (seb) is deprecated."
1040
 
1041
   After the message has been sent, clear the appropriate flags in the
1042
   command and/or the alias so the user is no longer bothered.
1043
 
1044
*/
1045
void
1046
deprecated_cmd_warning (char **text)
1047
{
1048
  struct cmd_list_element *alias = NULL;
1049
  struct cmd_list_element *prefix_cmd = NULL;
1050
  struct cmd_list_element *cmd = NULL;
1051
  struct cmd_list_element *c;
1052
  char *type;
1053
 
1054
  if (!lookup_cmd_composition (*text, &alias, &prefix_cmd, &cmd))
1055
    /* return if text doesn't evaluate to a command */
1056
    return;
1057
 
1058
  if (!((alias ? (alias->flags & DEPRECATED_WARN_USER) : 0)
1059
      || (cmd->flags & DEPRECATED_WARN_USER) ) )
1060
    /* return if nothing is deprecated */
1061
    return;
1062
 
1063
  printf_filtered ("Warning:");
1064
 
1065
  if (alias && !(cmd->flags & CMD_DEPRECATED))
1066
    printf_filtered (" '%s', an alias for the", alias->name);
1067
 
1068
  printf_filtered (" command '");
1069
 
1070
  if (prefix_cmd)
1071
    printf_filtered ("%s", prefix_cmd->prefixname);
1072
 
1073
  printf_filtered ("%s", cmd->name);
1074
 
1075
  if (alias && (cmd->flags & CMD_DEPRECATED))
1076
    printf_filtered ("' (%s) is deprecated.\n", alias->name);
1077
  else
1078
    printf_filtered ("' is deprecated.\n");
1079
 
1080
 
1081
  /* if it is only the alias that is deprecated, we want to indicate the
1082
     new alias, otherwise we'll indicate the new command */
1083
 
1084
  if (alias && !(cmd->flags & CMD_DEPRECATED))
1085
    {
1086
      if (alias->replacement)
1087
      printf_filtered ("Use '%s'.\n\n", alias->replacement);
1088
      else
1089
      printf_filtered ("No alternative known.\n\n");
1090
     }
1091
  else
1092
    {
1093
      if (cmd->replacement)
1094
      printf_filtered ("Use '%s'.\n\n", cmd->replacement);
1095
      else
1096
      printf_filtered ("No alternative known.\n\n");
1097
    }
1098
 
1099
  /* We've warned you, now we'll keep quiet */
1100
  if (alias)
1101
    alias->flags &= ~DEPRECATED_WARN_USER;
1102
 
1103
  cmd->flags &= ~DEPRECATED_WARN_USER;
1104
}
1105
 
1106
 
1107
 
1108
/* Look up the contents of LINE as a command in the command list 'cmdlist'.
1109
   Return 1 on success, 0 on failure.
1110
 
1111
   If LINE refers to an alias, *alias will point to that alias.
1112
 
1113
   If LINE is a postfix command (i.e. one that is preceeded by a prefix
1114
   command) set *prefix_cmd.
1115
 
1116
   Set *cmd to point to the command LINE indicates.
1117
 
1118
   If any of *alias, *prefix_cmd, or *cmd cannot be determined or do not
1119
   exist, they are NULL when we return.
1120
 
1121
*/
1122
int
1123
lookup_cmd_composition (char *text,
1124
                      struct cmd_list_element **alias,
1125
                      struct cmd_list_element **prefix_cmd,
1126
                      struct cmd_list_element **cmd)
1127
{
1128
  char *p, *command;
1129
  int len, tmp, nfound;
1130
  struct cmd_list_element *cur_list;
1131
  struct cmd_list_element *prev_cmd;
1132
  *alias = NULL;
1133
  *prefix_cmd = NULL;
1134
  *cmd = NULL;
1135
 
1136
  cur_list = cmdlist;
1137
 
1138
  while (1)
1139
    {
1140
      /* Go through as many command lists as we need to
1141
       to find the command TEXT refers to. */
1142
 
1143
      prev_cmd = *cmd;
1144
 
1145
      while (*text == ' ' || *text == '\t')
1146
      (text)++;
1147
 
1148
      /* Treating underscores as part of command words is important
1149
       so that "set args_foo()" doesn't get interpreted as
1150
       "set args _foo()".  */
1151
      for (p = text;
1152
         *p && (isalnum (*p) || *p == '-' || *p == '_' ||
1153
                (tui_version &&
1154
                 (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
1155
                (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
1156
         p++)
1157
      ;
1158
 
1159
      /* If nothing but whitespace, return.  */
1160
      if (p == text)
1161
      return 0;
1162
 
1163
      len = p - text;
1164
 
1165
      /* text and p now bracket the first command word to lookup (and
1166
       it's length is len).  We copy this into a local temporary */
1167
 
1168
      command = (char *) alloca (len + 1);
1169
      for (tmp = 0; tmp < len; tmp++)
1170
      {
1171
        char x = text[tmp];
1172
        command[tmp] = x;
1173
      }
1174
      command[len] = '\0';
1175
 
1176
      /* Look it up.  */
1177
      *cmd = 0;
1178
      nfound = 0;
1179
      *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1180
 
1181
      /* We didn't find the command in the entered case, so lower case it
1182
       and search again.
1183
      */
1184
      if (!*cmd || nfound == 0)
1185
      {
1186
        for (tmp = 0; tmp < len; tmp++)
1187
          {
1188
            char x = command[tmp];
1189
            command[tmp] = isupper (x) ? tolower (x) : x;
1190
          }
1191
        *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1192
      }
1193
 
1194
      if (*cmd == (struct cmd_list_element *) -1)
1195
      {
1196
        return 0;              /* ambiguous */
1197
      }
1198
 
1199
      if (*cmd == NULL)
1200
      return 0;                /* nothing found */
1201
      else
1202
      {
1203
        if ((*cmd)->cmd_pointer)
1204
          {
1205
            /* cmd was actually an alias, we note that an alias was used
1206
               (by assigning *alais) and we set *cmd.
1207
             */
1208
            *alias = *cmd;
1209
            *cmd = (*cmd)->cmd_pointer;
1210
          }
1211
        *prefix_cmd = prev_cmd;
1212
      }
1213
      if ((*cmd)->prefixlist)
1214
      cur_list = *(*cmd)->prefixlist;
1215
      else
1216
      return 1;
1217
 
1218
      text = p;
1219
    }
1220
}
1221
 
1222
 
1223
 
1224
 
1225
#if 0
1226
/* Look up the contents of *LINE as a command in the command list LIST.
1227
   LIST is a chain of struct cmd_list_element's.
1228
   If it is found, return the struct cmd_list_element for that command
1229
   and update *LINE to point after the command name, at the first argument.
1230
   If not found, call error if ALLOW_UNKNOWN is zero
1231
   otherwise (or if error returns) return zero.
1232
   Call error if specified command is ambiguous,
1233
   unless ALLOW_UNKNOWN is negative.
1234
   CMDTYPE precedes the word "command" in the error message.  */
1235
 
1236
struct cmd_list_element *
1237
lookup_cmd (line, list, cmdtype, allow_unknown)
1238
     char **line;
1239
     struct cmd_list_element *list;
1240
     char *cmdtype;
1241
     int allow_unknown;
1242
{
1243
  register char *p;
1244
  register struct cmd_list_element *c, *found;
1245
  int nfound;
1246
  char ambbuf[100];
1247
  char *processed_cmd;
1248
  int i, cmd_len;
1249
 
1250
  /* Skip leading whitespace.  */
1251
 
1252
  while (**line == ' ' || **line == '\t')
1253
    (*line)++;
1254
 
1255
  /* Clear out trailing whitespace.  */
1256
 
1257
  p = *line + strlen (*line);
1258
  while (p != *line && (p[-1] == ' ' || p[-1] == '\t'))
1259
    p--;
1260
  *p = 0;
1261
 
1262
  /* Find end of command name.  */
1263
 
1264
  p = *line;
1265
  while (*p == '-' || isalnum (*p))
1266
    p++;
1267
 
1268
  /* Look up the command name.
1269
     If exact match, keep that.
1270
     Otherwise, take command abbreviated, if unique.  Note that (in my
1271
     opinion) a null string does *not* indicate ambiguity; simply the
1272
     end of the argument.  */
1273
 
1274
  if (p == *line)
1275
    {
1276
      if (!allow_unknown)
1277
        error ("Lack of needed %scommand", cmdtype);
1278
      return 0;
1279
    }
1280
 
1281
  /* Copy over to a local buffer, converting to lowercase on the way.
1282
     This is in case the command being parsed is a subcommand which
1283
     doesn't match anything, and that's ok.  We want the original
1284
     untouched for the routine of the original command.  */
1285
 
1286
  processed_cmd = (char *) alloca (p - *line + 1);
1287
  for (cmd_len = 0; cmd_len < p - *line; cmd_len++)
1288
    {
1289
      char x = (*line)[cmd_len];
1290
      if (isupper (x))
1291
        processed_cmd[cmd_len] = tolower (x);
1292
      else
1293
        processed_cmd[cmd_len] = x;
1294
    }
1295
  processed_cmd[cmd_len] = '\0';
1296
 
1297
  /* Check all possibilities in the current command list.  */
1298
  found = 0;
1299
  nfound = 0;
1300
  for (c = list; c; c = c->next)
1301
    {
1302
      if (!strncmp (processed_cmd, c->name, cmd_len))
1303
        {
1304
          found = c;
1305
          nfound++;
1306
          if (c->name[cmd_len] == 0)
1307
            {
1308
              nfound = 1;
1309
              break;
1310
            }
1311
        }
1312
    }
1313
 
1314
  /* Report error for undefined command name.  */
1315
 
1316
  if (nfound != 1)
1317
    {
1318
      if (nfound > 1 && allow_unknown >= 0)
1319
        {
1320
          ambbuf[0] = 0;
1321
          for (c = list; c; c = c->next)
1322
            if (!strncmp (processed_cmd, c->name, cmd_len))
1323
              {
1324
                if (strlen (ambbuf) + strlen (c->name) + 6 < sizeof ambbuf)
1325
                  {
1326
                    if (strlen (ambbuf))
1327
                      strcat (ambbuf, ", ");
1328
                    strcat (ambbuf, c->name);
1329
                  }
1330
                else
1331
                  {
1332
                    strcat (ambbuf, "..");
1333
                    break;
1334
                  }
1335
              }
1336
          error ("Ambiguous %scommand \"%s\": %s.", cmdtype,
1337
                 processed_cmd, ambbuf);
1338
        }
1339
      else if (!allow_unknown)
1340
        error ("Undefined %scommand: \"%s\".", cmdtype, processed_cmd);
1341
      return 0;
1342
    }
1343
 
1344
  /* Skip whitespace before the argument.  */
1345
 
1346
  while (*p == ' ' || *p == '\t')
1347
    p++;
1348
  *line = p;
1349
 
1350
  if (found->prefixlist && *p)
1351
    {
1352
      c = lookup_cmd (line, *found->prefixlist, found->prefixname,
1353
                      found->allow_unknown);
1354
      if (c)
1355
        return c;
1356
    }
1357
 
1358
  return found;
1359
}
1360
#endif
1361
 
1362
/* Helper function for SYMBOL_COMPLETION_FUNCTION.  */
1363
 
1364
/* Return a vector of char pointers which point to the different
1365
   possible completions in LIST of TEXT.
1366
 
1367
   WORD points in the same buffer as TEXT, and completions should be
1368
   returned relative to this position.  For example, suppose TEXT is "foo"
1369
   and we want to complete to "foobar".  If WORD is "oo", return
1370
   "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
1371
 
1372
char **
1373
complete_on_cmdlist (list, text, word)
1374
     struct cmd_list_element *list;
1375
     char *text;
1376
     char *word;
1377
{
1378
  struct cmd_list_element *ptr;
1379
  char **matchlist;
1380
  int sizeof_matchlist;
1381
  int matches;
1382
  int textlen = strlen (text);
1383
 
1384
  sizeof_matchlist = 10;
1385
  matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
1386
  matches = 0;
1387
 
1388
  for (ptr = list; ptr; ptr = ptr->next)
1389
    if (!strncmp (ptr->name, text, textlen)
1390
        && !ptr->abbrev_flag
1391
        && (ptr->function.cfunc
1392
            || ptr->prefixlist))
1393
      {
1394
        if (matches == sizeof_matchlist)
1395
          {
1396
            sizeof_matchlist *= 2;
1397
            matchlist = (char **) xrealloc ((char *) matchlist,
1398
                                            (sizeof_matchlist
1399
                                             * sizeof (char *)));
1400
          }
1401
 
1402
        matchlist[matches] = (char *)
1403
          xmalloc (strlen (word) + strlen (ptr->name) + 1);
1404
        if (word == text)
1405
          strcpy (matchlist[matches], ptr->name);
1406
        else if (word > text)
1407
          {
1408
            /* Return some portion of ptr->name.  */
1409
            strcpy (matchlist[matches], ptr->name + (word - text));
1410
          }
1411
        else
1412
          {
1413
            /* Return some of text plus ptr->name.  */
1414
            strncpy (matchlist[matches], word, text - word);
1415
            matchlist[matches][text - word] = '\0';
1416
            strcat (matchlist[matches], ptr->name);
1417
          }
1418
        ++matches;
1419
      }
1420
 
1421
  if (matches == 0)
1422
    {
1423
      free ((PTR) matchlist);
1424
      matchlist = 0;
1425
    }
1426
  else
1427
    {
1428
      matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
1429
                                                        * sizeof (char *)));
1430
      matchlist[matches] = (char *) 0;
1431
    }
1432
 
1433
  return matchlist;
1434
}
1435
 
1436
/* Helper function for SYMBOL_COMPLETION_FUNCTION.  */
1437
 
1438
/* Return a vector of char pointers which point to the different
1439
   possible completions in CMD of TEXT.
1440
 
1441
   WORD points in the same buffer as TEXT, and completions should be
1442
   returned relative to this position.  For example, suppose TEXT is "foo"
1443
   and we want to complete to "foobar".  If WORD is "oo", return
1444
   "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
1445
 
1446
char **
1447
complete_on_enum (enumlist, text, word)
1448
     char **enumlist;
1449
     char *text;
1450
     char *word;
1451
{
1452
  char **matchlist;
1453
  int sizeof_matchlist;
1454
  int matches;
1455
  int textlen = strlen (text);
1456
  int i;
1457
  char *name;
1458
 
1459
  sizeof_matchlist = 10;
1460
  matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
1461
  matches = 0;
1462
 
1463
  for (i = 0; (name = enumlist[i]) != NULL; i++)
1464
    if (strncmp (name, text, textlen) == 0)
1465
      {
1466
        if (matches == sizeof_matchlist)
1467
          {
1468
            sizeof_matchlist *= 2;
1469
            matchlist = (char **) xrealloc ((char *) matchlist,
1470
                                            (sizeof_matchlist
1471
                                             * sizeof (char *)));
1472
          }
1473
 
1474
        matchlist[matches] = (char *)
1475
          xmalloc (strlen (word) + strlen (name) + 1);
1476
        if (word == text)
1477
          strcpy (matchlist[matches], name);
1478
        else if (word > text)
1479
          {
1480
            /* Return some portion of name.  */
1481
            strcpy (matchlist[matches], name + (word - text));
1482
          }
1483
        else
1484
          {
1485
            /* Return some of text plus name.  */
1486
            strncpy (matchlist[matches], word, text - word);
1487
            matchlist[matches][text - word] = '\0';
1488
            strcat (matchlist[matches], name);
1489
          }
1490
        ++matches;
1491
      }
1492
 
1493
  if (matches == 0)
1494
    {
1495
      free ((PTR) matchlist);
1496
      matchlist = 0;
1497
    }
1498
  else
1499
    {
1500
      matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
1501
                                                        * sizeof (char *)));
1502
      matchlist[matches] = (char *) 0;
1503
    }
1504
 
1505
  return matchlist;
1506
}
1507
 
1508
static int
1509
parse_binary_operation (arg)
1510
     char *arg;
1511
{
1512
  int length;
1513
 
1514
  if (!arg || !*arg)
1515
    return 1;
1516
 
1517
  length = strlen (arg);
1518
 
1519
  while (arg[length - 1] == ' ' || arg[length - 1] == '\t')
1520
    length--;
1521
 
1522
  if (!strncmp (arg, "on", length)
1523
      || !strncmp (arg, "1", length)
1524
      || !strncmp (arg, "yes", length))
1525
    return 1;
1526
  else if (!strncmp (arg, "off", length)
1527
           || !strncmp (arg, "0", length)
1528
           || !strncmp (arg, "no", length))
1529
    return 0;
1530
  else
1531
    {
1532
      error ("\"on\" or \"off\" expected.");
1533
      return 0;
1534
    }
1535
}
1536
 
1537
/* Do a "set" or "show" command.  ARG is NULL if no argument, or the text
1538
   of the argument, and FROM_TTY is nonzero if this command is being entered
1539
   directly by the user (i.e. these are just like any other
1540
   command).  C is the command list element for the command.  */
1541
void
1542
do_setshow_command (arg, from_tty, c)
1543
     char *arg;
1544
     int from_tty;
1545
     struct cmd_list_element *c;
1546
{
1547
  if (c->type == set_cmd)
1548
    {
1549
      switch (c->var_type)
1550
        {
1551
        case var_string:
1552
          {
1553
            char *new;
1554
            char *p;
1555
            char *q;
1556
            int ch;
1557
 
1558
            if (arg == NULL)
1559
              arg = "";
1560
            new = (char *) xmalloc (strlen (arg) + 2);
1561
            p = arg;
1562
            q = new;
1563
            while ((ch = *p++) != '\000')
1564
              {
1565
                if (ch == '\\')
1566
                  {
1567
                    /* \ at end of argument is used after spaces
1568
                       so they won't be lost.  */
1569
                    /* This is obsolete now that we no longer strip
1570
                       trailing whitespace and actually, the backslash
1571
                       didn't get here in my test, readline or
1572
                       something did something funky with a backslash
1573
                       right before a newline.  */
1574
                    if (*p == 0)
1575
                      break;
1576
                    ch = parse_escape (&p);
1577
                    if (ch == 0)
1578
                      break;    /* C loses */
1579
                    else if (ch > 0)
1580
                      *q++ = ch;
1581
                  }
1582
                else
1583
                  *q++ = ch;
1584
              }
1585
#if 0
1586
            if (*(p - 1) != '\\')
1587
              *q++ = ' ';
1588
#endif
1589
            *q++ = '\0';
1590
            new = (char *) xrealloc (new, q - new);
1591
            if (*(char **) c->var != NULL)
1592
              free (*(char **) c->var);
1593
            *(char **) c->var = new;
1594
          }
1595
          break;
1596
        case var_string_noescape:
1597
          if (arg == NULL)
1598
            arg = "";
1599
          if (*(char **) c->var != NULL)
1600
            free (*(char **) c->var);
1601
          *(char **) c->var = savestring (arg, strlen (arg));
1602
          break;
1603
        case var_filename:
1604
          if (arg == NULL)
1605
            error_no_arg ("filename to set it to.");
1606
          if (*(char **) c->var != NULL)
1607
            free (*(char **) c->var);
1608
          *(char **) c->var = tilde_expand (arg);
1609
          break;
1610
        case var_boolean:
1611
          *(int *) c->var = parse_binary_operation (arg);
1612
          break;
1613
        case var_uinteger:
1614
          if (arg == NULL)
1615
            error_no_arg ("integer to set it to.");
1616
          *(unsigned int *) c->var = parse_and_eval_address (arg);
1617
          if (*(unsigned int *) c->var == 0)
1618
            *(unsigned int *) c->var = UINT_MAX;
1619
          break;
1620
        case var_integer:
1621
          {
1622
            unsigned int val;
1623
            if (arg == NULL)
1624
              error_no_arg ("integer to set it to.");
1625
            val = parse_and_eval_address (arg);
1626
            if (val == 0)
1627
              *(int *) c->var = INT_MAX;
1628
            else if (val >= INT_MAX)
1629
              error ("integer %u out of range", val);
1630
            else
1631
              *(int *) c->var = val;
1632
            break;
1633
          }
1634
        case var_zinteger:
1635
          if (arg == NULL)
1636
            error_no_arg ("integer to set it to.");
1637
          *(int *) c->var = parse_and_eval_address (arg);
1638
          break;
1639
        case var_enum:
1640
          {
1641
            int i;
1642
            int len;
1643
            int nmatches;
1644
            char *match = NULL;
1645
            char *p;
1646
 
1647
            /* if no argument was supplied, print an informative error message */
1648
            if (arg == NULL)
1649
              {
1650
                char msg[1024];
1651
                strcpy (msg, "Requires an argument. Valid arguments are ");
1652
                for (i = 0; c->enums[i]; i++)
1653
                  {
1654
                    if (i != 0)
1655
                      strcat (msg, ", ");
1656
                    strcat (msg, c->enums[i]);
1657
                  }
1658
                strcat (msg, ".");
1659
                error (msg);
1660
              }
1661
 
1662
            p = strchr (arg, ' ');
1663
 
1664
            if (p)
1665
              len = p - arg;
1666
            else
1667
              len = strlen (arg);
1668
 
1669
            nmatches = 0;
1670
            for (i = 0; c->enums[i]; i++)
1671
              if (strncmp (arg, c->enums[i], len) == 0)
1672
                {
1673
                  match = c->enums[i];
1674
                  nmatches++;
1675
                }
1676
 
1677
            if (nmatches <= 0)
1678
              error ("Undefined item: \"%s\".", arg);
1679
 
1680
            if (nmatches > 1)
1681
              error ("Ambiguous item \"%s\".", arg);
1682
 
1683
            *(char **) c->var = match;
1684
          }
1685
          break;
1686
        default:
1687
          error ("gdb internal error: bad var_type in do_setshow_command");
1688
        }
1689
    }
1690
  else if (c->type == show_cmd)
1691
    {
1692
#ifdef UI_OUT
1693
      struct cleanup *old_chain;
1694
      struct ui_stream *stb;
1695
      int quote;
1696
 
1697
      stb = ui_out_stream_new (uiout);
1698
      old_chain = make_cleanup ((make_cleanup_func) ui_out_stream_delete, stb);
1699
#endif /* UI_OUT */
1700
 
1701
      /* Print doc minus "show" at start.  */
1702
      print_doc_line (gdb_stdout, c->doc + 5);
1703
 
1704
#ifdef UI_OUT
1705
      ui_out_text (uiout, " is ");
1706
      ui_out_wrap_hint (uiout, "    ");
1707
      quote = 0;
1708
      switch (c->var_type)
1709
        {
1710
        case var_string:
1711
          {
1712
            unsigned char *p;
1713
 
1714
            if (*(unsigned char **) c->var)
1715
              fputstr_filtered (*(unsigned char **) c->var, '"', stb->stream);
1716
            quote = 1;
1717
          }
1718
          break;
1719
        case var_string_noescape:
1720
        case var_filename:
1721
        case var_enum:
1722
          if (*(char **) c->var)
1723
            fputs_filtered (*(char **) c->var, stb->stream);
1724
          quote = 1;
1725
          break;
1726
        case var_boolean:
1727
          fputs_filtered (*(int *) c->var ? "on" : "off", stb->stream);
1728
          break;
1729
        case var_uinteger:
1730
          if (*(unsigned int *) c->var == UINT_MAX)
1731
            {
1732
              fputs_filtered ("unlimited", stb->stream);
1733
              break;
1734
            }
1735
          /* else fall through */
1736
        case var_zinteger:
1737
          fprintf_filtered (stb->stream, "%u", *(unsigned int *) c->var);
1738
          break;
1739
        case var_integer:
1740
          if (*(int *) c->var == INT_MAX)
1741
            {
1742
              fputs_filtered ("unlimited", stb->stream);
1743
            }
1744
          else
1745
            fprintf_filtered (stb->stream, "%d", *(int *) c->var);
1746
          break;
1747
 
1748
        default:
1749
          error ("gdb internal error: bad var_type in do_setshow_command");
1750
        }
1751
      if (quote)
1752
        ui_out_text (uiout, "\"");
1753
      ui_out_field_stream (uiout, "value", stb);
1754
      if (quote)
1755
        ui_out_text (uiout, "\"");
1756
      ui_out_text (uiout, ".\n");
1757
      do_cleanups (old_chain);
1758
#else
1759
      fputs_filtered (" is ", gdb_stdout);
1760
      wrap_here ("    ");
1761
      switch (c->var_type)
1762
        {
1763
        case var_string:
1764
          {
1765
            fputs_filtered ("\"", gdb_stdout);
1766
            if (*(unsigned char **) c->var)
1767
              fputstr_filtered (*(unsigned char **) c->var, '"', gdb_stdout);
1768
            fputs_filtered ("\"", gdb_stdout);
1769
          }
1770
          break;
1771
        case var_string_noescape:
1772
        case var_filename:
1773
        case var_enum:
1774
          fputs_filtered ("\"", gdb_stdout);
1775
          if (*(char **) c->var)
1776
            fputs_filtered (*(char **) c->var, gdb_stdout);
1777
          fputs_filtered ("\"", gdb_stdout);
1778
          break;
1779
        case var_boolean:
1780
          fputs_filtered (*(int *) c->var ? "on" : "off", gdb_stdout);
1781
          break;
1782
        case var_uinteger:
1783
          if (*(unsigned int *) c->var == UINT_MAX)
1784
            {
1785
              fputs_filtered ("unlimited", gdb_stdout);
1786
              break;
1787
            }
1788
          /* else fall through */
1789
        case var_zinteger:
1790
          fprintf_filtered (gdb_stdout, "%u", *(unsigned int *) c->var);
1791
          break;
1792
        case var_integer:
1793
          if (*(int *) c->var == INT_MAX)
1794
            {
1795
              fputs_filtered ("unlimited", gdb_stdout);
1796
            }
1797
          else
1798
            fprintf_filtered (gdb_stdout, "%d", *(int *) c->var);
1799
          break;
1800
 
1801
        default:
1802
          error ("gdb internal error: bad var_type in do_setshow_command");
1803
        }
1804
      fputs_filtered (".\n", gdb_stdout);
1805
#endif
1806
    }
1807
  else
1808
    error ("gdb internal error: bad cmd_type in do_setshow_command");
1809
  (*c->function.sfunc) (NULL, from_tty, c);
1810
  if (c->type == set_cmd && set_hook)
1811
    set_hook (c);
1812
}
1813
 
1814
/* Show all the settings in a list of show commands.  */
1815
 
1816
void
1817
cmd_show_list (list, from_tty, prefix)
1818
     struct cmd_list_element *list;
1819
     int from_tty;
1820
     char *prefix;
1821
{
1822
#ifdef UI_OUT
1823
  ui_out_list_begin (uiout, "showlist");
1824
#endif
1825
  for (; list != NULL; list = list->next)
1826
    {
1827
      /* If we find a prefix, run its list, prefixing our output by its
1828
         prefix (with "show " skipped).  */
1829
#ifdef UI_OUT
1830
      if (list->prefixlist && !list->abbrev_flag)
1831
        {
1832
          ui_out_list_begin (uiout, "optionlist");
1833
          ui_out_field_string (uiout, "prefix", list->prefixname + 5);
1834
          cmd_show_list (*list->prefixlist, from_tty, list->prefixname + 5);
1835
          ui_out_list_end (uiout);
1836
        }
1837
      if (list->type == show_cmd)
1838
        {
1839
          ui_out_list_begin (uiout, "option");
1840
          ui_out_text (uiout, prefix);
1841
          ui_out_field_string (uiout, "name", list->name);
1842
          ui_out_text (uiout, ":  ");
1843
          do_setshow_command ((char *) NULL, from_tty, list);
1844
          ui_out_list_end (uiout);
1845
        }
1846
#else
1847
      if (list->prefixlist && !list->abbrev_flag)
1848
        cmd_show_list (*list->prefixlist, from_tty, list->prefixname + 5);
1849
      if (list->type == show_cmd)
1850
        {
1851
          fputs_filtered (prefix, gdb_stdout);
1852
          fputs_filtered (list->name, gdb_stdout);
1853
          fputs_filtered (":  ", gdb_stdout);
1854
          do_setshow_command ((char *) NULL, from_tty, list);
1855
        }
1856
#endif
1857
    }
1858
#ifdef UI_OUT
1859
  ui_out_list_end (uiout);
1860
#endif
1861
}
1862
 
1863
/* ARGSUSED */
1864
static void
1865
shell_escape (arg, from_tty)
1866
     char *arg;
1867
     int from_tty;
1868
{
1869
#ifdef CANT_FORK
1870
  /* If ARG is NULL, they want an inferior shell, but `system' just
1871
     reports if the shell is available when passed a NULL arg.  */
1872
  int rc = system (arg ? arg : "");
1873
 
1874
  if (!arg)
1875
    arg = "inferior shell";
1876
 
1877
  if (rc == -1)
1878
    {
1879
      fprintf_unfiltered (gdb_stderr, "Cannot execute %s: %s\n", arg,
1880
                          safe_strerror (errno));
1881
      gdb_flush (gdb_stderr);
1882
    }
1883
  else if (rc)
1884
    {
1885
      fprintf_unfiltered (gdb_stderr, "%s exited with status %d\n", arg, rc);
1886
      gdb_flush (gdb_stderr);
1887
    }
1888
#ifdef __DJGPP__
1889
  /* Make sure to return to the directory GDB thinks it is, in case the
1890
     shell command we just ran changed it.  */
1891
  chdir (current_directory);
1892
#endif
1893
#else /* Can fork.  */
1894
  int rc, status, pid;
1895
  char *p, *user_shell;
1896
 
1897
  if ((user_shell = (char *) getenv ("SHELL")) == NULL)
1898
    user_shell = "/bin/sh";
1899
 
1900
  /* Get the name of the shell for arg0 */
1901
  if ((p = strrchr (user_shell, '/')) == NULL)
1902
    p = user_shell;
1903
  else
1904
    p++;                        /* Get past '/' */
1905
 
1906
  if ((pid = fork ()) == 0)
1907
    {
1908
      if (!arg)
1909
        execl (user_shell, p, 0);
1910
      else
1911
        execl (user_shell, p, "-c", arg, 0);
1912
 
1913
      fprintf_unfiltered (gdb_stderr, "Cannot execute %s: %s\n", user_shell,
1914
                          safe_strerror (errno));
1915
      gdb_flush (gdb_stderr);
1916
      _exit (0177);
1917
    }
1918
 
1919
  if (pid != -1)
1920
    while ((rc = wait (&status)) != pid && rc != -1)
1921
      ;
1922
  else
1923
    error ("Fork failed");
1924
#endif /* Can fork.  */
1925
}
1926
 
1927
static void
1928
make_command (arg, from_tty)
1929
     char *arg;
1930
     int from_tty;
1931
{
1932
  char *p;
1933
 
1934
  if (arg == 0)
1935
    p = "make";
1936
  else
1937
    {
1938
      p = xmalloc (sizeof ("make ") + strlen (arg));
1939
      strcpy (p, "make ");
1940
      strcpy (p + sizeof ("make ") - 1, arg);
1941
    }
1942
 
1943
  shell_escape (p, from_tty);
1944
}
1945
 
1946
static void
1947
show_user_1 (c, stream)
1948
     struct cmd_list_element *c;
1949
     struct ui_file *stream;
1950
{
1951
  register struct command_line *cmdlines;
1952
 
1953
  cmdlines = c->user_commands;
1954
  if (!cmdlines)
1955
    return;
1956
  fputs_filtered ("User command ", stream);
1957
  fputs_filtered (c->name, stream);
1958
  fputs_filtered (":\n", stream);
1959
 
1960
#ifdef UI_OUT
1961
  print_command_lines (uiout, cmdlines, 1);
1962
  fputs_filtered ("\n", stream);
1963
#else
1964
  while (cmdlines)
1965
    {
1966
      print_command_line (cmdlines, 4, stream);
1967
      cmdlines = cmdlines->next;
1968
    }
1969
  fputs_filtered ("\n", stream);
1970
#endif
1971
}
1972
 
1973
/* ARGSUSED */
1974
static void
1975
show_user (args, from_tty)
1976
     char *args;
1977
     int from_tty;
1978
{
1979
  struct cmd_list_element *c;
1980
  extern struct cmd_list_element *cmdlist;
1981
 
1982
  if (args)
1983
    {
1984
      c = lookup_cmd (&args, cmdlist, "", 0, 1);
1985
      if (c->class != class_user)
1986
        error ("Not a user command.");
1987
      show_user_1 (c, gdb_stdout);
1988
    }
1989
  else
1990
    {
1991
      for (c = cmdlist; c; c = c->next)
1992
        {
1993
          if (c->class == class_user)
1994
            show_user_1 (c, gdb_stdout);
1995
        }
1996
    }
1997
}
1998
 
1999
void
2000
_initialize_command ()
2001
{
2002
  add_com ("shell", class_support, shell_escape,
2003
           "Execute the rest of the line as a shell command.  \n\
2004
With no arguments, run an inferior shell.");
2005
 
2006
  /* NOTE: cagney/2000-03-20: Being able to enter ``(gdb) !ls'' would
2007
     be a really useful feature.  Unfortunatly, the below wont do
2008
     this.  Instead it adds support for the form ``(gdb) ! ls''
2009
     (i.e. the space is required).  If the ``!'' command below is
2010
     added the complains about no ``!'' command would be replaced by
2011
     complains about how the ``!'' command is broken :-) */
2012
  if (xdb_commands)
2013
    add_com_alias ("!", "shell", class_support, 0);
2014
 
2015
  add_com ("make", class_support, make_command,
2016
       "Run the ``make'' program using the rest of the line as arguments.");
2017
  add_cmd ("user", no_class, show_user,
2018
           "Show definitions of user defined commands.\n\
2019
Argument is the name of the user defined command.\n\
2020
With no argument, show definitions of all user defined commands.", &showlist);
2021
  add_com ("apropos", class_support, apropos_command, "Search for commands matching a REGEXP");
2022
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.