(add_declarator, skip_initializer): New functions.
authorGerd Moellmann <gerd@gnu.org>
Fri, 29 Mar 2002 11:20:40 +0000 (11:20 +0000)
committerGerd Moellmann <gerd@gnu.org>
Fri, 29 Mar 2002 11:20:40 +0000 (11:20 +0000)
(declaration): Use them.

lib-src/ChangeLog
lib-src/ebrowse.c

index 05bbbbe..baa43bb 100644 (file)
@@ -1,3 +1,8 @@
+2002-03-29  Gerd Moellmann  <gerd@gnu.org>
+
+       * ebrowse.c (add_declarator, skip_initializer): New functions.
+       (declaration): Use them.
+
 2002-03-28  Jason Rumney  <jasonr@gnu.org>
 
        * makefile.w32-in (lisp): Move backquote.elc into emacs-lisp.
index f54e18e..47ab0d1 100644 (file)
@@ -1,7 +1,7 @@
 /* ebrowse.c --- parsing files for the ebrowse C++ browser
 
    Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99,
-                 2000, 2001   Free Software Foundation Inc.
+                 2000, 2001, 2002   Free Software Foundation Inc.
 
    This file is part of GNU Emacs.
 
@@ -2423,6 +2423,30 @@ skip_matching ()
     }
 }
 
+int
+skip_initializer ()
+{
+  for (;;)
+    {
+      switch (LA1)
+       {
+       case ';':
+       case ',':
+       case YYEOF:
+         return;
+
+       case '{':
+       case '[':
+       case '(':
+         skip_matching ();
+         break;
+
+       default:
+         MATCH ();
+         break;
+       }
+    }
+}
 
 /* Build qualified namespace alias (A::B::c) and return it. */
 
@@ -3205,6 +3229,54 @@ class_definition (containing, tag, flags, nested)
     }
 }
 
+/* Add to class *CLS information for the declaration of variable or
+   type *ID.  If *CLS is null, this means a global declaration.  SC is
+   the storage class of *ID.  FLAGS is a bit set giving additional
+   information about the member (see the F_* defines).  */
+
+void
+add_declarator (cls, id, flags, sc)
+     struct sym **cls;
+     char **id;
+     int flags, sc;
+{
+  if (LOOKING_AT2 (';', ','))
+    {
+      /* The end of a member variable or of an access declaration
+         `X::f'.  To distinguish between them we have to know whether
+         type information has been seen.  */
+      if (*id)
+        {
+          char *regexp = matching_regexp ();
+          int pos = BUFFER_POS ();
+
+          if (cls)
+           add_member_defn (cls, *id, regexp, pos, 0, 1, SC_UNKNOWN, flags);
+          else
+            add_global_defn (*id, regexp, pos, 0, 1, sc, flags);
+        }
+
+      MATCH ();
+      print_info ();
+    }
+  else if (LOOKING_AT ('{'))
+    {
+      if (sc == SC_TYPE && *id)
+        {
+          /* A named enumeration.  */
+          char *regexp = matching_regexp ();
+          int pos = BUFFER_POS ();
+          add_global_defn (*id, regexp, pos, 0, 1, sc, flags);
+        }
+
+      skip_matching ();
+      print_info ();
+    }
+
+  xfree (*id);
+  *id = NULL;
+  *cls = NULL;
+}
 
 /* Parse a declaration.  */
 
@@ -3259,11 +3331,15 @@ declaration (flags)
            }
 
         case '=':
-          /* Assumed to be the start of an initialization in this context.
-             Skip over everything up to ';'.  */
-          skip_to (';');
+          /* Assumed to be the start of an initialization in this
+            context.  */
+         skip_initializer ();
           break;
 
+       case ',':
+         add_declarator (&cls, &id, flags, sc);
+         break;
+
         case OPERATOR:
          {
            char *s = operator_name (&sc);
@@ -3350,40 +3426,7 @@ declaration (flags)
         }
     }
 
-  if (LOOKING_AT (';'))
-    {
-      /* The end of a member variable or of an access declaration
-         `X::f'.  To distinguish between them we have to know whether
-         type information has been seen.  */
-      if (id)
-        {
-          char *regexp = matching_regexp ();
-          int pos = BUFFER_POS ();
-
-          if (cls)
-           add_member_defn (cls, id, regexp, pos, 0, 1, SC_UNKNOWN, flags);
-          else
-            add_global_defn (id, regexp, pos, 0, 1, sc, flags);
-        }
-
-      MATCH ();
-      print_info ();
-    }
-  else if (LOOKING_AT ('{'))
-    {
-      if (sc == SC_TYPE && id)
-        {
-          /* A named enumeration.  */
-          regexp = matching_regexp ();
-          pos = BUFFER_POS ();
-          add_global_defn (id, regexp, pos, 0, 1, sc, flags);
-        }
-
-      skip_matching ();
-      print_info ();
-    }
-
-  xfree (id);
+  add_declarator (&cls, &id, flags, sc);
 }