xref: /AOO41X/main/soltools/cpp/cpp.h (revision 5b501c92293051a25b12b7eb43a2a29471ec1458)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 /* $Id: cpp.h,v 1.4 2006-06-20 05:07:28 hr Exp $ */
22 
23 #define INS         32768   /* input buffer                             */
24 #define OBS         8092    /* outbut buffer                            */
25 #define NARG        32      /* Max number arguments to a macro          */
26 #define NINCLUDE    48      /* Max number of include directories (-I)   */
27 #define NIF         64      /* depth of nesting of #if                  */
28 #define NINC        32      /* depth of nesting of #include             */
29 
30 #ifndef EOF
31 #define EOF (-1)
32 #endif
33 
34 #ifndef NULL
35 #define NULL    0
36 #endif
37 
38 typedef unsigned char uchar;
39 
40 enum toktype
41 {
42     END, UNCLASS, NAME, NUMBER, STRING, CCON, NL, WS, DSHARP,
43     EQ, NEQ, LEQ, GEQ, LSH, RSH, LAND, LOR, PPLUS, MMINUS,
44     ARROW, SBRA, SKET, LP, RP, DOT, AND, STAR, PLUS, MINUS,
45     TILDE, NOT, SLASH, PCT, LT, GT, CIRC, OR, QUEST,
46     COLON, ASGN, COMMA, SHARP, SEMIC, CBRA, CKET,
47     ASPLUS, ASMINUS, ASSTAR, ASSLASH, ASPCT, ASCIRC, ASLSH,
48     ASRSH, ASOR, ASAND, ELLIPS,
49     DSHARP1, NAME1, NAME2, DEFINED, UMINUS, ARCHITECTURE, IDENT,
50     COMMENT
51 };
52 
53 enum kwtype
54 {
55     KIF, KIFDEF, KIFNDEF, KELIF, KELSE, KENDIF, KINCLUDE, KINCLUDENEXT,
56     KIMPORT, KDEFINE, KUNDEF, KLINE, KERROR, KPRAGMA, KIDENT, KDEFINED,
57     KMACHINE, KLINENO, KFILE, KDATE, KTIME, KSTDC, KEVAL
58 };
59 
60 #define ISDEFINED       0x01            /* has #defined value */
61 #define ISKW            0x02            /* is PP keyword */
62 #define ISUNCHANGE      0x04            /* can't be #defined in PP */
63 #define ISMAC           0x08            /* builtin macro, e.g. __LINE__ */
64 #define ISARCHITECTURE  0x10            /* architecture */
65 #define ISACTIVE        0x80            /* is macro currently expanded */
66 
67 #define EOB     0xFE                    /* sentinel for end of input buffer */
68 #define EOFC    0xFD                    /* sentinel for end of input file */
69 #define XPWS    1                       /* token flag: white space to assure token sep. */
70 #define XTWS    2
71 
72 typedef struct token
73 {
74     unsigned char type;
75     unsigned char flag;
76     unsigned int wslen;
77     unsigned int len;
78     uchar *t;
79     unsigned int identifier;            /* used from macro processor to identify where a macro becomes valid again. */
80 }   Token;
81 
82 typedef struct tokenrow
83 {
84     Token *tp;                          /* current one to scan */
85     Token *bp;                          /* base (allocated value) */
86     Token *lp;                          /* last+1 token used */
87     int max;                            /* number allocated */
88 }   Tokenrow;
89 
90 typedef struct source
91 {
92     char *filename;                     /* name of file of the source */
93     int line;                           /* current line number */
94     int lineinc;                        /* adjustment for \\n lines */
95     uchar *inb;                         /* input buffer */
96     uchar *inp;                         /* input pointer */
97     uchar *inl;                         /* end of input */
98     int fd;                             /* input source */
99     int ifdepth;                        /* conditional nesting in include */
100     int pathdepth;
101     int wrap;
102     struct source *next;                /* stack for #include */
103 }   Source;
104 
105 typedef struct nlist
106 {
107     struct nlist *next;
108     uchar *name;
109     int len;
110     Tokenrow *vp;                       /* value as macro */
111     Tokenrow *ap;                       /* list of argument names, if any */
112     char val;                           /* value as preprocessor name */
113     char flag;                          /* is defined, is pp name */
114     uchar *loc;                         /* location of definition */
115 }   Nlist;
116 
117 typedef struct includelist
118 {
119     char deleted;
120     char always;
121     char *file;
122 }   Includelist;
123 
124 typedef struct wraplist
125 {
126     char *file;
127 }   Wraplist;
128 
129 #define new(t)  (t *)domalloc(sizeof(t))
130 #define quicklook(a,b)  (namebit[(a)&077] & (1<<((b)&037)))
131 #define quickset(a,b)   namebit[(a)&077] |= (1<<((b)&037))
132 extern unsigned long namebit[077 + 1];
133 
134 enum errtype
135 {
136     INFO, WARNING, ERROR, FATAL
137 };
138 
139 
140 typedef struct macroValidator
141 {
142     Nlist *             pMacro;
143     unsigned int        nTokenWhereMacroBecomesValid;
144     struct macroValidator *
145                         pNext;
146 } MacroValidator;
147 typedef struct mvl
148 {
149     MacroValidator * pFirst;
150     unsigned int     nextFreeIdentifier;
151 } MacroValidatorList;
152 
153 void        mvl_init(
154                 MacroValidatorList *
155                                 out_pValidators);
156 void        mvl_destruct(
157                 MacroValidatorList *
158                                 out_pValidators);
159 /*  Adds MacroValidator to the list.
160 */
161 void        mvl_add(
162                 MacroValidatorList *
163                                 inout_pValidators,
164                 Nlist *         in_pMacro,
165                 Token *         in_pTokenWhereMacroBecomesValid);
166 /*  Updates all token pointers within the list, when the tokens have
167     moved, by
168         pTokenWhereMacroBecomesValid += in_nNrofTokens;
169     .
170 
171 void        mvl_move(
172                 MacroValidatorList *
173                                 inout_pValidators,
174                 int             in_nSpace); // in pointer units.
175 */
176 /*  Checks if one of the validators within the list points to
177     the token in_pTokenToCheck. If so, the macro is set valid and
178     the validator is removed.
179 */
180 void        mvl_check(
181                 MacroValidatorList *
182                                 inout_pValidators,
183                 Token *         inout_pTokenToCheck);
184 
185 void tokenrow_zeroTokenIdentifiers(Tokenrow* trp);
186 
187 void expandlex(void);
188 void fixlex(void);
189 void setup(int, char **);
190 int gettokens(Tokenrow *, int);
191 int comparetokens(Tokenrow *, Tokenrow *);
192 Source *setsource(char *, int, int, char *, int);
193 void unsetsource(void);
194 void puttokens(Tokenrow *);
195 void process(Tokenrow *);
196 void *domalloc(int);
197 void dofree(void *);
198 void error(enum errtype, char *,...);
199 void flushout(void);
200 int fillbuf(Source *);
201 int trigraph(Source *);
202 int foldline(Source *);
203 Nlist *lookup(Token *, int);
204 void control(Tokenrow *);
205 void dodefine(Tokenrow *);
206 void doadefine(Tokenrow *, int);
207 void doinclude(Tokenrow *, int, int);
208 void doif(Tokenrow *, enum kwtype);
209 void expand(Tokenrow *, Nlist *, MacroValidatorList *);
210 void builtin(Tokenrow *, int);
211 int gatherargs(Tokenrow *, Tokenrow **, int *);
212 void substargs(Nlist *, Tokenrow *, Tokenrow **);
213 void expandrow(Tokenrow *, char *);
214 void maketokenrow(int, Tokenrow *);
215 Tokenrow *copytokenrow(Tokenrow *, Tokenrow *);
216 Token *growtokenrow(Tokenrow *);
217 Tokenrow *normtokenrow(Tokenrow *);
218 void adjustrow(Tokenrow *, int);
219 void movetokenrow(Tokenrow *, Tokenrow *);
220 void insertrow(Tokenrow *, int, Tokenrow *);
221 void peektokens(Tokenrow *, char *);
222 void doconcat(Tokenrow *);
223 Tokenrow *stringify(Tokenrow *);
224 int lookuparg(Nlist *, Token *);
225 long eval(Tokenrow *, int);
226 void genline(void);
227 void genimport(char *, int, char *, int);
228 void genwrap(int);
229 void setempty(Tokenrow *);
230 void makespace(Tokenrow *, Token *);
231 char *outnum(char *, int);
232 int digit(int);
233 uchar *newstring(uchar *, int, int);
234 
235 #define rowlen(tokrow)  ((tokrow)->lp - (tokrow)->bp)
236 
237 extern char *outptr;
238 extern Token nltoken;
239 extern Source *cursource;
240 extern char *curtime;
241 extern int incdepth;
242 extern int ifdepth;
243 extern int ifsatisfied[NIF];
244 extern int Mflag;
245 extern int Iflag;
246 extern int Pflag;
247 extern int Aflag;
248 extern int Lflag;
249 extern int Xflag;
250 extern int Vflag;
251 extern int Cflag;
252 extern int Dflag;
253 extern int Cplusplus;
254 extern int skipping;
255 extern Nlist *kwdefined;
256 extern Includelist includelist[NINCLUDE];
257 extern Wraplist wraplist[NINCLUDE];
258 extern char wd[];
259 
260