From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21890 invoked by alias); 21 Dec 2001 17:36:10 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 21737 invoked from network); 21 Dec 2001 17:34:49 -0000 Received: from unknown (HELO cygnus.com) (205.180.230.5) by sources.redhat.com with SMTP; 21 Dec 2001 17:34:49 -0000 Received: from telocity.telocity.com (taarna.cygnus.com [205.180.230.102]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with SMTP id JAA00284; Fri, 21 Dec 2001 09:34:42 -0800 (PST) Message-ID: <3C2371D0.6A53@redhat.com> Date: Fri, 21 Dec 2001 09:36:00 -0000 From: Michael Snyder X-Mailer: Mozilla 3.04 (Win95; I) MIME-Version: 1.0 To: Pierre Muller CC: Michael Snyder , gdb-patches@sources.redhat.com Subject: Re: [PATCH] Further extend "maint info sections" cmd with ALLOBJ References: <200112202230.fBKMUAO31066@reddwarf.cygnus.com> <4.2.0.58.20011221115947.01848210@ics.u-strasbg.fr> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2001-12/txt/msg00563.txt.bz2 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 * 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;