This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: $argc variable
- From: Andrew STUBBS <andrew dot stubbs at st dot com>
- To: Daniel Jacobowitz <drow at false dot org>
- Cc: Eli Zaretskii <eliz at gnu dot org>, gdb-patches at sources dot redhat dot com
- Date: Mon, 14 Nov 2005 16:28:10 +0000
- Subject: Re: $argc variable
- References: <436A0BD2.5080505@st.com> <20051107001800.GF19200@nevyn.them.org> <436F35E9.4070808@st.com> <20051107133538.GA2331@nevyn.them.org> <43709E94.4070004@st.com> <u7jbisp6n.fsf@gnu.org> <4371D9A6.40109@st.com> <u3bm5sk6i.fsf@gnu.org> <43731C16.2040203@st.com> <20051113173524.GC1945@nevyn.them.org>
Daniel Jacobowitz wrote:
It looks OK to me. Could you post the revised documentation (to
gdb-patches, please) so that we can make sure that Eli and you did
converge? I couldn't quite follow your earlier conversation.
Here is the full patch including both code and docs.
In the end I have dropped the index altogether. Eli didn't like the
kindex and the cindex would be so close to the cindex for the section,
and so similar in content, that it would be pointless.
I still think there is an argument for a kindex entry for both $argc and
$arg0...$arg1 in case people don't know they are looking for
'user-defined', but I'm not really that bothered.
OK?
Andrew
2005-11-14 Andrew Stubbs <andrew.stubbs@st.com>
* cli/cli-script.c: Include gdb_assert.h.
(locate_arg): Detect $argc.
(insert_args): Substitute $argc.
* Makefile.in (cli-script.o): Add dependency on gdb_assert.h.
doc/
* gdb.texinfo (User-defined commands): Add $argc. Add missing 'end'.
Change @var{$arg0 to @code{$arg0.
Index: src/gdb/cli/cli-script.c
===================================================================
--- src.orig/gdb/cli/cli-script.c 2005-11-14 14:49:30.000000000 +0000
+++ src/gdb/cli/cli-script.c 2005-11-14 15:01:14.000000000 +0000
@@ -33,6 +33,7 @@
#include "cli/cli-cmds.h"
#include "cli/cli-decode.h"
#include "cli/cli-script.h"
+#include "gdb_assert.h"
/* Prototypes for local functions */
@@ -572,7 +573,8 @@ locate_arg (char *p)
{
while ((p = strchr (p, '$')))
{
- if (strncmp (p, "$arg", 4) == 0 && isdigit (p[4]))
+ if (strncmp (p, "$arg", 4) == 0
+ && (isdigit (p[4]) || p[4] == 'c'))
return p;
p++;
}
@@ -596,12 +598,20 @@ insert_args (char *line)
len += p - line;
i = p[4] - '0';
- if (i >= user_args->count)
+ if (p[4] == 'c')
+ {
+ /* $argc. Number will be <=10. */
+ len += user_args->count == 10 ? 2 : 1;
+ }
+ else if (i >= user_args->count)
{
error (_("Missing argument %d in user function."), i);
return NULL;
}
- len += user_args->a[i].len;
+ else
+ {
+ len += user_args->a[i].len;
+ }
line = p + 5;
}
@@ -625,13 +635,27 @@ insert_args (char *line)
memcpy (new_line, line, p - line);
new_line += p - line;
- i = p[4] - '0';
- len = user_args->a[i].len;
- if (len)
+ if (p[4] == 'c')
+ {
+ gdb_assert (user_args->count >= 0 && user_args->count <= 10);
+ if (user_args->count == 10)
+ {
+ *(new_line++) = '1';
+ *(new_line++) = '0';
+ }
+ else
+ *(new_line++) = user_args->count + '0';
+ }
+ else
{
- memcpy (new_line, user_args->a[i].arg, len);
- new_line += len;
+ i = p[4] - '0';
+ len = user_args->a[i].len;
+ if (len)
+ {
+ memcpy (new_line, user_args->a[i].arg, len);
+ new_line += len;
+ }
}
line = p + 5;
}
Index: src/gdb/doc/gdb.texinfo
===================================================================
--- src.orig/gdb/doc/gdb.texinfo 2005-11-14 14:50:18.000000000 +0000
+++ src/gdb/doc/gdb.texinfo 2005-11-14 15:28:00.000000000 +0000
@@ -15708,11 +15708,12 @@ A @dfn{user-defined command} is a sequen
which you assign a new name as a command. This is done with the
@code{define} command. User commands may accept up to 10 arguments
separated by whitespace. Arguments are accessed within the user command
-via @var{$arg0@dots{}$arg9}. A trivial example:
+via @code{$arg0@dots{}$arg9}. A trivial example:
@smallexample
define adder
print $arg0 + $arg1 + $arg2
+end
@end smallexample
@noindent
@@ -15728,6 +15729,20 @@ its three arguments. Note the arguments
reference variables, use complex expressions, or even perform inferior
functions calls.
+In addition, @code{$argc} may be used to find out how many arguments have
+been passed. This expands to a number in the range 0@dots{}10.
+
+@smallexample
+define adder
+ if $argc == 2
+ print $arg0 + $arg1
+ end
+ if $argc == 3
+ print $arg0 + $arg1 + $arg2
+ end
+end
+@end smallexample
+
@table @code
@kindex define
Index: src/gdb/Makefile.in
===================================================================
--- src.orig/gdb/Makefile.in 2005-11-14 14:49:30.000000000 +0000
+++ src/gdb/Makefile.in 2005-11-14 15:01:14.000000000 +0000
@@ -2807,7 +2807,7 @@ cli-logging.o: $(srcdir)/cli/cli-logging
$(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/cli/cli-logging.c
cli-script.o: $(srcdir)/cli/cli-script.c $(defs_h) $(value_h) $(language_h) \
$(ui_out_h) $(gdb_string_h) $(exceptions_h) $(top_h) $(cli_cmds_h) \
- $(cli_decode_h) $(cli_script_h)
+ $(cli_decode_h) $(cli_script_h) $(gdb_assert_h)
$(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/cli/cli-script.c
cli-setshow.o: $(srcdir)/cli/cli-setshow.c $(defs_h) $(readline_tilde_h) \
$(value_h) $(gdb_string_h) $(ui_out_h) $(cli_decode_h) $(cli_cmds_h) \