/* Support for GDB maintenance commands.
- Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001
+ Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
Written by Fred Fish at Cygnus Support.
#include "objfiles.h"
#include "value.h"
+#include "cli/cli-decode.h"
+
extern void _initialize_maint_cmds (void);
static void maintenance_command (char *, int);
help_list (maintenanceinfolist, "maintenance info ", -1, gdb_stdout);
}
+/* Mini tokenizing lexer for 'maint info sections' command. */
+
+static int
+match_substring (const char *string, const char *substr)
+{
+ int substr_len = strlen(substr);
+ const char *tok;
+
+ while ((tok = strstr (string, substr)) != NULL)
+ {
+ /* Got a partial match. Is it a whole word? */
+ if (tok == string
+ || tok[-1] == ' '
+ || tok[-1] == '\t')
+ {
+ /* Token is delimited at the front... */
+ if (tok[substr_len] == ' '
+ || tok[substr_len] == '\t'
+ || tok[substr_len] == '\0')
+ {
+ /* Token is delimited at the rear. Got a whole-word match. */
+ return 1;
+ }
+ }
+ /* Token didn't match as a whole word. Advance and try again. */
+ string = tok + 1;
+ }
+ return 0;
+}
+
static int
match_bfd_flags (char *string, flagword flags)
{
if (flags & SEC_ALLOC)
- if (strstr (string, "ALLOC"))
+ if (match_substring (string, "ALLOC"))
return 1;
if (flags & SEC_LOAD)
- if (strstr (string, "LOAD"))
+ if (match_substring (string, "LOAD"))
return 1;
if (flags & SEC_RELOC)
- if (strstr (string, "RELOC"))
+ if (match_substring (string, "RELOC"))
return 1;
if (flags & SEC_READONLY)
- if (strstr (string, "READONLY"))
+ if (match_substring (string, "READONLY"))
return 1;
if (flags & SEC_CODE)
- if (strstr (string, "CODE"))
+ if (match_substring (string, "CODE"))
return 1;
if (flags & SEC_DATA)
- if (strstr (string, "DATA"))
+ if (match_substring (string, "DATA"))
return 1;
if (flags & SEC_ROM)
- if (strstr (string, "ROM"))
+ if (match_substring (string, "ROM"))
return 1;
if (flags & SEC_CONSTRUCTOR)
- if (strstr (string, "CONSTRUCTOR"))
+ if (match_substring (string, "CONSTRUCTOR"))
return 1;
if (flags & SEC_HAS_CONTENTS)
- if (strstr (string, "HAS_CONTENTS"))
+ if (match_substring (string, "HAS_CONTENTS"))
return 1;
if (flags & SEC_NEVER_LOAD)
- if (strstr (string, "NEVER_LOAD"))
+ if (match_substring (string, "NEVER_LOAD"))
return 1;
if (flags & SEC_COFF_SHARED_LIBRARY)
- if (strstr (string, "COFF_SHARED_LIBRARY"))
+ if (match_substring (string, "COFF_SHARED_LIBRARY"))
return 1;
if (flags & SEC_IS_COMMON)
- if (strstr (string, "IS_COMMON"))
+ if (match_substring (string, "IS_COMMON"))
return 1;
return 0;
}
static void
-print_section_info (const char *name, flagword flags,
- CORE_ADDR addr, CORE_ADDR endaddr,
- unsigned long filepos)
+maint_print_section_info (const char *name, flagword flags,
+ CORE_ADDR addr, CORE_ADDR endaddr,
+ unsigned long filepos)
{
/* FIXME-32x64: Need print_address_numeric with field width. */
printf_filtered (" 0x%s", paddr (addr));
printf_filtered ("->0x%s", paddr (endaddr));
- printf_filtered (" at 0x%s",
+ printf_filtered (" at %s",
local_hex_string_custom ((unsigned long) filepos, "08l"));
printf_filtered (": %s", name);
print_bfd_flags (flags);
flagword flags = bfd_get_section_flags (abfd, asect);
const char *name = bfd_section_name (abfd, asect);
- if (arg == NULL || *((char *) arg) == '\0' ||
- strstr ((char *) arg, name) ||
- match_bfd_flags ((char *) arg, flags))
+ if (arg == NULL || *((char *) arg) == '\0'
+ || match_substring ((char *) arg, name)
+ || match_bfd_flags ((char *) arg, flags))
{
CORE_ADDR addr, endaddr;
addr = bfd_section_vma (abfd, asect);
endaddr = addr + bfd_section_size (abfd, asect);
- print_section_info (name, flags, addr, endaddr, asect->filepos);
+ maint_print_section_info (name, flags, addr, endaddr, asect->filepos);
}
}
flagword flags = bfd_get_section_flags (abfd, asect->the_bfd_section);
const char *name = bfd_section_name (abfd, asect->the_bfd_section);
- if (string == NULL || *string == '\0' ||
- strstr (string, name) ||
- match_bfd_flags (string, flags))
+ if (string == NULL || *string == '\0'
+ || match_substring (string, name)
+ || match_bfd_flags (string, flags))
{
- print_section_info (name, flags, asect->addr, asect->endaddr,
+ maint_print_section_info (name, flags, asect->addr, asect->endaddr,
asect->the_bfd_section->filepos);
}
}
printf_filtered (" `%s', ", bfd_get_filename (exec_bfd));
wrap_here (" ");
printf_filtered ("file type %s.\n", bfd_get_target (exec_bfd));
- if (arg && *arg && strstr (arg, "ALLOBJ"))
+ if (arg && *arg && match_substring (arg, "ALLOBJ"))
{
struct objfile *ofile;
struct obj_section *osect;
add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
add_cmd ("sections", class_maintenance, maintenance_info_sections,
- "List the BFD sections of the exec and core files. \n
+ "List the BFD sections of the exec and core files. \n\
Arguments may be any combination of:\n\
[one or more section names]\n\
ALLOC LOAD RELOC READONLY CODE DATA ROM CONSTRUCTOR\n\
"Set internal profiling.\n\
When enabled GDB is profiled.",
&maintenance_set_cmdlist);
- tmpcmd->function.sfunc = maintenance_set_profile_cmd;
+ set_cmd_sfunc (tmpcmd, maintenance_set_profile_cmd);
add_show_from_set (tmpcmd, &maintenance_show_cmdlist);
#endif
}