]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/cli/cli-decode.c
From 2002-02-20 Martin Schwidefsky <schwidefsky@de.ibm.com>:
[thirdparty/binutils-gdb.git] / gdb / cli / cli-decode.c
CommitLineData
c906108c 1/* Handle lists of commands, their decoding and documentation, for GDB.
8926118c
AC
2
3 Copyright 1986, 1989, 1990, 1991, 1998, 2000, 2001, 2002 Free
4 Software Foundation, Inc.
c906108c 5
c5aa993b
JM
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
c906108c 10
c5aa993b
JM
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
c906108c 15
c5aa993b
JM
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
c906108c
SS
20
21#include "defs.h"
c906108c 22#include "symtab.h"
c906108c 23#include <ctype.h>
f77b92bf 24#include "gdb_regex.h"
d318976c 25
8b93c638 26#include "ui-out.h"
c906108c 27
d318976c
FN
28#include "cli/cli-cmds.h"
29#include "cli/cli-decode.h"
53a5351d 30
c906108c
SS
31/* Prototypes for local functions */
32
a14ed312 33static void undef_cmd_error (char *, char *);
c906108c 34
a14ed312
KB
35static struct cmd_list_element *find_cmd (char *command,
36 int len,
37 struct cmd_list_element *clist,
38 int ignore_help_classes,
39 int *nfound);
6837a0a2 40
c85871a3 41static void help_all (struct ui_file *stream);
d318976c 42\f
9f60d481
AC
43/* Set the callback function for the specified command. For each both
44 the commands callback and func() are set. The latter set to a
45 bounce function (unless cfunc / sfunc is NULL that is). */
46
47static void
48do_cfunc (struct cmd_list_element *c, char *args, int from_tty)
49{
50 c->function.cfunc (args, from_tty); /* Ok. */
51}
52
53void
54set_cmd_cfunc (struct cmd_list_element *cmd,
55 void (*cfunc) (char *args, int from_tty))
56{
57 if (cfunc == NULL)
58 cmd->func = NULL;
59 else
60 cmd->func = do_cfunc;
61 cmd->function.cfunc = cfunc; /* Ok. */
62}
63
64static void
65do_sfunc (struct cmd_list_element *c, char *args, int from_tty)
66{
67 c->function.sfunc (args, from_tty, c); /* Ok. */
68}
69
70void
71set_cmd_sfunc (struct cmd_list_element *cmd,
72 void (*sfunc) (char *args, int from_tty,
73 struct cmd_list_element * c))
74{
75 if (sfunc == NULL)
76 cmd->func = NULL;
77 else
78 cmd->func = do_sfunc;
79 cmd->function.sfunc = sfunc; /* Ok. */
80}
81
82
c906108c
SS
83/* Add element named NAME.
84 CLASS is the top level category into which commands are broken down
85 for "help" purposes.
86 FUN should be the function to execute the command;
87 it will get a character string as argument, with leading
88 and trailing blanks already eliminated.
89
90 DOC is a documentation string for the command.
91 Its first line should be a complete sentence.
92 It should start with ? for a command that is an abbreviation
93 or with * for a command that most users don't need to know about.
94
95 Add this command to command list *LIST.
96
97 Returns a pointer to the added command (not necessarily the head
98 of *LIST). */
99
100struct cmd_list_element *
af1c1752
KB
101add_cmd (char *name, enum command_class class, void (*fun) (char *, int),
102 char *doc, struct cmd_list_element **list)
c906108c
SS
103{
104 register struct cmd_list_element *c
c5aa993b 105 = (struct cmd_list_element *) xmalloc (sizeof (struct cmd_list_element));
c906108c
SS
106 struct cmd_list_element *p;
107
108 delete_cmd (name, list);
109
494b7ec9 110 if (*list == NULL || strcmp ((*list)->name, name) >= 0)
c906108c
SS
111 {
112 c->next = *list;
113 *list = c;
114 }
115 else
116 {
117 p = *list;
494b7ec9 118 while (p->next && strcmp (p->next->name, name) <= 0)
c5aa993b
JM
119 {
120 p = p->next;
121 }
c906108c
SS
122 c->next = p->next;
123 p->next = c;
124 }
125
126 c->name = name;
127 c->class = class;
9f60d481 128 set_cmd_cfunc (c, fun);
c906108c 129 c->doc = doc;
56382845
FN
130 c->flags = 0;
131 c->replacement = NULL;
47724592 132 c->pre_show_hook = NULL;
73bc900d
FN
133 c->hook_pre = NULL;
134 c->hook_post = NULL;
135 c->hook_in = 0;
c906108c
SS
136 c->prefixlist = NULL;
137 c->prefixname = NULL;
138 c->allow_unknown = 0;
139 c->abbrev_flag = 0;
140 c->completer = make_symbol_completion_list;
141 c->type = not_set_cmd;
142 c->var = NULL;
143 c->var_type = var_boolean;
144 c->enums = NULL;
145 c->user_commands = NULL;
73bc900d
FN
146 c->hookee_pre = NULL;
147 c->hookee_post = NULL;
c906108c
SS
148 c->cmd_pointer = NULL;
149
150 return c;
151}
152
69da3468
FN
153/* Same as above, except that the abbrev_flag is set. */
154/* Note: Doesn't seem to be used anywhere currently. */
155
156struct cmd_list_element *
157add_abbrev_cmd (char *name, enum command_class class, void (*fun) (char *, int),
158 char *doc, struct cmd_list_element **list)
159{
160 register struct cmd_list_element *c
161 = add_cmd (name, class, fun, doc, list);
162
163 c->abbrev_flag = 1;
164 return c;
165}
56382845
FN
166
167/* Deprecates a command CMD.
168 REPLACEMENT is the name of the command which should be used in place
169 of this command, or NULL if no such command exists.
170
171 This function does not check to see if command REPLACEMENT exists
172 since gdb may not have gotten around to adding REPLACEMENT when this
173 function is called.
174
175 Returns a pointer to the deprecated command. */
176
177struct cmd_list_element *
fba45db2 178deprecate_cmd (struct cmd_list_element *cmd, char *replacement)
56382845
FN
179{
180 cmd->flags |= (CMD_DEPRECATED | DEPRECATED_WARN_USER);
181
182 if (replacement != NULL)
183 cmd->replacement = replacement;
184 else
185 cmd->replacement = NULL;
186
187 return cmd;
188}
189
c906108c 190struct cmd_list_element *
fba45db2
KB
191add_alias_cmd (char *name, char *oldname, enum command_class class,
192 int abbrev_flag, struct cmd_list_element **list)
c906108c
SS
193{
194 /* Must do this since lookup_cmd tries to side-effect its first arg */
195 char *copied_name;
196 register struct cmd_list_element *old;
197 register struct cmd_list_element *c;
198 copied_name = (char *) alloca (strlen (oldname) + 1);
199 strcpy (copied_name, oldname);
c5aa993b 200 old = lookup_cmd (&copied_name, *list, "", 1, 1);
c906108c
SS
201
202 if (old == 0)
203 {
204 delete_cmd (name, list);
205 return 0;
206 }
207
9f60d481
AC
208 c = add_cmd (name, class, NULL, old->doc, list);
209 /* NOTE: Both FUNC and all the FUNCTIONs need to be copied. */
210 c->func = old->func;
211 c->function = old->function;
c906108c
SS
212 c->prefixlist = old->prefixlist;
213 c->prefixname = old->prefixname;
214 c->allow_unknown = old->allow_unknown;
215 c->abbrev_flag = abbrev_flag;
216 c->cmd_pointer = old;
217 return c;
218}
219
220/* Like add_cmd but adds an element for a command prefix:
221 a name that should be followed by a subcommand to be looked up
222 in another command list. PREFIXLIST should be the address
223 of the variable containing that list. */
224
225struct cmd_list_element *
af1c1752
KB
226add_prefix_cmd (char *name, enum command_class class, void (*fun) (char *, int),
227 char *doc, struct cmd_list_element **prefixlist,
228 char *prefixname, int allow_unknown,
229 struct cmd_list_element **list)
c906108c
SS
230{
231 register struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
232 c->prefixlist = prefixlist;
233 c->prefixname = prefixname;
234 c->allow_unknown = allow_unknown;
235 return c;
236}
237
238/* Like add_prefix_cmd but sets the abbrev_flag on the new command. */
c5aa993b 239
c906108c 240struct cmd_list_element *
af1c1752
KB
241add_abbrev_prefix_cmd (char *name, enum command_class class,
242 void (*fun) (char *, int), char *doc,
243 struct cmd_list_element **prefixlist, char *prefixname,
244 int allow_unknown, struct cmd_list_element **list)
c906108c
SS
245{
246 register struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
247 c->prefixlist = prefixlist;
248 c->prefixname = prefixname;
249 c->allow_unknown = allow_unknown;
250 c->abbrev_flag = 1;
251 return c;
252}
253
254/* This is an empty "cfunc". */
255void
fba45db2 256not_just_help_class_command (char *args, int from_tty)
c906108c
SS
257{
258}
259
260/* This is an empty "sfunc". */
a14ed312 261static void empty_sfunc (char *, int, struct cmd_list_element *);
c906108c
SS
262
263static void
fba45db2 264empty_sfunc (char *args, int from_tty, struct cmd_list_element *c)
c906108c
SS
265{
266}
267
268/* Add element named NAME to command list LIST (the list for set
269 or some sublist thereof).
270 CLASS is as in add_cmd.
271 VAR_TYPE is the kind of thing we are setting.
272 VAR is address of the variable being controlled by this command.
273 DOC is the documentation string. */
274
275struct cmd_list_element *
1ed2a135
AC
276add_set_cmd (char *name,
277 enum command_class class,
278 var_types var_type,
279 void *var,
280 char *doc,
281 struct cmd_list_element **list)
c906108c 282{
e00d1dc8 283 struct cmd_list_element *c = add_cmd (name, class, NULL, doc, list);
c906108c
SS
284
285 c->type = set_cmd;
286 c->var_type = var_type;
287 c->var = var;
e00d1dc8 288 /* This needs to be something besides NULL so that this isn't
c906108c 289 treated as a help class. */
9f60d481 290 set_cmd_sfunc (c, empty_sfunc);
c906108c
SS
291 return c;
292}
293
294/* Add element named NAME to command list LIST (the list for set
295 or some sublist thereof).
296 CLASS is as in add_cmd.
297 ENUMLIST is a list of strings which may follow NAME.
298 VAR is address of the variable which will contain the matching string
c5aa993b 299 (from ENUMLIST).
c906108c
SS
300 DOC is the documentation string. */
301
302struct cmd_list_element *
1ed2a135
AC
303add_set_enum_cmd (char *name,
304 enum command_class class,
53904c9e
AC
305 const char *enumlist[],
306 const char **var,
1ed2a135
AC
307 char *doc,
308 struct cmd_list_element **list)
c906108c
SS
309{
310 struct cmd_list_element *c
c5aa993b 311 = add_set_cmd (name, class, var_enum, var, doc, list);
c906108c
SS
312 c->enums = enumlist;
313
314 return c;
315}
316
97c3646f
AC
317/* Add element named NAME to command list LIST (the list for set
318 or some sublist thereof).
319 CLASS is as in add_cmd.
320 VAR is address of the variable which will contain the value.
321 DOC is the documentation string. */
322struct cmd_list_element *
323add_set_auto_boolean_cmd (char *name,
324 enum command_class class,
325 enum cmd_auto_boolean *var,
326 char *doc,
327 struct cmd_list_element **list)
328{
329 static const char *auto_boolean_enums[] = { "on", "off", "auto", NULL };
330 struct cmd_list_element *c;
331 c = add_set_cmd (name, class, var_auto_boolean, var, doc, list);
332 c->enums = auto_boolean_enums;
333 return c;
334}
335
f3796e26
AC
336/* Add element named NAME to command list LIST (the list for set
337 or some sublist thereof).
338 CLASS is as in add_cmd.
339 VAR is address of the variable which will contain the value.
340 DOC is the documentation string. */
341struct cmd_list_element *
342add_set_boolean_cmd (char *name,
343 enum command_class class,
344 int *var,
345 char *doc,
346 struct cmd_list_element **list)
347{
348 static const char *boolean_enums[] = { "on", "off", NULL };
349 struct cmd_list_element *c;
350 c = add_set_cmd (name, class, var_boolean, var, doc, list);
351 c->enums = boolean_enums;
352 return c;
353}
354
c906108c
SS
355/* Where SETCMD has already been added, add the corresponding show
356 command to LIST and return a pointer to the added command (not
357 necessarily the head of LIST). */
358struct cmd_list_element *
fba45db2
KB
359add_show_from_set (struct cmd_list_element *setcmd,
360 struct cmd_list_element **list)
c906108c
SS
361{
362 struct cmd_list_element *showcmd =
c5aa993b 363 (struct cmd_list_element *) xmalloc (sizeof (struct cmd_list_element));
c906108c
SS
364 struct cmd_list_element *p;
365
366 memcpy (showcmd, setcmd, sizeof (struct cmd_list_element));
367 delete_cmd (showcmd->name, list);
368 showcmd->type = show_cmd;
c5aa993b 369
c906108c
SS
370 /* Replace "set " at start of docstring with "show ". */
371 if (setcmd->doc[0] == 'S' && setcmd->doc[1] == 'e'
372 && setcmd->doc[2] == 't' && setcmd->doc[3] == ' ')
373 showcmd->doc = concat ("Show ", setcmd->doc + 4, NULL);
374 else
375 fprintf_unfiltered (gdb_stderr, "GDB internal error: Bad docstring for set command\n");
c5aa993b 376
494b7ec9 377 if (*list == NULL || strcmp ((*list)->name, showcmd->name) >= 0)
c906108c
SS
378 {
379 showcmd->next = *list;
380 *list = showcmd;
381 }
382 else
383 {
384 p = *list;
494b7ec9 385 while (p->next && strcmp (p->next->name, showcmd->name) <= 0)
c5aa993b
JM
386 {
387 p = p->next;
388 }
c906108c
SS
389 showcmd->next = p->next;
390 p->next = showcmd;
391 }
392
393 return showcmd;
394}
395
396/* Remove the command named NAME from the command list. */
397
398void
fba45db2 399delete_cmd (char *name, struct cmd_list_element **list)
c906108c
SS
400{
401 register struct cmd_list_element *c;
402 struct cmd_list_element *p;
403
404 while (*list && STREQ ((*list)->name, name))
405 {
73bc900d
FN
406 if ((*list)->hookee_pre)
407 (*list)->hookee_pre->hook_pre = 0; /* Hook slips out of its mouth */
408 if ((*list)->hookee_post)
409 (*list)->hookee_post->hook_post = 0; /* Hook slips out of its bottom */
c906108c 410 p = (*list)->next;
b8c9b27d 411 xfree (* list);
c906108c
SS
412 *list = p;
413 }
414
415 if (*list)
416 for (c = *list; c->next;)
417 {
418 if (STREQ (c->next->name, name))
419 {
73bc900d
FN
420 if (c->next->hookee_pre)
421 c->next->hookee_pre->hook_pre = 0; /* hooked cmd gets away. */
422 if (c->next->hookee_post)
423 c->next->hookee_post->hook_post = 0; /* remove post hook */
424 /* :( no fishing metaphore */
c906108c 425 p = c->next->next;
b8c9b27d 426 xfree (c->next);
c906108c
SS
427 c->next = p;
428 }
429 else
430 c = c->next;
431 }
432}
d318976c
FN
433\f
434/* Shorthands to the commands above. */
435
436/* Add an element to the list of info subcommands. */
437
438struct cmd_list_element *
439add_info (char *name, void (*fun) (char *, int), char *doc)
440{
441 return add_cmd (name, no_class, fun, doc, &infolist);
442}
443
444/* Add an alias to the list of info subcommands. */
445
446struct cmd_list_element *
447add_info_alias (char *name, char *oldname, int abbrev_flag)
448{
449 return add_alias_cmd (name, oldname, 0, abbrev_flag, &infolist);
450}
451
452/* Add an element to the list of commands. */
453
454struct cmd_list_element *
455add_com (char *name, enum command_class class, void (*fun) (char *, int),
456 char *doc)
457{
458 return add_cmd (name, class, fun, doc, &cmdlist);
459}
460
461/* Add an alias or abbreviation command to the list of commands. */
462
463struct cmd_list_element *
464add_com_alias (char *name, char *oldname, enum command_class class,
465 int abbrev_flag)
466{
467 return add_alias_cmd (name, oldname, class, abbrev_flag, &cmdlist);
468}
469\f
6837a0a2
DB
470/* Recursively walk the commandlist structures, and print out the
471 documentation of commands that match our regex in either their
472 name, or their documentation.
473*/
d318976c
FN
474void
475apropos_cmd (struct ui_file *stream, struct cmd_list_element *commandlist,
6837a0a2
DB
476 struct re_pattern_buffer *regex, char *prefix)
477{
478 register struct cmd_list_element *c;
479 int returnvalue=1; /*Needed to avoid double printing*/
480 /* Walk through the commands */
481 for (c=commandlist;c;c=c->next)
482 {
483 if (c->name != NULL)
484 {
485 /* Try to match against the name*/
486 returnvalue=re_search(regex,c->name,strlen(c->name),0,strlen(c->name),NULL);
487 if (returnvalue >= 0)
488 {
489 /* Stolen from help_cmd_list. We don't directly use
490 * help_cmd_list because it doesn't let us print out
491 * single commands
492 */
493 fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
494 print_doc_line (stream, c->doc);
495 fputs_filtered ("\n", stream);
496 returnvalue=0; /*Set this so we don't print it again.*/
497 }
498 }
499 if (c->doc != NULL && returnvalue != 0)
500 {
501 /* Try to match against documentation */
502 if (re_search(regex,c->doc,strlen(c->doc),0,strlen(c->doc),NULL) >=0)
503 {
504 /* Stolen from help_cmd_list. We don't directly use
505 * help_cmd_list because it doesn't let us print out
506 * single commands
507 */
508 fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
509 print_doc_line (stream, c->doc);
510 fputs_filtered ("\n", stream);
511 }
512 }
513 /* Check if this command has subcommands */
514 if (c->prefixlist != NULL)
515 {
516 /* Recursively call ourselves on the subcommand list,
517 passing the right prefix in.
518 */
d318976c 519 apropos_cmd (stream,*c->prefixlist,regex,c->prefixname);
6837a0a2
DB
520 }
521 }
522}
c906108c
SS
523
524/* This command really has to deal with two things:
525 * 1) I want documentation on *this string* (usually called by
526 * "help commandname").
527 * 2) I want documentation on *this list* (usually called by
528 * giving a command that requires subcommands. Also called by saying
529 * just "help".)
530 *
531 * I am going to split this into two seperate comamnds, help_cmd and
532 * help_list.
533 */
534
535void
fba45db2 536help_cmd (char *command, struct ui_file *stream)
c906108c
SS
537{
538 struct cmd_list_element *c;
539 extern struct cmd_list_element *cmdlist;
540
541 if (!command)
542 {
543 help_list (cmdlist, "", all_classes, stream);
544 return;
545 }
546
49a5a3a3
GM
547 if (strcmp (command, "all") == 0)
548 {
549 help_all (stream);
550 return;
551 }
552
c906108c
SS
553 c = lookup_cmd (&command, cmdlist, "", 0, 0);
554
555 if (c == 0)
556 return;
557
558 /* There are three cases here.
559 If c->prefixlist is nonzero, we have a prefix command.
560 Print its documentation, then list its subcommands.
c5aa993b 561
9f60d481
AC
562 If c->func is non NULL, we really have a command. Print its
563 documentation and return.
c5aa993b 564
9f60d481
AC
565 If c->func is NULL, we have a class name. Print its
566 documentation (as if it were a command) and then set class to the
567 number of this class so that the commands in the class will be
568 listed. */
c906108c
SS
569
570 fputs_filtered (c->doc, stream);
571 fputs_filtered ("\n", stream);
572
9f60d481 573 if (c->prefixlist == 0 && c->func != NULL)
c906108c
SS
574 return;
575 fprintf_filtered (stream, "\n");
576
577 /* If this is a prefix command, print it's subcommands */
578 if (c->prefixlist)
579 help_list (*c->prefixlist, c->prefixname, all_commands, stream);
580
581 /* If this is a class name, print all of the commands in the class */
9f60d481 582 if (c->func == NULL)
c906108c
SS
583 help_list (cmdlist, "", c->class, stream);
584
73bc900d
FN
585 if (c->hook_pre || c->hook_post)
586 fprintf_filtered (stream,
587 "\nThis command has a hook (or hooks) defined:\n");
588
589 if (c->hook_pre)
590 fprintf_filtered (stream,
591 "\tThis command is run after : %s (pre hook)\n",
592 c->hook_pre->name);
593 if (c->hook_post)
594 fprintf_filtered (stream,
595 "\tThis command is run before : %s (post hook)\n",
596 c->hook_post->name);
c906108c
SS
597}
598
599/*
600 * Get a specific kind of help on a command list.
601 *
602 * LIST is the list.
603 * CMDTYPE is the prefix to use in the title string.
604 * CLASS is the class with which to list the nodes of this list (see
605 * documentation for help_cmd_list below), As usual, ALL_COMMANDS for
606 * everything, ALL_CLASSES for just classes, and non-negative for only things
607 * in a specific class.
608 * and STREAM is the output stream on which to print things.
609 * If you call this routine with a class >= 0, it recurses.
610 */
611void
fba45db2
KB
612help_list (struct cmd_list_element *list, char *cmdtype,
613 enum command_class class, struct ui_file *stream)
c906108c
SS
614{
615 int len;
616 char *cmdtype1, *cmdtype2;
c5aa993b 617
c906108c
SS
618 /* If CMDTYPE is "foo ", CMDTYPE1 gets " foo" and CMDTYPE2 gets "foo sub" */
619 len = strlen (cmdtype);
620 cmdtype1 = (char *) alloca (len + 1);
621 cmdtype1[0] = 0;
622 cmdtype2 = (char *) alloca (len + 4);
623 cmdtype2[0] = 0;
624 if (len)
625 {
626 cmdtype1[0] = ' ';
627 strncpy (cmdtype1 + 1, cmdtype, len - 1);
628 cmdtype1[len] = 0;
629 strncpy (cmdtype2, cmdtype, len - 1);
630 strcpy (cmdtype2 + len - 1, " sub");
631 }
632
633 if (class == all_classes)
634 fprintf_filtered (stream, "List of classes of %scommands:\n\n", cmdtype2);
635 else
636 fprintf_filtered (stream, "List of %scommands:\n\n", cmdtype2);
637
c5aa993b 638 help_cmd_list (list, class, cmdtype, (int) class >= 0, stream);
c906108c
SS
639
640 if (class == all_classes)
641 fprintf_filtered (stream, "\n\
642Type \"help%s\" followed by a class name for a list of commands in that class.",
c5aa993b 643 cmdtype1);
c906108c
SS
644
645 fprintf_filtered (stream, "\n\
646Type \"help%s\" followed by %scommand name for full documentation.\n\
647Command name abbreviations are allowed if unambiguous.\n",
c5aa993b 648 cmdtype1, cmdtype2);
c906108c 649}
c5aa993b 650
49a5a3a3 651static void
c85871a3 652help_all (struct ui_file *stream)
49a5a3a3
GM
653{
654 struct cmd_list_element *c;
655 extern struct cmd_list_element *cmdlist;
656
657 for (c = cmdlist; c; c = c->next)
658 {
659 if (c->abbrev_flag)
660 continue;
661 /* If this is a prefix command, print it's subcommands */
662 if (c->prefixlist)
663 help_cmd_list (*c->prefixlist, all_commands, c->prefixname, 0, stream);
664
665 /* If this is a class name, print all of the commands in the class */
9f60d481 666 else if (c->func == NULL)
49a5a3a3
GM
667 help_cmd_list (cmdlist, c->class, "", 0, stream);
668 }
669}
670
c906108c 671/* Print only the first line of STR on STREAM. */
d318976c 672void
fba45db2 673print_doc_line (struct ui_file *stream, char *str)
c906108c
SS
674{
675 static char *line_buffer = 0;
676 static int line_size;
677 register char *p;
678
679 if (!line_buffer)
680 {
681 line_size = 80;
682 line_buffer = (char *) xmalloc (line_size);
683 }
684
685 p = str;
686 while (*p && *p != '\n' && *p != '.' && *p != ',')
687 p++;
688 if (p - str > line_size - 1)
689 {
690 line_size = p - str + 1;
b8c9b27d 691 xfree (line_buffer);
c906108c
SS
692 line_buffer = (char *) xmalloc (line_size);
693 }
694 strncpy (line_buffer, str, p - str);
695 line_buffer[p - str] = '\0';
696 if (islower (line_buffer[0]))
697 line_buffer[0] = toupper (line_buffer[0]);
8b93c638 698 ui_out_text (uiout, line_buffer);
c906108c
SS
699}
700
701/*
702 * Implement a help command on command list LIST.
703 * RECURSE should be non-zero if this should be done recursively on
704 * all sublists of LIST.
705 * PREFIX is the prefix to print before each command name.
706 * STREAM is the stream upon which the output should be written.
707 * CLASS should be:
c5aa993b 708 * A non-negative class number to list only commands in that
c906108c 709 * class.
c5aa993b
JM
710 * ALL_COMMANDS to list all commands in list.
711 * ALL_CLASSES to list all classes in list.
c906108c
SS
712 *
713 * Note that RECURSE will be active on *all* sublists, not just the
714 * ones selected by the criteria above (ie. the selection mechanism
715 * is at the low level, not the high-level).
716 */
717void
fba45db2
KB
718help_cmd_list (struct cmd_list_element *list, enum command_class class,
719 char *prefix, int recurse, struct ui_file *stream)
c906108c
SS
720{
721 register struct cmd_list_element *c;
722
723 for (c = list; c; c = c->next)
724 {
725 if (c->abbrev_flag == 0 &&
726 (class == all_commands
9f60d481
AC
727 || (class == all_classes && c->func == NULL)
728 || (class == c->class && c->func != NULL)))
c906108c
SS
729 {
730 fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
731 print_doc_line (stream, c->doc);
732 fputs_filtered ("\n", stream);
733 }
734 if (recurse
735 && c->prefixlist != 0
736 && c->abbrev_flag == 0)
737 help_cmd_list (*c->prefixlist, class, c->prefixname, 1, stream);
738 }
739}
c906108c 740\f
c5aa993b 741
c906108c
SS
742/* Search the input clist for 'command'. Return the command if
743 found (or NULL if not), and return the number of commands
744 found in nfound */
745
746static struct cmd_list_element *
fba45db2
KB
747find_cmd (char *command, int len, struct cmd_list_element *clist,
748 int ignore_help_classes, int *nfound)
c906108c
SS
749{
750 struct cmd_list_element *found, *c;
751
c5aa993b 752 found = (struct cmd_list_element *) NULL;
c906108c
SS
753 *nfound = 0;
754 for (c = clist; c; c = c->next)
755 if (!strncmp (command, c->name, len)
9f60d481 756 && (!ignore_help_classes || c->func))
c906108c 757 {
c5aa993b
JM
758 found = c;
759 (*nfound)++;
760 if (c->name[len] == '\0')
761 {
762 *nfound = 1;
763 break;
764 }
c906108c
SS
765 }
766 return found;
767}
768
769/* This routine takes a line of TEXT and a CLIST in which to start the
770 lookup. When it returns it will have incremented the text pointer past
771 the section of text it matched, set *RESULT_LIST to point to the list in
772 which the last word was matched, and will return a pointer to the cmd
773 list element which the text matches. It will return NULL if no match at
774 all was possible. It will return -1 (cast appropriately, ick) if ambigous
775 matches are possible; in this case *RESULT_LIST will be set to point to
776 the list in which there are ambiguous choices (and *TEXT will be set to
777 the ambiguous text string).
778
779 If the located command was an abbreviation, this routine returns the base
780 command of the abbreviation.
781
782 It does no error reporting whatsoever; control will always return
783 to the superior routine.
784
785 In the case of an ambiguous return (-1), *RESULT_LIST will be set to point
786 at the prefix_command (ie. the best match) *or* (special case) will be NULL
787 if no prefix command was ever found. For example, in the case of "info a",
788 "info" matches without ambiguity, but "a" could be "args" or "address", so
789 *RESULT_LIST is set to the cmd_list_element for "info". So in this case
790 RESULT_LIST should not be interpeted as a pointer to the beginning of a
791 list; it simply points to a specific command. In the case of an ambiguous
792 return *TEXT is advanced past the last non-ambiguous prefix (e.g.
793 "info t" can be "info types" or "info target"; upon return *TEXT has been
794 advanced past "info ").
795
796 If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise
797 affect the operation).
798
799 This routine does *not* modify the text pointed to by TEXT.
c5aa993b 800
c906108c
SS
801 If IGNORE_HELP_CLASSES is nonzero, ignore any command list elements which
802 are actually help classes rather than commands (i.e. the function field of
803 the struct cmd_list_element is NULL). */
804
805struct cmd_list_element *
fba45db2
KB
806lookup_cmd_1 (char **text, struct cmd_list_element *clist,
807 struct cmd_list_element **result_list, int ignore_help_classes)
c906108c
SS
808{
809 char *p, *command;
810 int len, tmp, nfound;
811 struct cmd_list_element *found, *c;
56382845 812 char *line = *text;
c906108c
SS
813
814 while (**text == ' ' || **text == '\t')
815 (*text)++;
816
817 /* Treating underscores as part of command words is important
818 so that "set args_foo()" doesn't get interpreted as
819 "set args _foo()". */
820 for (p = *text;
c5aa993b 821 *p && (isalnum (*p) || *p == '-' || *p == '_' ||
c906108c
SS
822 (tui_version &&
823 (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
824 (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
825 p++)
826 ;
827
828 /* If nothing but whitespace, return 0. */
829 if (p == *text)
830 return 0;
c5aa993b 831
c906108c
SS
832 len = p - *text;
833
834 /* *text and p now bracket the first command word to lookup (and
835 it's length is len). We copy this into a local temporary */
836
837
838 command = (char *) alloca (len + 1);
839 for (tmp = 0; tmp < len; tmp++)
840 {
841 char x = (*text)[tmp];
842 command[tmp] = x;
843 }
844 command[len] = '\0';
845
846 /* Look it up. */
847 found = 0;
848 nfound = 0;
c5aa993b 849 found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
c906108c
SS
850
851 /*
c5aa993b
JM
852 ** We didn't find the command in the entered case, so lower case it
853 ** and search again.
854 */
c906108c
SS
855 if (!found || nfound == 0)
856 {
857 for (tmp = 0; tmp < len; tmp++)
c5aa993b
JM
858 {
859 char x = command[tmp];
860 command[tmp] = isupper (x) ? tolower (x) : x;
861 }
862 found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
c906108c
SS
863 }
864
865 /* If nothing matches, we have a simple failure. */
866 if (nfound == 0)
867 return 0;
868
869 if (nfound > 1)
870 {
871 if (result_list != NULL)
872 /* Will be modified in calling routine
873 if we know what the prefix command is. */
c5aa993b
JM
874 *result_list = 0;
875 return (struct cmd_list_element *) -1; /* Ambiguous. */
c906108c
SS
876 }
877
878 /* We've matched something on this list. Move text pointer forward. */
879
880 *text = p;
881
c906108c 882 if (found->cmd_pointer)
56382845
FN
883 {
884 /* We drop the alias (abbreviation) in favor of the command it is
885 pointing to. If the alias is deprecated, though, we need to
886 warn the user about it before we drop it. Note that while we
887 are warning about the alias, we may also warn about the command
888 itself and we will adjust the appropriate DEPRECATED_WARN_USER
889 flags */
890
891 if (found->flags & DEPRECATED_WARN_USER)
892 deprecated_cmd_warning (&line);
893 found = found->cmd_pointer;
894 }
c906108c
SS
895 /* If we found a prefix command, keep looking. */
896
897 if (found->prefixlist)
898 {
899 c = lookup_cmd_1 (text, *found->prefixlist, result_list,
900 ignore_help_classes);
901 if (!c)
902 {
903 /* Didn't find anything; this is as far as we got. */
904 if (result_list != NULL)
905 *result_list = clist;
906 return found;
907 }
908 else if (c == (struct cmd_list_element *) -1)
909 {
910 /* We've gotten this far properly, but the next step
911 is ambiguous. We need to set the result list to the best
912 we've found (if an inferior hasn't already set it). */
913 if (result_list != NULL)
914 if (!*result_list)
915 /* This used to say *result_list = *found->prefixlist
c5aa993b
JM
916 If that was correct, need to modify the documentation
917 at the top of this function to clarify what is supposed
918 to be going on. */
c906108c
SS
919 *result_list = found;
920 return c;
921 }
922 else
923 {
924 /* We matched! */
925 return c;
926 }
927 }
928 else
929 {
930 if (result_list != NULL)
931 *result_list = clist;
932 return found;
933 }
934}
935
936/* All this hair to move the space to the front of cmdtype */
937
938static void
fba45db2 939undef_cmd_error (char *cmdtype, char *q)
c906108c
SS
940{
941 error ("Undefined %scommand: \"%s\". Try \"help%s%.*s\".",
c5aa993b
JM
942 cmdtype,
943 q,
944 *cmdtype ? " " : "",
945 strlen (cmdtype) - 1,
946 cmdtype);
c906108c
SS
947}
948
949/* Look up the contents of *LINE as a command in the command list LIST.
950 LIST is a chain of struct cmd_list_element's.
951 If it is found, return the struct cmd_list_element for that command
952 and update *LINE to point after the command name, at the first argument.
953 If not found, call error if ALLOW_UNKNOWN is zero
954 otherwise (or if error returns) return zero.
955 Call error if specified command is ambiguous,
956 unless ALLOW_UNKNOWN is negative.
957 CMDTYPE precedes the word "command" in the error message.
958
959 If INGNORE_HELP_CLASSES is nonzero, ignore any command list
960 elements which are actually help classes rather than commands (i.e.
961 the function field of the struct cmd_list_element is 0). */
962
963struct cmd_list_element *
fba45db2
KB
964lookup_cmd (char **line, struct cmd_list_element *list, char *cmdtype,
965 int allow_unknown, int ignore_help_classes)
c906108c
SS
966{
967 struct cmd_list_element *last_list = 0;
968 struct cmd_list_element *c =
c5aa993b 969 lookup_cmd_1 (line, list, &last_list, ignore_help_classes);
c64601c7
FN
970
971 /* Note: Do not remove trailing whitespace here because this
972 would be wrong for complete_command. Jim Kingdon */
c5aa993b 973
c906108c
SS
974 if (!c)
975 {
976 if (!allow_unknown)
977 {
978 if (!*line)
979 error ("Lack of needed %scommand", cmdtype);
980 else
981 {
982 char *p = *line, *q;
983
c5aa993b 984 while (isalnum (*p) || *p == '-')
c906108c
SS
985 p++;
986
987 q = (char *) alloca (p - *line + 1);
988 strncpy (q, *line, p - *line);
989 q[p - *line] = '\0';
990 undef_cmd_error (cmdtype, q);
991 }
992 }
993 else
994 return 0;
995 }
996 else if (c == (struct cmd_list_element *) -1)
997 {
998 /* Ambigous. Local values should be off prefixlist or called
c5aa993b 999 values. */
c906108c
SS
1000 int local_allow_unknown = (last_list ? last_list->allow_unknown :
1001 allow_unknown);
1002 char *local_cmdtype = last_list ? last_list->prefixname : cmdtype;
1003 struct cmd_list_element *local_list =
c5aa993b
JM
1004 (last_list ? *(last_list->prefixlist) : list);
1005
c906108c
SS
1006 if (local_allow_unknown < 0)
1007 {
1008 if (last_list)
1009 return last_list; /* Found something. */
1010 else
1011 return 0; /* Found nothing. */
1012 }
1013 else
1014 {
1015 /* Report as error. */
1016 int amb_len;
1017 char ambbuf[100];
1018
1019 for (amb_len = 0;
1020 ((*line)[amb_len] && (*line)[amb_len] != ' '
1021 && (*line)[amb_len] != '\t');
1022 amb_len++)
1023 ;
c5aa993b 1024
c906108c
SS
1025 ambbuf[0] = 0;
1026 for (c = local_list; c; c = c->next)
1027 if (!strncmp (*line, c->name, amb_len))
1028 {
c5aa993b 1029 if (strlen (ambbuf) + strlen (c->name) + 6 < (int) sizeof ambbuf)
c906108c
SS
1030 {
1031 if (strlen (ambbuf))
1032 strcat (ambbuf, ", ");
1033 strcat (ambbuf, c->name);
1034 }
1035 else
1036 {
1037 strcat (ambbuf, "..");
1038 break;
1039 }
1040 }
1041 error ("Ambiguous %scommand \"%s\": %s.", local_cmdtype,
1042 *line, ambbuf);
1043 return 0; /* lint */
1044 }
1045 }
1046 else
1047 {
1048 /* We've got something. It may still not be what the caller
1049 wants (if this command *needs* a subcommand). */
1050 while (**line == ' ' || **line == '\t')
1051 (*line)++;
1052
1053 if (c->prefixlist && **line && !c->allow_unknown)
1054 undef_cmd_error (c->prefixname, *line);
1055
1056 /* Seems to be what he wants. Return it. */
1057 return c;
1058 }
1059 return 0;
1060}
c5aa993b 1061
56382845
FN
1062/* We are here presumably because an alias or command in *TEXT is
1063 deprecated and a warning message should be generated. This function
1064 decodes *TEXT and potentially generates a warning message as outlined
1065 below.
1066
1067 Example for 'set endian big' which has a fictitious alias 'seb'.
1068
1069 If alias wasn't used in *TEXT, and the command is deprecated:
1070 "warning: 'set endian big' is deprecated."
1071
1072 If alias was used, and only the alias is deprecated:
1073 "warning: 'seb' an alias for the command 'set endian big' is deprecated."
1074
1075 If alias was used and command is deprecated (regardless of whether the
1076 alias itself is deprecated:
1077
1078 "warning: 'set endian big' (seb) is deprecated."
1079
1080 After the message has been sent, clear the appropriate flags in the
1081 command and/or the alias so the user is no longer bothered.
1082
1083*/
1084void
1085deprecated_cmd_warning (char **text)
1086{
1087 struct cmd_list_element *alias = NULL;
1088 struct cmd_list_element *prefix_cmd = NULL;
1089 struct cmd_list_element *cmd = NULL;
1090 struct cmd_list_element *c;
1091 char *type;
1092
1093 if (!lookup_cmd_composition (*text, &alias, &prefix_cmd, &cmd))
1094 /* return if text doesn't evaluate to a command */
1095 return;
1096
1097 if (!((alias ? (alias->flags & DEPRECATED_WARN_USER) : 0)
1098 || (cmd->flags & DEPRECATED_WARN_USER) ) )
1099 /* return if nothing is deprecated */
1100 return;
1101
1102 printf_filtered ("Warning:");
1103
1104 if (alias && !(cmd->flags & CMD_DEPRECATED))
1105 printf_filtered (" '%s', an alias for the", alias->name);
1106
1107 printf_filtered (" command '");
1108
1109 if (prefix_cmd)
1110 printf_filtered ("%s", prefix_cmd->prefixname);
1111
1112 printf_filtered ("%s", cmd->name);
1113
1114 if (alias && (cmd->flags & CMD_DEPRECATED))
1115 printf_filtered ("' (%s) is deprecated.\n", alias->name);
1116 else
1117 printf_filtered ("' is deprecated.\n");
1118
1119
1120 /* if it is only the alias that is deprecated, we want to indicate the
1121 new alias, otherwise we'll indicate the new command */
1122
1123 if (alias && !(cmd->flags & CMD_DEPRECATED))
1124 {
1125 if (alias->replacement)
1126 printf_filtered ("Use '%s'.\n\n", alias->replacement);
1127 else
1128 printf_filtered ("No alternative known.\n\n");
1129 }
1130 else
1131 {
1132 if (cmd->replacement)
1133 printf_filtered ("Use '%s'.\n\n", cmd->replacement);
1134 else
1135 printf_filtered ("No alternative known.\n\n");
1136 }
1137
1138 /* We've warned you, now we'll keep quiet */
1139 if (alias)
1140 alias->flags &= ~DEPRECATED_WARN_USER;
1141
1142 cmd->flags &= ~DEPRECATED_WARN_USER;
1143}
1144
1145
1146
1147/* Look up the contents of LINE as a command in the command list 'cmdlist'.
1148 Return 1 on success, 0 on failure.
1149
1150 If LINE refers to an alias, *alias will point to that alias.
1151
1152 If LINE is a postfix command (i.e. one that is preceeded by a prefix
1153 command) set *prefix_cmd.
1154
1155 Set *cmd to point to the command LINE indicates.
1156
1157 If any of *alias, *prefix_cmd, or *cmd cannot be determined or do not
1158 exist, they are NULL when we return.
1159
1160*/
1161int
1162lookup_cmd_composition (char *text,
1163 struct cmd_list_element **alias,
1164 struct cmd_list_element **prefix_cmd,
1165 struct cmd_list_element **cmd)
1166{
1167 char *p, *command;
1168 int len, tmp, nfound;
1169 struct cmd_list_element *cur_list;
1170 struct cmd_list_element *prev_cmd;
1171 *alias = NULL;
1172 *prefix_cmd = NULL;
1173 *cmd = NULL;
1174
1175 cur_list = cmdlist;
1176
1177 while (1)
1178 {
1179 /* Go through as many command lists as we need to
1180 to find the command TEXT refers to. */
1181
1182 prev_cmd = *cmd;
1183
1184 while (*text == ' ' || *text == '\t')
1185 (text)++;
1186
1187 /* Treating underscores as part of command words is important
1188 so that "set args_foo()" doesn't get interpreted as
1189 "set args _foo()". */
1190 for (p = text;
1191 *p && (isalnum (*p) || *p == '-' || *p == '_' ||
1192 (tui_version &&
1193 (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
1194 (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
1195 p++)
1196 ;
1197
1198 /* If nothing but whitespace, return. */
1199 if (p == text)
1200 return 0;
1201
1202 len = p - text;
1203
1204 /* text and p now bracket the first command word to lookup (and
1205 it's length is len). We copy this into a local temporary */
1206
1207 command = (char *) alloca (len + 1);
1208 for (tmp = 0; tmp < len; tmp++)
1209 {
1210 char x = text[tmp];
1211 command[tmp] = x;
1212 }
1213 command[len] = '\0';
1214
1215 /* Look it up. */
1216 *cmd = 0;
1217 nfound = 0;
1218 *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1219
1220 /* We didn't find the command in the entered case, so lower case it
1221 and search again.
1222 */
1223 if (!*cmd || nfound == 0)
1224 {
1225 for (tmp = 0; tmp < len; tmp++)
1226 {
1227 char x = command[tmp];
1228 command[tmp] = isupper (x) ? tolower (x) : x;
1229 }
1230 *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1231 }
1232
1233 if (*cmd == (struct cmd_list_element *) -1)
1234 {
1235 return 0; /* ambiguous */
1236 }
1237
1238 if (*cmd == NULL)
1239 return 0; /* nothing found */
1240 else
1241 {
1242 if ((*cmd)->cmd_pointer)
1243 {
1244 /* cmd was actually an alias, we note that an alias was used
1245 (by assigning *alais) and we set *cmd.
1246 */
1247 *alias = *cmd;
1248 *cmd = (*cmd)->cmd_pointer;
1249 }
1250 *prefix_cmd = prev_cmd;
1251 }
1252 if ((*cmd)->prefixlist)
1253 cur_list = *(*cmd)->prefixlist;
1254 else
1255 return 1;
1256
1257 text = p;
1258 }
1259}
1260
c906108c
SS
1261/* Helper function for SYMBOL_COMPLETION_FUNCTION. */
1262
1263/* Return a vector of char pointers which point to the different
1264 possible completions in LIST of TEXT.
1265
1266 WORD points in the same buffer as TEXT, and completions should be
1267 returned relative to this position. For example, suppose TEXT is "foo"
1268 and we want to complete to "foobar". If WORD is "oo", return
1269 "oobar"; if WORD is "baz/foo", return "baz/foobar". */
1270
1271char **
fba45db2 1272complete_on_cmdlist (struct cmd_list_element *list, char *text, char *word)
c906108c
SS
1273{
1274 struct cmd_list_element *ptr;
1275 char **matchlist;
1276 int sizeof_matchlist;
1277 int matches;
1278 int textlen = strlen (text);
1279
1280 sizeof_matchlist = 10;
1281 matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
1282 matches = 0;
1283
1284 for (ptr = list; ptr; ptr = ptr->next)
1285 if (!strncmp (ptr->name, text, textlen)
1286 && !ptr->abbrev_flag
9f60d481 1287 && (ptr->func
c906108c
SS
1288 || ptr->prefixlist))
1289 {
1290 if (matches == sizeof_matchlist)
1291 {
1292 sizeof_matchlist *= 2;
c5aa993b 1293 matchlist = (char **) xrealloc ((char *) matchlist,
c906108c
SS
1294 (sizeof_matchlist
1295 * sizeof (char *)));
1296 }
1297
c5aa993b 1298 matchlist[matches] = (char *)
c906108c
SS
1299 xmalloc (strlen (word) + strlen (ptr->name) + 1);
1300 if (word == text)
1301 strcpy (matchlist[matches], ptr->name);
1302 else if (word > text)
1303 {
1304 /* Return some portion of ptr->name. */
1305 strcpy (matchlist[matches], ptr->name + (word - text));
1306 }
1307 else
1308 {
1309 /* Return some of text plus ptr->name. */
1310 strncpy (matchlist[matches], word, text - word);
1311 matchlist[matches][text - word] = '\0';
1312 strcat (matchlist[matches], ptr->name);
1313 }
1314 ++matches;
1315 }
1316
1317 if (matches == 0)
1318 {
b8c9b27d 1319 xfree (matchlist);
c906108c
SS
1320 matchlist = 0;
1321 }
1322 else
1323 {
c5aa993b
JM
1324 matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
1325 * sizeof (char *)));
c906108c
SS
1326 matchlist[matches] = (char *) 0;
1327 }
1328
1329 return matchlist;
1330}
1331
1332/* Helper function for SYMBOL_COMPLETION_FUNCTION. */
1333
1334/* Return a vector of char pointers which point to the different
1335 possible completions in CMD of TEXT.
1336
1337 WORD points in the same buffer as TEXT, and completions should be
1338 returned relative to this position. For example, suppose TEXT is "foo"
1339 and we want to complete to "foobar". If WORD is "oo", return
1340 "oobar"; if WORD is "baz/foo", return "baz/foobar". */
1341
1342char **
53904c9e
AC
1343complete_on_enum (const char *enumlist[],
1344 char *text,
1345 char *word)
c906108c
SS
1346{
1347 char **matchlist;
1348 int sizeof_matchlist;
1349 int matches;
1350 int textlen = strlen (text);
1351 int i;
53904c9e 1352 const char *name;
c906108c
SS
1353
1354 sizeof_matchlist = 10;
1355 matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
1356 matches = 0;
1357
1358 for (i = 0; (name = enumlist[i]) != NULL; i++)
1359 if (strncmp (name, text, textlen) == 0)
1360 {
1361 if (matches == sizeof_matchlist)
1362 {
1363 sizeof_matchlist *= 2;
c5aa993b 1364 matchlist = (char **) xrealloc ((char *) matchlist,
c906108c
SS
1365 (sizeof_matchlist
1366 * sizeof (char *)));
1367 }
1368
c5aa993b 1369 matchlist[matches] = (char *)
c906108c
SS
1370 xmalloc (strlen (word) + strlen (name) + 1);
1371 if (word == text)
1372 strcpy (matchlist[matches], name);
1373 else if (word > text)
1374 {
1375 /* Return some portion of name. */
1376 strcpy (matchlist[matches], name + (word - text));
1377 }
1378 else
1379 {
1380 /* Return some of text plus name. */
1381 strncpy (matchlist[matches], word, text - word);
1382 matchlist[matches][text - word] = '\0';
1383 strcat (matchlist[matches], name);
1384 }
1385 ++matches;
1386 }
1387
1388 if (matches == 0)
1389 {
b8c9b27d 1390 xfree (matchlist);
c906108c
SS
1391 matchlist = 0;
1392 }
1393 else
1394 {
c5aa993b
JM
1395 matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
1396 * sizeof (char *)));
c906108c
SS
1397 matchlist[matches] = (char *) 0;
1398 }
1399
1400 return matchlist;
1401}
1402