xref: /trunk/main/rsc/source/rscpp/cpp.h (revision 9eab2a37)
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 
22 
23 
24 
25 #ifndef TRUE
26 #define TRUE            1
27 #define FALSE           0
28 #endif
29 
30 /* in cpp1.c: file-pointer auf stdout oder file */
31 extern FILE *pCppOut;                                   /* BP */
32 #define PUTCHAR( d )   fprintf( pCppOut, "%c", (d) )    /* BP */
33 #if OSL_DEBUG_LEVEL > 1
34 extern FILE *pDefOut;                                   /* ER */
35 #ifdef EVALDEFS
36 #define NEVALBUF		2048
37 #endif
38 #endif
39 
40 /* limit for reading commandfiles */
41 #define	PARALIMIT		100
42 
43 #ifndef EOS
44 /*
45  * This is predefined in Decus C
46  */
47 #define EOS             '\0'            /* End of string                */
48 #endif
49 #define EOF_CHAR        0               /* Returned by get() on eof     */
50 #define NULLST          ((char *) NULL) /* Pointer to nowhere (linted)  */
51 #define DEF_NOARGS      (-1)            /* #define foo vs #define foo() */
52 
53 /*
54  * The following may need to change if the host system doesn't use ASCII.
55  */
56 #define DEF_MAGIC       0x1D            /* Magic for #defines           */
57 #define TOK_SEP         0x1E            /* Token concatenation delim.   */
58 #define COM_SEP         0x1F            /* Magic comment separator      */
59 
60 #ifdef 	EBCDIC
61 #define HT				0x05			/* horizontal tab				*/
62 #define NL				0x15			/* new line						*/
63 #define CR				0x0D			/* carriage return				*/
64 #define DEL				0x07
65 #else
66 #define HT				0x09			/* horizontal tab				*/
67 #define NL				0x0A			/* new line						*/
68 #define CR				0x0D			/* carriage return				*/
69 #define DEL				0x7F
70 #endif
71 
72 
73 #ifdef 	SOLAR
74 #define MAC_PARM        0x01            /* Macro formals start here     */
75 #else
76 /*
77  * Note -- in Ascii, the following will map macro formals onto DEL + the
78  * C1 control character region (decimal 128 .. (128 + PAR_MAC)) which will
79  * be ok as long as PAR_MAC is less than 33).  Note that the last PAR_MAC
80  * value is reserved for string substitution.
81  */
82 
83 #define MAC_PARM        DEL				/* Macro formals start here     */
84 #if PAR_MAC >= 33
85         assertion fails -- PAR_MAC is not less than 33
86 #endif
87 #endif
88 #define LASTPARM        (PAR_MAC - 1)
89 
90 /*
91  * Character type codes.
92  */
93 
94 #define INV             0               /* Invalid, must be zero        */
95 #define OP_EOE          INV             /* End of expression            */
96 #define DIG             1               /* Digit                        */
97 #define LET             2               /* Identifier start             */
98 #define FIRST_BINOP     OP_ADD
99 #define OP_ADD          3
100 #define OP_SUB          4
101 #define OP_MUL          5
102 #define OP_DIV          6
103 #define OP_MOD          7
104 #define OP_ASL          8
105 #define OP_ASR          9
106 #define OP_AND          10              /* &, not &&                    */
107 #define OP_OR           11              /* |, not ||                    */
108 #define OP_XOR          12
109 #define OP_EQ           13
110 #define OP_NE           14
111 #define OP_LT           15
112 #define OP_LE           16
113 #define OP_GE           17
114 #define OP_GT           18
115 #define OP_ANA          19              /* &&                           */
116 #define OP_ORO          20              /* ||                           */
117 #define OP_QUE          21              /* ?                            */
118 #define OP_COL          22              /* :                            */
119 #define OP_CMA          23              /* , (relevant?)                */
120 #define LAST_BINOP      OP_CMA          /* Last binary operand          */
121 /*
122  * The following are unary.
123  */
124 #define FIRST_UNOP      OP_PLU          /* First Unary operand          */
125 #define OP_PLU          24              /* + (draft ANSI standard)      */
126 #define OP_NEG          25              /* -                            */
127 #define OP_COM          26              /* ~                            */
128 #define OP_NOT          27              /* !                            */
129 #define LAST_UNOP       OP_NOT
130 #define OP_LPA          28              /* (                            */
131 #define OP_RPA          29              /* )                            */
132 #define OP_END          30              /* End of expression marker     */
133 #define OP_MAX          (OP_END + 1)    /* Number of operators          */
134 #define OP_FAIL         (OP_END + 1)    /* For error returns            */
135 
136 /*
137  * The following are for lexical scanning only.
138  */
139 
140 #define QUO             65              /* Both flavors of quotation    */
141 #define DOT             66              /* . might start a number       */
142 #define SPA             67              /* Space and tab                */
143 #define BSH             68              /* Just a backslash             */
144 #define END             69              /* EOF                          */
145 
146 /*
147  * These bits are set in ifstack[]
148  */
149 #define WAS_COMPILING   1               /* TRUE if compile set at entry */
150 #define ELSE_SEEN       2               /* TRUE when #else processed    */
151 #define TRUE_SEEN       4               /* TRUE when #if TRUE processed */
152 
153 /*
154  * Define bits for the basic types and their adjectives
155  */
156 
157 #define T_CHAR            1
158 #define T_INT             2
159 #define T_FLOAT           4
160 #define T_DOUBLE          8
161 #define T_SHORT          16
162 #define T_LONG           32
163 #define T_SIGNED         64
164 #define T_UNSIGNED      128
165 #define T_PTR           256             /* Pointer                      */
166 #define T_FPTR          512             /* Pointer to functions         */
167 
168 /*
169  * The DEFBUF structure stores information about #defined
170  * macros.  Note that the defbuf->repl information is always
171  * in malloc storage.
172  */
173 
174 typedef struct defbuf {
175         struct defbuf   *link;          /* Next define in chain */
176         char            *repl;          /* -> replacement       */
177         int             hash;           /* Symbol table hash    */
178         int             nargs;          /* For define(args)     */
179         char            name[1];        /* #define name         */
180 } DEFBUF;
181 
182 /*
183  * The FILEINFO structure stores information about open files
184  * and macros being expanded.
185  */
186 
187 typedef struct fileinfo {
188         char            *bptr;          /* Buffer pointer       */
189         int             line;           /* for include or macro */
190         FILE            *fp;            /* File if non-null     */
191         struct fileinfo *parent;        /* Link to includer     */
192         char            *filename;      /* File/macro name      */
193         char            *progname;      /* From #line statement */
194         unsigned int    unrecur;        /* For macro recursion  */
195         char            buffer[1];      /* current input line   */
196 } FILEINFO;
197 
198 /*
199  * The SIZES structure is used to store the values for #if sizeof
200  */
201 
202 typedef struct sizes {
203     short       bits;                   /* If this bit is set,          */
204     int         size;                   /* this is the datum size value */
205     int         psize;                  /* this is the pointer size     */
206 } SIZES;
207 /*
208  * nomacarg is a built-in #define on Decus C.
209  */
210 
211 #ifdef  nomacarg
212 #define cput            output          /* cput concatenates tokens     */
213 #else
214 #if COMMENT_INVISIBLE
215 #define cput(c)         { if (c != TOK_SEP && c != COM_SEP) PUTCHAR(c); }
216 #else
217 #define cput(c)         { if (c != TOK_SEP) PUTCHAR(c); }
218 #endif
219 #endif
220 
221 #ifndef nomacarg
222 #define streq(s1, s2)   (strcmp(s1, s2) == 0)
223 #endif
224 
225 /*
226  * Error codes.  VMS uses system definitions.
227  * Decus C codes are defined in stdio.h.
228  * Others are cooked to order.
229  */
230 
231 #if HOST == SYS_VMS
232 #include                <ssdef.h>
233 #include                <stsdef.h>
234 #define IO_NORMAL       (SS$_NORMAL | STS$M_INHIB_MSG)
235 #define IO_ERROR        SS$_ABORT
236 #endif
237 /*
238  * Note: IO_NORMAL and IO_ERROR are defined in the Decus C stdio.h file
239  */
240 #ifndef IO_NORMAL
241 #define IO_NORMAL       0
242 #endif
243 #ifndef IO_ERROR
244 #define IO_ERROR        1
245 #endif
246 
247 /*
248  * Externs
249  */
250 
251 extern int      line;                   /* Current line number          */
252 extern int      wrongline;              /* Force #line to cc pass 1     */
253 extern char     type[];                 /* Character classifier         */
254 extern char     token[IDMAX + 1];       /* Current input token          */
255 extern int      instring;               /* TRUE if scanning string      */
256 extern int      inmacro;                /* TRUE if scanning #define     */
257 extern int      errors;                 /* Error counter                */
258 extern int      recursion;              /* Macro depth counter          */
259 extern char     ifstack[BLK_NEST];      /* #if information              */
260 #define compiling ifstack[0]
261 extern char     *ifptr;                 /* -> current ifstack item      */
262 extern char     *incdir[NINCLUDE];      /* -i directories               */
263 extern char     **incend;               /* -> active end of incdir      */
264 extern int      cflag;                  /* -C option (keep comments)    */
265 extern int      eflag;                  /* -E option (ignore errors)    */
266 extern int      nflag;                  /* -N option (no pre-defines)   */
267 extern int      rec_recover;            /* unwind recursive macros      */
268 extern char     *preset[];              /* Standard predefined symbols  */
269 extern char     *magic[];               /* Magic predefined symbols     */
270 extern FILEINFO *infile;                /* Current input file           */
271 extern char     work[NWORK + 1];        /* #define scratch              */
272 extern char     *workp;                 /* Free space in work           */
273 #if OSL_DEBUG_LEVEL > 1
274 extern int      debug;                  /* Debug level                  */
275 /* ER dump & evaluate #define's */
276 extern int      bDumpDefs;				/* TRUE if #define's dump req.  */
277 extern int		bIsInEval;				/* TRUE if #define dumping now  */
278 #ifdef EVALDEFS
279 extern char		EvalBuf[NEVALBUF + 1];	/* evaluation buffer            */
280 extern int		nEvalOff;				/* offset to free buffer pos	*/
281 #endif
282 #endif
283 extern int      keepcomments;           /* Don't remove comments if set */
284 extern SIZES    size_table[];           /* For #if sizeof sizes         */
285 
286 #ifdef NOMAIN                /* BP */
287 #ifndef _NO_PROTO
288 int start_cpp( int argc, char *argv[] );
289 #endif
290 #define MAIN   start_cpp     /* fuer die cpp.lib muss main() geandert werden */
291 #else
292 #ifdef WNT
293 #define MAIN   __cdecl main
294 #else
295 #define MAIN   main
296 #endif
297 #endif
298 
299 
300 void InitCpp1();
301 void InitCpp2();
302 void InitCpp3();
303 void InitCpp4();
304 void InitCpp5();
305 void InitCpp6();
306 
307 #define HELLO()   fprintf( stderr, "[Hello at %s, %d] ", __FILE__, __LINE__ )
308 
309 #ifndef _STDIO_H
310 #include <stdio.h>
311 #endif
312 
313 #ifndef _STDLIB_H
314 #include <stdlib.h>
315 #endif
316 
317 #ifndef _STRING_H
318 #include <string.h>
319 #endif
320 
321 /* cpp1.c */
322 void output( int c );
323 void sharp();
324 void cppmain();
325 #if OSL_DEBUG_LEVEL > 1
326 #ifdef EVALDEFS
327 int outputEval( int c );
328 #endif
329 #endif
330 
331 
332 /* cpp2.c */
333 int control( int counter );
334 void doinclude();
335 void dodefine();
336 void doif( int hash );
337 int openinclude( char *, int );
338 int hasdirectory(char *, char * );
339 int openfile( char * );
340 
341 /* cpp3.c */
342 int openfiles( char *filename );
343 void addfile( FILE *fp, char *filename );
344 void setincdirs();
345 int AddInclude( char *pIncStr );
346 int getredirection( int argc, char **argv );
347 void zap_uc( char *ap );
348 
349 void initdefines();
350 int dooptions( int argc, char *argv[] );
351 int readoptions(char* filename, char*** pfargv);
352 
353 /* cpp4.c */
354 void dodefines();
355 void checkparm( int c, DEFBUF *dp );
356 int expcollect();
357 void expstuff( DEFBUF *dp );
358 
359 #if STRING_FORMAL
360 void stparmscan( int delim, DEFBUF *dp);
361 #else
362 void stparmscan( int delim);
363 #endif
364 #if OSL_DEBUG_LEVEL > 1
365 void dumpparm( char *why );
366 #endif
367 
368 void doundef();
369 void textput( char *text );
370 void charput( int c );
371 void expand( DEFBUF *tokenp );
372 
373 /* cpp5.c */
374 int eval();
375 int evallex(int);
376 int *evaleval(int *, int, int );
377 int evalchar(int);
378 int dosizeof();
379 int evalnum( int c );
380 int bittest( int );
381 
382 /* cpp6.c */
383 
384 void skipnl();
385 int skipws();
386 void scanid( int c );
387 int macroid( int c );
388 int catenate();
389 int scanstring( int c, void (*outfun)( int c ) );
390 void scannumber( int c, void (*outfun)( int c ) );
391 void save( int c );
392 char *savestring( char *text );
393 FILEINFO *getfile( int bufsize, char *name);
394 char *getmem( int size );
395 DEFBUF *lookid( int c );
396 DEFBUF *defendel( char *name, int delete );
397 void dunpdef( char *why );
398 void dumpadef( char *why, DEFBUF *dp);
399 int get();
400 int cget();
401 void unget();
402 void ungetstring( char *text );
403 void cerror( char *format, char *sarg);
404 void cwarn( char *format, char *sarg);
405 void cfatal( char *format, char *sarg);
406 void cierror( char *format, int n);
407 void ciwarn( char *format, int n);
408 #if OSL_DEBUG_LEVEL > 1
409 void dumpdef( char *why );
410 void dumpadef( char *why, DEFBUF *dp );
411 #endif
412