From fa8bc89d0d3ad6df499de4f0b0bb28dca95e166a Mon Sep 17 00:00:00 2001 From: Gerd Moellmann Date: Fri, 29 Mar 2002 11:20:40 +0000 Subject: [PATCH] (add_declarator, skip_initializer): New functions. (declaration): Use them. --- lib-src/ChangeLog | 5 ++ lib-src/ebrowse.c | 119 +++++++++++++++++++++++++++++++--------------- 2 files changed, 86 insertions(+), 38 deletions(-) diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index 05bbbbe559..baa43bba37 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -1,3 +1,8 @@ +2002-03-29 Gerd Moellmann + + * ebrowse.c (add_declarator, skip_initializer): New functions. + (declaration): Use them. + 2002-03-28 Jason Rumney * makefile.w32-in (lisp): Move backquote.elc into emacs-lisp. diff --git a/lib-src/ebrowse.c b/lib-src/ebrowse.c index f54e18ebed..47ab0d1c9e 100644 --- a/lib-src/ebrowse.c +++ b/lib-src/ebrowse.c @@ -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); } -- 2.20.1