# HG changeset patch # User Gerd Moellmann # Date 1017400736 0 # Node ID 69735f5e2a07e9d9daad7c5463ba321a73d4a865 # Parent dfaa607f640f8a30d30343ba0c27d204a3f5bf69 (add_declarator, skip_initializer): New functions. (declaration): Use them. diff -r dfaa607f640f -r 69735f5e2a07 lib-src/ebrowse.c --- 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); }