changeset 44220:69735f5e2a07

(add_declarator, skip_initializer): New functions. (declaration): Use them.
author Gerd Moellmann <gerd@gnu.org>
date Fri, 29 Mar 2002 11:18:56 +0000
parents dfaa607f640f
children b13eadb97179
files lib-src/ebrowse.c
diffstat 1 files changed, 81 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/lib-src/ebrowse.c	Fri Mar 29 00:04:30 2002 +0000
+++ b/lib-src/ebrowse.c	Fri Mar 29 11:18:56 2002 +0000
@@ -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 @@
     }
 }
 
+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 @@
     }
 }
 
+/* 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 @@
 	    }
 
         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 @@
         }
     }
 
-  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);
 }