2011-02-21 19:13:17 +01:00
|
|
|
/* CLI utilities.
|
|
|
|
|
2014-01-01 04:54:24 +01:00
|
|
|
Copyright (C) 2011-2014 Free Software Foundation, Inc.
|
2011-02-21 19:13:17 +01:00
|
|
|
|
|
|
|
This file is part of GDB.
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
#include "defs.h"
|
|
|
|
#include "cli/cli-utils.h"
|
remove gdb_string.h
This removes gdb_string.h. This patch is purely mechanical. I
created it by running the two commands:
git rm common/gdb_string.h
perl -pi -e's/"gdb_string.h"/<string.h>/;' *.[chyl] */*.[chyl]
2013-11-18 Tom Tromey <tromey@redhat.com>
* common/gdb_string.h: Remove.
* aarch64-tdep.c: Use string.h, not gdb_string.h.
* ada-exp.y: Use string.h, not gdb_string.h.
* ada-lang.c: Use string.h, not gdb_string.h.
* ada-lex.l: Use string.h, not gdb_string.h.
* ada-typeprint.c: Use string.h, not gdb_string.h.
* ada-valprint.c: Use string.h, not gdb_string.h.
* aix-thread.c: Use string.h, not gdb_string.h.
* alpha-linux-tdep.c: Use string.h, not gdb_string.h.
* alpha-mdebug-tdep.c: Use string.h, not gdb_string.h.
* alpha-nat.c: Use string.h, not gdb_string.h.
* alpha-osf1-tdep.c: Use string.h, not gdb_string.h.
* alpha-tdep.c: Use string.h, not gdb_string.h.
* alphanbsd-tdep.c: Use string.h, not gdb_string.h.
* amd64-dicos-tdep.c: Use string.h, not gdb_string.h.
* amd64-linux-nat.c: Use string.h, not gdb_string.h.
* amd64-linux-tdep.c: Use string.h, not gdb_string.h.
* amd64-nat.c: Use string.h, not gdb_string.h.
* amd64-sol2-tdep.c: Use string.h, not gdb_string.h.
* amd64fbsd-tdep.c: Use string.h, not gdb_string.h.
* amd64obsd-tdep.c: Use string.h, not gdb_string.h.
* arch-utils.c: Use string.h, not gdb_string.h.
* arm-linux-nat.c: Use string.h, not gdb_string.h.
* arm-linux-tdep.c: Use string.h, not gdb_string.h.
* arm-tdep.c: Use string.h, not gdb_string.h.
* arm-wince-tdep.c: Use string.h, not gdb_string.h.
* armbsd-tdep.c: Use string.h, not gdb_string.h.
* armnbsd-nat.c: Use string.h, not gdb_string.h.
* armnbsd-tdep.c: Use string.h, not gdb_string.h.
* armobsd-tdep.c: Use string.h, not gdb_string.h.
* avr-tdep.c: Use string.h, not gdb_string.h.
* ax-gdb.c: Use string.h, not gdb_string.h.
* ax-general.c: Use string.h, not gdb_string.h.
* bcache.c: Use string.h, not gdb_string.h.
* bfin-tdep.c: Use string.h, not gdb_string.h.
* breakpoint.c: Use string.h, not gdb_string.h.
* build-id.c: Use string.h, not gdb_string.h.
* buildsym.c: Use string.h, not gdb_string.h.
* c-exp.y: Use string.h, not gdb_string.h.
* c-lang.c: Use string.h, not gdb_string.h.
* c-typeprint.c: Use string.h, not gdb_string.h.
* c-valprint.c: Use string.h, not gdb_string.h.
* charset.c: Use string.h, not gdb_string.h.
* cli-out.c: Use string.h, not gdb_string.h.
* cli/cli-cmds.c: Use string.h, not gdb_string.h.
* cli/cli-decode.c: Use string.h, not gdb_string.h.
* cli/cli-dump.c: Use string.h, not gdb_string.h.
* cli/cli-interp.c: Use string.h, not gdb_string.h.
* cli/cli-logging.c: Use string.h, not gdb_string.h.
* cli/cli-script.c: Use string.h, not gdb_string.h.
* cli/cli-setshow.c: Use string.h, not gdb_string.h.
* cli/cli-utils.c: Use string.h, not gdb_string.h.
* coffread.c: Use string.h, not gdb_string.h.
* common/common-utils.c: Use string.h, not gdb_string.h.
* common/filestuff.c: Use string.h, not gdb_string.h.
* common/linux-procfs.c: Use string.h, not gdb_string.h.
* common/linux-ptrace.c: Use string.h, not gdb_string.h.
* common/signals.c: Use string.h, not gdb_string.h.
* common/vec.h: Use string.h, not gdb_string.h.
* core-regset.c: Use string.h, not gdb_string.h.
* corefile.c: Use string.h, not gdb_string.h.
* corelow.c: Use string.h, not gdb_string.h.
* cp-abi.c: Use string.h, not gdb_string.h.
* cp-support.c: Use string.h, not gdb_string.h.
* cp-valprint.c: Use string.h, not gdb_string.h.
* cris-tdep.c: Use string.h, not gdb_string.h.
* d-lang.c: Use string.h, not gdb_string.h.
* dbxread.c: Use string.h, not gdb_string.h.
* dcache.c: Use string.h, not gdb_string.h.
* demangle.c: Use string.h, not gdb_string.h.
* dicos-tdep.c: Use string.h, not gdb_string.h.
* disasm.c: Use string.h, not gdb_string.h.
* doublest.c: Use string.h, not gdb_string.h.
* dsrec.c: Use string.h, not gdb_string.h.
* dummy-frame.c: Use string.h, not gdb_string.h.
* dwarf2-frame.c: Use string.h, not gdb_string.h.
* dwarf2loc.c: Use string.h, not gdb_string.h.
* dwarf2read.c: Use string.h, not gdb_string.h.
* elfread.c: Use string.h, not gdb_string.h.
* environ.c: Use string.h, not gdb_string.h.
* eval.c: Use string.h, not gdb_string.h.
* event-loop.c: Use string.h, not gdb_string.h.
* exceptions.c: Use string.h, not gdb_string.h.
* exec.c: Use string.h, not gdb_string.h.
* expprint.c: Use string.h, not gdb_string.h.
* f-exp.y: Use string.h, not gdb_string.h.
* f-lang.c: Use string.h, not gdb_string.h.
* f-typeprint.c: Use string.h, not gdb_string.h.
* f-valprint.c: Use string.h, not gdb_string.h.
* fbsd-nat.c: Use string.h, not gdb_string.h.
* findcmd.c: Use string.h, not gdb_string.h.
* findvar.c: Use string.h, not gdb_string.h.
* fork-child.c: Use string.h, not gdb_string.h.
* frame.c: Use string.h, not gdb_string.h.
* frv-linux-tdep.c: Use string.h, not gdb_string.h.
* frv-tdep.c: Use string.h, not gdb_string.h.
* gdb.c: Use string.h, not gdb_string.h.
* gdb_bfd.c: Use string.h, not gdb_string.h.
* gdbarch.c: Use string.h, not gdb_string.h.
* gdbtypes.c: Use string.h, not gdb_string.h.
* gnu-nat.c: Use string.h, not gdb_string.h.
* gnu-v2-abi.c: Use string.h, not gdb_string.h.
* gnu-v3-abi.c: Use string.h, not gdb_string.h.
* go-exp.y: Use string.h, not gdb_string.h.
* go-lang.c: Use string.h, not gdb_string.h.
* go32-nat.c: Use string.h, not gdb_string.h.
* hppa-hpux-tdep.c: Use string.h, not gdb_string.h.
* hppa-linux-nat.c: Use string.h, not gdb_string.h.
* hppanbsd-tdep.c: Use string.h, not gdb_string.h.
* hppaobsd-tdep.c: Use string.h, not gdb_string.h.
* i386-cygwin-tdep.c: Use string.h, not gdb_string.h.
* i386-dicos-tdep.c: Use string.h, not gdb_string.h.
* i386-linux-nat.c: Use string.h, not gdb_string.h.
* i386-linux-tdep.c: Use string.h, not gdb_string.h.
* i386-nto-tdep.c: Use string.h, not gdb_string.h.
* i386-sol2-tdep.c: Use string.h, not gdb_string.h.
* i386-tdep.c: Use string.h, not gdb_string.h.
* i386bsd-tdep.c: Use string.h, not gdb_string.h.
* i386gnu-nat.c: Use string.h, not gdb_string.h.
* i386nbsd-tdep.c: Use string.h, not gdb_string.h.
* i386obsd-tdep.c: Use string.h, not gdb_string.h.
* i387-tdep.c: Use string.h, not gdb_string.h.
* ia64-libunwind-tdep.c: Use string.h, not gdb_string.h.
* ia64-linux-nat.c: Use string.h, not gdb_string.h.
* inf-child.c: Use string.h, not gdb_string.h.
* inf-ptrace.c: Use string.h, not gdb_string.h.
* inf-ttrace.c: Use string.h, not gdb_string.h.
* infcall.c: Use string.h, not gdb_string.h.
* infcmd.c: Use string.h, not gdb_string.h.
* inflow.c: Use string.h, not gdb_string.h.
* infrun.c: Use string.h, not gdb_string.h.
* interps.c: Use string.h, not gdb_string.h.
* iq2000-tdep.c: Use string.h, not gdb_string.h.
* irix5-nat.c: Use string.h, not gdb_string.h.
* jv-exp.y: Use string.h, not gdb_string.h.
* jv-lang.c: Use string.h, not gdb_string.h.
* jv-typeprint.c: Use string.h, not gdb_string.h.
* jv-valprint.c: Use string.h, not gdb_string.h.
* language.c: Use string.h, not gdb_string.h.
* linux-fork.c: Use string.h, not gdb_string.h.
* linux-nat.c: Use string.h, not gdb_string.h.
* lm32-tdep.c: Use string.h, not gdb_string.h.
* m2-exp.y: Use string.h, not gdb_string.h.
* m2-typeprint.c: Use string.h, not gdb_string.h.
* m32c-tdep.c: Use string.h, not gdb_string.h.
* m32r-linux-nat.c: Use string.h, not gdb_string.h.
* m32r-linux-tdep.c: Use string.h, not gdb_string.h.
* m32r-rom.c: Use string.h, not gdb_string.h.
* m32r-tdep.c: Use string.h, not gdb_string.h.
* m68hc11-tdep.c: Use string.h, not gdb_string.h.
* m68k-tdep.c: Use string.h, not gdb_string.h.
* m68kbsd-tdep.c: Use string.h, not gdb_string.h.
* m68klinux-nat.c: Use string.h, not gdb_string.h.
* m68klinux-tdep.c: Use string.h, not gdb_string.h.
* m88k-tdep.c: Use string.h, not gdb_string.h.
* macrocmd.c: Use string.h, not gdb_string.h.
* main.c: Use string.h, not gdb_string.h.
* mdebugread.c: Use string.h, not gdb_string.h.
* mem-break.c: Use string.h, not gdb_string.h.
* memattr.c: Use string.h, not gdb_string.h.
* memory-map.c: Use string.h, not gdb_string.h.
* mep-tdep.c: Use string.h, not gdb_string.h.
* mi/mi-cmd-break.c: Use string.h, not gdb_string.h.
* mi/mi-cmd-disas.c: Use string.h, not gdb_string.h.
* mi/mi-cmd-env.c: Use string.h, not gdb_string.h.
* mi/mi-cmd-stack.c: Use string.h, not gdb_string.h.
* mi/mi-cmd-var.c: Use string.h, not gdb_string.h.
* mi/mi-cmds.c: Use string.h, not gdb_string.h.
* mi/mi-console.c: Use string.h, not gdb_string.h.
* mi/mi-getopt.c: Use string.h, not gdb_string.h.
* mi/mi-interp.c: Use string.h, not gdb_string.h.
* mi/mi-main.c: Use string.h, not gdb_string.h.
* mi/mi-parse.c: Use string.h, not gdb_string.h.
* microblaze-rom.c: Use string.h, not gdb_string.h.
* microblaze-tdep.c: Use string.h, not gdb_string.h.
* mingw-hdep.c: Use string.h, not gdb_string.h.
* minidebug.c: Use string.h, not gdb_string.h.
* minsyms.c: Use string.h, not gdb_string.h.
* mips-irix-tdep.c: Use string.h, not gdb_string.h.
* mips-linux-tdep.c: Use string.h, not gdb_string.h.
* mips-tdep.c: Use string.h, not gdb_string.h.
* mips64obsd-tdep.c: Use string.h, not gdb_string.h.
* mipsnbsd-tdep.c: Use string.h, not gdb_string.h.
* mipsread.c: Use string.h, not gdb_string.h.
* mn10300-linux-tdep.c: Use string.h, not gdb_string.h.
* mn10300-tdep.c: Use string.h, not gdb_string.h.
* monitor.c: Use string.h, not gdb_string.h.
* moxie-tdep.c: Use string.h, not gdb_string.h.
* mt-tdep.c: Use string.h, not gdb_string.h.
* nbsd-tdep.c: Use string.h, not gdb_string.h.
* nios2-linux-tdep.c: Use string.h, not gdb_string.h.
* nto-procfs.c: Use string.h, not gdb_string.h.
* nto-tdep.c: Use string.h, not gdb_string.h.
* objc-lang.c: Use string.h, not gdb_string.h.
* objfiles.c: Use string.h, not gdb_string.h.
* opencl-lang.c: Use string.h, not gdb_string.h.
* osabi.c: Use string.h, not gdb_string.h.
* osdata.c: Use string.h, not gdb_string.h.
* p-exp.y: Use string.h, not gdb_string.h.
* p-lang.c: Use string.h, not gdb_string.h.
* p-typeprint.c: Use string.h, not gdb_string.h.
* parse.c: Use string.h, not gdb_string.h.
* posix-hdep.c: Use string.h, not gdb_string.h.
* ppc-linux-nat.c: Use string.h, not gdb_string.h.
* ppc-sysv-tdep.c: Use string.h, not gdb_string.h.
* ppcfbsd-tdep.c: Use string.h, not gdb_string.h.
* ppcnbsd-tdep.c: Use string.h, not gdb_string.h.
* ppcobsd-tdep.c: Use string.h, not gdb_string.h.
* printcmd.c: Use string.h, not gdb_string.h.
* procfs.c: Use string.h, not gdb_string.h.
* prologue-value.c: Use string.h, not gdb_string.h.
* python/py-auto-load.c: Use string.h, not gdb_string.h.
* python/py-gdb-readline.c: Use string.h, not gdb_string.h.
* ravenscar-thread.c: Use string.h, not gdb_string.h.
* regcache.c: Use string.h, not gdb_string.h.
* registry.c: Use string.h, not gdb_string.h.
* remote-fileio.c: Use string.h, not gdb_string.h.
* remote-m32r-sdi.c: Use string.h, not gdb_string.h.
* remote-mips.c: Use string.h, not gdb_string.h.
* remote-sim.c: Use string.h, not gdb_string.h.
* remote.c: Use string.h, not gdb_string.h.
* reverse.c: Use string.h, not gdb_string.h.
* rs6000-aix-tdep.c: Use string.h, not gdb_string.h.
* ser-base.c: Use string.h, not gdb_string.h.
* ser-go32.c: Use string.h, not gdb_string.h.
* ser-mingw.c: Use string.h, not gdb_string.h.
* ser-pipe.c: Use string.h, not gdb_string.h.
* ser-tcp.c: Use string.h, not gdb_string.h.
* ser-unix.c: Use string.h, not gdb_string.h.
* serial.c: Use string.h, not gdb_string.h.
* sh-tdep.c: Use string.h, not gdb_string.h.
* sh64-tdep.c: Use string.h, not gdb_string.h.
* shnbsd-tdep.c: Use string.h, not gdb_string.h.
* skip.c: Use string.h, not gdb_string.h.
* sol-thread.c: Use string.h, not gdb_string.h.
* solib-dsbt.c: Use string.h, not gdb_string.h.
* solib-frv.c: Use string.h, not gdb_string.h.
* solib-osf.c: Use string.h, not gdb_string.h.
* solib-spu.c: Use string.h, not gdb_string.h.
* solib-target.c: Use string.h, not gdb_string.h.
* solib.c: Use string.h, not gdb_string.h.
* somread.c: Use string.h, not gdb_string.h.
* source.c: Use string.h, not gdb_string.h.
* sparc-nat.c: Use string.h, not gdb_string.h.
* sparc-sol2-tdep.c: Use string.h, not gdb_string.h.
* sparc-tdep.c: Use string.h, not gdb_string.h.
* sparc64-tdep.c: Use string.h, not gdb_string.h.
* sparc64fbsd-tdep.c: Use string.h, not gdb_string.h.
* sparc64nbsd-tdep.c: Use string.h, not gdb_string.h.
* sparcnbsd-tdep.c: Use string.h, not gdb_string.h.
* spu-linux-nat.c: Use string.h, not gdb_string.h.
* spu-multiarch.c: Use string.h, not gdb_string.h.
* spu-tdep.c: Use string.h, not gdb_string.h.
* stabsread.c: Use string.h, not gdb_string.h.
* stack.c: Use string.h, not gdb_string.h.
* std-regs.c: Use string.h, not gdb_string.h.
* symfile.c: Use string.h, not gdb_string.h.
* symmisc.c: Use string.h, not gdb_string.h.
* symtab.c: Use string.h, not gdb_string.h.
* target.c: Use string.h, not gdb_string.h.
* thread.c: Use string.h, not gdb_string.h.
* tilegx-linux-nat.c: Use string.h, not gdb_string.h.
* tilegx-tdep.c: Use string.h, not gdb_string.h.
* top.c: Use string.h, not gdb_string.h.
* tracepoint.c: Use string.h, not gdb_string.h.
* tui/tui-command.c: Use string.h, not gdb_string.h.
* tui/tui-data.c: Use string.h, not gdb_string.h.
* tui/tui-disasm.c: Use string.h, not gdb_string.h.
* tui/tui-file.c: Use string.h, not gdb_string.h.
* tui/tui-layout.c: Use string.h, not gdb_string.h.
* tui/tui-out.c: Use string.h, not gdb_string.h.
* tui/tui-regs.c: Use string.h, not gdb_string.h.
* tui/tui-source.c: Use string.h, not gdb_string.h.
* tui/tui-stack.c: Use string.h, not gdb_string.h.
* tui/tui-win.c: Use string.h, not gdb_string.h.
* tui/tui-windata.c: Use string.h, not gdb_string.h.
* tui/tui-winsource.c: Use string.h, not gdb_string.h.
* typeprint.c: Use string.h, not gdb_string.h.
* ui-file.c: Use string.h, not gdb_string.h.
* ui-out.c: Use string.h, not gdb_string.h.
* user-regs.c: Use string.h, not gdb_string.h.
* utils.c: Use string.h, not gdb_string.h.
* v850-tdep.c: Use string.h, not gdb_string.h.
* valarith.c: Use string.h, not gdb_string.h.
* valops.c: Use string.h, not gdb_string.h.
* valprint.c: Use string.h, not gdb_string.h.
* value.c: Use string.h, not gdb_string.h.
* varobj.c: Use string.h, not gdb_string.h.
* vax-tdep.c: Use string.h, not gdb_string.h.
* vaxnbsd-tdep.c: Use string.h, not gdb_string.h.
* vaxobsd-tdep.c: Use string.h, not gdb_string.h.
* windows-nat.c: Use string.h, not gdb_string.h.
* xcoffread.c: Use string.h, not gdb_string.h.
* xml-support.c: Use string.h, not gdb_string.h.
* xstormy16-tdep.c: Use string.h, not gdb_string.h.
* xtensa-linux-nat.c: Use string.h, not gdb_string.h.
2013-11-06 15:14:23 +01:00
|
|
|
#include <string.h>
|
2011-02-21 19:13:17 +01:00
|
|
|
#include "value.h"
|
2011-02-27 21:57:16 +01:00
|
|
|
#include "gdb_assert.h"
|
2011-02-21 19:13:17 +01:00
|
|
|
|
|
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
/* *PP is a string denoting a number. Get the number of the. Advance
|
|
|
|
*PP after the string and any trailing whitespace.
|
|
|
|
|
2011-02-27 21:57:16 +01:00
|
|
|
Currently the string can either be a number, or "$" followed by the
|
|
|
|
name of a convenience variable, or ("$" or "$$") followed by digits.
|
2011-02-21 19:13:17 +01:00
|
|
|
|
|
|
|
TRAILER is a character which can be found after the number; most
|
|
|
|
commonly this is `-'. If you don't want a trailer, use \0. */
|
|
|
|
|
|
|
|
static int
|
|
|
|
get_number_trailer (char **pp, int trailer)
|
|
|
|
{
|
|
|
|
int retval = 0; /* default */
|
|
|
|
char *p = *pp;
|
|
|
|
|
|
|
|
if (*p == '$')
|
|
|
|
{
|
2011-02-27 21:57:16 +01:00
|
|
|
struct value *val = value_from_history_ref (p, &p);
|
2011-02-21 19:13:17 +01:00
|
|
|
|
2011-02-27 21:57:16 +01:00
|
|
|
if (val) /* Value history reference */
|
2011-02-21 19:13:17 +01:00
|
|
|
{
|
2011-02-27 21:57:16 +01:00
|
|
|
if (TYPE_CODE (value_type (val)) == TYPE_CODE_INT)
|
|
|
|
retval = value_as_long (val);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printf_filtered (_("History value must have integer type."));
|
|
|
|
retval = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else /* Convenience variable */
|
|
|
|
{
|
|
|
|
/* Internal variable. Make a copy of the name, so we can
|
|
|
|
null-terminate it to pass to lookup_internalvar(). */
|
|
|
|
char *varname;
|
|
|
|
char *start = ++p;
|
|
|
|
LONGEST val;
|
|
|
|
|
|
|
|
while (isalnum (*p) || *p == '_')
|
|
|
|
p++;
|
|
|
|
varname = (char *) alloca (p - start + 1);
|
|
|
|
strncpy (varname, start, p - start);
|
|
|
|
varname[p - start] = '\0';
|
|
|
|
if (get_internalvar_integer (lookup_internalvar (varname), &val))
|
|
|
|
retval = (int) val;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printf_filtered (_("Convenience variable must "
|
|
|
|
"have integer value.\n"));
|
|
|
|
retval = 0;
|
|
|
|
}
|
2011-02-21 19:13:17 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (*p == '-')
|
|
|
|
++p;
|
|
|
|
while (*p >= '0' && *p <= '9')
|
|
|
|
++p;
|
|
|
|
if (p == *pp)
|
|
|
|
/* There is no number here. (e.g. "cond a == b"). */
|
|
|
|
{
|
|
|
|
/* Skip non-numeric token. */
|
|
|
|
while (*p && !isspace((int) *p))
|
|
|
|
++p;
|
|
|
|
/* Return zero, which caller must interpret as error. */
|
|
|
|
retval = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
retval = atoi (*pp);
|
|
|
|
}
|
|
|
|
if (!(isspace (*p) || *p == '\0' || *p == trailer))
|
|
|
|
{
|
|
|
|
/* Trailing junk: return 0 and let caller print error msg. */
|
|
|
|
while (!(isspace (*p) || *p == '\0' || *p == trailer))
|
|
|
|
++p;
|
|
|
|
retval = 0;
|
|
|
|
}
|
|
|
|
p = skip_spaces (p);
|
|
|
|
*pp = p;
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* See documentation in cli-utils.h. */
|
|
|
|
|
|
|
|
int
|
|
|
|
get_number (char **pp)
|
|
|
|
{
|
|
|
|
return get_number_trailer (pp, '\0');
|
|
|
|
}
|
|
|
|
|
|
|
|
/* See documentation in cli-utils.h. */
|
|
|
|
|
2011-03-10 19:33:59 +01:00
|
|
|
void
|
|
|
|
init_number_or_range (struct get_number_or_range_state *state,
|
|
|
|
char *string)
|
2011-02-21 19:13:17 +01:00
|
|
|
{
|
2011-03-10 19:33:59 +01:00
|
|
|
memset (state, 0, sizeof (*state));
|
|
|
|
state->string = string;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* See documentation in cli-utils.h. */
|
2011-02-21 19:13:17 +01:00
|
|
|
|
2011-03-10 19:33:59 +01:00
|
|
|
int
|
|
|
|
get_number_or_range (struct get_number_or_range_state *state)
|
|
|
|
{
|
|
|
|
if (*state->string != '-')
|
2011-02-21 19:13:17 +01:00
|
|
|
{
|
2011-03-10 19:33:59 +01:00
|
|
|
/* Default case: state->string is pointing either to a solo
|
|
|
|
number, or to the first number of a range. */
|
|
|
|
state->last_retval = get_number_trailer (&state->string, '-');
|
|
|
|
if (*state->string == '-')
|
2011-02-21 19:13:17 +01:00
|
|
|
{
|
|
|
|
char **temp;
|
|
|
|
|
|
|
|
/* This is the start of a range (<number1> - <number2>).
|
|
|
|
Skip the '-', parse and remember the second number,
|
|
|
|
and also remember the end of the final token. */
|
|
|
|
|
2011-03-10 19:33:59 +01:00
|
|
|
temp = &state->end_ptr;
|
|
|
|
state->end_ptr = skip_spaces (state->string + 1);
|
|
|
|
state->end_value = get_number (temp);
|
|
|
|
if (state->end_value < state->last_retval)
|
2011-02-21 19:13:17 +01:00
|
|
|
{
|
|
|
|
error (_("inverted range"));
|
|
|
|
}
|
2011-03-10 19:33:59 +01:00
|
|
|
else if (state->end_value == state->last_retval)
|
2011-02-21 19:13:17 +01:00
|
|
|
{
|
|
|
|
/* Degenerate range (number1 == number2). Advance the
|
|
|
|
token pointer so that the range will be treated as a
|
|
|
|
single number. */
|
2011-03-10 19:33:59 +01:00
|
|
|
state->string = state->end_ptr;
|
2011-02-21 19:13:17 +01:00
|
|
|
}
|
|
|
|
else
|
2011-03-10 19:33:59 +01:00
|
|
|
state->in_range = 1;
|
2011-02-21 19:13:17 +01:00
|
|
|
}
|
|
|
|
}
|
2011-03-10 19:33:59 +01:00
|
|
|
else if (! state->in_range)
|
2011-02-21 19:13:17 +01:00
|
|
|
error (_("negative value"));
|
|
|
|
else
|
|
|
|
{
|
2011-03-10 19:33:59 +01:00
|
|
|
/* state->string points to the '-' that betokens a range. All
|
2011-02-21 19:13:17 +01:00
|
|
|
number-parsing has already been done. Return the next
|
|
|
|
integer value (one greater than the saved previous value).
|
2011-03-10 19:33:59 +01:00
|
|
|
Do not advance the token pointer until the end of range
|
2011-02-21 19:13:17 +01:00
|
|
|
is reached. */
|
|
|
|
|
2011-03-10 19:33:59 +01:00
|
|
|
if (++state->last_retval == state->end_value)
|
2011-02-21 19:13:17 +01:00
|
|
|
{
|
|
|
|
/* End of range reached; advance token pointer. */
|
2011-03-10 19:33:59 +01:00
|
|
|
state->string = state->end_ptr;
|
|
|
|
state->in_range = 0;
|
2011-02-21 19:13:17 +01:00
|
|
|
}
|
|
|
|
}
|
2011-03-10 19:33:59 +01:00
|
|
|
state->finished = *state->string == '\0';
|
|
|
|
return state->last_retval;
|
2011-02-21 19:13:17 +01:00
|
|
|
}
|
|
|
|
|
2011-02-22 00:40:47 +01:00
|
|
|
/* Accept a number and a string-form list of numbers such as is
|
|
|
|
accepted by get_number_or_range. Return TRUE if the number is
|
|
|
|
in the list.
|
|
|
|
|
|
|
|
By definition, an empty list includes all numbers. This is to
|
|
|
|
be interpreted as typing a command such as "delete break" with
|
|
|
|
no arguments. */
|
|
|
|
|
|
|
|
int
|
|
|
|
number_is_in_list (char *list, int number)
|
|
|
|
{
|
2011-03-10 19:33:59 +01:00
|
|
|
struct get_number_or_range_state state;
|
|
|
|
|
2011-02-22 00:40:47 +01:00
|
|
|
if (list == NULL || *list == '\0')
|
|
|
|
return 1;
|
|
|
|
|
2011-03-10 19:33:59 +01:00
|
|
|
init_number_or_range (&state, list);
|
|
|
|
while (!state.finished)
|
2011-02-22 19:45:05 +01:00
|
|
|
{
|
2011-03-10 19:33:59 +01:00
|
|
|
int gotnum = get_number_or_range (&state);
|
2011-02-22 00:40:47 +01:00
|
|
|
|
2011-02-22 19:45:05 +01:00
|
|
|
if (gotnum == 0)
|
|
|
|
error (_("Args must be numbers or '$' variables."));
|
|
|
|
if (gotnum == number)
|
|
|
|
return 1;
|
|
|
|
}
|
2011-02-22 00:40:47 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2011-02-21 19:13:17 +01:00
|
|
|
/* See documentation in cli-utils.h. */
|
|
|
|
|
|
|
|
char *
|
|
|
|
skip_spaces (char *chp)
|
|
|
|
{
|
|
|
|
if (chp == NULL)
|
|
|
|
return NULL;
|
|
|
|
while (*chp && isspace (*chp))
|
|
|
|
chp++;
|
|
|
|
return chp;
|
|
|
|
}
|
|
|
|
|
2012-04-27 22:47:57 +02:00
|
|
|
/* A const-correct version of the above. */
|
|
|
|
|
|
|
|
const char *
|
|
|
|
skip_spaces_const (const char *chp)
|
|
|
|
{
|
|
|
|
if (chp == NULL)
|
|
|
|
return NULL;
|
|
|
|
while (*chp && isspace (*chp))
|
|
|
|
chp++;
|
|
|
|
return chp;
|
|
|
|
}
|
|
|
|
|
2011-02-21 19:13:17 +01:00
|
|
|
/* See documentation in cli-utils.h. */
|
|
|
|
|
2013-03-12 18:39:45 +01:00
|
|
|
const char *
|
|
|
|
skip_to_space_const (const char *chp)
|
2011-02-21 19:13:17 +01:00
|
|
|
{
|
|
|
|
if (chp == NULL)
|
|
|
|
return NULL;
|
|
|
|
while (*chp && !isspace (*chp))
|
|
|
|
chp++;
|
|
|
|
return chp;
|
|
|
|
}
|
2011-03-16 22:12:12 +01:00
|
|
|
|
|
|
|
/* See documentation in cli-utils.h. */
|
|
|
|
|
|
|
|
char *
|
|
|
|
remove_trailing_whitespace (const char *start, char *s)
|
|
|
|
{
|
|
|
|
while (s > start && isspace (*(s - 1)))
|
|
|
|
--s;
|
|
|
|
|
|
|
|
return s;
|
|
|
|
}
|
2012-04-27 22:47:57 +02:00
|
|
|
|
|
|
|
/* See documentation in cli-utils.h. */
|
|
|
|
|
|
|
|
char *
|
2013-11-11 06:19:32 +01:00
|
|
|
extract_arg_const (const char **arg)
|
2012-04-27 22:47:57 +02:00
|
|
|
{
|
2013-11-11 06:19:32 +01:00
|
|
|
const char *result;
|
2012-04-27 22:47:57 +02:00
|
|
|
|
|
|
|
if (!*arg)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
/* Find the start of the argument. */
|
2013-11-11 06:19:32 +01:00
|
|
|
*arg = skip_spaces_const (*arg);
|
2012-04-27 22:47:57 +02:00
|
|
|
if (!**arg)
|
|
|
|
return NULL;
|
|
|
|
result = *arg;
|
|
|
|
|
|
|
|
/* Find the end of the argument. */
|
2013-11-11 06:19:32 +01:00
|
|
|
*arg = skip_to_space_const (*arg + 1);
|
2012-04-27 22:47:57 +02:00
|
|
|
|
|
|
|
if (result == *arg)
|
|
|
|
return NULL;
|
|
|
|
|
2013-11-11 06:19:32 +01:00
|
|
|
return savestring (result, *arg - result);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* See documentation in cli-utils.h. */
|
|
|
|
|
|
|
|
char *
|
|
|
|
extract_arg (char **arg)
|
|
|
|
{
|
|
|
|
const char *arg_const = *arg;
|
|
|
|
char *result;
|
2012-04-27 22:47:57 +02:00
|
|
|
|
2013-11-11 06:19:32 +01:00
|
|
|
result = extract_arg_const (&arg_const);
|
|
|
|
*arg += arg_const - *arg;
|
|
|
|
return result;
|
2012-04-27 22:47:57 +02:00
|
|
|
}
|
2012-07-05 03:00:43 +02:00
|
|
|
|
|
|
|
/* See documentation in cli-utils.h. */
|
|
|
|
|
|
|
|
int
|
|
|
|
check_for_argument (char **str, char *arg, int arg_len)
|
|
|
|
{
|
|
|
|
if (strncmp (*str, arg, arg_len) == 0
|
|
|
|
&& ((*str)[arg_len] == '\0' || isspace ((*str)[arg_len])))
|
|
|
|
{
|
|
|
|
*str += arg_len;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|