1 /* GDB CLI command scripting. 2 3 Copyright (C) 1986-2015 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #include "defs.h" 21 #include "value.h" 22 #include "language.h" /* For value_true */ 23 #include <ctype.h> 24 25 #include "ui-out.h" 26 #include "top.h" 27 #include "breakpoint.h" 28 #include "cli/cli-cmds.h" 29 #include "cli/cli-decode.h" 30 #include "cli/cli-script.h" 31 32 #include "extension.h" 33 #include "interps.h" 34 #include "compile/compile.h" 35 36 /* Prototypes for local functions. */ 37 38 static enum command_control_type 39 recurse_read_control_structure (char * (*read_next_line_func) (void), 40 struct command_line *current_cmd, 41 void (*validator)(char *, void *), 42 void *closure); 43 44 static char *insert_args (char *line); 45 46 static struct cleanup * setup_user_args (char *p); 47 48 static char *read_next_line (void); 49 50 /* Level of control structure when reading. */ 51 static int control_level; 52 53 /* Level of control structure when executing. */ 54 static int command_nest_depth = 1; 55 56 /* This is to prevent certain commands being printed twice. */ 57 static int suppress_next_print_command_trace = 0; 58 59 /* Structure for arguments to user defined functions. */ 60 #define MAXUSERARGS 10 61 struct user_args 62 { 63 struct user_args *next; 64 /* It is necessary to store a malloced copy of the command line to 65 ensure that the arguments are not overwritten before they are 66 used. */ 67 char *command; 68 struct 69 { 70 char *arg; 71 int len; 72 } 73 a[MAXUSERARGS]; 74 int count; 75 } 76 *user_args; 77 78 79 /* Return non-zero if TYPE is a multi-line command (i.e., is terminated 80 by "end"). */ 81 82 static int 83 multi_line_command_p (enum command_control_type type) 84 { 85 switch (type) 86 { 87 case if_control: 88 case while_control: 89 case while_stepping_control: 90 case commands_control: 91 case compile_control: 92 case python_control: 93 case guile_control: 94 return 1; 95 default: 96 return 0; 97 } 98 } 99 100 /* Allocate, initialize a new command line structure for one of the 101 control commands (if/while). */ 102 103 static struct command_line * 104 build_command_line (enum command_control_type type, char *args) 105 { 106 struct command_line *cmd; 107 108 if (args == NULL && (type == if_control || type == while_control)) 109 error (_("if/while commands require arguments.")); 110 gdb_assert (args != NULL); 111 112 cmd = (struct command_line *) xmalloc (sizeof (struct command_line)); 113 cmd->next = NULL; 114 cmd->control_type = type; 115 116 cmd->body_count = 1; 117 cmd->body_list 118 = (struct command_line **) xmalloc (sizeof (struct command_line *) 119 * cmd->body_count); 120 memset (cmd->body_list, 0, sizeof (struct command_line *) * cmd->body_count); 121 cmd->line = xstrdup (args); 122 123 return cmd; 124 } 125 126 /* Build and return a new command structure for the control commands 127 such as "if" and "while". */ 128 129 struct command_line * 130 get_command_line (enum command_control_type type, char *arg) 131 { 132 struct command_line *cmd; 133 struct cleanup *old_chain = NULL; 134 135 /* Allocate and build a new command line structure. */ 136 cmd = build_command_line (type, arg); 137 138 old_chain = make_cleanup_free_command_lines (&cmd); 139 140 /* Read in the body of this command. */ 141 if (recurse_read_control_structure (read_next_line, cmd, 0, 0) 142 == invalid_control) 143 { 144 warning (_("Error reading in canned sequence of commands.")); 145 do_cleanups (old_chain); 146 return NULL; 147 } 148 149 discard_cleanups (old_chain); 150 return cmd; 151 } 152 153 /* Recursively print a command (including full control structures). */ 154 155 void 156 print_command_lines (struct ui_out *uiout, struct command_line *cmd, 157 unsigned int depth) 158 { 159 struct command_line *list; 160 161 list = cmd; 162 while (list) 163 { 164 if (depth) 165 ui_out_spaces (uiout, 2 * depth); 166 167 /* A simple command, print it and continue. */ 168 if (list->control_type == simple_control) 169 { 170 ui_out_field_string (uiout, NULL, list->line); 171 ui_out_text (uiout, "\n"); 172 list = list->next; 173 continue; 174 } 175 176 /* loop_continue to jump to the start of a while loop, print it 177 and continue. */ 178 if (list->control_type == continue_control) 179 { 180 ui_out_field_string (uiout, NULL, "loop_continue"); 181 ui_out_text (uiout, "\n"); 182 list = list->next; 183 continue; 184 } 185 186 /* loop_break to break out of a while loop, print it and 187 continue. */ 188 if (list->control_type == break_control) 189 { 190 ui_out_field_string (uiout, NULL, "loop_break"); 191 ui_out_text (uiout, "\n"); 192 list = list->next; 193 continue; 194 } 195 196 /* A while command. Recursively print its subcommands and 197 continue. */ 198 if (list->control_type == while_control 199 || list->control_type == while_stepping_control) 200 { 201 /* For while-stepping, the line includes the 'while-stepping' 202 token. See comment in process_next_line for explanation. 203 Here, take care not print 'while-stepping' twice. */ 204 if (list->control_type == while_control) 205 ui_out_field_fmt (uiout, NULL, "while %s", list->line); 206 else 207 ui_out_field_string (uiout, NULL, list->line); 208 ui_out_text (uiout, "\n"); 209 print_command_lines (uiout, *list->body_list, depth + 1); 210 if (depth) 211 ui_out_spaces (uiout, 2 * depth); 212 ui_out_field_string (uiout, NULL, "end"); 213 ui_out_text (uiout, "\n"); 214 list = list->next; 215 continue; 216 } 217 218 /* An if command. Recursively print both arms before 219 continueing. */ 220 if (list->control_type == if_control) 221 { 222 ui_out_field_fmt (uiout, NULL, "if %s", list->line); 223 ui_out_text (uiout, "\n"); 224 /* The true arm. */ 225 print_command_lines (uiout, list->body_list[0], depth + 1); 226 227 /* Show the false arm if it exists. */ 228 if (list->body_count == 2) 229 { 230 if (depth) 231 ui_out_spaces (uiout, 2 * depth); 232 ui_out_field_string (uiout, NULL, "else"); 233 ui_out_text (uiout, "\n"); 234 print_command_lines (uiout, list->body_list[1], depth + 1); 235 } 236 237 if (depth) 238 ui_out_spaces (uiout, 2 * depth); 239 ui_out_field_string (uiout, NULL, "end"); 240 ui_out_text (uiout, "\n"); 241 list = list->next; 242 continue; 243 } 244 245 /* A commands command. Print the breakpoint commands and 246 continue. */ 247 if (list->control_type == commands_control) 248 { 249 if (*(list->line)) 250 ui_out_field_fmt (uiout, NULL, "commands %s", list->line); 251 else 252 ui_out_field_string (uiout, NULL, "commands"); 253 ui_out_text (uiout, "\n"); 254 print_command_lines (uiout, *list->body_list, depth + 1); 255 if (depth) 256 ui_out_spaces (uiout, 2 * depth); 257 ui_out_field_string (uiout, NULL, "end"); 258 ui_out_text (uiout, "\n"); 259 list = list->next; 260 continue; 261 } 262 263 if (list->control_type == python_control) 264 { 265 ui_out_field_string (uiout, NULL, "python"); 266 ui_out_text (uiout, "\n"); 267 /* Don't indent python code at all. */ 268 print_command_lines (uiout, *list->body_list, 0); 269 if (depth) 270 ui_out_spaces (uiout, 2 * depth); 271 ui_out_field_string (uiout, NULL, "end"); 272 ui_out_text (uiout, "\n"); 273 list = list->next; 274 continue; 275 } 276 277 if (list->control_type == compile_control) 278 { 279 ui_out_field_string (uiout, NULL, "compile expression"); 280 ui_out_text (uiout, "\n"); 281 print_command_lines (uiout, *list->body_list, 0); 282 if (depth) 283 ui_out_spaces (uiout, 2 * depth); 284 ui_out_field_string (uiout, NULL, "end"); 285 ui_out_text (uiout, "\n"); 286 list = list->next; 287 continue; 288 } 289 290 if (list->control_type == guile_control) 291 { 292 ui_out_field_string (uiout, NULL, "guile"); 293 ui_out_text (uiout, "\n"); 294 print_command_lines (uiout, *list->body_list, depth + 1); 295 if (depth) 296 ui_out_spaces (uiout, 2 * depth); 297 ui_out_field_string (uiout, NULL, "end"); 298 ui_out_text (uiout, "\n"); 299 list = list->next; 300 continue; 301 } 302 303 /* Ignore illegal command type and try next. */ 304 list = list->next; 305 } /* while (list) */ 306 } 307 308 /* Handle pre-post hooks. */ 309 310 static void 311 clear_hook_in_cleanup (void *data) 312 { 313 struct cmd_list_element *c = data; 314 315 c->hook_in = 0; /* Allow hook to work again once it is complete. */ 316 } 317 318 void 319 execute_cmd_pre_hook (struct cmd_list_element *c) 320 { 321 if ((c->hook_pre) && (!c->hook_in)) 322 { 323 struct cleanup *cleanups = make_cleanup (clear_hook_in_cleanup, c); 324 c->hook_in = 1; /* Prevent recursive hooking. */ 325 execute_user_command (c->hook_pre, (char *) 0); 326 do_cleanups (cleanups); 327 } 328 } 329 330 void 331 execute_cmd_post_hook (struct cmd_list_element *c) 332 { 333 if ((c->hook_post) && (!c->hook_in)) 334 { 335 struct cleanup *cleanups = make_cleanup (clear_hook_in_cleanup, c); 336 337 c->hook_in = 1; /* Prevent recursive hooking. */ 338 execute_user_command (c->hook_post, (char *) 0); 339 do_cleanups (cleanups); 340 } 341 } 342 343 /* Execute the command in CMD. */ 344 static void 345 do_restore_user_call_depth (void * call_depth) 346 { 347 int *depth = call_depth; 348 349 (*depth)--; 350 if ((*depth) == 0) 351 in_user_command = 0; 352 } 353 354 355 void 356 execute_user_command (struct cmd_list_element *c, char *args) 357 { 358 struct command_line *cmdlines; 359 struct cleanup *old_chain; 360 enum command_control_type ret; 361 static int user_call_depth = 0; 362 extern unsigned int max_user_call_depth; 363 364 cmdlines = c->user_commands; 365 if (cmdlines == 0) 366 /* Null command */ 367 return; 368 369 old_chain = setup_user_args (args); 370 371 if (++user_call_depth > max_user_call_depth) 372 error (_("Max user call depth exceeded -- command aborted.")); 373 374 make_cleanup (do_restore_user_call_depth, &user_call_depth); 375 376 /* Set the instream to 0, indicating execution of a 377 user-defined function. */ 378 make_cleanup (do_restore_instream_cleanup, instream); 379 instream = (FILE *) 0; 380 381 /* Also set the global in_user_command, so that NULL instream is 382 not confused with Insight. */ 383 in_user_command = 1; 384 385 make_cleanup_restore_integer (&interpreter_async); 386 interpreter_async = 0; 387 388 command_nest_depth++; 389 while (cmdlines) 390 { 391 ret = execute_control_command (cmdlines); 392 if (ret != simple_control && ret != break_control) 393 { 394 warning (_("Error executing canned sequence of commands.")); 395 break; 396 } 397 cmdlines = cmdlines->next; 398 } 399 command_nest_depth--; 400 do_cleanups (old_chain); 401 } 402 403 /* This function is called every time GDB prints a prompt. It ensures 404 that errors and the like do not confuse the command tracing. */ 405 406 void 407 reset_command_nest_depth (void) 408 { 409 command_nest_depth = 1; 410 411 /* Just in case. */ 412 suppress_next_print_command_trace = 0; 413 } 414 415 /* Print the command, prefixed with '+' to represent the call depth. 416 This is slightly complicated because this function may be called 417 from execute_command and execute_control_command. Unfortunately 418 execute_command also prints the top level control commands. 419 In these cases execute_command will call execute_control_command 420 via while_command or if_command. Inner levels of 'if' and 'while' 421 are dealt with directly. Therefore we can use these functions 422 to determine whether the command has been printed already or not. */ 423 void 424 print_command_trace (const char *cmd) 425 { 426 int i; 427 428 if (suppress_next_print_command_trace) 429 { 430 suppress_next_print_command_trace = 0; 431 return; 432 } 433 434 if (!source_verbose && !trace_commands) 435 return; 436 437 for (i=0; i < command_nest_depth; i++) 438 printf_filtered ("+"); 439 440 printf_filtered ("%s\n", cmd); 441 } 442 443 enum command_control_type 444 execute_control_command (struct command_line *cmd) 445 { 446 struct expression *expr; 447 struct command_line *current; 448 struct cleanup *old_chain = make_cleanup (null_cleanup, 0); 449 struct value *val; 450 struct value *val_mark; 451 int loop; 452 enum command_control_type ret; 453 char *new_line; 454 455 /* Start by assuming failure, if a problem is detected, the code 456 below will simply "break" out of the switch. */ 457 ret = invalid_control; 458 459 switch (cmd->control_type) 460 { 461 case simple_control: 462 /* A simple command, execute it and return. */ 463 new_line = insert_args (cmd->line); 464 if (!new_line) 465 break; 466 make_cleanup (free_current_contents, &new_line); 467 execute_command (new_line, 0); 468 ret = cmd->control_type; 469 break; 470 471 case continue_control: 472 print_command_trace ("loop_continue"); 473 474 /* Return for "continue", and "break" so we can either 475 continue the loop at the top, or break out. */ 476 ret = cmd->control_type; 477 break; 478 479 case break_control: 480 print_command_trace ("loop_break"); 481 482 /* Return for "continue", and "break" so we can either 483 continue the loop at the top, or break out. */ 484 ret = cmd->control_type; 485 break; 486 487 case while_control: 488 { 489 int len = strlen (cmd->line) + 7; 490 char *buffer = alloca (len); 491 492 xsnprintf (buffer, len, "while %s", cmd->line); 493 print_command_trace (buffer); 494 495 /* Parse the loop control expression for the while statement. */ 496 new_line = insert_args (cmd->line); 497 if (!new_line) 498 break; 499 make_cleanup (free_current_contents, &new_line); 500 expr = parse_expression (new_line); 501 make_cleanup (free_current_contents, &expr); 502 503 ret = simple_control; 504 loop = 1; 505 506 /* Keep iterating so long as the expression is true. */ 507 while (loop == 1) 508 { 509 int cond_result; 510 511 QUIT; 512 513 /* Evaluate the expression. */ 514 val_mark = value_mark (); 515 val = evaluate_expression (expr); 516 cond_result = value_true (val); 517 value_free_to_mark (val_mark); 518 519 /* If the value is false, then break out of the loop. */ 520 if (!cond_result) 521 break; 522 523 /* Execute the body of the while statement. */ 524 current = *cmd->body_list; 525 while (current) 526 { 527 command_nest_depth++; 528 ret = execute_control_command (current); 529 command_nest_depth--; 530 531 /* If we got an error, or a "break" command, then stop 532 looping. */ 533 if (ret == invalid_control || ret == break_control) 534 { 535 loop = 0; 536 break; 537 } 538 539 /* If we got a "continue" command, then restart the loop 540 at this point. */ 541 if (ret == continue_control) 542 break; 543 544 /* Get the next statement. */ 545 current = current->next; 546 } 547 } 548 549 /* Reset RET so that we don't recurse the break all the way down. */ 550 if (ret == break_control) 551 ret = simple_control; 552 553 break; 554 } 555 556 case if_control: 557 { 558 int len = strlen (cmd->line) + 4; 559 char *buffer = alloca (len); 560 561 xsnprintf (buffer, len, "if %s", cmd->line); 562 print_command_trace (buffer); 563 564 new_line = insert_args (cmd->line); 565 if (!new_line) 566 break; 567 make_cleanup (free_current_contents, &new_line); 568 /* Parse the conditional for the if statement. */ 569 expr = parse_expression (new_line); 570 make_cleanup (free_current_contents, &expr); 571 572 current = NULL; 573 ret = simple_control; 574 575 /* Evaluate the conditional. */ 576 val_mark = value_mark (); 577 val = evaluate_expression (expr); 578 579 /* Choose which arm to take commands from based on the value 580 of the conditional expression. */ 581 if (value_true (val)) 582 current = *cmd->body_list; 583 else if (cmd->body_count == 2) 584 current = *(cmd->body_list + 1); 585 value_free_to_mark (val_mark); 586 587 /* Execute commands in the given arm. */ 588 while (current) 589 { 590 command_nest_depth++; 591 ret = execute_control_command (current); 592 command_nest_depth--; 593 594 /* If we got an error, get out. */ 595 if (ret != simple_control) 596 break; 597 598 /* Get the next statement in the body. */ 599 current = current->next; 600 } 601 602 break; 603 } 604 605 case commands_control: 606 { 607 /* Breakpoint commands list, record the commands in the 608 breakpoint's command list and return. */ 609 new_line = insert_args (cmd->line); 610 if (!new_line) 611 break; 612 make_cleanup (free_current_contents, &new_line); 613 ret = commands_from_control_command (new_line, cmd); 614 break; 615 } 616 617 case compile_control: 618 eval_compile_command (cmd, NULL, cmd->control_u.compile.scope); 619 ret = simple_control; 620 break; 621 622 case python_control: 623 case guile_control: 624 { 625 eval_ext_lang_from_control_command (cmd); 626 ret = simple_control; 627 break; 628 } 629 630 default: 631 warning (_("Invalid control type in canned commands structure.")); 632 break; 633 } 634 635 do_cleanups (old_chain); 636 637 return ret; 638 } 639 640 /* Like execute_control_command, but first set 641 suppress_next_print_command_trace. */ 642 643 enum command_control_type 644 execute_control_command_untraced (struct command_line *cmd) 645 { 646 suppress_next_print_command_trace = 1; 647 return execute_control_command (cmd); 648 } 649 650 651 /* "while" command support. Executes a body of statements while the 652 loop condition is nonzero. */ 653 654 static void 655 while_command (char *arg, int from_tty) 656 { 657 struct command_line *command = NULL; 658 struct cleanup *old_chain; 659 660 control_level = 1; 661 command = get_command_line (while_control, arg); 662 663 if (command == NULL) 664 return; 665 666 old_chain = make_cleanup_restore_integer (&interpreter_async); 667 interpreter_async = 0; 668 669 execute_control_command_untraced (command); 670 free_command_lines (&command); 671 672 do_cleanups (old_chain); 673 } 674 675 /* "if" command support. Execute either the true or false arm depending 676 on the value of the if conditional. */ 677 678 static void 679 if_command (char *arg, int from_tty) 680 { 681 struct command_line *command = NULL; 682 struct cleanup *old_chain; 683 684 control_level = 1; 685 command = get_command_line (if_control, arg); 686 687 if (command == NULL) 688 return; 689 690 old_chain = make_cleanup_restore_integer (&interpreter_async); 691 interpreter_async = 0; 692 693 execute_control_command_untraced (command); 694 free_command_lines (&command); 695 696 do_cleanups (old_chain); 697 } 698 699 /* Cleanup */ 700 static void 701 arg_cleanup (void *ignore) 702 { 703 struct user_args *oargs = user_args; 704 705 if (!user_args) 706 internal_error (__FILE__, __LINE__, 707 _("arg_cleanup called with no user args.\n")); 708 709 user_args = user_args->next; 710 xfree (oargs->command); 711 xfree (oargs); 712 } 713 714 /* Bind the incomming arguments for a user defined command to 715 $arg0, $arg1 ... $argMAXUSERARGS. */ 716 717 static struct cleanup * 718 setup_user_args (char *p) 719 { 720 struct user_args *args; 721 struct cleanup *old_chain; 722 unsigned int arg_count = 0; 723 724 args = (struct user_args *) xmalloc (sizeof (struct user_args)); 725 memset (args, 0, sizeof (struct user_args)); 726 727 args->next = user_args; 728 user_args = args; 729 730 old_chain = make_cleanup (arg_cleanup, 0/*ignored*/); 731 732 if (p == NULL) 733 return old_chain; 734 735 user_args->command = p = xstrdup (p); 736 737 while (*p) 738 { 739 char *start_arg; 740 int squote = 0; 741 int dquote = 0; 742 int bsquote = 0; 743 744 if (arg_count >= MAXUSERARGS) 745 error (_("user defined function may only have %d arguments."), 746 MAXUSERARGS); 747 748 /* Strip whitespace. */ 749 while (*p == ' ' || *p == '\t') 750 p++; 751 752 /* P now points to an argument. */ 753 start_arg = p; 754 user_args->a[arg_count].arg = p; 755 756 /* Get to the end of this argument. */ 757 while (*p) 758 { 759 if (((*p == ' ' || *p == '\t')) && !squote && !dquote && !bsquote) 760 break; 761 else 762 { 763 if (bsquote) 764 bsquote = 0; 765 else if (*p == '\\') 766 bsquote = 1; 767 else if (squote) 768 { 769 if (*p == '\'') 770 squote = 0; 771 } 772 else if (dquote) 773 { 774 if (*p == '"') 775 dquote = 0; 776 } 777 else 778 { 779 if (*p == '\'') 780 squote = 1; 781 else if (*p == '"') 782 dquote = 1; 783 } 784 p++; 785 } 786 } 787 788 user_args->a[arg_count].len = p - start_arg; 789 arg_count++; 790 user_args->count++; 791 } 792 return old_chain; 793 } 794 795 /* Given character string P, return a point to the first argument 796 ($arg), or NULL if P contains no arguments. */ 797 798 static char * 799 locate_arg (char *p) 800 { 801 while ((p = strchr (p, '$'))) 802 { 803 if (strncmp (p, "$arg", 4) == 0 804 && (isdigit (p[4]) || p[4] == 'c')) 805 return p; 806 p++; 807 } 808 return NULL; 809 } 810 811 /* Insert the user defined arguments stored in user_arg into the $arg 812 arguments found in line, with the updated copy being placed into 813 nline. */ 814 815 static char * 816 insert_args (char *line) 817 { 818 char *p, *save_line, *new_line; 819 unsigned len, i; 820 821 /* If we are not in a user-defined function, treat $argc, $arg0, et 822 cetera as normal convenience variables. */ 823 if (user_args == NULL) 824 return xstrdup (line); 825 826 /* First we need to know how much memory to allocate for the new 827 line. */ 828 save_line = line; 829 len = 0; 830 while ((p = locate_arg (line))) 831 { 832 len += p - line; 833 i = p[4] - '0'; 834 835 if (p[4] == 'c') 836 { 837 /* $argc. Number will be <=10. */ 838 len += user_args->count == 10 ? 2 : 1; 839 } 840 else if (i >= user_args->count) 841 { 842 error (_("Missing argument %d in user function."), i); 843 return NULL; 844 } 845 else 846 { 847 len += user_args->a[i].len; 848 } 849 line = p + 5; 850 } 851 852 /* Don't forget the tail. */ 853 len += strlen (line); 854 855 /* Allocate space for the new line and fill it in. */ 856 new_line = (char *) xmalloc (len + 1); 857 if (new_line == NULL) 858 return NULL; 859 860 /* Restore pointer to beginning of old line. */ 861 line = save_line; 862 863 /* Save pointer to beginning of new line. */ 864 save_line = new_line; 865 866 while ((p = locate_arg (line))) 867 { 868 int i, len; 869 870 memcpy (new_line, line, p - line); 871 new_line += p - line; 872 873 if (p[4] == 'c') 874 { 875 gdb_assert (user_args->count >= 0 && user_args->count <= 10); 876 if (user_args->count == 10) 877 { 878 *(new_line++) = '1'; 879 *(new_line++) = '0'; 880 } 881 else 882 *(new_line++) = user_args->count + '0'; 883 } 884 else 885 { 886 i = p[4] - '0'; 887 len = user_args->a[i].len; 888 if (len) 889 { 890 memcpy (new_line, user_args->a[i].arg, len); 891 new_line += len; 892 } 893 } 894 line = p + 5; 895 } 896 /* Don't forget the tail. */ 897 strcpy (new_line, line); 898 899 /* Return a pointer to the beginning of the new line. */ 900 return save_line; 901 } 902 903 904 /* Expand the body_list of COMMAND so that it can hold NEW_LENGTH 905 code bodies. This is typically used when we encounter an "else" 906 clause for an "if" command. */ 907 908 static void 909 realloc_body_list (struct command_line *command, int new_length) 910 { 911 int n; 912 struct command_line **body_list; 913 914 n = command->body_count; 915 916 /* Nothing to do? */ 917 if (new_length <= n) 918 return; 919 920 body_list = (struct command_line **) 921 xmalloc (sizeof (struct command_line *) * new_length); 922 923 memcpy (body_list, command->body_list, sizeof (struct command_line *) * n); 924 memset (body_list + n, 0, sizeof (struct command_line *) * (new_length - n)); 925 926 xfree (command->body_list); 927 command->body_list = body_list; 928 command->body_count = new_length; 929 } 930 931 /* Read next line from stdout. Passed to read_command_line_1 and 932 recurse_read_control_structure whenever we need to read commands 933 from stdout. */ 934 935 static char * 936 read_next_line (void) 937 { 938 char *prompt_ptr, control_prompt[256]; 939 int i = 0; 940 941 if (control_level >= 254) 942 error (_("Control nesting too deep!")); 943 944 /* Set a prompt based on the nesting of the control commands. */ 945 if (instream == stdin || (instream == 0 && deprecated_readline_hook != NULL)) 946 { 947 for (i = 0; i < control_level; i++) 948 control_prompt[i] = ' '; 949 control_prompt[i] = '>'; 950 control_prompt[i + 1] = '\0'; 951 prompt_ptr = (char *) &control_prompt[0]; 952 } 953 else 954 prompt_ptr = NULL; 955 956 return command_line_input (prompt_ptr, instream == stdin, "commands"); 957 } 958 959 /* Process one input line. If the command is an "end", return such an 960 indication to the caller. If PARSE_COMMANDS is true, strip leading 961 whitespace (trailing whitespace is always stripped) in the line, 962 attempt to recognize GDB control commands, and also return an 963 indication if the command is an "else" or a nop. 964 965 Otherwise, only "end" is recognized. */ 966 967 static enum misc_command_type 968 process_next_line (char *p, struct command_line **command, int parse_commands, 969 void (*validator)(char *, void *), void *closure) 970 { 971 char *p_end; 972 char *p_start; 973 int not_handled = 0; 974 975 /* Not sure what to do here. */ 976 if (p == NULL) 977 return end_command; 978 979 /* Strip trailing whitespace. */ 980 p_end = p + strlen (p); 981 while (p_end > p && (p_end[-1] == ' ' || p_end[-1] == '\t')) 982 p_end--; 983 984 p_start = p; 985 /* Strip leading whitespace. */ 986 while (p_start < p_end && (*p_start == ' ' || *p_start == '\t')) 987 p_start++; 988 989 /* 'end' is always recognized, regardless of parse_commands value. 990 We also permit whitespace before end and after. */ 991 if (p_end - p_start == 3 && !strncmp (p_start, "end", 3)) 992 return end_command; 993 994 if (parse_commands) 995 { 996 /* If commands are parsed, we skip initial spaces. Otherwise, 997 which is the case for Python commands and documentation 998 (see the 'document' command), spaces are preserved. */ 999 p = p_start; 1000 1001 /* Blanks and comments don't really do anything, but we need to 1002 distinguish them from else, end and other commands which can 1003 be executed. */ 1004 if (p_end == p || p[0] == '#') 1005 return nop_command; 1006 1007 /* Is the else clause of an if control structure? */ 1008 if (p_end - p == 4 && !strncmp (p, "else", 4)) 1009 return else_command; 1010 1011 /* Check for while, if, break, continue, etc and build a new 1012 command line structure for them. */ 1013 if ((p_end - p >= 14 && !strncmp (p, "while-stepping", 14)) 1014 || (p_end - p >= 8 && !strncmp (p, "stepping", 8)) 1015 || (p_end - p >= 2 && !strncmp (p, "ws", 2))) 1016 { 1017 /* Because validate_actionline and encode_action lookup 1018 command's line as command, we need the line to 1019 include 'while-stepping'. 1020 1021 For 'ws' alias, the command will have 'ws', not expanded 1022 to 'while-stepping'. This is intentional -- we don't 1023 really want frontend to send a command list with 'ws', 1024 and next break-info returning command line with 1025 'while-stepping'. This should work, but might cause the 1026 breakpoint to be marked as changed while it's actually 1027 not. */ 1028 *command = build_command_line (while_stepping_control, p); 1029 } 1030 else if (p_end - p > 5 && !strncmp (p, "while", 5)) 1031 { 1032 char *first_arg; 1033 1034 first_arg = p + 5; 1035 while (first_arg < p_end && isspace (*first_arg)) 1036 first_arg++; 1037 *command = build_command_line (while_control, first_arg); 1038 } 1039 else if (p_end - p > 2 && !strncmp (p, "if", 2)) 1040 { 1041 char *first_arg; 1042 1043 first_arg = p + 2; 1044 while (first_arg < p_end && isspace (*first_arg)) 1045 first_arg++; 1046 *command = build_command_line (if_control, first_arg); 1047 } 1048 else if (p_end - p >= 8 && !strncmp (p, "commands", 8)) 1049 { 1050 char *first_arg; 1051 1052 first_arg = p + 8; 1053 while (first_arg < p_end && isspace (*first_arg)) 1054 first_arg++; 1055 *command = build_command_line (commands_control, first_arg); 1056 } 1057 else if (p_end - p == 6 && !strncmp (p, "python", 6)) 1058 { 1059 /* Note that we ignore the inline "python command" form 1060 here. */ 1061 *command = build_command_line (python_control, ""); 1062 } 1063 else if (p_end - p == 6 && !strncmp (p, "compile", 7)) 1064 { 1065 /* Note that we ignore the inline "compile command" form 1066 here. */ 1067 *command = build_command_line (compile_control, ""); 1068 (*command)->control_u.compile.scope = COMPILE_I_INVALID_SCOPE; 1069 } 1070 1071 else if (p_end - p == 5 && !strncmp (p, "guile", 5)) 1072 { 1073 /* Note that we ignore the inline "guile command" form here. */ 1074 *command = build_command_line (guile_control, ""); 1075 } 1076 else if (p_end - p == 10 && !strncmp (p, "loop_break", 10)) 1077 { 1078 *command = (struct command_line *) 1079 xmalloc (sizeof (struct command_line)); 1080 (*command)->next = NULL; 1081 (*command)->line = NULL; 1082 (*command)->control_type = break_control; 1083 (*command)->body_count = 0; 1084 (*command)->body_list = NULL; 1085 } 1086 else if (p_end - p == 13 && !strncmp (p, "loop_continue", 13)) 1087 { 1088 *command = (struct command_line *) 1089 xmalloc (sizeof (struct command_line)); 1090 (*command)->next = NULL; 1091 (*command)->line = NULL; 1092 (*command)->control_type = continue_control; 1093 (*command)->body_count = 0; 1094 (*command)->body_list = NULL; 1095 } 1096 else 1097 not_handled = 1; 1098 } 1099 1100 if (!parse_commands || not_handled) 1101 { 1102 /* A normal command. */ 1103 *command = (struct command_line *) 1104 xmalloc (sizeof (struct command_line)); 1105 (*command)->next = NULL; 1106 (*command)->line = savestring (p, p_end - p); 1107 (*command)->control_type = simple_control; 1108 (*command)->body_count = 0; 1109 (*command)->body_list = NULL; 1110 } 1111 1112 if (validator) 1113 { 1114 volatile struct gdb_exception ex; 1115 1116 TRY_CATCH (ex, RETURN_MASK_ALL) 1117 { 1118 validator ((*command)->line, closure); 1119 } 1120 if (ex.reason < 0) 1121 { 1122 xfree (*command); 1123 throw_exception (ex); 1124 } 1125 } 1126 1127 /* Nothing special. */ 1128 return ok_command; 1129 } 1130 1131 /* Recursively read in the control structures and create a 1132 command_line structure from them. Use read_next_line_func to 1133 obtain lines of the command. */ 1134 1135 static enum command_control_type 1136 recurse_read_control_structure (char * (*read_next_line_func) (void), 1137 struct command_line *current_cmd, 1138 void (*validator)(char *, void *), 1139 void *closure) 1140 { 1141 int current_body, i; 1142 enum misc_command_type val; 1143 enum command_control_type ret; 1144 struct command_line **body_ptr, *child_tail, *next; 1145 1146 child_tail = NULL; 1147 current_body = 1; 1148 1149 /* Sanity checks. */ 1150 if (current_cmd->control_type == simple_control) 1151 error (_("Recursed on a simple control type.")); 1152 1153 if (current_body > current_cmd->body_count) 1154 error (_("Allocated body is smaller than this command type needs.")); 1155 1156 /* Read lines from the input stream and build control structures. */ 1157 while (1) 1158 { 1159 dont_repeat (); 1160 1161 next = NULL; 1162 val = process_next_line (read_next_line_func (), &next, 1163 current_cmd->control_type != python_control 1164 && current_cmd->control_type != guile_control 1165 && current_cmd->control_type != compile_control, 1166 validator, closure); 1167 1168 /* Just skip blanks and comments. */ 1169 if (val == nop_command) 1170 continue; 1171 1172 if (val == end_command) 1173 { 1174 if (multi_line_command_p (current_cmd->control_type)) 1175 { 1176 /* Success reading an entire canned sequence of commands. */ 1177 ret = simple_control; 1178 break; 1179 } 1180 else 1181 { 1182 ret = invalid_control; 1183 break; 1184 } 1185 } 1186 1187 /* Not the end of a control structure. */ 1188 if (val == else_command) 1189 { 1190 if (current_cmd->control_type == if_control 1191 && current_body == 1) 1192 { 1193 realloc_body_list (current_cmd, 2); 1194 current_body = 2; 1195 child_tail = NULL; 1196 continue; 1197 } 1198 else 1199 { 1200 ret = invalid_control; 1201 break; 1202 } 1203 } 1204 1205 if (child_tail) 1206 { 1207 child_tail->next = next; 1208 } 1209 else 1210 { 1211 body_ptr = current_cmd->body_list; 1212 for (i = 1; i < current_body; i++) 1213 body_ptr++; 1214 1215 *body_ptr = next; 1216 1217 } 1218 1219 child_tail = next; 1220 1221 /* If the latest line is another control structure, then recurse 1222 on it. */ 1223 if (multi_line_command_p (next->control_type)) 1224 { 1225 control_level++; 1226 ret = recurse_read_control_structure (read_next_line_func, next, 1227 validator, closure); 1228 control_level--; 1229 1230 if (ret != simple_control) 1231 break; 1232 } 1233 } 1234 1235 dont_repeat (); 1236 1237 return ret; 1238 } 1239 1240 static void 1241 restore_interp (void *arg) 1242 { 1243 interp_set_temp (interp_name ((struct interp *)arg)); 1244 } 1245 1246 /* Read lines from the input stream and accumulate them in a chain of 1247 struct command_line's, which is then returned. For input from a 1248 terminal, the special command "end" is used to mark the end of the 1249 input, and is not included in the returned chain of commands. 1250 1251 If PARSE_COMMANDS is true, strip leading whitespace (trailing whitespace 1252 is always stripped) in the line and attempt to recognize GDB control 1253 commands. Otherwise, only "end" is recognized. */ 1254 1255 #define END_MESSAGE "End with a line saying just \"end\"." 1256 1257 struct command_line * 1258 read_command_lines (char *prompt_arg, int from_tty, int parse_commands, 1259 void (*validator)(char *, void *), void *closure) 1260 { 1261 struct command_line *head; 1262 1263 if (from_tty && input_from_terminal_p ()) 1264 { 1265 if (deprecated_readline_begin_hook) 1266 { 1267 /* Note - intentional to merge messages with no newline. */ 1268 (*deprecated_readline_begin_hook) ("%s %s\n", prompt_arg, 1269 END_MESSAGE); 1270 } 1271 else 1272 { 1273 printf_unfiltered ("%s\n%s\n", prompt_arg, END_MESSAGE); 1274 gdb_flush (gdb_stdout); 1275 } 1276 } 1277 1278 1279 /* Reading commands assumes the CLI behavior, so temporarily 1280 override the current interpreter with CLI. */ 1281 if (current_interp_named_p (INTERP_CONSOLE)) 1282 head = read_command_lines_1 (read_next_line, parse_commands, 1283 validator, closure); 1284 else 1285 { 1286 struct interp *old_interp = interp_set_temp (INTERP_CONSOLE); 1287 struct cleanup *old_chain = make_cleanup (restore_interp, old_interp); 1288 1289 head = read_command_lines_1 (read_next_line, parse_commands, 1290 validator, closure); 1291 do_cleanups (old_chain); 1292 } 1293 1294 if (deprecated_readline_end_hook && from_tty && input_from_terminal_p ()) 1295 { 1296 (*deprecated_readline_end_hook) (); 1297 } 1298 return (head); 1299 } 1300 1301 /* Act the same way as read_command_lines, except that each new line is 1302 obtained using READ_NEXT_LINE_FUNC. */ 1303 1304 struct command_line * 1305 read_command_lines_1 (char * (*read_next_line_func) (void), int parse_commands, 1306 void (*validator)(char *, void *), void *closure) 1307 { 1308 struct command_line *head, *tail, *next; 1309 struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); 1310 enum command_control_type ret; 1311 enum misc_command_type val; 1312 1313 control_level = 0; 1314 head = tail = NULL; 1315 1316 while (1) 1317 { 1318 dont_repeat (); 1319 val = process_next_line (read_next_line_func (), &next, parse_commands, 1320 validator, closure); 1321 1322 /* Ignore blank lines or comments. */ 1323 if (val == nop_command) 1324 continue; 1325 1326 if (val == end_command) 1327 { 1328 ret = simple_control; 1329 break; 1330 } 1331 1332 if (val != ok_command) 1333 { 1334 ret = invalid_control; 1335 break; 1336 } 1337 1338 if (multi_line_command_p (next->control_type)) 1339 { 1340 control_level++; 1341 ret = recurse_read_control_structure (read_next_line_func, next, 1342 validator, closure); 1343 control_level--; 1344 1345 if (ret == invalid_control) 1346 break; 1347 } 1348 1349 if (tail) 1350 { 1351 tail->next = next; 1352 } 1353 else 1354 { 1355 head = next; 1356 make_cleanup_free_command_lines (&head); 1357 } 1358 tail = next; 1359 } 1360 1361 dont_repeat (); 1362 1363 if (ret != invalid_control) 1364 discard_cleanups (old_chain); 1365 else 1366 do_cleanups (old_chain); 1367 1368 return head; 1369 } 1370 1371 /* Free a chain of struct command_line's. */ 1372 1373 void 1374 free_command_lines (struct command_line **lptr) 1375 { 1376 struct command_line *l = *lptr; 1377 struct command_line *next; 1378 struct command_line **blist; 1379 int i; 1380 1381 while (l) 1382 { 1383 if (l->body_count > 0) 1384 { 1385 blist = l->body_list; 1386 for (i = 0; i < l->body_count; i++, blist++) 1387 free_command_lines (blist); 1388 } 1389 next = l->next; 1390 xfree (l->line); 1391 xfree (l); 1392 l = next; 1393 } 1394 *lptr = NULL; 1395 } 1396 1397 static void 1398 do_free_command_lines_cleanup (void *arg) 1399 { 1400 free_command_lines (arg); 1401 } 1402 1403 struct cleanup * 1404 make_cleanup_free_command_lines (struct command_line **arg) 1405 { 1406 return make_cleanup (do_free_command_lines_cleanup, arg); 1407 } 1408 1409 struct command_line * 1410 copy_command_lines (struct command_line *cmds) 1411 { 1412 struct command_line *result = NULL; 1413 1414 if (cmds) 1415 { 1416 result = (struct command_line *) xmalloc (sizeof (struct command_line)); 1417 1418 result->next = copy_command_lines (cmds->next); 1419 result->line = xstrdup (cmds->line); 1420 result->control_type = cmds->control_type; 1421 result->body_count = cmds->body_count; 1422 if (cmds->body_count > 0) 1423 { 1424 int i; 1425 1426 result->body_list = (struct command_line **) 1427 xmalloc (sizeof (struct command_line *) * cmds->body_count); 1428 1429 for (i = 0; i < cmds->body_count; i++) 1430 result->body_list[i] = copy_command_lines (cmds->body_list[i]); 1431 } 1432 else 1433 result->body_list = NULL; 1434 } 1435 1436 return result; 1437 } 1438 1439 /* Validate that *COMNAME is a valid name for a command. Return the 1440 containing command list, in case it starts with a prefix command. 1441 The prefix must already exist. *COMNAME is advanced to point after 1442 any prefix, and a NUL character overwrites the space after the 1443 prefix. */ 1444 1445 static struct cmd_list_element ** 1446 validate_comname (char **comname) 1447 { 1448 struct cmd_list_element **list = &cmdlist; 1449 char *p, *last_word; 1450 1451 if (*comname == 0) 1452 error_no_arg (_("name of command to define")); 1453 1454 /* Find the last word of the argument. */ 1455 p = *comname + strlen (*comname); 1456 while (p > *comname && isspace (p[-1])) 1457 p--; 1458 while (p > *comname && !isspace (p[-1])) 1459 p--; 1460 last_word = p; 1461 1462 /* Find the corresponding command list. */ 1463 if (last_word != *comname) 1464 { 1465 struct cmd_list_element *c; 1466 char saved_char; 1467 const char *tem = *comname; 1468 1469 /* Separate the prefix and the command. */ 1470 saved_char = last_word[-1]; 1471 last_word[-1] = '\0'; 1472 1473 c = lookup_cmd (&tem, cmdlist, "", 0, 1); 1474 if (c->prefixlist == NULL) 1475 error (_("\"%s\" is not a prefix command."), *comname); 1476 1477 list = c->prefixlist; 1478 last_word[-1] = saved_char; 1479 *comname = last_word; 1480 } 1481 1482 p = *comname; 1483 while (*p) 1484 { 1485 if (!isalnum (*p) && *p != '-' && *p != '_') 1486 error (_("Junk in argument list: \"%s\""), p); 1487 p++; 1488 } 1489 1490 return list; 1491 } 1492 1493 /* This is just a placeholder in the command data structures. */ 1494 static void 1495 user_defined_command (char *ignore, int from_tty) 1496 { 1497 } 1498 1499 static void 1500 define_command (char *comname, int from_tty) 1501 { 1502 #define MAX_TMPBUF 128 1503 enum cmd_hook_type 1504 { 1505 CMD_NO_HOOK = 0, 1506 CMD_PRE_HOOK, 1507 CMD_POST_HOOK 1508 }; 1509 struct command_line *cmds; 1510 struct cmd_list_element *c, *newc, *hookc = 0, **list; 1511 char *tem, *comfull; 1512 const char *tem_c; 1513 char tmpbuf[MAX_TMPBUF]; 1514 int hook_type = CMD_NO_HOOK; 1515 int hook_name_size = 0; 1516 1517 #define HOOK_STRING "hook-" 1518 #define HOOK_LEN 5 1519 #define HOOK_POST_STRING "hookpost-" 1520 #define HOOK_POST_LEN 9 1521 1522 comfull = comname; 1523 list = validate_comname (&comname); 1524 1525 /* Look it up, and verify that we got an exact match. */ 1526 tem_c = comname; 1527 c = lookup_cmd (&tem_c, *list, "", -1, 1); 1528 if (c && strcmp (comname, c->name) != 0) 1529 c = 0; 1530 1531 if (c) 1532 { 1533 int q; 1534 1535 if (c->class == class_user || c->class == class_alias) 1536 q = query (_("Redefine command \"%s\"? "), c->name); 1537 else 1538 q = query (_("Really redefine built-in command \"%s\"? "), c->name); 1539 if (!q) 1540 error (_("Command \"%s\" not redefined."), c->name); 1541 } 1542 1543 /* If this new command is a hook, then mark the command which it 1544 is hooking. Note that we allow hooking `help' commands, so that 1545 we can hook the `stop' pseudo-command. */ 1546 1547 if (!strncmp (comname, HOOK_STRING, HOOK_LEN)) 1548 { 1549 hook_type = CMD_PRE_HOOK; 1550 hook_name_size = HOOK_LEN; 1551 } 1552 else if (!strncmp (comname, HOOK_POST_STRING, HOOK_POST_LEN)) 1553 { 1554 hook_type = CMD_POST_HOOK; 1555 hook_name_size = HOOK_POST_LEN; 1556 } 1557 1558 if (hook_type != CMD_NO_HOOK) 1559 { 1560 /* Look up cmd it hooks, and verify that we got an exact match. */ 1561 tem_c = comname + hook_name_size; 1562 hookc = lookup_cmd (&tem_c, *list, "", -1, 0); 1563 if (hookc && strcmp (comname + hook_name_size, hookc->name) != 0) 1564 hookc = 0; 1565 if (!hookc) 1566 { 1567 warning (_("Your new `%s' command does not " 1568 "hook any existing command."), 1569 comfull); 1570 if (!query (_("Proceed? "))) 1571 error (_("Not confirmed.")); 1572 } 1573 } 1574 1575 comname = xstrdup (comname); 1576 1577 /* If the rest of the commands will be case insensitive, this one 1578 should behave in the same manner. */ 1579 for (tem = comname; *tem; tem++) 1580 if (isupper (*tem)) 1581 *tem = tolower (*tem); 1582 1583 xsnprintf (tmpbuf, sizeof (tmpbuf), 1584 "Type commands for definition of \"%s\".", comfull); 1585 cmds = read_command_lines (tmpbuf, from_tty, 1, 0, 0); 1586 1587 if (c && c->class == class_user) 1588 free_command_lines (&c->user_commands); 1589 1590 newc = add_cmd (comname, class_user, user_defined_command, 1591 (c && c->class == class_user) 1592 ? c->doc : xstrdup ("User-defined."), list); 1593 newc->user_commands = cmds; 1594 1595 /* If this new command is a hook, then mark both commands as being 1596 tied. */ 1597 if (hookc) 1598 { 1599 switch (hook_type) 1600 { 1601 case CMD_PRE_HOOK: 1602 hookc->hook_pre = newc; /* Target gets hooked. */ 1603 newc->hookee_pre = hookc; /* We are marked as hooking target cmd. */ 1604 break; 1605 case CMD_POST_HOOK: 1606 hookc->hook_post = newc; /* Target gets hooked. */ 1607 newc->hookee_post = hookc; /* We are marked as hooking 1608 target cmd. */ 1609 break; 1610 default: 1611 /* Should never come here as hookc would be 0. */ 1612 internal_error (__FILE__, __LINE__, _("bad switch")); 1613 } 1614 } 1615 } 1616 1617 static void 1618 document_command (char *comname, int from_tty) 1619 { 1620 struct command_line *doclines; 1621 struct cmd_list_element *c, **list; 1622 const char *tem; 1623 char *comfull; 1624 char tmpbuf[128]; 1625 1626 comfull = comname; 1627 list = validate_comname (&comname); 1628 1629 tem = comname; 1630 c = lookup_cmd (&tem, *list, "", 0, 1); 1631 1632 if (c->class != class_user) 1633 error (_("Command \"%s\" is built-in."), comfull); 1634 1635 xsnprintf (tmpbuf, sizeof (tmpbuf), "Type documentation for \"%s\".", 1636 comfull); 1637 doclines = read_command_lines (tmpbuf, from_tty, 0, 0, 0); 1638 1639 if (c->doc) 1640 xfree ((char *) c->doc); 1641 1642 { 1643 struct command_line *cl1; 1644 int len = 0; 1645 char *doc; 1646 1647 for (cl1 = doclines; cl1; cl1 = cl1->next) 1648 len += strlen (cl1->line) + 1; 1649 1650 doc = (char *) xmalloc (len + 1); 1651 *doc = 0; 1652 1653 for (cl1 = doclines; cl1; cl1 = cl1->next) 1654 { 1655 strcat (doc, cl1->line); 1656 if (cl1->next) 1657 strcat (doc, "\n"); 1658 } 1659 1660 c->doc = doc; 1661 } 1662 1663 free_command_lines (&doclines); 1664 } 1665 1666 struct source_cleanup_lines_args 1667 { 1668 int old_line; 1669 const char *old_file; 1670 }; 1671 1672 static void 1673 source_cleanup_lines (void *args) 1674 { 1675 struct source_cleanup_lines_args *p = 1676 (struct source_cleanup_lines_args *) args; 1677 1678 source_line_number = p->old_line; 1679 source_file_name = p->old_file; 1680 } 1681 1682 /* Used to implement source_command. */ 1683 1684 void 1685 script_from_file (FILE *stream, const char *file) 1686 { 1687 struct cleanup *old_cleanups; 1688 struct source_cleanup_lines_args old_lines; 1689 1690 if (stream == NULL) 1691 internal_error (__FILE__, __LINE__, _("called with NULL file pointer!")); 1692 1693 old_lines.old_line = source_line_number; 1694 old_lines.old_file = source_file_name; 1695 old_cleanups = make_cleanup (source_cleanup_lines, &old_lines); 1696 source_line_number = 0; 1697 source_file_name = file; 1698 1699 make_cleanup_restore_integer (&interpreter_async); 1700 interpreter_async = 0; 1701 1702 { 1703 volatile struct gdb_exception e; 1704 1705 TRY_CATCH (e, RETURN_MASK_ERROR) 1706 { 1707 read_command_file (stream); 1708 } 1709 switch (e.reason) 1710 { 1711 case 0: 1712 break; 1713 case RETURN_ERROR: 1714 /* Re-throw the error, but with the file name information 1715 prepended. */ 1716 throw_error (e.error, 1717 _("%s:%d: Error in sourced command file:\n%s"), 1718 source_file_name, source_line_number, e.message); 1719 default: 1720 internal_error (__FILE__, __LINE__, _("bad reason")); 1721 } 1722 } 1723 1724 do_cleanups (old_cleanups); 1725 } 1726 1727 /* Print the definition of user command C to STREAM. Or, if C is a 1728 prefix command, show the definitions of all user commands under C 1729 (recursively). PREFIX and NAME combined are the name of the 1730 current command. */ 1731 void 1732 show_user_1 (struct cmd_list_element *c, const char *prefix, const char *name, 1733 struct ui_file *stream) 1734 { 1735 struct command_line *cmdlines; 1736 1737 if (c->prefixlist != NULL) 1738 { 1739 const char *prefixname = c->prefixname; 1740 1741 for (c = *c->prefixlist; c != NULL; c = c->next) 1742 if (c->class == class_user || c->prefixlist != NULL) 1743 show_user_1 (c, prefixname, c->name, gdb_stdout); 1744 return; 1745 } 1746 1747 cmdlines = c->user_commands; 1748 fprintf_filtered (stream, "User command \"%s%s\":\n", prefix, name); 1749 1750 if (!cmdlines) 1751 return; 1752 print_command_lines (current_uiout, cmdlines, 1); 1753 fputs_filtered ("\n", stream); 1754 } 1755 1756 1757 1758 initialize_file_ftype _initialize_cli_script; 1759 1760 void 1761 _initialize_cli_script (void) 1762 { 1763 add_com ("document", class_support, document_command, _("\ 1764 Document a user-defined command.\n\ 1765 Give command name as argument. Give documentation on following lines.\n\ 1766 End with a line of just \"end\".")); 1767 add_com ("define", class_support, define_command, _("\ 1768 Define a new command name. Command name is argument.\n\ 1769 Definition appears on following lines, one command per line.\n\ 1770 End with a line of just \"end\".\n\ 1771 Use the \"document\" command to give documentation for the new command.\n\ 1772 Commands defined in this way may have up to ten arguments.")); 1773 1774 add_com ("while", class_support, while_command, _("\ 1775 Execute nested commands WHILE the conditional expression is non zero.\n\ 1776 The conditional expression must follow the word `while' and must in turn be\n\ 1777 followed by a new line. The nested commands must be entered one per line,\n\ 1778 and should be terminated by the word `end'.")); 1779 1780 add_com ("if", class_support, if_command, _("\ 1781 Execute nested commands once IF the conditional expression is non zero.\n\ 1782 The conditional expression must follow the word `if' and must in turn be\n\ 1783 followed by a new line. The nested commands must be entered one per line,\n\ 1784 and should be terminated by the word 'else' or `end'. If an else clause\n\ 1785 is used, the same rules apply to its nested commands as to the first ones.")); 1786 } 1787