Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Michael Snyder <msnyder@redhat.com>
To: Pierre Muller <muller@cerbere.u-strasbg.fr>
Cc: Michael Snyder <msnyder@cygnus.com>, gdb-patches@sources.redhat.com
Subject: Re: [PATCH] Further extend "maint info sections" cmd with ALLOBJ
Date: Fri, 21 Dec 2001 09:36:00 -0000	[thread overview]
Message-ID: <3C2371D0.6A53@redhat.com> (raw)
In-Reply-To: <4.2.0.58.20011221115947.01848210@ics.u-strasbg.fr>

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;


  parent reply	other threads:[~2001-12-21 17:36 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-12-20 14:35 Michael Snyder
2001-12-21  2:55 ` Pierre Muller
2001-12-21  4:32   ` Pierre Muller
2001-12-21  8:58     ` Michael Snyder
2001-12-21  9:36     ` Michael Snyder [this message]
2001-12-21  8:51   ` Michael Snyder

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3C2371D0.6A53@redhat.com \
    --to=msnyder@redhat.com \
    --cc=gdb-patches@sources.redhat.com \
    --cc=msnyder@cygnus.com \
    --cc=muller@cerbere.u-strasbg.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox