diff options
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/maint.c | 60 |
2 files changed, 54 insertions, 15 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d7e3441..a3bbbdc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2001-12-21 Michael Snyder <msnyder@redhat.com> + + * maint.c (match_substring): New function. Tokenizer for + maint 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. + 2001-12-21 Orjan Friberg <orjanf@axis.com> * configure.tgt: Delete CRIS from multi-arch targets. diff --git a/gdb/maint.c b/gdb/maint.c index 0b58fd4..3e1b63f 100644 --- a/gdb/maint.c +++ b/gdb/maint.c @@ -186,44 +186,74 @@ maintenance_info_command (char *arg, int from_tty) 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 (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; @@ -282,7 +312,7 @@ print_bfd_section_info (bfd *abfd, const char *name = bfd_section_name (abfd, asect); if (arg == NULL || *((char *) arg) == '\0' || - strstr ((char *) arg, name) || + match_substring ((char *) arg, name) || match_bfd_flags ((char *) arg, flags)) { CORE_ADDR addr, endaddr; @@ -302,7 +332,7 @@ print_objfile_section_info (bfd *abfd, const char *name = bfd_section_name (abfd, asect->the_bfd_section); if (string == NULL || *string == '\0' || - strstr (string, name) || + match_substring (string, name) || match_bfd_flags (string, flags)) { print_section_info (name, flags, asect->addr, asect->endaddr, @@ -320,7 +350,7 @@ maintenance_info_sections (char *arg, int from_tty) 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; |