annotate lib-src/ebrowse.c @ 66573:e65b759c6906

Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-630 Merge from gnus--rel--5.10 Patches applied: * gnus--rel--5.10 (patch 149-151) - Merge from emacs--cvs-trunk--0 - Update from CVS 2005-10-27 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/flow-fill.el (fill-flowed-encode-tests): Restore trailing whitespace removed in revision 7.8. Use concatenated string to protect trailing whitespace. 2005-10-27 Jouni K Seppanen <jks@iki.fi> (tiny change) * lisp/gnus/nnimap.el (nnimap-search-uids-not-since-is-evil): Add variable. (nnimap-request-expire-articles): Use it to avoid sending 'UID SEARCH UID ... NOT SINCE' queries, for inefficient servers like Courier IMAP ("some version from 2004"). Mostly based on similar code in the same function. 2005-10-26 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/message.el (message-display-completion-list): New function. (message-expand-group): Use it; make sure the Completions buffer is modifiable.
author Miles Bader <miles@gnu.org>
date Mon, 31 Oct 2005 07:07:28 +0000
parents 69a9e146ef35
children 3661e9b3c48f ee12d75eb214
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1 /* ebrowse.c --- parsing files for the ebrowse C++ browser
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2
64769
6358e3c6075c Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64083
diff changeset
3 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
6358e3c6075c Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64083
diff changeset
4 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
5
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
6 This file is part of GNU Emacs.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
7
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
8 GNU Emacs is free software; you can redistribute it and/or modify
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
9 it under the terms of the GNU General Public License as published by
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
10 the Free Software Foundation; either version 2, or (at your option)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
11 any later version.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
12
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
13 GNU Emacs is distributed in the hope that it will be useful,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
16 GNU General Public License for more details.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
17
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
42259
20ee6e9752ef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 42174
diff changeset
19 along with GNU Emacs; see the file COPYING. If not, write to the
64083
23a17af379b1 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 55442
diff changeset
20 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23a17af379b1 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 55442
diff changeset
21 Boston, MA 02110-1301, USA. */
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
22
29889
565ecd919fca Move config.h before other includes (which may use feature tests).
Dave Love <fx@gnu.org>
parents: 29561
diff changeset
23 #ifdef HAVE_CONFIG_H
565ecd919fca Move config.h before other includes (which may use feature tests).
Dave Love <fx@gnu.org>
parents: 29561
diff changeset
24 #include <config.h>
565ecd919fca Move config.h before other includes (which may use feature tests).
Dave Love <fx@gnu.org>
parents: 29561
diff changeset
25 #endif
565ecd919fca Move config.h before other includes (which may use feature tests).
Dave Love <fx@gnu.org>
parents: 29561
diff changeset
26
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
27 #include <stdio.h>
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
28
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
29 #ifdef HAVE_STDLIB_H
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
30 #include <stdlib.h>
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
31 #endif
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
32
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
33 #ifdef HAVE_STRING_H
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
34 #include <string.h>
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
35 #endif
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
36
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
37 #include <ctype.h>
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
38 #include <assert.h>
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
39 #include "getopt.h"
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
40
39076
fe37d7c5eae2 (SEEK_END): #define if not defined by system headers.
Eli Zaretskii <eliz@gnu.org>
parents: 38769
diff changeset
41 /* The SunOS compiler doesn't have SEEK_END. */
fe37d7c5eae2 (SEEK_END): #define if not defined by system headers.
Eli Zaretskii <eliz@gnu.org>
parents: 38769
diff changeset
42 #ifndef SEEK_END
fe37d7c5eae2 (SEEK_END): #define if not defined by system headers.
Eli Zaretskii <eliz@gnu.org>
parents: 38769
diff changeset
43 #define SEEK_END 2
fe37d7c5eae2 (SEEK_END): #define if not defined by system headers.
Eli Zaretskii <eliz@gnu.org>
parents: 38769
diff changeset
44 #endif
fe37d7c5eae2 (SEEK_END): #define if not defined by system headers.
Eli Zaretskii <eliz@gnu.org>
parents: 38769
diff changeset
45
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
46 /* Conditionalize function prototypes. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
47
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
48 #ifdef PROTOTYPES /* From config.h. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
49 #define P_(x) x
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
50 #else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
51 #define P_(x) ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
52 #endif
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
53
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
54 /* Value is non-zero if strings X and Y compare equal. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
55
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
56 #define streq(X, Y) (*(X) == *(Y) && strcmp ((X) + 1, (Y) + 1) == 0)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
57
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
58 /* The ubiquitous `max' and `min' macros. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
59
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
60 #ifndef max
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
61 #define max(X, Y) ((X) > (Y) ? (X) : (Y))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
62 #define min(X, Y) ((X) < (Y) ? (X) : (Y))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
63 #endif
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
64
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
65 /* Files are read in chunks of this number of bytes. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
66
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
67 #define READ_CHUNK_SIZE (100 * 1024)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
68
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
69 /* The character used as a separator in path lists (like $PATH). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
70
29561
235fb8ea80a2 [WINDOWS-NT]: Use stricmp rather than strcasecmp to compare filenames.
Jason Rumney <jasonr@gnu.org>
parents: 29459
diff changeset
71 #if defined(__MSDOS__)
28773
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
72 #define PATH_LIST_SEPARATOR ';'
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
73 #define FILENAME_EQ(X,Y) (strcasecmp(X,Y) == 0)
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
74 #else
29561
235fb8ea80a2 [WINDOWS-NT]: Use stricmp rather than strcasecmp to compare filenames.
Jason Rumney <jasonr@gnu.org>
parents: 29459
diff changeset
75 #if defined(WINDOWSNT)
235fb8ea80a2 [WINDOWS-NT]: Use stricmp rather than strcasecmp to compare filenames.
Jason Rumney <jasonr@gnu.org>
parents: 29459
diff changeset
76 #define PATH_LIST_SEPARATOR ';'
235fb8ea80a2 [WINDOWS-NT]: Use stricmp rather than strcasecmp to compare filenames.
Jason Rumney <jasonr@gnu.org>
parents: 29459
diff changeset
77 #define FILENAME_EQ(X,Y) (stricmp(X,Y) == 0)
235fb8ea80a2 [WINDOWS-NT]: Use stricmp rather than strcasecmp to compare filenames.
Jason Rumney <jasonr@gnu.org>
parents: 29459
diff changeset
78 #else
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
79 #define PATH_LIST_SEPARATOR ':'
28773
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
80 #define FILENAME_EQ(X,Y) (streq(X,Y))
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
81 #endif
29561
235fb8ea80a2 [WINDOWS-NT]: Use stricmp rather than strcasecmp to compare filenames.
Jason Rumney <jasonr@gnu.org>
parents: 29459
diff changeset
82 #endif
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
83 /* The default output file name. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
84
28814
7bb3a2b7ff29 (DEFAULT_OUTFILE): Set to `BROWSE'.
Gerd Moellmann <gerd@gnu.org>
parents: 28773
diff changeset
85 #define DEFAULT_OUTFILE "BROWSE"
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
86
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
87 /* A version string written to the output file. Change this whenever
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
88 the structure of the output file changes. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
89
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
90 #define EBROWSE_FILE_VERSION "ebrowse 5.0"
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
91
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
92 /* The output file consists of a tree of Lisp objects, with major
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
93 nodes built out of Lisp structures. These are the heads of the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
94 Lisp structs with symbols identifying their type. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
95
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
96 #define TREE_HEADER_STRUCT "[ebrowse-hs "
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
97 #define TREE_STRUCT "[ebrowse-ts "
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
98 #define MEMBER_STRUCT "[ebrowse-ms "
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
99 #define BROWSE_STRUCT "[ebrowse-bs "
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
100 #define CLASS_STRUCT "[ebrowse-cs "
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
101
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
102 /* The name of the symbol table entry for global functions, variables,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
103 defines etc. This name also appears in the browser display. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
104
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
105 #define GLOBALS_NAME "*Globals*"
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
106
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
107 /* Token definitions. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
108
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
109 enum token
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
110 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
111 YYEOF = 0, /* end of file */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
112 CSTRING = 256, /* string constant */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
113 CCHAR, /* character constant */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
114 CINT, /* integral constant */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
115 CFLOAT, /* real constant */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
116
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
117 ELLIPSIS, /* ... */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
118 LSHIFTASGN, /* <<= */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
119 RSHIFTASGN, /* >>= */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
120 ARROWSTAR, /* ->* */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
121 IDENT, /* identifier */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
122 DIVASGN, /* /= */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
123 INC, /* ++ */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
124 ADDASGN, /* += */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
125 DEC, /* -- */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
126 ARROW, /* -> */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
127 SUBASGN, /* -= */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
128 MULASGN, /* *= */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
129 MODASGN, /* %= */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
130 LOR, /* || */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
131 ORASGN, /* |= */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
132 LAND, /* && */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
133 ANDASGN, /* &= */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
134 XORASGN, /* ^= */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
135 POINTSTAR, /* .* */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
136 DCOLON, /* :: */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
137 EQ, /* == */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
138 NE, /* != */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
139 LE, /* <= */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
140 LSHIFT, /* << */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
141 GE, /* >= */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
142 RSHIFT, /* >> */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
143
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
144 /* Keywords. The undef's are there because these
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
145 three symbols are very likely to be defined somewhere. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
146 #undef BOOL
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
147 #undef TRUE
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
148 #undef FALSE
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
149
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
150 ASM, /* asm */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
151 AUTO, /* auto */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
152 BREAK, /* break */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
153 CASE, /* case */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
154 CATCH, /* catch */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
155 CHAR, /* char */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
156 CLASS, /* class */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
157 CONST, /* const */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
158 CONTINUE, /* continue */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
159 DEFAULT, /* default */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
160 DELETE, /* delete */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
161 DO, /* do */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
162 DOUBLE, /* double */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
163 ELSE, /* else */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
164 ENUM, /* enum */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
165 EXTERN, /* extern */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
166 FLOAT, /* float */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
167 FOR, /* for */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
168 FRIEND, /* friend */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
169 GOTO, /* goto */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
170 IF, /* if */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
171 T_INLINE, /* inline */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
172 INT, /* int */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
173 LONG, /* long */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
174 NEW, /* new */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
175 OPERATOR, /* operator */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
176 PRIVATE, /* private */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
177 PROTECTED, /* protected */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
178 PUBLIC, /* public */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
179 REGISTER, /* register */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
180 RETURN, /* return */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
181 SHORT, /* short */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
182 SIGNED, /* signed */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
183 SIZEOF, /* sizeof */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
184 STATIC, /* static */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
185 STRUCT, /* struct */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
186 SWITCH, /* switch */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
187 TEMPLATE, /* template */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
188 THIS, /* this */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
189 THROW, /* throw */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
190 TRY, /* try */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
191 TYPEDEF, /* typedef */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
192 UNION, /* union */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
193 UNSIGNED, /* unsigned */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
194 VIRTUAL, /* virtual */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
195 VOID, /* void */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
196 VOLATILE, /* volatile */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
197 WHILE, /* while */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
198 MUTABLE, /* mutable */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
199 BOOL, /* bool */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
200 TRUE, /* true */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
201 FALSE, /* false */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
202 SIGNATURE, /* signature (GNU extension) */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
203 NAMESPACE, /* namespace */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
204 EXPLICIT, /* explicit */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
205 TYPENAME, /* typename */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
206 CONST_CAST, /* const_cast */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
207 DYNAMIC_CAST, /* dynamic_cast */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
208 REINTERPRET_CAST, /* reinterpret_cast */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
209 STATIC_CAST, /* static_cast */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
210 TYPEID, /* typeid */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
211 USING, /* using */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
212 WCHAR /* wchar_t */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
213 };
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
214
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
215 /* Storage classes, in a wider sense. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
216
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
217 enum sc
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
218 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
219 SC_UNKNOWN,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
220 SC_MEMBER, /* Is an instance member. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
221 SC_STATIC, /* Is static member. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
222 SC_FRIEND, /* Is friend function. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
223 SC_TYPE /* Is a type definition. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
224 };
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
225
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
226 /* Member visibility. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
227
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
228 enum visibility
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
229 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
230 V_PUBLIC,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
231 V_PROTECTED,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
232 V_PRIVATE
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
233 };
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
234
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
235 /* Member flags. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
236
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
237 #define F_VIRTUAL 1 /* Is virtual function. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
238 #define F_INLINE 2 /* Is inline function. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
239 #define F_CONST 4 /* Is const. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
240 #define F_PURE 8 /* Is pure virtual function. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
241 #define F_MUTABLE 16 /* Is mutable. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
242 #define F_TEMPLATE 32 /* Is a template. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
243 #define F_EXPLICIT 64 /* Is explicit constructor. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
244 #define F_THROW 128 /* Has a throw specification. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
245 #define F_EXTERNC 256 /* Is declared extern "C". */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
246 #define F_DEFINE 512 /* Is a #define. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
247
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
248 /* Two macros to set and test a bit in an int. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
249
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
250 #define SET_FLAG(F, FLAG) ((F) |= (FLAG))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
251 #define HAS_FLAG(F, FLAG) (((F) & (FLAG)) != 0)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
252
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
253 /* Structure describing a class member. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
254
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
255 struct member
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
256 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
257 struct member *next; /* Next in list of members. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
258 struct member *anext; /* Collision chain in member_table. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
259 struct member **list; /* Pointer to list in class. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
260 unsigned param_hash; /* Hash value for parameter types. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
261 int vis; /* Visibility (public, ...). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
262 int flags; /* See F_* above. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
263 char *regexp; /* Matching regular expression. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
264 char *filename; /* Don't free this shared string. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
265 int pos; /* Buffer position of occurrence. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
266 char *def_regexp; /* Regular expression matching definition. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
267 char *def_filename; /* File name of definition. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
268 int def_pos; /* Buffer position of definition. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
269 char name[1]; /* Member name. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
270 };
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
271
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
272 /* Structures of this type are used to connect class structures with
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
273 their super and subclasses. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
274
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
275 struct link
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
276 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
277 struct sym *sym; /* The super or subclass. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
278 struct link *next; /* Next in list or NULL. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
279 };
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
280
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
281 /* Structure used to record namespace aliases. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
282
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
283 struct alias
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
284 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
285 struct alias *next; /* Next in list. */
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
286 struct sym *namesp; /* Namespace in which defined. */
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
287 struct link *aliasee; /* List of aliased namespaces (A::B::C...). */
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
288 char name[1]; /* Alias name. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
289 };
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
290
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
291 /* The structure used to describe a class in the symbol table,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
292 or a namespace in all_namespaces. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
293
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
294 struct sym
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
295 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
296 int flags; /* Is class a template class?. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
297 unsigned char visited; /* Used to find circles. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
298 struct sym *next; /* Hash collision list. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
299 struct link *subs; /* List of subclasses. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
300 struct link *supers; /* List of superclasses. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
301 struct member *vars; /* List of instance variables. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
302 struct member *fns; /* List of instance functions. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
303 struct member *static_vars; /* List of static variables. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
304 struct member *static_fns; /* List of static functions. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
305 struct member *friends; /* List of friend functions. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
306 struct member *types; /* List of local types. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
307 char *regexp; /* Matching regular expression. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
308 int pos; /* Buffer position. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
309 char *filename; /* File in which it can be found. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
310 char *sfilename; /* File in which members can be found. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
311 struct sym *namesp; /* Namespace in which defined. . */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
312 char name[1]; /* Name of the class. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
313 };
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
314
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
315 /* Experimental: Print info for `--position-info'. We print
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
316 '(CLASS-NAME SCOPE MEMBER-NAME). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
317
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
318 #define P_DEFN 1
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
319 #define P_DECL 2
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
320
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
321 int info_where;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
322 struct sym *info_cls = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
323 struct member *info_member = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
324
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
325 /* Experimental. For option `--position-info', the buffer position we
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
326 are interested in. When this position is reached, print out
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
327 information about what we know about that point. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
328
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
329 int info_position = -1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
330
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
331 /* Command line options structure for getopt_long. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
332
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
333 struct option options[] =
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
334 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
335 {"append", no_argument, NULL, 'a'},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
336 {"files", required_argument, NULL, 'f'},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
337 {"help", no_argument, NULL, -2},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
338 {"min-regexp-length", required_argument, NULL, 'm'},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
339 {"max-regexp-length", required_argument, NULL, 'M'},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
340 {"no-nested-classes", no_argument, NULL, 'n'},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
341 {"no-regexps", no_argument, NULL, 'x'},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
342 {"no-structs-or-unions", no_argument, NULL, 's'},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
343 {"output-file", required_argument, NULL, 'o'},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
344 {"position-info", required_argument, NULL, 'p'},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
345 {"search-path", required_argument, NULL, 'I'},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
346 {"verbose", no_argument, NULL, 'v'},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
347 {"version", no_argument, NULL, -3},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
348 {"very-verbose", no_argument, NULL, 'V'},
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
349 {NULL, 0, NULL, 0}
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
350 };
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
351
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
352 /* Semantic values of tokens. Set by yylex.. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
353
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
354 unsigned yyival; /* Set for token CINT. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
355 char *yytext; /* Set for token IDENT. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
356 char *yytext_end;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
357
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
358 /* Output file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
359
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
360 FILE *yyout;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
361
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
362 /* Current line number. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
363
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
364 int yyline;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
365
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
366 /* The name of the current input file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
367
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
368 char *filename;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
369
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
370 /* Three character class vectors, and macros to test membership
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
371 of characters. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
372
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
373 char is_ident[255];
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
374 char is_digit[255];
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
375 char is_white[255];
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
376
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
377 #define IDENTP(C) is_ident[(unsigned char) (C)]
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
378 #define DIGITP(C) is_digit[(unsigned char) (C)]
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
379 #define WHITEP(C) is_white[(unsigned char) (C)]
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
380
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
381 /* Command line flags. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
382
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
383 int f_append;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
384 int f_verbose;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
385 int f_very_verbose;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
386 int f_structs = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
387 int f_regexps = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
388 int f_nested_classes = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
389
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
390 /* Maximum and minimum lengths of regular expressions matching a
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
391 member, class etc., for writing them to the output file. These are
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
392 overridable from the command line. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
393
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
394 int min_regexp = 5;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
395 int max_regexp = 50;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
396
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
397 /* Input buffer. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
398
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
399 char *inbuffer;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
400 char *in;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
401 int inbuffer_size;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
402
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
403 /* Return the current buffer position in the input file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
404
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
405 #define BUFFER_POS() (in - inbuffer)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
406
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
407 /* If current lookahead is CSTRING, the following points to the
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
408 first character in the string constant. Used for recognizing
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
409 extern "C". */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
410
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
411 char *string_start;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
412
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
413 /* The size of the hash tables for classes.and members. Should be
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
414 prime. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
415
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
416 #define TABLE_SIZE 1001
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
417
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
418 /* The hash table for class symbols. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
419
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
420 struct sym *class_table[TABLE_SIZE];
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
421
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
422 /* Hash table containing all member structures. This is generally
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
423 faster for member lookup than traversing the member lists of a
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
424 `struct sym'. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
425
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
426 struct member *member_table[TABLE_SIZE];
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
427
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
428 /* Hash table for namespace aliases */
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
429
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
430 struct alias *namespace_alias_table[TABLE_SIZE];
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
431
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
432 /* The special class symbol used to hold global functions,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
433 variables etc. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
434
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
435 struct sym *global_symbols;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
436
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
437 /* The current namespace. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
438
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
439 struct sym *current_namespace;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
440
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
441 /* The list of all known namespaces. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
442
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
443 struct sym *all_namespaces;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
444
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
445 /* Stack of namespaces we're currently nested in, during the parse. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
446
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
447 struct sym **namespace_stack;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
448 int namespace_stack_size;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
449 int namespace_sp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
450
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
451 /* The current lookahead token. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
452
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
453 int tk = -1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
454
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
455 /* Structure describing a keyword. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
456
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
457 struct kw
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
458 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
459 char *name; /* Spelling. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
460 int tk; /* Token value. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
461 struct kw *next; /* Next in collision chain. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
462 };
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
463
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
464 /* Keywords are lookup up in a hash table of their own. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
465
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
466 #define KEYWORD_TABLE_SIZE 1001
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
467 struct kw *keyword_table[KEYWORD_TABLE_SIZE];
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
468
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
469 /* Search path. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
470
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
471 struct search_path
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
472 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
473 char *path;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
474 struct search_path *next;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
475 };
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
476
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
477 struct search_path *search_path;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
478 struct search_path *search_path_tail;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
479
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
480 /* Function prototypes. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
481
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
482 int yylex P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
483 void yyparse P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
484 void re_init_parser P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
485 char *token_string P_ ((int));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
486 char *matching_regexp P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
487 void init_sym P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
488 struct sym *add_sym P_ ((char *, struct sym *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
489 void add_link P_ ((struct sym *, struct sym *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
490 void add_member_defn P_ ((struct sym *, char *, char *,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
491 int, unsigned, int, int, int));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
492 void add_member_decl P_ ((struct sym *, char *, char *, int,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
493 unsigned, int, int, int, int));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
494 void dump_roots P_ ((FILE *));
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
495 void *xmalloc P_ ((int));
35459
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
496 void xfree P_ ((void *));
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
497 void add_global_defn P_ ((char *, char *, int, unsigned, int, int, int));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
498 void add_global_decl P_ ((char *, char *, int, unsigned, int, int, int));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
499 void add_define P_ ((char *, char *, int));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
500 void mark_inherited_virtual P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
501 void leave_namespace P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
502 void enter_namespace P_ ((char *));
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
503 void register_namespace_alias P_ ((char *, struct link *));
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
504 void insert_keyword P_ ((char *, int));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
505 void re_init_scanner P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
506 void init_scanner P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
507 void usage P_ ((int));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
508 void version P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
509 void process_file P_ ((char *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
510 void add_search_path P_ ((char *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
511 FILE *open_file P_ ((char *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
512 int process_pp_line P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
513 int dump_members P_ ((FILE *, struct member *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
514 void dump_sym P_ ((FILE *, struct sym *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
515 int dump_tree P_ ((FILE *, struct sym *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
516 struct member *find_member P_ ((struct sym *, char *, int, int, unsigned));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
517 struct member *add_member P_ ((struct sym *, char *, int, int, unsigned));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
518 void mark_virtual P_ ((struct sym *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
519 void mark_virtual P_ ((struct sym *));
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
520 struct sym *make_namespace P_ ((char *, struct sym *));
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
521 char *sym_scope P_ ((struct sym *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
522 char *sym_scope_1 P_ ((struct sym *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
523 int skip_to P_ ((int));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
524 void skip_matching P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
525 void member P_ ((struct sym *, int));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
526 void class_body P_ ((struct sym *, int));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
527 void class_definition P_ ((struct sym *, int, int, int));
28645
0813367c7810 (xmalloc, xrealloc): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 28523
diff changeset
528 void declaration P_ ((int));
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
529 unsigned parm_list P_ ((int *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
530 char *operator_name P_ ((int *));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
531 struct sym *parse_classname P_ ((void));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
532 struct sym *parse_qualified_ident_or_type P_ ((char **));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
533 void parse_qualified_param_ident_or_type P_ ((char **));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
534 int globals P_ ((int));
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
535 void yyerror P_ ((char *, char *));
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
536
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
537
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
538
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
539 /***********************************************************************
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
540 Utilities
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
541 ***********************************************************************/
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
542
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
543 /* Print an error in a printf-like style with the current input file
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
544 name and line number. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
545
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
546 void
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
547 yyerror (format, s)
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
548 char *format, *s;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
549 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
550 fprintf (stderr, "%s:%d: ", filename, yyline);
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
551 fprintf (stderr, format, s);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
552 putc ('\n', stderr);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
553 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
554
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
555
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
556 /* Like malloc but print an error and exit if not enough memory is
33384
2a6bbd7e52a1 Fix comment.
Dave Love <fx@gnu.org>
parents: 30232
diff changeset
557 available. */
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
558
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
559 void *
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
560 xmalloc (nbytes)
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
561 int nbytes;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
562 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
563 void *p = malloc (nbytes);
28645
0813367c7810 (xmalloc, xrealloc): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 28523
diff changeset
564 if (p == NULL)
0813367c7810 (xmalloc, xrealloc): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 28523
diff changeset
565 {
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
566 yyerror ("out of memory", NULL);
55442
a47704955f8d Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
567 exit (EXIT_FAILURE);
28645
0813367c7810 (xmalloc, xrealloc): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 28523
diff changeset
568 }
0813367c7810 (xmalloc, xrealloc): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 28523
diff changeset
569 return p;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
570 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
571
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
572
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
573 /* Like realloc but print an error and exit if out of memory. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
574
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
575 void *
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
576 xrealloc (p, sz)
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
577 void *p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
578 int sz;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
579 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
580 p = realloc (p, sz);
28645
0813367c7810 (xmalloc, xrealloc): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 28523
diff changeset
581 if (p == NULL)
0813367c7810 (xmalloc, xrealloc): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 28523
diff changeset
582 {
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
583 yyerror ("out of memory", NULL);
55442
a47704955f8d Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
584 exit (EXIT_FAILURE);
28645
0813367c7810 (xmalloc, xrealloc): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 28523
diff changeset
585 }
0813367c7810 (xmalloc, xrealloc): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 28523
diff changeset
586 return p;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
587 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
588
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
589
35459
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
590 /* Like free but always check for null pointers.. */
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
591
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
592 void
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
593 xfree (p)
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
594 void *p;
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
595 {
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
596 if (p)
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
597 free (p);
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
598 }
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
599
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
600
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
601 /* Like strdup, but print an error and exit if not enough memory is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
602 available.. If S is null, return null. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
603
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
604 char *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
605 xstrdup (s)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
606 char *s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
607 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
608 if (s)
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
609 s = strcpy (xmalloc (strlen (s) + 1), s);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
610 return s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
611 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
612
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
613
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
614
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
615 /***********************************************************************
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
616 Symbols
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
617 ***********************************************************************/
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
618
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
619 /* Initialize the symbol table. This currently only sets up the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
620 special symbol for globals (`*Globals*'). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
621
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
622 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
623 init_sym ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
624 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
625 global_symbols = add_sym (GLOBALS_NAME, NULL);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
626 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
627
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
628
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
629 /* Add a symbol for class NAME to the symbol table. NESTED_IN_CLASS
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
630 is the class in which class NAME was found. If it is null,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
631 this means the scope of NAME is the current namespace.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
632
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
633 If a symbol for NAME already exists, return that. Otherwise
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
634 create a new symbol and set it to default values. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
635
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
636 struct sym *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
637 add_sym (name, nested_in_class)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
638 char *name;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
639 struct sym *nested_in_class;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
640 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
641 struct sym *sym;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
642 unsigned h;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
643 char *s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
644 struct sym *scope = nested_in_class ? nested_in_class : current_namespace;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
645
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
646 for (s = name, h = 0; *s; ++s)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
647 h = (h << 1) ^ *s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
648 h %= TABLE_SIZE;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
649
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
650 for (sym = class_table[h]; sym; sym = sym->next)
65626
69a9e146ef35 (add_sym): Compare namespace names instead of namespace objects. This
Chong Yidong <cyd@stupidchicken.com>
parents: 64769
diff changeset
651 if (streq (name, sym->name)
69a9e146ef35 (add_sym): Compare namespace names instead of namespace objects. This
Chong Yidong <cyd@stupidchicken.com>
parents: 64769
diff changeset
652 && ((!sym->namesp && !scope)
69a9e146ef35 (add_sym): Compare namespace names instead of namespace objects. This
Chong Yidong <cyd@stupidchicken.com>
parents: 64769
diff changeset
653 || (sym->namesp && scope
69a9e146ef35 (add_sym): Compare namespace names instead of namespace objects. This
Chong Yidong <cyd@stupidchicken.com>
parents: 64769
diff changeset
654 && streq (sym->namesp->name, scope->name))))
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
655 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
656
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
657 if (sym == NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
658 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
659 if (f_very_verbose)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
660 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
661 putchar ('\t');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
662 puts (name);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
663 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
664
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
665 sym = (struct sym *) xmalloc (sizeof *sym + strlen (name));
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
666 bzero (sym, sizeof *sym);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
667 strcpy (sym->name, name);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
668 sym->namesp = scope;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
669 sym->next = class_table[h];
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
670 class_table[h] = sym;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
671 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
672
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
673 return sym;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
674 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
675
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
676
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
677 /* Add links between superclass SUPER and subclass SUB. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
678
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
679 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
680 add_link (super, sub)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
681 struct sym *super, *sub;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
682 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
683 struct link *lnk, *lnk2, *p, *prev;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
684
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
685 /* See if a link already exists. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
686 for (p = super->subs, prev = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
687 p && strcmp (sub->name, p->sym->name) > 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
688 prev = p, p = p->next)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
689 ;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
690
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
691 /* Avoid duplicates. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
692 if (p == NULL || p->sym != sub)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
693 {
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
694 lnk = (struct link *) xmalloc (sizeof *lnk);
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
695 lnk2 = (struct link *) xmalloc (sizeof *lnk2);
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
696
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
697 lnk->sym = sub;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
698 lnk->next = p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
699
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
700 if (prev)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
701 prev->next = lnk;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
702 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
703 super->subs = lnk;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
704
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
705 lnk2->sym = super;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
706 lnk2->next = sub->supers;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
707 sub->supers = lnk2;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
708 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
709 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
710
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
711
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
712 /* Find in class CLS member NAME.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
713
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
714 VAR non-zero means look for a member variable; otherwise a function
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
715 is searched. SC specifies what kind of member is searched---a
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
716 static, or per-instance member etc. HASH is a hash code for the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
717 parameter types of functions. Value is a pointer to the member
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
718 found or null if not found. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
719
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
720 struct member *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
721 find_member (cls, name, var, sc, hash)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
722 struct sym *cls;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
723 char *name;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
724 int var, sc;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
725 unsigned hash;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
726 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
727 struct member **list;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
728 struct member *p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
729 unsigned name_hash = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
730 char *s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
731 int i;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
732
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
733 switch (sc)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
734 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
735 case SC_FRIEND:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
736 list = &cls->friends;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
737 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
738
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
739 case SC_TYPE:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
740 list = &cls->types;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
741 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
742
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
743 case SC_STATIC:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
744 list = var ? &cls->static_vars : &cls->static_fns;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
745 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
746
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
747 default:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
748 list = var ? &cls->vars : &cls->fns;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
749 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
750 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
751
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
752 for (s = name; *s; ++s)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
753 name_hash = (name_hash << 1) ^ *s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
754 i = name_hash % TABLE_SIZE;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
755
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
756 for (p = member_table[i]; p; p = p->anext)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
757 if (p->list == list && p->param_hash == hash && streq (name, p->name))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
758 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
759
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
760 return p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
761 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
762
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
763
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
764 /* Add to class CLS information for the declaration of member NAME.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
765 REGEXP is a regexp matching the declaration, if non-null. POS is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
766 the position in the source where the declaration is found. HASH is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
767 a hash code for the parameter list of the member, if it's a
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
768 function. VAR non-zero means member is a variable or type. SC
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
769 specifies the type of member (instance member, static, ...). VIS
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
770 is the member's visibility (public, protected, private). FLAGS is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
771 a bit set giving additional information about the member (see the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
772 F_* defines). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
773
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
774 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
775 add_member_decl (cls, name, regexp, pos, hash, var, sc, vis, flags)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
776 struct sym *cls;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
777 char *name;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
778 char *regexp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
779 int pos;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
780 unsigned hash;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
781 int var;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
782 int sc;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
783 int vis;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
784 int flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
785 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
786 struct member *m;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
787
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
788 m = find_member (cls, name, var, sc, hash);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
789 if (m == NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
790 m = add_member (cls, name, var, sc, hash);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
791
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
792 /* Have we seen a new filename? If so record that. */
28773
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
793 if (!cls->filename || !FILENAME_EQ (cls->filename, filename))
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
794 m->filename = filename;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
795
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
796 m->regexp = regexp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
797 m->pos = pos;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
798 m->flags = flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
799
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
800 switch (vis)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
801 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
802 case PRIVATE:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
803 m->vis = V_PRIVATE;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
804 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
805
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
806 case PROTECTED:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
807 m->vis = V_PROTECTED;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
808 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
809
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
810 case PUBLIC:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
811 m->vis = V_PUBLIC;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
812 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
813 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
814
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
815 info_where = P_DECL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
816 info_cls = cls;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
817 info_member = m;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
818 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
819
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
820
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
821 /* Add to class CLS information for the definition of member NAME.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
822 REGEXP is a regexp matching the declaration, if non-null. POS is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
823 the position in the source where the declaration is found. HASH is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
824 a hash code for the parameter list of the member, if it's a
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
825 function. VAR non-zero means member is a variable or type. SC
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
826 specifies the type of member (instance member, static, ...). VIS
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
827 is the member's visibility (public, protected, private). FLAGS is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
828 a bit set giving additional information about the member (see the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
829 F_* defines). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
830
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
831 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
832 add_member_defn (cls, name, regexp, pos, hash, var, sc, flags)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
833 struct sym *cls;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
834 char *name;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
835 char *regexp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
836 int pos;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
837 unsigned hash;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
838 int var;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
839 int sc;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
840 int flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
841 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
842 struct member *m;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
843
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
844 if (sc == SC_UNKNOWN)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
845 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
846 m = find_member (cls, name, var, SC_MEMBER, hash);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
847 if (m == NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
848 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
849 m = find_member (cls, name, var, SC_STATIC, hash);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
850 if (m == NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
851 m = add_member (cls, name, var, sc, hash);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
852 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
853 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
854 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
855 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
856 m = find_member (cls, name, var, sc, hash);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
857 if (m == NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
858 m = add_member (cls, name, var, sc, hash);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
859 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
860
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
861 if (!cls->sfilename)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
862 cls->sfilename = filename;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
863
28773
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
864 if (!FILENAME_EQ (cls->sfilename, filename))
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
865 m->def_filename = filename;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
866
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
867 m->def_regexp = regexp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
868 m->def_pos = pos;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
869 m->flags |= flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
870
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
871 info_where = P_DEFN;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
872 info_cls = cls;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
873 info_member = m;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
874 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
875
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
876
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
877 /* Add a symbol for a define named NAME to the symbol table.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
878 REGEXP is a regular expression matching the define in the source,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
879 if it is non-null. POS is the position in the file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
880
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
881 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
882 add_define (name, regexp, pos)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
883 char *name, *regexp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
884 int pos;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
885 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
886 add_global_defn (name, regexp, pos, 0, 1, SC_FRIEND, F_DEFINE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
887 add_global_decl (name, regexp, pos, 0, 1, SC_FRIEND, F_DEFINE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
888 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
889
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
890
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
891 /* Add information for the global definition of NAME.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
892 REGEXP is a regexp matching the declaration, if non-null. POS is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
893 the position in the source where the declaration is found. HASH is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
894 a hash code for the parameter list of the member, if it's a
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
895 function. VAR non-zero means member is a variable or type. SC
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
896 specifies the type of member (instance member, static, ...). VIS
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
897 is the member's visibility (public, protected, private). FLAGS is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
898 a bit set giving additional information about the member (see the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
899 F_* defines). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
900
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
901 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
902 add_global_defn (name, regexp, pos, hash, var, sc, flags)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
903 char *name, *regexp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
904 int pos;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
905 unsigned hash;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
906 int var;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
907 int sc;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
908 int flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
909 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
910 int i;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
911 struct sym *sym;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
912
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
913 /* Try to find out for which classes a function is a friend, and add
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
914 what we know about it to them. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
915 if (!var)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
916 for (i = 0; i < TABLE_SIZE; ++i)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
917 for (sym = class_table[i]; sym; sym = sym->next)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
918 if (sym != global_symbols && sym->friends)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
919 if (find_member (sym, name, 0, SC_FRIEND, hash))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
920 add_member_defn (sym, name, regexp, pos, hash, 0,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
921 SC_FRIEND, flags);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
922
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
923 /* Add to global symbols. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
924 add_member_defn (global_symbols, name, regexp, pos, hash, var, sc, flags);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
925 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
926
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
927
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
928 /* Add information for the global declaration of NAME.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
929 REGEXP is a regexp matching the declaration, if non-null. POS is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
930 the position in the source where the declaration is found. HASH is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
931 a hash code for the parameter list of the member, if it's a
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
932 function. VAR non-zero means member is a variable or type. SC
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
933 specifies the type of member (instance member, static, ...). VIS
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
934 is the member's visibility (public, protected, private). FLAGS is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
935 a bit set giving additional information about the member (see the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
936 F_* defines). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
937
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
938 void
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
939 add_global_decl (name, regexp, pos, hash, var, sc, flags)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
940 char *name, *regexp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
941 int pos;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
942 unsigned hash;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
943 int var;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
944 int sc;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
945 int flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
946 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
947 /* Add declaration only if not already declared. Header files must
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
948 be processed before source files for this to have the right effect.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
949 I do not want to handle implicit declarations at the moment. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
950 struct member *m;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
951 struct member *found;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
952
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
953 m = found = find_member (global_symbols, name, var, sc, hash);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
954 if (m == NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
955 m = add_member (global_symbols, name, var, sc, hash);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
956
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
957 /* Definition already seen => probably last declaration implicit.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
958 Override. This means that declarations must always be added to
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
959 the symbol table before definitions. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
960 if (!found)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
961 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
962 if (!global_symbols->filename
28773
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
963 || !FILENAME_EQ (global_symbols->filename, filename))
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
964 m->filename = filename;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
965
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
966 m->regexp = regexp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
967 m->pos = pos;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
968 m->vis = V_PUBLIC;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
969 m->flags = flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
970
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
971 info_where = P_DECL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
972 info_cls = global_symbols;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
973 info_member = m;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
974 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
975 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
976
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
977
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
978 /* Add a symbol for member NAME to class CLS.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
979 VAR non-zero means it's a variable. SC specifies the kind of
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
980 member. HASH is a hash code for the parameter types of a function.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
981 Value is a pointer to the member's structure. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
982
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
983 struct member *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
984 add_member (cls, name, var, sc, hash)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
985 struct sym *cls;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
986 char *name;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
987 int var;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
988 int sc;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
989 unsigned hash;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
990 {
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
991 struct member *m = (struct member *) xmalloc (sizeof *m + strlen (name));
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
992 struct member **list;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
993 struct member *p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
994 struct member *prev;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
995 unsigned name_hash = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
996 int i;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
997 char *s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
998
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
999 strcpy (m->name, name);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1000 m->param_hash = hash;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1001
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1002 m->vis = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1003 m->flags = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1004 m->regexp = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1005 m->filename = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1006 m->pos = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1007 m->def_regexp = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1008 m->def_filename = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1009 m->def_pos = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1010
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1011 assert (cls != NULL);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1012
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1013 switch (sc)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1014 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1015 case SC_FRIEND:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1016 list = &cls->friends;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1017 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1018
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1019 case SC_TYPE:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1020 list = &cls->types;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1021 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1022
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1023 case SC_STATIC:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1024 list = var ? &cls->static_vars : &cls->static_fns;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1025 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1026
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1027 default:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1028 list = var ? &cls->vars : &cls->fns;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1029 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1030 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1031
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1032 for (s = name; *s; ++s)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1033 name_hash = (name_hash << 1) ^ *s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1034 i = name_hash % TABLE_SIZE;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1035 m->anext = member_table[i];
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1036 member_table[i] = m;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1037 m->list = list;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1038
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1039 /* Keep the member list sorted. It's cheaper to do it here than to
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1040 sort them in Lisp. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1041 for (prev = NULL, p = *list;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1042 p && strcmp (name, p->name) > 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1043 prev = p, p = p->next)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1044 ;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1045
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1046 m->next = p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1047 if (prev)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1048 prev->next = m;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1049 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1050 *list = m;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1051 return m;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1052 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1053
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1054
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1055 /* Given the root R of a class tree, step through all subclasses
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1056 recursively, marking functions as virtual that are declared virtual
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1057 in base classes. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1058
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1059 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1060 mark_virtual (r)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1061 struct sym *r;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1062 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1063 struct link *p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1064 struct member *m, *m2;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1065
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1066 for (p = r->subs; p; p = p->next)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1067 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1068 for (m = r->fns; m; m = m->next)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1069 if (HAS_FLAG (m->flags, F_VIRTUAL))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1070 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1071 for (m2 = p->sym->fns; m2; m2 = m2->next)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1072 if (m->param_hash == m2->param_hash && streq (m->name, m2->name))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1073 SET_FLAG (m2->flags, F_VIRTUAL);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1074 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1075
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1076 mark_virtual (p->sym);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1077 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1078 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1079
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1080
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1081 /* For all roots of the class tree, mark functions as virtual that
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1082 are virtual because of a virtual declaration in a base class. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1083
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1084 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1085 mark_inherited_virtual ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1086 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1087 struct sym *r;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1088 int i;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1089
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1090 for (i = 0; i < TABLE_SIZE; ++i)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1091 for (r = class_table[i]; r; r = r->next)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1092 if (r->supers == NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1093 mark_virtual (r);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1094 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1095
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1096
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1097 /* Create and return a symbol for a namespace with name NAME. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1098
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1099 struct sym *
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1100 make_namespace (name, context)
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1101 char *name;
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1102 struct sym *context;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1103 {
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
1104 struct sym *s = (struct sym *) xmalloc (sizeof *s + strlen (name));
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1105 bzero (s, sizeof *s);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1106 strcpy (s->name, name);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1107 s->next = all_namespaces;
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1108 s->namesp = context;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1109 all_namespaces = s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1110 return s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1111 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1112
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1113
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1114 /* Find the symbol for namespace NAME. If not found, retrun NULL */
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1115
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1116 struct sym *
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1117 check_namespace (name, context)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1118 char *name;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1119 struct sym *context;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1120 {
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1121 struct sym *p = NULL;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1122
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1123 for (p = all_namespaces; p; p = p->next)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1124 {
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1125 if (streq (p->name, name) && (p->namesp == context))
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1126 break;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1127 }
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1128
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1129 return p;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1130 }
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1131
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1132 /* Find the symbol for namespace NAME. If not found, add a new symbol
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1133 for NAME to all_namespaces. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1134
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1135 struct sym *
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1136 find_namespace (name, context)
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1137 char *name;
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1138 struct sym *context;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1139 {
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1140 struct sym *p = check_namespace (name, context);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1141
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1142 if (p == NULL)
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1143 p = make_namespace (name, context);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1144
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1145 return p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1146 }
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1147
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1148
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1149 /* Find namespace alias with name NAME. If not found return NULL. */
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1150
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1151 struct link *
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1152 check_namespace_alias (name)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1153 char *name;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1154 {
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1155 struct link *p = NULL;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1156 struct alias *al;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1157 unsigned h;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1158 char *s;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1159
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1160 for (s = name, h = 0; *s; ++s)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1161 h = (h << 1) ^ *s;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1162 h %= TABLE_SIZE;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1163
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1164 for (al = namespace_alias_table[h]; al; al = al->next)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1165 if (streq (name, al->name) && (al->namesp == current_namespace))
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1166 {
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1167 p = al->aliasee;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1168 break;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1169 }
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1170
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1171 return p;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1172 }
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1173
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1174 /* Register the name NEW_NAME as an alias for namespace list OLD_NAME. */
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1175
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1176 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1177 register_namespace_alias (new_name, old_name)
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1178 char *new_name;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1179 struct link *old_name;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1180 {
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1181 unsigned h;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1182 char *s;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1183 struct alias *al;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1184
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1185 for (s = new_name, h = 0; *s; ++s)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1186 h = (h << 1) ^ *s;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1187 h %= TABLE_SIZE;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1188
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1189
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1190 /* Is it already in the table of aliases? */
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1191 for (al = namespace_alias_table[h]; al; al = al->next)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1192 if (streq (new_name, al->name) && (al->namesp == current_namespace))
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1193 return;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1194
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
1195 al = (struct alias *) xmalloc (sizeof *al + strlen (new_name));
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1196 strcpy (al->name, new_name);
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1197 al->next = namespace_alias_table[h];
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1198 al->namesp = current_namespace;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1199 al->aliasee = old_name;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1200 namespace_alias_table[h] = al;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1201 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1202
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1203
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1204 /* Enter namespace with name NAME. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1205
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1206 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1207 enter_namespace (name)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1208 char *name;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1209 {
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
1210 struct sym *p = find_namespace (name, current_namespace);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1211
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1212 if (namespace_sp == namespace_stack_size)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1213 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1214 int size = max (10, 2 * namespace_stack_size);
37615
ceb79feb93aa (enter_namespace): Fix reallocation of
Gerd Moellmann <gerd@gnu.org>
parents: 37594
diff changeset
1215 namespace_stack
ceb79feb93aa (enter_namespace): Fix reallocation of
Gerd Moellmann <gerd@gnu.org>
parents: 37594
diff changeset
1216 = (struct sym **) xrealloc ((void *)namespace_stack,
ceb79feb93aa (enter_namespace): Fix reallocation of
Gerd Moellmann <gerd@gnu.org>
parents: 37594
diff changeset
1217 size * sizeof *namespace_stack);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1218 namespace_stack_size = size;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1219 }
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1220
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1221 namespace_stack[namespace_sp++] = current_namespace;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1222 current_namespace = p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1223 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1224
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1225
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1226 /* Leave the current namespace. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1227
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1228 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1229 leave_namespace ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1230 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1231 assert (namespace_sp > 0);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1232 current_namespace = namespace_stack[--namespace_sp];
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1233 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1234
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1235
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1236
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1237 /***********************************************************************
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1238 Writing the Output File
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1239 ***********************************************************************/
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1240
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1241 /* Write string S to the output file FP in a Lisp-readable form.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1242 If S is null, write out `()'. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1243
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1244 #define PUTSTR(s, fp) \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1245 do { \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1246 if (!s) \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1247 { \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1248 putc ('(', fp); \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1249 putc (')', fp); \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1250 putc (' ', fp); \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1251 } \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1252 else \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1253 { \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1254 putc ('"', fp); \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1255 fputs (s, fp); \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1256 putc ('"', fp); \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1257 putc (' ', fp); \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1258 } \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1259 } while (0)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1260
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1261 /* A dynamically allocated buffer for constructing a scope name. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1262
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1263 char *scope_buffer;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1264 int scope_buffer_size;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1265 int scope_buffer_len;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1266
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1267
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1268 /* Make sure scope_buffer has enough room to add LEN chars to it. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1269
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1270 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1271 ensure_scope_buffer_room (len)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1272 int len;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1273 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1274 if (scope_buffer_len + len >= scope_buffer_size)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1275 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1276 int new_size = max (2 * scope_buffer_size, scope_buffer_len + len);
34522
db980c0e762d (ensure_scope_buffer_room): Fix xrealloc call.
Dave Love <fx@gnu.org>
parents: 34304
diff changeset
1277 scope_buffer = (char *) xrealloc (scope_buffer, new_size);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1278 scope_buffer_size = new_size;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1279 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1280 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1281
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1282
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1283 /* Recursively add the scope names of symbol P and the scopes of its
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1284 namespaces to scope_buffer. Value is a pointer to the complete
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1285 scope name constructed. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1286
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1287 char *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1288 sym_scope_1 (p)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1289 struct sym *p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1290 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1291 int len;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1292
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1293 if (p->namesp)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1294 sym_scope_1 (p->namesp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1295
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1296 if (*scope_buffer)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1297 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1298 ensure_scope_buffer_room (3);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1299 strcat (scope_buffer, "::");
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1300 scope_buffer_len += 2;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1301 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1302
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1303 len = strlen (p->name);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1304 ensure_scope_buffer_room (len + 1);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1305 strcat (scope_buffer, p->name);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1306 scope_buffer_len += len;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1307
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1308 if (HAS_FLAG (p->flags, F_TEMPLATE))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1309 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1310 ensure_scope_buffer_room (3);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1311 strcat (scope_buffer, "<>");
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1312 scope_buffer_len += 2;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1313 }
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1314
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1315 return scope_buffer;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1316 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1317
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1318
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1319 /* Return the scope of symbol P in printed representation, i.e.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1320 as it would appear in a C*+ source file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1321
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1322 char *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1323 sym_scope (p)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1324 struct sym *p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1325 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1326 if (!scope_buffer)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1327 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1328 scope_buffer_size = 1024;
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
1329 scope_buffer = (char *) xmalloc (scope_buffer_size);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1330 }
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1331
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1332 *scope_buffer = '\0';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1333 scope_buffer_len = 0;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1334
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1335 if (p->namesp)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1336 sym_scope_1 (p->namesp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1337
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1338 return scope_buffer;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1339 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1340
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1341
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1342 /* Dump the list of members M to file FP. Value is the length of the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1343 list. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1344
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1345 int
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1346 dump_members (fp, m)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1347 FILE *fp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1348 struct member *m;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1349 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1350 int n;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1351
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1352 putc ('(', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1353
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1354 for (n = 0; m; m = m->next, ++n)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1355 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1356 fputs (MEMBER_STRUCT, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1357 PUTSTR (m->name, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1358 PUTSTR (NULL, fp); /* FIXME? scope for globals */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1359 fprintf (fp, "%u ", (unsigned) m->flags);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1360 PUTSTR (m->filename, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1361 PUTSTR (m->regexp, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1362 fprintf (fp, "%u ", (unsigned) m->pos);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1363 fprintf (fp, "%u ", (unsigned) m->vis);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1364 putc (' ', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1365 PUTSTR (m->def_filename, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1366 PUTSTR (m->def_regexp, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1367 fprintf (fp, "%u", (unsigned) m->def_pos);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1368 putc (']', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1369 putc ('\n', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1370 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1371
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1372 putc (')', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1373 putc ('\n', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1374 return n;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1375 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1376
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1377
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1378 /* Dump class ROOT to stream FP. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1379
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1380 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1381 dump_sym (fp, root)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1382 FILE *fp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1383 struct sym *root;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1384 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1385 fputs (CLASS_STRUCT, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1386 PUTSTR (root->name, fp);
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1387
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1388 /* Print scope, if any. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1389 if (root->namesp)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1390 PUTSTR (sym_scope (root), fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1391 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1392 PUTSTR (NULL, fp);
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1393
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1394 /* Print flags. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1395 fprintf (fp, "%u", root->flags);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1396 PUTSTR (root->filename, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1397 PUTSTR (root->regexp, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1398 fprintf (fp, "%u", (unsigned) root->pos);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1399 PUTSTR (root->sfilename, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1400 putc (']', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1401 putc ('\n', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1402 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1403
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1404
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1405 /* Dump class ROOT and its subclasses to file FP. Value is the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1406 number of classes written. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1407
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1408 int
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1409 dump_tree (fp, root)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1410 FILE *fp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1411 struct sym *root;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1412 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1413 struct link *lk;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1414 unsigned n = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1415
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1416 dump_sym (fp, root);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1417
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1418 if (f_verbose)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1419 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1420 putchar ('+');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1421 fflush (stdout);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1422 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1423
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1424 putc ('(', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1425
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1426 for (lk = root->subs; lk; lk = lk->next)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1427 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1428 fputs (TREE_STRUCT, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1429 n += dump_tree (fp, lk->sym);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1430 putc (']', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1431 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1432
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1433 putc (')', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1434
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1435 dump_members (fp, root->vars);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1436 n += dump_members (fp, root->fns);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1437 dump_members (fp, root->static_vars);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1438 n += dump_members (fp, root->static_fns);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1439 n += dump_members (fp, root->friends);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1440 dump_members (fp, root->types);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1441
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1442 /* Superclasses. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1443 putc ('(', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1444 putc (')', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1445
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1446 /* Mark slot. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1447 putc ('(', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1448 putc (')', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1449
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1450 putc ('\n', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1451 return n;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1452 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1453
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1454
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1455 /* Dump the entire class tree to file FP. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1456
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1457 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1458 dump_roots (fp)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1459 FILE *fp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1460 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1461 int i, n = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1462 struct sym *r;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1463
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1464 /* Output file header containing version string, command line
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1465 options etc. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1466 if (!f_append)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1467 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1468 fputs (TREE_HEADER_STRUCT, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1469 PUTSTR (EBROWSE_FILE_VERSION, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1470
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1471 putc ('\"', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1472 if (!f_structs)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1473 fputs (" -s", fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1474 if (f_regexps)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1475 fputs (" -x", fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1476 putc ('\"', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1477 fputs (" ()", fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1478 fputs (" ()", fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1479 putc (']', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1480 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1481
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1482 /* Mark functions as virtual that are so because of functions
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1483 declared virtual in base classes. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1484 mark_inherited_virtual ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1485
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1486 /* Dump the roots of the graph. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1487 for (i = 0; i < TABLE_SIZE; ++i)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1488 for (r = class_table[i]; r; r = r->next)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1489 if (!r->supers)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1490 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1491 fputs (TREE_STRUCT, fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1492 n += dump_tree (fp, r);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1493 putc (']', fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1494 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1495
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1496 if (f_verbose)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1497 putchar ('\n');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1498 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1499
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1500
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1501
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1502 /***********************************************************************
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1503 Scanner
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1504 ***********************************************************************/
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1505
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1506 #ifdef DEBUG
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1507 #define INCREMENT_LINENO \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1508 do { \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1509 if (f_very_verbose) \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1510 { \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1511 ++yyline; \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1512 printf ("%d:\n", yyline); \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1513 } \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1514 else \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1515 ++yyline; \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1516 } while (0)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1517 #else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1518 #define INCREMENT_LINENO ++yyline
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1519 #endif
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1520
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1521 /* Define two macros for accessing the input buffer (current input
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1522 file). GET(C) sets C to the next input character and advances the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1523 input pointer. UNGET retracts the input pointer. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1524
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1525 #define GET(C) ((C) = *in++)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1526 #define UNGET() (--in)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1527
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1528
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1529 /* Process a preprocessor line. Value is the next character from the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1530 input buffer not consumed. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1531
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1532 int
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1533 process_pp_line ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1534 {
30138
d00767029418 (yylex): Accept string literals with newlines in them.
Gerd Moellmann <gerd@gnu.org>
parents: 29994
diff changeset
1535 int in_comment = 0, in_string = 0;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1536 int c;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1537 char *p = yytext;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1538
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1539 /* Skip over white space. The `#' has been consumed already. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1540 while (WHITEP (GET (c)))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1541 ;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1542
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1543 /* Read the preprocessor command (if any). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1544 while (IDENTP (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1545 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1546 *p++ = c;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1547 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1548 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1549
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1550 /* Is it a `define'? */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1551 *p = '\0';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1552
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1553 if (*yytext && streq (yytext, "define"))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1554 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1555 p = yytext;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1556 while (WHITEP (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1557 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1558 while (IDENTP (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1559 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1560 *p++ = c;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1561 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1562 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1563
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1564 *p = '\0';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1565
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1566 if (*yytext)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1567 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1568 char *regexp = matching_regexp ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1569 int pos = BUFFER_POS ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1570 add_define (yytext, regexp, pos);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1571 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1572 }
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1573
30138
d00767029418 (yylex): Accept string literals with newlines in them.
Gerd Moellmann <gerd@gnu.org>
parents: 29994
diff changeset
1574 while (c && (c != '\n' || in_comment || in_string))
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1575 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1576 if (c == '\\')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1577 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1578 else if (c == '/' && !in_comment)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1579 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1580 if (GET (c) == '*')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1581 in_comment = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1582 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1583 else if (c == '*' && in_comment)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1584 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1585 if (GET (c) == '/')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1586 in_comment = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1587 }
30138
d00767029418 (yylex): Accept string literals with newlines in them.
Gerd Moellmann <gerd@gnu.org>
parents: 29994
diff changeset
1588 else if (c == '"')
d00767029418 (yylex): Accept string literals with newlines in them.
Gerd Moellmann <gerd@gnu.org>
parents: 29994
diff changeset
1589 in_string = !in_string;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
1590
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1591 if (c == '\n')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1592 INCREMENT_LINENO;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1593
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1594 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1595 }
30138
d00767029418 (yylex): Accept string literals with newlines in them.
Gerd Moellmann <gerd@gnu.org>
parents: 29994
diff changeset
1596
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1597 return c;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1598 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1599
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1600
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1601 /* Value is the next token from the input buffer. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1602
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1603 int
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1604 yylex ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1605 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1606 int c;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1607 char end_char;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1608 char *p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1609
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1610 for (;;)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1611 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1612 while (WHITEP (GET (c)))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1613 ;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1614
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1615 switch (c)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1616 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1617 case '\n':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1618 INCREMENT_LINENO;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1619 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1620
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1621 case '\r':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1622 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1623
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1624 case 0:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1625 /* End of file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1626 return YYEOF;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1627
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1628 case '\\':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1629 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1630 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1631
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1632 case '"':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1633 case '\'':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1634 /* String and character constants. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1635 end_char = c;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1636 string_start = in;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1637 while (GET (c) && c != end_char)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1638 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1639 switch (c)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1640 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1641 case '\\':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1642 /* Escape sequences. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1643 if (!GET (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1644 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1645 if (end_char == '\'')
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
1646 yyerror ("EOF in character constant", NULL);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1647 else
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
1648 yyerror ("EOF in string constant", NULL);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1649 goto end_string;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1650 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1651 else switch (c)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1652 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1653 case '\n':
30138
d00767029418 (yylex): Accept string literals with newlines in them.
Gerd Moellmann <gerd@gnu.org>
parents: 29994
diff changeset
1654 INCREMENT_LINENO;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1655 case 'a':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1656 case 'b':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1657 case 'f':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1658 case 'n':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1659 case 'r':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1660 case 't':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1661 case 'v':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1662 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1663
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1664 case 'x':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1665 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1666 /* Hexadecimal escape sequence. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1667 int i;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1668 for (i = 0; i < 2; ++i)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1669 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1670 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1671
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1672 if (c >= '0' && c <= '7')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1673 ;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1674 else if (c >= 'a' && c <= 'f')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1675 ;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1676 else if (c >= 'A' && c <= 'F')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1677 ;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1678 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1679 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1680 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1681 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1682 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1683 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1684 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1685 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1686
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1687 case '0':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1688 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1689 /* Octal escape sequence. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1690 int i;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1691 for (i = 0; i < 3; ++i)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1692 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1693 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1694
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1695 if (c >= '0' && c <= '7')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1696 ;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1697 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1698 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1699 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1700 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1701 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1702 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1703 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1704 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1705
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1706 default:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1707 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1708 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1709 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1710
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1711 case '\n':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1712 if (end_char == '\'')
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
1713 yyerror ("newline in character constant", NULL);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1714 else
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
1715 yyerror ("newline in string constant", NULL);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1716 INCREMENT_LINENO;
30138
d00767029418 (yylex): Accept string literals with newlines in them.
Gerd Moellmann <gerd@gnu.org>
parents: 29994
diff changeset
1717 break;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1718
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1719 default:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1720 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1721 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1722 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1723
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1724 end_string:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1725 return end_char == '\'' ? CCHAR : CSTRING;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1726
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1727 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1728 case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1729 case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1730 case 'v': case 'w': case 'x': case 'y': case 'z':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1731 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1732 case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1733 case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1734 case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1735 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1736 /* Identifier and keywords. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1737 unsigned hash;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1738 struct kw *k;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1739
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1740 p = yytext;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1741 *p++ = hash = c;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1742
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1743 while (IDENTP (GET (*p)))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1744 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1745 hash = (hash << 1) ^ *p++;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1746 if (p == yytext_end - 1)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1747 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1748 int size = yytext_end - yytext;
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
1749 yytext = (char *) xrealloc (yytext, 2 * size);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1750 yytext_end = yytext + 2 * size;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1751 p = yytext + size - 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1752 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1753 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1754
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1755 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1756 *p = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1757
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1758 for (k = keyword_table[hash % KEYWORD_TABLE_SIZE]; k; k = k->next)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1759 if (streq (k->name, yytext))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1760 return k->tk;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1761
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1762 return IDENT;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1763 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1764
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1765 case '/':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1766 /* C and C++ comments, '/' and '/='. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1767 switch (GET (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1768 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1769 case '*':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1770 while (GET (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1771 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1772 switch (c)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1773 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1774 case '*':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1775 if (GET (c) == '/')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1776 goto comment_end;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1777 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1778 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1779 case '\\':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1780 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1781 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1782 case '\n':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1783 INCREMENT_LINENO;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1784 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1785 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1786 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1787 comment_end:;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1788 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1789
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1790 case '=':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1791 return DIVASGN;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1792
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1793 case '/':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1794 while (GET (c) && c != '\n')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1795 ;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1796 INCREMENT_LINENO;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1797 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1798
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1799 default:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1800 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1801 return '/';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1802 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1803 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1804
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1805 case '+':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1806 if (GET (c) == '+')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1807 return INC;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1808 else if (c == '=')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1809 return ADDASGN;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1810 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1811 return '+';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1812
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1813 case '-':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1814 switch (GET (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1815 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1816 case '-':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1817 return DEC;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1818 case '>':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1819 if (GET (c) == '*')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1820 return ARROWSTAR;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1821 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1822 return ARROW;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1823 case '=':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1824 return SUBASGN;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1825 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1826 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1827 return '-';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1828
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1829 case '*':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1830 if (GET (c) == '=')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1831 return MULASGN;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1832 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1833 return '*';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1834
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1835 case '%':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1836 if (GET (c) == '=')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1837 return MODASGN;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1838 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1839 return '%';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1840
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1841 case '|':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1842 if (GET (c) == '|')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1843 return LOR;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1844 else if (c == '=')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1845 return ORASGN;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1846 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1847 return '|';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1848
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1849 case '&':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1850 if (GET (c) == '&')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1851 return LAND;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1852 else if (c == '=')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1853 return ANDASGN;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1854 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1855 return '&';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1856
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1857 case '^':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1858 if (GET (c) == '=')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1859 return XORASGN;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1860 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1861 return '^';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1862
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1863 case '.':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1864 if (GET (c) == '*')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1865 return POINTSTAR;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1866 else if (c == '.')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1867 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1868 if (GET (c) != '.')
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
1869 yyerror ("invalid token '..' ('...' assumed)", NULL);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1870 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1871 return ELLIPSIS;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1872 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1873 else if (!DIGITP (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1874 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1875 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1876 return '.';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1877 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1878 goto mantissa;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1879
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1880 case ':':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1881 if (GET (c) == ':')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1882 return DCOLON;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1883 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1884 return ':';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1885
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1886 case '=':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1887 if (GET (c) == '=')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1888 return EQ;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1889 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1890 return '=';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1891
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1892 case '!':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1893 if (GET (c) == '=')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1894 return NE;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1895 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1896 return '!';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1897
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1898 case '<':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1899 switch (GET (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1900 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1901 case '=':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1902 return LE;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1903 case '<':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1904 if (GET (c) == '=')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1905 return LSHIFTASGN;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1906 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1907 return LSHIFT;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1908 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1909 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1910 return '<';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1911
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1912 case '>':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1913 switch (GET (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1914 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1915 case '=':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1916 return GE;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1917 case '>':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1918 if (GET (c) == '=')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1919 return RSHIFTASGN;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1920 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1921 return RSHIFT;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1922 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1923 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1924 return '>';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1925
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1926 case '#':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1927 c = process_pp_line ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1928 if (c == 0)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1929 return YYEOF;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1930 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1931
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1932 case '(': case ')': case '[': case ']': case '{': case '}':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1933 case ';': case ',': case '?': case '~':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1934 return c;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1935
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1936 case '0':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1937 yyival = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1938
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1939 if (GET (c) == 'x' || c == 'X')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1940 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1941 while (GET (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1942 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1943 if (DIGITP (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1944 yyival = yyival * 16 + c - '0';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1945 else if (c >= 'a' && c <= 'f')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1946 yyival = yyival * 16 + c - 'a' + 10;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1947 else if (c >= 'A' && c <= 'F')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1948 yyival = yyival * 16 + c - 'A' + 10;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1949 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1950 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1951 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1952
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1953 goto int_suffixes;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1954 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1955 else if (c == '.')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1956 goto mantissa;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1957
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1958 while (c >= '0' && c <= '7')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1959 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1960 yyival = (yyival << 3) + c - '0';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1961 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1962 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1963
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1964 int_suffixes:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1965 /* Integer suffixes. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1966 while (isalpha (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1967 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1968 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1969 return CINT;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1970
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1971 case '1': case '2': case '3': case '4': case '5': case '6':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1972 case '7': case '8': case '9':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1973 /* Integer or floating constant, part before '.'. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1974 yyival = c - '0';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1975
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1976 while (GET (c) && DIGITP (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1977 yyival = 10 * yyival + c - '0';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1978
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1979 if (c != '.')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1980 goto int_suffixes;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1981
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1982 mantissa:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1983 /* Digits following '.'. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1984 while (DIGITP (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1985 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1986
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1987 /* Optional exponent. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1988 if (c == 'E' || c == 'e')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1989 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1990 if (GET (c) == '-' || c == '+')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1991 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1992
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1993 while (DIGITP (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1994 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1995 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1996
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1997 /* Optional type suffixes. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1998 while (isalpha (c))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1999 GET (c);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2000 UNGET ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2001 return CFLOAT;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2002
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2003 default:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2004 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2005 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2006 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2007 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2008
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2009
35591
92a64125d228 (matching_regexp_buffer, matching_regexp_end_buf):
Gerd Moellmann <gerd@gnu.org>
parents: 35459
diff changeset
2010 /* Actually local to matching_regexp. These variables must be in
92a64125d228 (matching_regexp_buffer, matching_regexp_end_buf):
Gerd Moellmann <gerd@gnu.org>
parents: 35459
diff changeset
2011 global scope for the case that `static' get's defined away. */
92a64125d228 (matching_regexp_buffer, matching_regexp_end_buf):
Gerd Moellmann <gerd@gnu.org>
parents: 35459
diff changeset
2012
92a64125d228 (matching_regexp_buffer, matching_regexp_end_buf):
Gerd Moellmann <gerd@gnu.org>
parents: 35459
diff changeset
2013 static char *matching_regexp_buffer, *matching_regexp_end_buf;
92a64125d228 (matching_regexp_buffer, matching_regexp_end_buf):
Gerd Moellmann <gerd@gnu.org>
parents: 35459
diff changeset
2014
92a64125d228 (matching_regexp_buffer, matching_regexp_end_buf):
Gerd Moellmann <gerd@gnu.org>
parents: 35459
diff changeset
2015
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2016 /* Value is the string from the start of the line to the current
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2017 position in the input buffer, or maybe a bit more if that string is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2018 shorter than min_regexp. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2019
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2020 char *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2021 matching_regexp ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2022 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2023 char *p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2024 char *s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2025 char *t;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2026
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2027 if (!f_regexps)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2028 return NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2029
35591
92a64125d228 (matching_regexp_buffer, matching_regexp_end_buf):
Gerd Moellmann <gerd@gnu.org>
parents: 35459
diff changeset
2030 if (matching_regexp_buffer == NULL)
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2031 {
35591
92a64125d228 (matching_regexp_buffer, matching_regexp_end_buf):
Gerd Moellmann <gerd@gnu.org>
parents: 35459
diff changeset
2032 matching_regexp_buffer = (char *) xmalloc (max_regexp);
92a64125d228 (matching_regexp_buffer, matching_regexp_end_buf):
Gerd Moellmann <gerd@gnu.org>
parents: 35459
diff changeset
2033 matching_regexp_end_buf = &matching_regexp_buffer[max_regexp] - 1;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2034 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2035
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2036 /* Scan back to previous newline of buffer start. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2037 for (p = in - 1; p > inbuffer && *p != '\n'; --p)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2038 ;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2039
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2040 if (*p == '\n')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2041 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2042 while (in - p < min_regexp && p > inbuffer)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2043 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2044 /* Line probably not significant enough */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2045 for (--p; p >= inbuffer && *p != '\n'; --p)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2046 ;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2047 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2048 if (*p == '\n')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2049 ++p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2050 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2051
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2052 /* Copy from end to make sure significant portions are included.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2053 This implies that in the browser a regular expressing of the form
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2054 `^.*{regexp}' has to be used. */
35591
92a64125d228 (matching_regexp_buffer, matching_regexp_end_buf):
Gerd Moellmann <gerd@gnu.org>
parents: 35459
diff changeset
2055 for (s = matching_regexp_end_buf - 1, t = in;
92a64125d228 (matching_regexp_buffer, matching_regexp_end_buf):
Gerd Moellmann <gerd@gnu.org>
parents: 35459
diff changeset
2056 s > matching_regexp_buffer && t > p;)
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2057 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2058 *--s = *--t;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2059
41112
1ba618f8fdb5 (matching_regexp): Escape '\\'.
Gerd Moellmann <gerd@gnu.org>
parents: 39514
diff changeset
2060 if (*s == '"' || *s == '\\')
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2061 *--s = '\\';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2062 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2063
35591
92a64125d228 (matching_regexp_buffer, matching_regexp_end_buf):
Gerd Moellmann <gerd@gnu.org>
parents: 35459
diff changeset
2064 *(matching_regexp_end_buf - 1) = '\0';
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2065 return xstrdup (s);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2066 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2067
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2068
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2069 /* Return a printable representation of token T. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2070
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2071 char *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2072 token_string (t)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2073 int t;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2074 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2075 static char b[3];
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2076
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2077 switch (t)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2078 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2079 case CSTRING: return "string constant";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2080 case CCHAR: return "char constant";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2081 case CINT: return "int constant";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2082 case CFLOAT: return "floating constant";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2083 case ELLIPSIS: return "...";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2084 case LSHIFTASGN: return "<<=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2085 case RSHIFTASGN: return ">>=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2086 case ARROWSTAR: return "->*";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2087 case IDENT: return "identifier";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2088 case DIVASGN: return "/=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2089 case INC: return "++";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2090 case ADDASGN: return "+=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2091 case DEC: return "--";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2092 case ARROW: return "->";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2093 case SUBASGN: return "-=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2094 case MULASGN: return "*=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2095 case MODASGN: return "%=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2096 case LOR: return "||";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2097 case ORASGN: return "|=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2098 case LAND: return "&&";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2099 case ANDASGN: return "&=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2100 case XORASGN: return "^=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2101 case POINTSTAR: return ".*";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2102 case DCOLON: return "::";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2103 case EQ: return "==";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2104 case NE: return "!=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2105 case LE: return "<=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2106 case LSHIFT: return "<<";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2107 case GE: return ">=";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2108 case RSHIFT: return ">>";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2109 case ASM: return "asm";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2110 case AUTO: return "auto";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2111 case BREAK: return "break";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2112 case CASE: return "case";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2113 case CATCH: return "catch";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2114 case CHAR: return "char";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2115 case CLASS: return "class";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2116 case CONST: return "const";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2117 case CONTINUE: return "continue";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2118 case DEFAULT: return "default";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2119 case DELETE: return "delete";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2120 case DO: return "do";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2121 case DOUBLE: return "double";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2122 case ELSE: return "else";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2123 case ENUM: return "enum";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2124 case EXTERN: return "extern";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2125 case FLOAT: return "float";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2126 case FOR: return "for";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2127 case FRIEND: return "friend";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2128 case GOTO: return "goto";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2129 case IF: return "if";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2130 case T_INLINE: return "inline";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2131 case INT: return "int";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2132 case LONG: return "long";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2133 case NEW: return "new";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2134 case OPERATOR: return "operator";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2135 case PRIVATE: return "private";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2136 case PROTECTED: return "protected";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2137 case PUBLIC: return "public";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2138 case REGISTER: return "register";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2139 case RETURN: return "return";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2140 case SHORT: return "short";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2141 case SIGNED: return "signed";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2142 case SIZEOF: return "sizeof";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2143 case STATIC: return "static";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2144 case STRUCT: return "struct";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2145 case SWITCH: return "switch";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2146 case TEMPLATE: return "template";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2147 case THIS: return "this";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2148 case THROW: return "throw";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2149 case TRY: return "try";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2150 case TYPEDEF: return "typedef";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2151 case UNION: return "union";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2152 case UNSIGNED: return "unsigned";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2153 case VIRTUAL: return "virtual";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2154 case VOID: return "void";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2155 case VOLATILE: return "volatile";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2156 case WHILE: return "while";
29994
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2157 case MUTABLE: return "mutable";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2158 case BOOL: return "bool";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2159 case TRUE: return "true";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2160 case FALSE: return "false";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2161 case SIGNATURE: return "signature";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2162 case NAMESPACE: return "namespace";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2163 case EXPLICIT: return "explicit";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2164 case TYPENAME: return "typename";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2165 case CONST_CAST: return "const_cast";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2166 case DYNAMIC_CAST: return "dynamic_cast";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2167 case REINTERPRET_CAST: return "reinterpret_cast";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2168 case STATIC_CAST: return "static_cast";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2169 case TYPEID: return "typeid";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2170 case USING: return "using";
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2171 case WCHAR: return "wchar_t";
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2172 case YYEOF: return "EOF";
29994
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2173
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2174 default:
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2175 if (t < 255)
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2176 {
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2177 b[0] = t;
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2178 b[1] = '\0';
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2179 return b;
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2180 }
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2181 else
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2182 return "???";
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2183 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2184 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2185
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2186
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2187 /* Reinitialize the scanner for a new input file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2188
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2189 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2190 re_init_scanner ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2191 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2192 in = inbuffer;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2193 yyline = 1;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2194
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2195 if (yytext == NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2196 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2197 int size = 256;
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
2198 yytext = (char *) xmalloc (size * sizeof *yytext);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2199 yytext_end = yytext + size;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2200 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2201 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2202
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2203
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2204 /* Insert a keyword NAME with token value TK into the keyword hash
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2205 table. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2206
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2207 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2208 insert_keyword (name, tk)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2209 char *name;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2210 int tk;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2211 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2212 char *s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2213 unsigned h = 0;
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
2214 struct kw *k = (struct kw *) xmalloc (sizeof *k);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2215
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2216 for (s = name; *s; ++s)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2217 h = (h << 1) ^ *s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2218
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2219 h %= KEYWORD_TABLE_SIZE;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2220 k->name = name;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2221 k->tk = tk;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2222 k->next = keyword_table[h];
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2223 keyword_table[h] = k;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2224 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2225
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2226
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2227 /* Initialize the scanner for the first file. This sets up the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2228 character class vectors and fills the keyword hash table. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2229
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2230 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2231 init_scanner ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2232 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2233 int i;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2234
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2235 /* Allocate the input buffer */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2236 inbuffer_size = READ_CHUNK_SIZE + 1;
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
2237 inbuffer = in = (char *) xmalloc (inbuffer_size);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2238 yyline = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2239
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2240 /* Set up character class vectors. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2241 for (i = 0; i < sizeof is_ident; ++i)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2242 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2243 if (i == '_' || isalnum (i))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2244 is_ident[i] = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2245
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2246 if (i >= '0' && i <= '9')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2247 is_digit[i] = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2248
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2249 if (i == ' ' || i == '\t' || i == '\f' || i == '\v')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2250 is_white[i] = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2251 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2252
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2253 /* Fill keyword hash table. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2254 insert_keyword ("and", LAND);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2255 insert_keyword ("and_eq", ANDASGN);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2256 insert_keyword ("asm", ASM);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2257 insert_keyword ("auto", AUTO);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2258 insert_keyword ("bitand", '&');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2259 insert_keyword ("bitor", '|');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2260 insert_keyword ("bool", BOOL);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2261 insert_keyword ("break", BREAK);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2262 insert_keyword ("case", CASE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2263 insert_keyword ("catch", CATCH);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2264 insert_keyword ("char", CHAR);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2265 insert_keyword ("class", CLASS);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2266 insert_keyword ("compl", '~');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2267 insert_keyword ("const", CONST);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2268 insert_keyword ("const_cast", CONST_CAST);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2269 insert_keyword ("continue", CONTINUE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2270 insert_keyword ("default", DEFAULT);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2271 insert_keyword ("delete", DELETE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2272 insert_keyword ("do", DO);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2273 insert_keyword ("double", DOUBLE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2274 insert_keyword ("dynamic_cast", DYNAMIC_CAST);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2275 insert_keyword ("else", ELSE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2276 insert_keyword ("enum", ENUM);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2277 insert_keyword ("explicit", EXPLICIT);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2278 insert_keyword ("extern", EXTERN);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2279 insert_keyword ("false", FALSE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2280 insert_keyword ("float", FLOAT);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2281 insert_keyword ("for", FOR);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2282 insert_keyword ("friend", FRIEND);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2283 insert_keyword ("goto", GOTO);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2284 insert_keyword ("if", IF);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2285 insert_keyword ("inline", T_INLINE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2286 insert_keyword ("int", INT);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2287 insert_keyword ("long", LONG);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2288 insert_keyword ("mutable", MUTABLE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2289 insert_keyword ("namespace", NAMESPACE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2290 insert_keyword ("new", NEW);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2291 insert_keyword ("not", '!');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2292 insert_keyword ("not_eq", NE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2293 insert_keyword ("operator", OPERATOR);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2294 insert_keyword ("or", LOR);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2295 insert_keyword ("or_eq", ORASGN);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2296 insert_keyword ("private", PRIVATE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2297 insert_keyword ("protected", PROTECTED);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2298 insert_keyword ("public", PUBLIC);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2299 insert_keyword ("register", REGISTER);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2300 insert_keyword ("reinterpret_cast", REINTERPRET_CAST);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2301 insert_keyword ("return", RETURN);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2302 insert_keyword ("short", SHORT);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2303 insert_keyword ("signed", SIGNED);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2304 insert_keyword ("sizeof", SIZEOF);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2305 insert_keyword ("static", STATIC);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2306 insert_keyword ("static_cast", STATIC_CAST);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2307 insert_keyword ("struct", STRUCT);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2308 insert_keyword ("switch", SWITCH);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2309 insert_keyword ("template", TEMPLATE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2310 insert_keyword ("this", THIS);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2311 insert_keyword ("throw", THROW);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2312 insert_keyword ("true", TRUE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2313 insert_keyword ("try", TRY);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2314 insert_keyword ("typedef", TYPEDEF);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2315 insert_keyword ("typeid", TYPEID);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2316 insert_keyword ("typename", TYPENAME);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2317 insert_keyword ("union", UNION);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2318 insert_keyword ("unsigned", UNSIGNED);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2319 insert_keyword ("using", USING);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2320 insert_keyword ("virtual", VIRTUAL);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2321 insert_keyword ("void", VOID);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2322 insert_keyword ("volatile", VOLATILE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2323 insert_keyword ("wchar_t", WCHAR);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2324 insert_keyword ("while", WHILE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2325 insert_keyword ("xor", '^');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2326 insert_keyword ("xor_eq", XORASGN);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2327 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2328
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2329
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2330
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2331 /***********************************************************************
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2332 Parser
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2333 ***********************************************************************/
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2334
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2335 /* Match the current lookahead token and set it to the next token. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2336
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2337 #define MATCH() (tk = yylex ())
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2338
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2339 /* Return the lookahead token. If current lookahead token is cleared,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2340 read a new token. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2341
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2342 #define LA1 (tk == -1 ? (tk = yylex ()) : tk)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2343
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2344 /* Is the current lookahead equal to the token T? */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2345
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2346 #define LOOKING_AT(T) (tk == (T))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2347
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2348 /* Is the current lookahead one of T1 or T2? */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2349
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2350 #define LOOKING_AT2(T1, T2) (tk == (T1) || tk == (T2))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2351
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2352 /* Is the current lookahead one of T1, T2 or T3? */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2353
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2354 #define LOOKING_AT3(T1, T2, T3) (tk == (T1) || tk == (T2) || tk == (T3))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2355
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2356 /* Is the current lookahead one of T1...T4? */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2357
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2358 #define LOOKING_AT4(T1, T2, T3, T4) \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2359 (tk == (T1) || tk == (T2) || tk == (T3) || tk == (T4))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2360
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2361 /* Match token T if current lookahead is T. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2362
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2363 #define MATCH_IF(T) if (LOOKING_AT (T)) MATCH (); else ((void) 0)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2364
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2365 /* Skip to matching token if current token is T. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2366
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2367 #define SKIP_MATCHING_IF(T) \
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2368 if (LOOKING_AT (T)) skip_matching (); else ((void) 0)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2369
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2370
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2371 /* Skip forward until a given token TOKEN or YYEOF is seen and return
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2372 the current lookahead token after skipping. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2373
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2374 int
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2375 skip_to (token)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2376 int token;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2377 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2378 while (!LOOKING_AT2 (YYEOF, token))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2379 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2380 return tk;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2381 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2382
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2383 /* Skip over pairs of tokens (parentheses, square brackets,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2384 angle brackets, curly brackets) matching the current lookahead. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2385
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2386 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2387 skip_matching ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2388 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2389 int open, close, n;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2390
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2391 switch (open = LA1)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2392 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2393 case '{':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2394 close = '}';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2395 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2396
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2397 case '(':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2398 close = ')';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2399 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2400
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2401 case '<':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2402 close = '>';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2403 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2404
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2405 case '[':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2406 close = ']';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2407 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2408
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2409 default:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2410 abort ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2411 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2412
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2413 for (n = 0;;)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2414 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2415 if (LOOKING_AT (open))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2416 ++n;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2417 else if (LOOKING_AT (close))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2418 --n;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2419 else if (LOOKING_AT (YYEOF))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2420 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2421
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2422 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2423
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2424 if (n == 0)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2425 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2426 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2427 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2428
44819
9ce753124d1b (skip_initializer): Return void.
Pavel Janík <Pavel@Janik.cz>
parents: 44719
diff changeset
2429 void
44220
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2430 skip_initializer ()
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2431 {
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2432 for (;;)
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2433 {
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2434 switch (LA1)
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2435 {
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2436 case ';':
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2437 case ',':
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2438 case YYEOF:
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2439 return;
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2440
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2441 case '{':
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2442 case '[':
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2443 case '(':
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2444 skip_matching ();
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2445 break;
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2446
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2447 default:
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2448 MATCH ();
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2449 break;
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2450 }
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2451 }
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
2452 }
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2453
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2454 /* Build qualified namespace alias (A::B::c) and return it. */
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2455
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2456 struct link *
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2457 match_qualified_namespace_alias ()
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2458 {
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2459 struct link *head = NULL;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2460 struct link *cur = NULL;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2461 struct link *tmp = NULL;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2462
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2463 for (;;)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2464 {
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2465 MATCH ();
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2466 switch (LA1)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2467 {
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2468 case IDENT:
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2469 tmp = (struct link *) xmalloc (sizeof *cur);
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2470 tmp->sym = find_namespace (yytext, cur);
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2471 tmp->next = NULL;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2472 if (head)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2473 {
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2474 cur = cur->next = tmp;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2475 }
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2476 else
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2477 {
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2478 head = cur = tmp;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2479 }
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2480 break;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2481 case DCOLON:
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2482 /* Just skip */
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2483 break;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2484 default:
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2485 return head;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2486 break;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2487 }
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2488 }
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2489 }
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
2490
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2491 /* Re-initialize the parser by resetting the lookahead token. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2492
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2493 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2494 re_init_parser ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2495 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2496 tk = -1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2497 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2498
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2499
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2500 /* Parse a parameter list, including the const-specifier,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2501 pure-specifier, and throw-list that may follow a parameter list.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2502 Return in FLAGS what was seen following the parameter list.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2503 Returns a hash code for the parameter types. This value is used to
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2504 distinguish between overloaded functions. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2505
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2506 unsigned
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2507 parm_list (flags)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2508 int *flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2509 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2510 unsigned hash = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2511 int type_seen = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2512
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2513 while (!LOOKING_AT2 (YYEOF, ')'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2514 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2515 switch (LA1)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2516 {
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44819
diff changeset
2517 /* Skip over grouping parens or parameter lists in parameter
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2518 declarations. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2519 case '(':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2520 skip_matching ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2521 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2522
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2523 /* Next parameter. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2524 case ',':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2525 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2526 type_seen = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2527 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2528
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2529 /* Ignore the scope part of types, if any. This is because
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2530 some types need scopes when defined outside of a class body,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2531 and don't need them inside the class body. This means that
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2532 we have to look for the last IDENT in a sequence of
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2533 IDENT::IDENT::... */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2534 case IDENT:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2535 if (!type_seen)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2536 {
29994
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2537 char *last_id;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2538 unsigned ident_type_hash = 0;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2539
29994
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2540 parse_qualified_param_ident_or_type (&last_id);
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2541 if (last_id)
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2542 {
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2543 /* LAST_ID null means something like `X::*'. */
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2544 for (; *last_id; ++last_id)
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2545 ident_type_hash = (ident_type_hash << 1) ^ *last_id;
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2546 hash = (hash << 1) ^ ident_type_hash;
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2547 type_seen = 1;
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
2548 }
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2549 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2550 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2551 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2552 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2553
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2554 case VOID:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2555 /* This distinction is made to make `func (void)' equivalent
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2556 to `func ()'. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2557 type_seen = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2558 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2559 if (!LOOKING_AT (')'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2560 hash = (hash << 1) ^ VOID;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2561 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2562
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2563 case BOOL: case CHAR: case CLASS: case CONST:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2564 case DOUBLE: case ENUM: case FLOAT: case INT:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2565 case LONG: case SHORT: case SIGNED: case STRUCT:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2566 case UNION: case UNSIGNED: case VOLATILE: case WCHAR:
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2567 case ELLIPSIS:
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2568 type_seen = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2569 hash = (hash << 1) ^ LA1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2570 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2571 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2572
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2573 case '*': case '&': case '[': case ']':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2574 hash = (hash << 1) ^ LA1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2575 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2576 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2577
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2578 default:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2579 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2580 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2581 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2582 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2583
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2584 if (LOOKING_AT (')'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2585 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2586 MATCH ();
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2587
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2588 if (LOOKING_AT (CONST))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2589 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2590 /* We can overload the same function on `const' */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2591 hash = (hash << 1) ^ CONST;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2592 SET_FLAG (*flags, F_CONST);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2593 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2594 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2595
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2596 if (LOOKING_AT (THROW))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2597 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2598 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2599 SKIP_MATCHING_IF ('(');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2600 SET_FLAG (*flags, F_THROW);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2601 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2602
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2603 if (LOOKING_AT ('='))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2604 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2605 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2606 if (LOOKING_AT (CINT) && yyival == 0)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2607 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2608 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2609 SET_FLAG (*flags, F_PURE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2610 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2611 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2612 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2613
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2614 return hash;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2615 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2616
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2617
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2618 /* Print position info to stdout. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2619
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2620 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2621 print_info ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2622 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2623 if (info_position >= 0 && BUFFER_POS () <= info_position)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2624 if (info_cls)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2625 printf ("(\"%s\" \"%s\" \"%s\" %d)\n",
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2626 info_cls->name, sym_scope (info_cls),
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2627 info_member->name, info_where);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2628 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2629
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2630
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2631 /* Parse a member declaration within the class body of CLS. VIS is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2632 the access specifier for the member (private, protected,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2633 public). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2634
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2635 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2636 member (cls, vis)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2637 struct sym *cls;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2638 int vis;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2639 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2640 char *id = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2641 int sc = SC_MEMBER;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2642 char *regexp = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2643 int pos;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2644 int is_constructor;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2645 int anonymous = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2646 int flags = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2647 int class_tag;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2648 int type_seen = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2649 int paren_seen = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2650 unsigned hash = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2651 int tilde = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2652
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2653 while (!LOOKING_AT4 (';', '{', '}', YYEOF))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2654 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2655 switch (LA1)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2656 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2657 default:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2658 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2659 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2660
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2661 /* A function or class may follow. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2662 case TEMPLATE:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2663 MATCH();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2664 SET_FLAG (flags, F_TEMPLATE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2665 /* Skip over template argument list */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2666 SKIP_MATCHING_IF ('<');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2667 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2668
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2669 case EXPLICIT:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2670 SET_FLAG (flags, F_EXPLICIT);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2671 goto typeseen;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2672
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2673 case MUTABLE:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2674 SET_FLAG (flags, F_MUTABLE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2675 goto typeseen;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2676
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2677 case T_INLINE:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2678 SET_FLAG (flags, F_INLINE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2679 goto typeseen;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2680
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2681 case VIRTUAL:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2682 SET_FLAG (flags, F_VIRTUAL);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2683 goto typeseen;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2684
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2685 case '[':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2686 skip_matching ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2687 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2688
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2689 case ENUM:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2690 sc = SC_TYPE;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2691 goto typeseen;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2692
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2693 case TYPEDEF:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2694 sc = SC_TYPE;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2695 goto typeseen;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2696
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2697 case FRIEND:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2698 sc = SC_FRIEND;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2699 goto typeseen;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2700
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2701 case STATIC:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2702 sc = SC_STATIC;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2703 goto typeseen;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2704
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2705 case '~':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2706 tilde = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2707 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2708 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2709
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2710 case IDENT:
35459
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
2711 /* Remember IDENTS seen so far. Among these will be the member
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
2712 name. */
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
2713 id = (char *) xrealloc (id, strlen (yytext) + 2);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2714 if (tilde)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2715 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2716 *id = '~';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2717 strcpy (id + 1, yytext);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2718 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2719 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2720 strcpy (id, yytext);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2721 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2722 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2723
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2724 case OPERATOR:
35459
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
2725 {
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
2726 char *s = operator_name (&sc);
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
2727 id = (char *) xrealloc (id, strlen (s) + 1);
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
2728 strcpy (id, s);
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
2729 }
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2730 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2731
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2732 case '(':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2733 /* Most probably the beginning of a parameter list. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2734 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2735 paren_seen = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2736
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2737 if (id && cls)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2738 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2739 if (!(is_constructor = streq (id, cls->name)))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2740 regexp = matching_regexp ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2741 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2742 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2743 is_constructor = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2744
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2745 pos = BUFFER_POS ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2746 hash = parm_list (&flags);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2747
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2748 if (is_constructor)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2749 regexp = matching_regexp ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2750
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2751 if (id && cls != NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2752 add_member_decl (cls, id, regexp, pos, hash, 0, sc, vis, flags);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2753
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2754 while (!LOOKING_AT3 (';', '{', YYEOF))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2755 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2756
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2757 if (LOOKING_AT ('{') && id && cls)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2758 add_member_defn (cls, id, regexp, pos, hash, 0, sc, flags);
35459
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
2759
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
2760 xfree (id);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2761 id = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2762 sc = SC_MEMBER;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2763 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2764
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2765 case STRUCT: case UNION: case CLASS:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2766 /* Nested class */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2767 class_tag = LA1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2768 type_seen = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2769 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2770 anonymous = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2771
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2772 /* More than one ident here to allow for MS-DOS specialties
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2773 like `_export class' etc. The last IDENT seen counts
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2774 as the class name. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2775 while (!LOOKING_AT4 (YYEOF, ';', ':', '{'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2776 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2777 if (LOOKING_AT (IDENT))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2778 anonymous = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2779 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2780 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2781
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2782 if (LOOKING_AT2 (':', '{'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2783 class_definition (anonymous ? NULL : cls, class_tag, flags, 1);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2784 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2785 skip_to (';');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2786 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2787
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2788 case INT: case CHAR: case LONG: case UNSIGNED:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2789 case SIGNED: case CONST: case DOUBLE: case VOID:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2790 case SHORT: case VOLATILE: case BOOL: case WCHAR:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2791 case TYPENAME:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2792 typeseen:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2793 type_seen = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2794 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2795 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2796 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2797 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2798
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2799 if (LOOKING_AT (';'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2800 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2801 /* The end of a member variable, a friend declaration or an access
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2802 declaration. We don't want to add friend classes as members. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2803 if (id && sc != SC_FRIEND && cls)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2804 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2805 regexp = matching_regexp ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2806 pos = BUFFER_POS ();
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2807
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2808 if (cls != NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2809 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2810 if (type_seen || !paren_seen)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2811 add_member_decl (cls, id, regexp, pos, 0, 1, sc, vis, 0);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2812 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2813 add_member_decl (cls, id, regexp, pos, hash, 0, sc, vis, 0);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2814 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2815 }
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2816
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2817 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2818 print_info ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2819 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2820 else if (LOOKING_AT ('{'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2821 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2822 /* A named enum. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2823 if (sc == SC_TYPE && id && cls)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2824 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2825 regexp = matching_regexp ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2826 pos = BUFFER_POS ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2827
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2828 if (cls != NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2829 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2830 add_member_decl (cls, id, regexp, pos, 0, 1, sc, vis, 0);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2831 add_member_defn (cls, id, regexp, pos, 0, 1, sc, 0);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2832 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2833 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2834
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2835 skip_matching ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2836 print_info ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2837 }
35459
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
2838
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
2839 xfree (id);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2840 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2841
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2842
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2843 /* Parse the body of class CLS. TAG is the tag of the class (struct,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2844 union, class). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2845
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2846 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2847 class_body (cls, tag)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2848 struct sym *cls;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2849 int tag;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2850 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2851 int vis = tag == CLASS ? PRIVATE : PUBLIC;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2852 int temp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2853
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2854 while (!LOOKING_AT2 (YYEOF, '}'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2855 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2856 switch (LA1)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2857 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2858 case PRIVATE: case PROTECTED: case PUBLIC:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2859 temp = LA1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2860 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2861
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2862 if (LOOKING_AT (':'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2863 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2864 vis = temp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2865 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2866 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2867 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2868 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2869 /* Probably conditional compilation for inheritance list.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2870 We don't known whether there comes more of this.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2871 This is only a crude fix that works most of the time. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2872 do
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2873 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2874 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2875 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2876 while (LOOKING_AT2 (IDENT, ',')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2877 || LOOKING_AT3 (PUBLIC, PROTECTED, PRIVATE));
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2878 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2879 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2880
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2881 case TYPENAME:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2882 case USING:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2883 skip_to (';');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2884 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2885
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2886 /* Try to synchronize */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2887 case CHAR: case CLASS: case CONST:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2888 case DOUBLE: case ENUM: case FLOAT: case INT:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2889 case LONG: case SHORT: case SIGNED: case STRUCT:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2890 case UNION: case UNSIGNED: case VOID: case VOLATILE:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2891 case TYPEDEF: case STATIC: case T_INLINE: case FRIEND:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2892 case VIRTUAL: case TEMPLATE: case IDENT: case '~':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2893 case BOOL: case WCHAR: case EXPLICIT: case MUTABLE:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2894 member (cls, vis);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2895 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2896
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2897 default:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2898 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2899 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2900 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2901 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2902 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2903
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2904
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2905 /* Parse a qualified identifier. Current lookahead is IDENT. A
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2906 qualified ident has the form `X<..>::Y<...>::T<...>. Returns a
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2907 symbol for that class. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2908
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2909 struct sym *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2910 parse_classname ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2911 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2912 struct sym *last_class = NULL;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2913
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2914 while (LOOKING_AT (IDENT))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2915 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2916 last_class = add_sym (yytext, last_class);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2917 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2918
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2919 if (LOOKING_AT ('<'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2920 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2921 skip_matching ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2922 SET_FLAG (last_class->flags, F_TEMPLATE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2923 }
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2924
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2925 if (!LOOKING_AT (DCOLON))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2926 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2927
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2928 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2929 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2930
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2931 return last_class;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2932 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2933
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2934
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2935 /* Parse an operator name. Add the `static' flag to *SC if an
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2936 implicitly static operator has been parsed. Value is a pointer to
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2937 a static buffer holding the constructed operator name string. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2938
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2939 char *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2940 operator_name (sc)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2941 int *sc;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2942 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2943 static int id_size = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2944 static char *id = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2945 char *s;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2946 int len;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2947
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2948 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2949
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2950 if (LOOKING_AT2 (NEW, DELETE))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2951 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2952 /* `new' and `delete' are implicitly static. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2953 if (*sc != SC_FRIEND)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2954 *sc = SC_STATIC;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2955
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2956 s = token_string (LA1);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2957 MATCH ();
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2958
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2959 len = strlen (s) + 10;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2960 if (len > id_size)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2961 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2962 int new_size = max (len, 2 * id_size);
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
2963 id = (char *) xrealloc (id, new_size);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2964 id_size = new_size;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2965 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2966 strcpy (id, s);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2967
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2968 /* Vector new or delete? */
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2969 if (LOOKING_AT ('['))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2970 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2971 strcat (id, "[");
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2972 MATCH ();
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
2973
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2974 if (LOOKING_AT (']'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2975 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2976 strcat (id, "]");
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2977 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2978 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2979 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2980 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2981 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2982 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2983 int tokens_matched = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2984
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2985 len = 20;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2986 if (len > id_size)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2987 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2988 int new_size = max (len, 2 * id_size);
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
2989 id = (char *) xrealloc (id, new_size);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2990 id_size = new_size;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2991 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2992 strcpy (id, "operator");
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2993
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2994 /* Beware access declarations of the form "X::f;" Beware of
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2995 `operator () ()'. Yet another difficulty is found in
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2996 GCC 2.95's STL: `operator == __STL_NULL_TMPL_ARGS (...'. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2997 while (!(LOOKING_AT ('(') && tokens_matched)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2998 && !LOOKING_AT2 (';', YYEOF))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2999 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3000 s = token_string (LA1);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3001 len += strlen (s) + 2;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3002 if (len > id_size)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3003 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3004 int new_size = max (len, 2 * id_size);
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
3005 id = (char *) xrealloc (id, new_size);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3006 id_size = new_size;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3007 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3008
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3009 if (*s != ')' && *s != ']')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3010 strcat (id, " ");
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3011 strcat (id, s);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3012 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3013
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3014 /* If this is a simple operator like `+', stop now. */
34610
beea10bab07e (operator_name): Cast argument of isalpha to
Gerd Moellmann <gerd@gnu.org>
parents: 34522
diff changeset
3015 if (!isalpha ((unsigned char) *s) && *s != '(' && *s != '[')
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3016 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3017
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3018 ++tokens_matched;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3019 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3020 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3021
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3022 return id;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3023 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3024
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3025
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3026 /* This one consumes the last IDENT of a qualified member name like
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3027 `X::Y::z'. This IDENT is returned in LAST_ID. Value is the
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3028 symbol structure for the ident. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3029
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3030 struct sym *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3031 parse_qualified_ident_or_type (last_id)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3032 char **last_id;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3033 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3034 struct sym *cls = NULL;
36478
742df7c33f75 (parse_qualified_param_ident_or_type): Return a
Gerd Moellmann <gerd@gnu.org>
parents: 35591
diff changeset
3035 char *id = NULL;
742df7c33f75 (parse_qualified_param_ident_or_type): Return a
Gerd Moellmann <gerd@gnu.org>
parents: 35591
diff changeset
3036 size_t id_size = 0;
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3037 int enter = 0;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3038
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3039 while (LOOKING_AT (IDENT))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3040 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3041 int len = strlen (yytext) + 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3042 if (len > id_size)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3043 {
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
3044 id = (char *) xrealloc (id, len);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3045 id_size = len;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3046 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3047 strcpy (id, yytext);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3048 *last_id = id;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3049 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3050
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3051 SKIP_MATCHING_IF ('<');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3052
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3053 if (LOOKING_AT (DCOLON))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3054 {
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3055 struct sym *pcn = NULL;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3056 struct link *pna = check_namespace_alias (id);
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3057 if (pna)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3058 {
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3059 do
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3060 {
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3061 enter_namespace (pna->sym->name);
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3062 enter++;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3063 pna = pna->next;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3064 }
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3065 while (pna);
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3066 }
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3067 else if ((pcn = check_namespace (id, current_namespace)))
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3068 {
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3069 enter_namespace (pcn->name);
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3070 enter++;
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3071 }
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3072 else
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3073 cls = add_sym (id, cls);
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3074
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3075 *last_id = NULL;
36478
742df7c33f75 (parse_qualified_param_ident_or_type): Return a
Gerd Moellmann <gerd@gnu.org>
parents: 35591
diff changeset
3076 xfree (id);
742df7c33f75 (parse_qualified_param_ident_or_type): Return a
Gerd Moellmann <gerd@gnu.org>
parents: 35591
diff changeset
3077 id = NULL;
742df7c33f75 (parse_qualified_param_ident_or_type): Return a
Gerd Moellmann <gerd@gnu.org>
parents: 35591
diff changeset
3078 id_size = 0;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3079 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3080 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3081 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3082 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3083 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3084
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3085 while (enter--)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3086 leave_namespace();
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3087
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3088 return cls;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3089 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3090
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3091
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3092 /* This one consumes the last IDENT of a qualified member name like
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3093 `X::Y::z'. This IDENT is returned in LAST_ID. Value is the
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3094 symbol structure for the ident. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3095
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3096 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3097 parse_qualified_param_ident_or_type (last_id)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3098 char **last_id;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3099 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3100 struct sym *cls = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3101 static char *id = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3102 static int id_size = 0;
29994
b5da88c41066 (token_string): Add missing tokens.
Gerd Moellmann <gerd@gnu.org>
parents: 29889
diff changeset
3103
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3104 while (LOOKING_AT (IDENT))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3105 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3106 int len = strlen (yytext) + 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3107 if (len > id_size)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3108 {
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
3109 id = (char *) xrealloc (id, len);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3110 id_size = len;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3111 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3112 strcpy (id, yytext);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3113 *last_id = id;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3114 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3115
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3116 SKIP_MATCHING_IF ('<');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3117
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3118 if (LOOKING_AT (DCOLON))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3119 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3120 cls = add_sym (id, cls);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3121 *last_id = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3122 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3123 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3124 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3125 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3126 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3127 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3128
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3129
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3130 /* Parse a class definition.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3131
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3132 CONTAINING is the class containing the class being parsed or null.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3133 This may also be null if NESTED != 0 if the containing class is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3134 anonymous. TAG is the tag of the class (struct, union, class).
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3135 NESTED is non-zero if we are parsing a nested class.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3136
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3137 Current lookahead is the class name. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3138
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3139 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3140 class_definition (containing, tag, flags, nested)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3141 struct sym *containing;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3142 int tag;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3143 int flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3144 int nested;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3145 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3146 struct sym *current;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3147 struct sym *base_class;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3148
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3149 /* Set CURRENT to null if no entry has to be made for the class
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3150 parsed. This is the case for certain command line flag
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3151 settings. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3152 if ((tag != CLASS && !f_structs) || (nested && !f_nested_classes))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3153 current = NULL;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44819
diff changeset
3154 else
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3155 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3156 current = add_sym (yytext, containing);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3157 current->pos = BUFFER_POS ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3158 current->regexp = matching_regexp ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3159 current->filename = filename;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3160 current->flags = flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3161 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3162
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3163 /* If at ':', base class list follows. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3164 if (LOOKING_AT (':'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3165 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3166 int done = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3167 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3168
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3169 while (!done)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3170 {
28645
0813367c7810 (xmalloc, xrealloc): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 28523
diff changeset
3171 switch (LA1)
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3172 {
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 44819
diff changeset
3173 case VIRTUAL: case PUBLIC: case PROTECTED: case PRIVATE:
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3174 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3175 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3176
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3177 case IDENT:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3178 base_class = parse_classname ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3179 if (base_class && current && base_class != current)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3180 add_link (base_class, current);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3181 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3182
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3183 /* The `,' between base classes or the end of the base
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3184 class list. Add the previously found base class.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3185 It's done this way to skip over sequences of
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3186 `A::B::C' until we reach the end.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3187
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3188 FIXME: it is now possible to handle `class X : public B::X'
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3189 because we have enough information. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3190 case ',':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3191 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3192 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3193
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3194 default:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3195 /* A syntax error, possibly due to preprocessor constructs
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3196 like
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3197
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3198 #ifdef SOMETHING
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3199 class A : public B
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3200 #else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3201 class A : private B.
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3202
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3203 MATCH until we see something like `;' or `{'. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3204 while (!LOOKING_AT3 (';', YYEOF, '{'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3205 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3206 done = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3207
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3208 case '{':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3209 done = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3210 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3211 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3212 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3213 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3214
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3215 /* Parse the class body if there is one. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3216 if (LOOKING_AT ('{'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3217 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3218 if (tag != CLASS && !f_structs)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3219 skip_matching ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3220 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3221 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3222 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3223 class_body (current, tag);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3224
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3225 if (LOOKING_AT ('}'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3226 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3227 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3228 if (LOOKING_AT (';') && !nested)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3229 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3230 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3231 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3232 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3233 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3234
44220
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3235 /* Add to class *CLS information for the declaration of variable or
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3236 type *ID. If *CLS is null, this means a global declaration. SC is
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3237 the storage class of *ID. FLAGS is a bit set giving additional
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3238 information about the member (see the F_* defines). */
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3239
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3240 void
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3241 add_declarator (cls, id, flags, sc)
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3242 struct sym **cls;
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3243 char **id;
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3244 int flags, sc;
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3245 {
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3246 if (LOOKING_AT2 (';', ','))
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3247 {
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3248 /* The end of a member variable or of an access declaration
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3249 `X::f'. To distinguish between them we have to know whether
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3250 type information has been seen. */
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3251 if (*id)
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3252 {
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3253 char *regexp = matching_regexp ();
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3254 int pos = BUFFER_POS ();
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3255
44719
dfc7601deedf (add_declarator): Test *CLS instead of CLS.
Gerd Moellmann <gerd@gnu.org>
parents: 44254
diff changeset
3256 if (*cls)
44254
2bc6f0ac1394 (add_declarator): Fix the first call to add_member_defn.
Eli Zaretskii <eliz@gnu.org>
parents: 44220
diff changeset
3257 add_member_defn (*cls, *id, regexp, pos, 0, 1, SC_UNKNOWN, flags);
44220
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3258 else
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3259 add_global_defn (*id, regexp, pos, 0, 1, sc, flags);
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3260 }
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3261
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3262 MATCH ();
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3263 print_info ();
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3264 }
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3265 else if (LOOKING_AT ('{'))
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3266 {
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3267 if (sc == SC_TYPE && *id)
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3268 {
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3269 /* A named enumeration. */
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3270 char *regexp = matching_regexp ();
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3271 int pos = BUFFER_POS ();
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3272 add_global_defn (*id, regexp, pos, 0, 1, sc, flags);
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3273 }
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3274
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3275 skip_matching ();
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3276 print_info ();
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3277 }
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3278
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3279 xfree (*id);
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3280 *id = NULL;
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3281 *cls = NULL;
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3282 }
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3283
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3284 /* Parse a declaration. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3285
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3286 void
28645
0813367c7810 (xmalloc, xrealloc): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 28523
diff changeset
3287 declaration (flags)
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3288 int flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3289 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3290 char *id = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3291 struct sym *cls = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3292 char *regexp = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3293 int pos = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3294 unsigned hash = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3295 int is_constructor;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3296 int sc = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3297
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3298 while (!LOOKING_AT3 (';', '{', YYEOF))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3299 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3300 switch (LA1)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3301 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3302 default:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3303 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3304 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3305
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3306 case '[':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3307 skip_matching ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3308 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3309
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3310 case ENUM:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3311 case TYPEDEF:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3312 sc = SC_TYPE;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3313 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3314 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3315
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3316 case STATIC:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3317 sc = SC_STATIC;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3318 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3319 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3320
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3321 case INT: case CHAR: case LONG: case UNSIGNED:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3322 case SIGNED: case CONST: case DOUBLE: case VOID:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3323 case SHORT: case VOLATILE: case BOOL: case WCHAR:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3324 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3325 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3326
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3327 case CLASS: case STRUCT: case UNION:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3328 /* This is for the case `STARTWRAP class X : ...' or
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3329 `declare (X, Y)\n class A : ...'. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3330 if (id)
35459
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3331 {
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3332 xfree (id);
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3333 return;
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3334 }
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3335
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3336 case '=':
44220
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3337 /* Assumed to be the start of an initialization in this
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3338 context. */
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3339 skip_initializer ();
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3340 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3341
44220
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3342 case ',':
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3343 add_declarator (&cls, &id, flags, sc);
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3344 break;
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3345
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3346 case OPERATOR:
35459
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3347 {
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3348 char *s = operator_name (&sc);
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3349 id = (char *) xrealloc (id, strlen (s) + 1);
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3350 strcpy (id, s);
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3351 }
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3352 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3353
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3354 case T_INLINE:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3355 SET_FLAG (flags, F_INLINE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3356 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3357 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3358
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3359 case '~':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3360 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3361 if (LOOKING_AT (IDENT))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3362 {
35459
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3363 id = (char *) xrealloc (id, strlen (yytext) + 2);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3364 *id = '~';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3365 strcpy (id + 1, yytext);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3366 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3367 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3368 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3369
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3370 case IDENT:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3371 cls = parse_qualified_ident_or_type (&id);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3372 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3373
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3374 case '(':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3375 /* Most probably the beginning of a parameter list. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3376 if (cls)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3377 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3378 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3379
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3380 if (id && cls)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3381 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3382 if (!(is_constructor = streq (id, cls->name)))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3383 regexp = matching_regexp ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3384 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3385 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3386 is_constructor = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3387
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3388 pos = BUFFER_POS ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3389 hash = parm_list (&flags);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3390
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3391 if (is_constructor)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3392 regexp = matching_regexp ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3393
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3394 if (id && cls)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3395 add_member_defn (cls, id, regexp, pos, hash, 0,
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3396 SC_UNKNOWN, flags);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3397 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3398 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3399 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3400 /* This may be a C functions, but also a macro
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3401 call of the form `declare (A, B)' --- such macros
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3402 can be found in some class libraries. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3403 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3404
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3405 if (id)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3406 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3407 regexp = matching_regexp ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3408 pos = BUFFER_POS ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3409 hash = parm_list (&flags);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3410 add_global_decl (id, regexp, pos, hash, 0, sc, flags);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3411 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3412
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3413 /* This is for the case that the function really is
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3414 a macro with no `;' following it. If a CLASS directly
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3415 follows, we would miss it otherwise. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3416 if (LOOKING_AT3 (CLASS, STRUCT, UNION))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3417 return;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3418 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3419
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3420 while (!LOOKING_AT3 (';', '{', YYEOF))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3421 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3422
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3423 if (!cls && id && LOOKING_AT ('{'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3424 add_global_defn (id, regexp, pos, hash, 0, sc, flags);
35459
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3425
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3426 xfree (id);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3427 id = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3428 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3429 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3430 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3431
44220
69735f5e2a07 (add_declarator, skip_initializer): New functions.
Gerd Moellmann <gerd@gnu.org>
parents: 42259
diff changeset
3432 add_declarator (&cls, &id, flags, sc);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3433 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3434
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3435
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3436 /* Parse a list of top-level declarations/definitions. START_FLAGS
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3437 says in which context we are parsing. If it is F_EXTERNC, we are
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3438 parsing in an `extern "C"' block. Value is 1 if EOF is reached, 0
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3439 otherwise. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3440
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3441 int
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3442 globals (start_flags)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3443 int start_flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3444 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3445 int anonymous;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3446 int class_tk;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3447 int flags = start_flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3448
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3449 for (;;)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3450 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3451 char *prev_in = in;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3452
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3453 switch (LA1)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3454 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3455 case NAMESPACE:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3456 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3457 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3458
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3459 if (LOOKING_AT (IDENT))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3460 {
35459
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3461 char *namespace_name = xstrdup (yytext);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3462 MATCH ();
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3463
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3464 if (LOOKING_AT ('='))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3465 {
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3466 struct link *qna = match_qualified_namespace_alias ();
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3467 if (qna)
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3468 register_namespace_alias (namespace_name, qna);
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3469
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3470 if (skip_to (';') == ';')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3471 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3472 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3473 else if (LOOKING_AT ('{'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3474 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3475 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3476 enter_namespace (namespace_name);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3477 globals (0);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3478 leave_namespace ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3479 MATCH_IF ('}');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3480 }
35459
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3481
a5db73d46825 (xfree): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 34990
diff changeset
3482 xfree (namespace_name);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3483 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3484 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3485 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3486
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3487 case EXTERN:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3488 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3489 if (LOOKING_AT (CSTRING) && *string_start == 'C'
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3490 && *(string_start + 1) == '"')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3491 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3492 /* This is `extern "C"'. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3493 MATCH ();
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3494
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3495 if (LOOKING_AT ('{'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3496 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3497 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3498 globals (F_EXTERNC);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3499 MATCH_IF ('}');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3500 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3501 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3502 SET_FLAG (flags, F_EXTERNC);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3503 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3504 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3505
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3506 case TEMPLATE:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3507 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3508 SKIP_MATCHING_IF ('<');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3509 SET_FLAG (flags, F_TEMPLATE);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3510 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3511
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3512 case CLASS: case STRUCT: case UNION:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3513 class_tk = LA1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3514 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3515 anonymous = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3516
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3517 /* More than one ident here to allow for MS-DOS and OS/2
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3518 specialties like `far', `_Export' etc. Some C++ libs
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3519 have constructs like `_OS_DLLIMPORT(_OS_CLIENT)' in front
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3520 of the class name. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3521 while (!LOOKING_AT4 (YYEOF, ';', ':', '{'))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3522 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3523 if (LOOKING_AT (IDENT))
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3524 anonymous = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3525 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3526 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3527
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3528 /* Don't add anonymous unions. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3529 if (LOOKING_AT2 (':', '{') && !anonymous)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3530 class_definition (NULL, class_tk, flags, 0);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3531 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3532 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3533 if (skip_to (';') == ';')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3534 MATCH ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3535 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3536
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3537 flags = start_flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3538 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3539
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3540 case YYEOF:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3541 return 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3542
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3543 case '}':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3544 return 0;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3545
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3546 default:
28645
0813367c7810 (xmalloc, xrealloc): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents: 28523
diff changeset
3547 declaration (flags);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3548 flags = start_flags;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3549 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3550 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3551
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3552 if (prev_in == in)
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
3553 yyerror ("parse error", NULL);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3554 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3555 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3556
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3557
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3558 /* Parse the current input file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3559
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3560 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3561 yyparse ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3562 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3563 while (globals (0) == 0)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3564 MATCH_IF ('}');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3565 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3566
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3567
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3568
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3569 /***********************************************************************
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3570 Main Program
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3571 ***********************************************************************/
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3572
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3573 /* Add the list of paths PATH_LIST to the current search path for
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3574 input files. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3575
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3576 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3577 add_search_path (path_list)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3578 char *path_list;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3579 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3580 while (*path_list)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3581 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3582 char *start = path_list;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3583 struct search_path *p;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3584
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3585 while (*path_list && *path_list != PATH_LIST_SEPARATOR)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3586 ++path_list;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3587
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
3588 p = (struct search_path *) xmalloc (sizeof *p);
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
3589 p->path = (char *) xmalloc (path_list - start + 1);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3590 memcpy (p->path, start, path_list - start);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3591 p->path[path_list - start] = '\0';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3592 p->next = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3593
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3594 if (search_path_tail)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3595 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3596 search_path_tail->next = p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3597 search_path_tail = p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3598 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3599 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3600 search_path = search_path_tail = p;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3601
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3602 while (*path_list == PATH_LIST_SEPARATOR)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3603 ++path_list;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3604 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3605 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3606
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3607
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3608 /* Open FILE and return a file handle for it, or -1 if FILE cannot be
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3609 opened. Try to find FILE in search_path first, then try the
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3610 unchanged file name. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3611
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3612 FILE *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3613 open_file (file)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3614 char *file;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3615 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3616 FILE *fp = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3617 static char *buffer;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3618 static int buffer_size;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3619 struct search_path *path;
28773
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
3620 int flen = strlen (file) + 1; /* +1 for the slash */
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3621
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3622 filename = xstrdup (file);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3623
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3624 for (path = search_path; path && fp == NULL; path = path->next)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3625 {
28773
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
3626 int len = strlen (path->path) + flen;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3627
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3628 if (len + 1 >= buffer_size)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3629 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3630 buffer_size = max (len + 1, 2 * buffer_size);
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
3631 buffer = (char *) xrealloc (buffer, buffer_size);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3632 }
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3633
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3634 strcpy (buffer, path->path);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3635 strcat (buffer, "/");
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3636 strcat (buffer, file);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3637 fp = fopen (buffer, "r");
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3638 }
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3639
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3640 /* Try the original file name. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3641 if (fp == NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3642 fp = fopen (file, "r");
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3643
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3644 if (fp == NULL)
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
3645 yyerror ("cannot open", NULL);
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3646
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3647 return fp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3648 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3649
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3650
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3651 /* Display usage information and exit program. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3652
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3653 #define USAGE "\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3654 Usage: ebrowse [options] {files}\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3655 \n\
38429
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3656 -a, --append append output to existing file\n\
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3657 -f, --files=FILES read input file names from FILE\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3658 -I, --search-path=LIST set search path for input files\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3659 -m, --min-regexp-length=N set minimum regexp length to N\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3660 -M, --max-regexp-length=N set maximum regexp length to N\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3661 -n, --no-nested-classes exclude nested classes\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3662 -o, --output-file=FILE set output file name to FILE\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3663 -p, --position-info print info about position in file\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3664 -s, --no-structs-or-unions don't record structs or unions\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3665 -v, --verbose be verbose\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3666 -V, --very-verbose be very verbose\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3667 -x, --no-regexps don't record regular expressions\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3668 --help display this help\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3669 --version display version info\n\
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3670 "
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3671
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3672 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3673 usage (error)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3674 int error;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3675 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3676 puts (USAGE);
55442
a47704955f8d Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
3677 exit (error ? EXIT_FAILURE : EXIT_SUCCESS);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3678 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3679
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3680
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3681 /* Display version and copyright info. The VERSION macro is set
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3682 from the Makefile and contains the Emacs version. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3683
34258
6894bd47e0e0 (VERSION): Provide default definition, like etags.c
Andrew Innes <andrewi@gnu.org>
parents: 33384
diff changeset
3684 #ifndef VERSION
6894bd47e0e0 (VERSION): Provide default definition, like etags.c
Andrew Innes <andrewi@gnu.org>
parents: 33384
diff changeset
3685 # define VERSION "21"
6894bd47e0e0 (VERSION): Provide default definition, like etags.c
Andrew Innes <andrewi@gnu.org>
parents: 33384
diff changeset
3686 #endif
6894bd47e0e0 (VERSION): Provide default definition, like etags.c
Andrew Innes <andrewi@gnu.org>
parents: 33384
diff changeset
3687
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3688 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3689 version ()
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3690 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3691 printf ("ebrowse %s\n", VERSION);
39514
542ef74db0d2 (struct alias): Add two new struct members: NAMESP and
Gerd Moellmann <gerd@gnu.org>
parents: 39076
diff changeset
3692 puts ("Copyright (C) 1992-1999, 2000, 2001 Free Software Foundation, Inc.");
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3693 puts ("This program is distributed under the same terms as Emacs.");
55442
a47704955f8d Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
3694 exit (EXIT_SUCCESS);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3695 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3696
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3697
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3698 /* Parse one input file FILE, adding classes and members to the symbol
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3699 table. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3700
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3701 void
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3702 process_file (file)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3703 char *file;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3704 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3705 FILE *fp;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3706
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3707 fp = open_file (file);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3708 if (fp)
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3709 {
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3710 int nread, nbytes;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3711
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3712 /* Give a progress indication if needed. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3713 if (f_very_verbose)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3714 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3715 puts (filename);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3716 fflush (stdout);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3717 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3718 else if (f_verbose)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3719 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3720 putchar ('.');
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3721 fflush (stdout);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3722 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3723
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3724 /* Read file to inbuffer. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3725 for (nread = 0;;)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3726 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3727 if (nread + READ_CHUNK_SIZE >= inbuffer_size)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3728 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3729 inbuffer_size = nread + READ_CHUNK_SIZE + 1;
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
3730 inbuffer = (char *) xrealloc (inbuffer, inbuffer_size);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3731 }
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3732
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3733 nbytes = fread (inbuffer + nread, 1, READ_CHUNK_SIZE, fp);
28773
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
3734 if (nbytes <= 0)
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
3735 break;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3736 nread += nbytes;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3737 }
28773
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
3738 if (nread < 0)
9afdf8a67091 (PATH_LIST_SEPARATOR) [__MSDOS__ || WINDOWSNT]: Define
Eli Zaretskii <eliz@gnu.org>
parents: 28645
diff changeset
3739 nread = 0;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3740 inbuffer[nread] = '\0';
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3741
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3742 /* Reinitialize scanner and parser for the new input file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3743 re_init_scanner ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3744 re_init_parser ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3745
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3746 /* Parse it and close the file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3747 yyparse ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3748 fclose (fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3749 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3750 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3751
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3752
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3753 /* Read a line from stream FP and return a pointer to a static buffer
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3754 containing its contents without the terminating newline. Value
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3755 is null when EOF is reached. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3756
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3757 char *
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3758 read_line (fp)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3759 FILE *fp;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3760 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3761 static char *buffer;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3762 static int buffer_size;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3763 int i = 0, c;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3764
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3765 while ((c = getc (fp)) != EOF && c != '\n')
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3766 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3767 if (i >= buffer_size)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3768 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3769 buffer_size = max (100, buffer_size * 2);
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
3770 buffer = (char *) xrealloc (buffer, buffer_size);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3771 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3772
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3773 buffer[i++] = c;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3774 }
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3775
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3776 if (c == EOF && i == 0)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3777 return NULL;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3778
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3779 if (i == buffer_size)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3780 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3781 buffer_size = max (100, buffer_size * 2);
30232
ad501fc526c2 (xrealloc, xmalloc): Renamed from yrealloc and
Gerd Moellmann <gerd@gnu.org>
parents: 30138
diff changeset
3782 buffer = (char *) xrealloc (buffer, buffer_size);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3783 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3784
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3785 buffer[i] = '\0';
36478
742df7c33f75 (parse_qualified_param_ident_or_type): Return a
Gerd Moellmann <gerd@gnu.org>
parents: 35591
diff changeset
3786 if (i > 0 && buffer[i - 1] == '\r')
742df7c33f75 (parse_qualified_param_ident_or_type): Return a
Gerd Moellmann <gerd@gnu.org>
parents: 35591
diff changeset
3787 buffer[i - 1] = '\0';
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3788 return buffer;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3789 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3790
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3791
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3792 /* Main entry point. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3793
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3794 int
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3795 main (argc, argv)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3796 int argc;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3797 char **argv;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3798 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3799 int i;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3800 int any_inputfiles = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3801 static char *out_filename = DEFAULT_OUTFILE;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3802 static char **input_filenames = NULL;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3803 static int input_filenames_size = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3804 static int n_input_files;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3805
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3806 filename = "command line";
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3807 yyout = stdout;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3808
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3809 while ((i = getopt_long (argc, argv, "af:I:m:M:no:p:svVx",
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3810 options, NULL)) != EOF)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3811 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3812 switch (i)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3813 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3814 /* Experimental. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3815 case 'p':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3816 info_position = atoi (optarg);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3817 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3818
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3819 case 'n':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3820 f_nested_classes = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3821 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3822
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3823 case 'x':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3824 f_regexps = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3825 break;
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3826
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3827 /* Add the name of a file containing more input files. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3828 case 'f':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3829 if (n_input_files == input_filenames_size)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3830 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3831 input_filenames_size = max (10, 2 * input_filenames_size);
34954
ff4771c51345 (enter_namespace, main): Cast variables to shut up
Eli Zaretskii <eliz@gnu.org>
parents: 34610
diff changeset
3832 input_filenames = (char **) xrealloc ((void *)input_filenames,
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3833 input_filenames_size);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3834 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3835 input_filenames[n_input_files++] = xstrdup (optarg);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3836 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3837
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3838 /* Append new output to output file instead of truncating it. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3839 case 'a':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3840 f_append = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3841 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3842
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3843 /* Include structs in the output */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3844 case 's':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3845 f_structs = 0;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3846 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3847
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3848 /* Be verbose (give a progress indication). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3849 case 'v':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3850 f_verbose = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3851 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3852
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3853 /* Be very verbose (print file names as they are processed). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3854 case 'V':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3855 f_verbose = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3856 f_very_verbose = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3857 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3858
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3859 /* Change the name of the output file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3860 case 'o':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3861 out_filename = optarg;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3862 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3863
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3864 /* Set minimum length for regular expression strings
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3865 when recorded in the output file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3866 case 'm':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3867 min_regexp = atoi (optarg);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3868 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3869
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3870 /* Set maximum length for regular expression strings
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3871 when recorded in the output file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3872 case 'M':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3873 max_regexp = atoi (optarg);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3874 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3875
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3876 /* Add to search path. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3877 case 'I':
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3878 add_search_path (optarg);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3879 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3880
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3881 /* Display help */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3882 case -2:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3883 usage (0);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3884 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3885
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3886 case -3:
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3887 version ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3888 break;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3889 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3890 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3891
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3892 /* Call init_scanner after command line flags have been processed to be
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3893 able to add keywords depending on command line (not yet
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3894 implemented). */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3895 init_scanner ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3896 init_sym ();
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3897
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3898 /* Open output file */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3899 if (*out_filename)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3900 {
38429
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3901 if (f_append)
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3902 {
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3903 /* Check that the file to append to exists, and is not
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3904 empty. More specifically, it should be a valid file
38769
99864bb6de1e Fix a typo in a comment.
Eli Zaretskii <eliz@gnu.org>
parents: 38429
diff changeset
3905 produced by a previous run of ebrowse, but that's too
38429
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3906 difficult to check. */
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3907 FILE *fp;
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3908 int rc;
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3909
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3910 fp = fopen (out_filename, "r");
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3911 if (fp == NULL)
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3912 yyerror ("file `%s' must exist for --append", out_filename);
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3913
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3914 rc = fseek (fp, 0, SEEK_END);
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3915 if (rc == -1)
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3916 yyerror ("error seeking in file `%s'", out_filename);
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3917
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3918 rc = ftell (fp);
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3919 if (rc == -1)
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3920 yyerror ("error getting size of file `%s'", out_filename);
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3921 else if (rc == 0)
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3922 yyerror ("file `%s' is empty", out_filename);
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3923
38429
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3924 fclose (fp);
3960fdb54cfd (main): Check that the output file exists and
Gerd Moellmann <gerd@gnu.org>
parents: 37615
diff changeset
3925 }
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3926
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3927 yyout = fopen (out_filename, f_append ? "a" : "w");
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3928 if (yyout == NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3929 {
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
3930 yyerror ("cannot open output file `%s'", out_filename);
55442
a47704955f8d Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
3931 exit (EXIT_FAILURE);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3932 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3933 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3934
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3935 /* Process input files specified on the command line. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3936 while (optind < argc)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3937 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3938 process_file (argv[optind++]);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3939 any_inputfiles = 1;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3940 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3941
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3942 /* Process files given on stdin if no files specified. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3943 if (!any_inputfiles && n_input_files == 0)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3944 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3945 char *file;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3946 while ((file = read_line (stdin)) != NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3947 process_file (file);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3948 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3949 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3950 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3951 /* Process files from `--files=FILE'. Every line in FILE names
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3952 one input file to process. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3953 for (i = 0; i < n_input_files; ++i)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3954 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3955 FILE *fp = fopen (input_filenames[i], "r");
42174
e3b97ef49aee Include stdlib.h and string.h conditionally.
Pavel Janík <Pavel@Janik.cz>
parents: 41112
diff changeset
3956
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3957 if (fp == NULL)
34990
49cf406a0cab (yyerror): Changed to take two arguments. Prototype
Gerd Moellmann <gerd@gnu.org>
parents: 34954
diff changeset
3958 yyerror ("cannot open input file `%s'", input_filenames[i]);
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3959 else
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3960 {
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3961 char *file;
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3962 while ((file = read_line (fp)) != NULL)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3963 process_file (file);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3964 fclose (fp);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3965 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3966 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3967 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3968
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3969 /* Write output file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3970 dump_roots (yyout);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3971
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3972 /* Close output file. */
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3973 if (yyout != stdout)
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3974 fclose (yyout);
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3975
55442
a47704955f8d Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
3976 return EXIT_SUCCESS;
28523
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3977 }
47e1a131eef3 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3978
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
3979 /* arch-tag: fc03b4bc-91a9-4c3d-b3b9-12a77fa86dd8
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
3980 (do not change this comment) */
55442
a47704955f8d Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
3981
a47704955f8d Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
3982 /* ebrowse.c ends here */