Fix PR 20559 - "eval" command and $arg0...$arg9/$argc substitution
authorPedro Alves <palves@redhat.com>
Fri, 2 Dec 2016 19:17:13 +0000 (19:17 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 2 Dec 2016 19:17:13 +0000 (19:17 +0000)
commit01770bbde902e075e524b518ac6c1087a4cc1cfb
treeea8041e575a6b7447dd92d986da08ab869ae9242
parent7ed7e438bf8a21983eeaeec0617868f8bab06197
Fix PR 20559 - "eval" command and $arg0...$arg9/$argc substitution

It'd be handy to be able to iterate over command arguments in
user-defined commands, in order to support optional arguments
($arg0..$argN).

I thought I could make it work with "eval", but alas, it doesn't work
currently.  E.g., with:

 define test
   set $i = 0
   while $i < $argc
     eval "print $arg%d", $i
     set $i = $i + 1
   end
 end

we get:

 (gdb) test 1
 $1 = void
 (gdb) test 1 2 3
 $2 = void
 $3 = void
 $4 = void
 (gdb)

The problem is that "eval" doesn't do user-defined command arguments
substitution after expanding its own argument.  This patch fixes that,
which makes the example above work:

 (gdb) test 1
 $1 = 1
 (gdb) test 1 2 3
 $2 = 1
 $3 = 2
 $4 = 3
 (gdb)

New test included, similar the above, but also exercises expanding
$argc.

I think this is likely to simplify many scripts out there, so I'm
adding an example to the manual and mentioning it in NEWS as well.

gdb/ChangeLog:
2016-12-02  Pedro Alves  <palves@redhat.com>

PR cli/20559
* NEWS: Mention "eval" expands user-defined command arguments.
* cli/cli-script.c (execute_control_command): Adjust to rename.
(insert_args): Rename to ...
(insert_user_defined_cmd_args): ... this, and make extern.
* cli/cli-script.h (insert_user_defined_cmd_args): New
declaration.
* printcmd.c: Include "cli/cli-script.h".
(eval_command): Call insert_user_defined_cmd_args.

gdb/doc/ChangeLog:
2016-12-02  Pedro Alves  <palves@redhat.com>

PR cli/20559
* gdb.texinfo (Define): Add example of using "eval" to process a
variable number of arguments.
(Output) <eval>: Add anchor.

gdb/testsuite/ChangeLog:
2016-12-02  Pedro Alves  <palves@redhat.com>

PR cli/20559
* gdb.base/commands.exp (user_defined_command_args_eval): New
procedure.
(top level): Call it.
gdb/ChangeLog
gdb/NEWS
gdb/cli/cli-script.c
gdb/cli/cli-script.h
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/printcmd.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/commands.exp