This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [PATCH] Further extend "maint info sections" cmd with ALLOBJ
Pierre Muller wrote:
> The problem might be quite general :
>
> maint info sect NEVER_LOAD
> gives the same output than
> maint info sect HAS_CONTENT
>
> Debugging a little more lead me to find out that
> the reason of that bug is simply that
> NEVER_LOAD contains LOAD,
> ans strstr function returns thus true for strstr(string, "LOAD")
> if string is "NEVER_LOAD"
OK, I've added a slightly more intelligent lexer/tokenizer.
Patch attached below (or just update). Please try it now.
2001-12-21 Michael Snyder <msnyder@redhat.com>
* maint.c (match_substring): New function. Tokenizer for
'maintenance info sections' command arguments.
(match_bfd_flag): Use match_substring.
(print_bfd_section_info): Use match_substring.
(print_objfile_section_info): Use match_substring.
(maintenance_info_sections): Use match_substring.
Index: maint.c
===================================================================
RCS file: /cvs/src/src/gdb/maint.c,v
retrieving revision 1.18
diff -p -r1.18 maint.c
*** maint.c 2001/12/20 22:31:24 1.18
--- maint.c 2001/12/21 17:25:24
*************** maintenance_info_command (char *arg, int
*** 186,229 ****
help_list (maintenanceinfolist, "maintenance info ", -1,
gdb_stdout);
}
static int
match_bfd_flags (char *string, flagword flags)
{
if (flags & SEC_ALLOC)
! if (strstr (string, "ALLOC"))
return 1;
if (flags & SEC_LOAD)
! if (strstr (string, "LOAD"))
return 1;
if (flags & SEC_RELOC)
! if (strstr (string, "RELOC"))
return 1;
if (flags & SEC_READONLY)
! if (strstr (string, "READONLY"))
return 1;
if (flags & SEC_CODE)
! if (strstr (string, "CODE"))
return 1;
if (flags & SEC_DATA)
! if (strstr (string, "DATA"))
return 1;
if (flags & SEC_ROM)
! if (strstr (string, "ROM"))
return 1;
if (flags & SEC_CONSTRUCTOR)
! if (strstr (string, "CONSTRUCTOR"))
return 1;
if (flags & SEC_HAS_CONTENTS)
! if (strstr (string, "HAS_CONTENTS"))
return 1;
if (flags & SEC_NEVER_LOAD)
! if (strstr (string, "NEVER_LOAD"))
return 1;
if (flags & SEC_COFF_SHARED_LIBRARY)
! if (strstr (string, "COFF_SHARED_LIBRARY"))
return 1;
if (flags & SEC_IS_COMMON)
! if (strstr (string, "IS_COMMON"))
return 1;
return 0;
--- 186,259 ----
help_list (maintenanceinfolist, "maintenance info ", -1,
gdb_stdout);
}
+ /* Mini tokenizing lexer for 'maint info sections' command. */
+
+ static int
+ match_substring (char *string, char *substr)
+ {
+ int substr_len = strlen(substr);
+ 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 (match_substring (string, "ALLOC"))
return 1;
if (flags & SEC_LOAD)
! if (match_substring (string, "LOAD"))
return 1;
if (flags & SEC_RELOC)
! if (match_substring (string, "RELOC"))
return 1;
if (flags & SEC_READONLY)
! if (match_substring (string, "READONLY"))
return 1;
if (flags & SEC_CODE)
! if (match_substring (string, "CODE"))
return 1;
if (flags & SEC_DATA)
! if (match_substring (string, "DATA"))
return 1;
if (flags & SEC_ROM)
! if (match_substring (string, "ROM"))
return 1;
if (flags & SEC_CONSTRUCTOR)
! if (match_substring (string, "CONSTRUCTOR"))
return 1;
if (flags & SEC_HAS_CONTENTS)
! if (match_substring (string, "HAS_CONTENTS"))
return 1;
if (flags & SEC_NEVER_LOAD)
! if (match_substring (string, "NEVER_LOAD"))
return 1;
if (flags & SEC_COFF_SHARED_LIBRARY)
! if (match_substring (string, "COFF_SHARED_LIBRARY"))
return 1;
if (flags & SEC_IS_COMMON)
! if (match_substring (string, "IS_COMMON"))
return 1;
return 0;
*************** print_bfd_section_info (bfd *abfd,
*** 282,288 ****
const char *name = bfd_section_name (abfd, asect);
if (arg == NULL || *((char *) arg) == '\0' ||
! strstr ((char *) arg, name) ||
match_bfd_flags ((char *) arg, flags))
{
CORE_ADDR addr, endaddr;
--- 312,318 ----
const char *name = bfd_section_name (abfd, asect);
if (arg == NULL || *((char *) arg) == '\0' ||
! match_substring ((char *) arg, name) ||
match_bfd_flags ((char *) arg, flags))
{
CORE_ADDR addr, endaddr;
*************** print_objfile_section_info (bfd *abfd,
*** 302,308 ****
const char *name = bfd_section_name (abfd, asect->the_bfd_section);
if (string == NULL || *string == '\0' ||
! strstr (string, name) ||
match_bfd_flags (string, flags))
{
print_section_info (name, flags, asect->addr, asect->endaddr,
--- 332,338 ----
const char *name = bfd_section_name (abfd, asect->the_bfd_section);
if (string == NULL || *string == '\0' ||
! match_substring (string, name) ||
match_bfd_flags (string, flags))
{
print_section_info (name, flags, asect->addr, asect->endaddr,
*************** maintenance_info_sections (char *arg, in
*** 320,326 ****
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"))
{
struct objfile *ofile;
struct obj_section *osect;
--- 350,356 ----
printf_filtered (" `%s', ", bfd_get_filename (exec_bfd));
wrap_here (" ");
printf_filtered ("file type %s.\n", bfd_get_target (exec_bfd));
! if (arg && *arg && match_substring (arg, "ALLOBJ"))
{
struct objfile *ofile;
struct obj_section *osect;