Imported Upstream version 1.4.16
[platform/upstream/m4.git] / src / m4.h
1 /* GNU m4 -- A simple macro processor
2
3    Copyright (C) 1989-1994, 2004-2011 Free Software Foundation, Inc.
4
5    This file is part of GNU M4.
6
7    GNU M4 is free software: you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation, either version 3 of the License, or
10    (at your option) any later version.
11
12    GNU M4 is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 /* We use <config.h> instead of "config.h" so that a compilation
22    using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
23    (which it would do because it found this file in $srcdir).  */
24
25 #include <config.h>
26
27 #include <assert.h>
28 #include <ctype.h>
29 #include <errno.h>
30 #include <limits.h>
31 #include <stdbool.h>
32 #include <stdint.h>
33 #include <string.h>
34 #include <sys/stat.h>
35 #include <sys/types.h>
36
37 #include "binary-io.h"
38 #include "clean-temp.h"
39 #include "cloexec.h"
40 #include "close-stream.h"
41 #include "closein.h"
42 #include "dirname.h"
43 #include "error.h"
44 #include "exitfail.h"
45 #include "filenamecat.h"
46 #include "obstack.h"
47 #include "stdio--.h"
48 #include "stdlib--.h"
49 #include "unistd--.h"
50 #include "verror.h"
51 #include "xalloc.h"
52 #include "xprintf.h"
53 #include "xvasprintf.h"
54
55 /* Canonicalize UNIX recognition macros.  */
56 #if defined unix || defined __unix || defined __unix__ \
57   || defined _POSIX_VERSION || defined _POSIX2_VERSION \
58   || defined __NetBSD__ || defined __OpenBSD__ \
59   || defined __APPLE__ || defined __APPLE_CC__
60 # define UNIX 1
61 #endif
62
63 /* Canonicalize Windows recognition macros.  */
64 #if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
65 # define W32_NATIVE 1
66 #endif
67
68 /* Canonicalize OS/2 recognition macro.  */
69 #ifdef __EMX__
70 # define OS2 1
71 # undef UNIX
72 #endif
73
74 /* Used if any programmer error is detected (not possible, right?)  */
75 #define EXIT_INTERNAL_ERROR 2
76
77 /* Used for version mismatch, when -R detects a frozen file it can't parse.  */
78 #define EXIT_MISMATCH 63
79
80 /* No-op, for future gettext compatibility.  */
81 #define _(ARG) ARG
82 \f
83 /* Various declarations.  */
84
85 struct string
86   {
87     char *string;               /* characters of the string */
88     size_t length;              /* length of the string */
89   };
90 typedef struct string STRING;
91
92 /* Memory allocation.  */
93 #define obstack_chunk_alloc     xmalloc
94 #define obstack_chunk_free      free
95
96 /* Those must come first.  */
97 typedef struct token_data token_data;
98 typedef void builtin_func (struct obstack *, int, token_data **);
99
100 /* Gnulib's stdbool doesn't work with bool bitfields.  For nicer
101    debugging, use bool when we know it works, but use the more
102    portable unsigned int elsewhere.  */
103 #if __GNUC__ > 2
104 typedef bool bool_bitfield;
105 #else
106 typedef unsigned int bool_bitfield;
107 #endif /* ! __GNUC__ */
108
109 /* Take advantage of GNU C compiler source level optimization hints,
110    using portable macros.  */
111 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 6)
112 # define M4_GNUC_ATTRIBUTE(args)        __attribute__ (args)
113 #else
114 # define M4_GNUC_ATTRIBUTE(args)
115 #endif  /* __GNUC__ */
116
117 #define M4_GNUC_UNUSED          M4_GNUC_ATTRIBUTE ((__unused__))
118 #define M4_GNUC_PRINTF(fmt, arg)                        \
119   M4_GNUC_ATTRIBUTE ((__format__ (__printf__, fmt, arg)))
120 #define M4_GNUC_NORETURN        M4_GNUC_ATTRIBUTE ((__noreturn__))
121 \f
122 /* File: m4.c  --- global definitions.  */
123
124 /* Option flags.  */
125 extern int sync_output;                 /* -s */
126 extern int debug_level;                 /* -d */
127 extern size_t hash_table_size;          /* -H */
128 extern int no_gnu_extensions;           /* -G */
129 extern int prefix_all_builtins;         /* -P */
130 extern int max_debug_argument_length;   /* -l */
131 extern int suppress_warnings;           /* -Q */
132 extern int warning_status;              /* -E */
133 extern int nesting_limit;               /* -L */
134 #ifdef ENABLE_CHANGEWORD
135 extern const char *user_word_regexp;    /* -W */
136 #endif
137
138 /* Error handling.  */
139 extern int retcode;
140 extern const char *program_name;
141
142 void m4_error (int, int, const char *, ...) M4_GNUC_PRINTF(3, 4);
143 void m4_error_at_line (int, int, const char *, int,
144                        const char *, ...) M4_GNUC_PRINTF(5, 6);
145
146 #define M4ERROR(Arglist) (m4_error Arglist)
147 #define M4ERROR_AT_LINE(Arglist) (m4_error_at_line Arglist)
148
149 \f
150 /* File: debug.c  --- debugging and tracing function.  */
151
152 extern FILE *debug;
153
154 /* The value of debug_level is a bitmask of the following.  */
155
156 /* a: show arglist in trace output */
157 #define DEBUG_TRACE_ARGS 1
158 /* e: show expansion in trace output */
159 #define DEBUG_TRACE_EXPANSION 2
160 /* q: quote args and expansion in trace output */
161 #define DEBUG_TRACE_QUOTE 4
162 /* t: trace all macros -- overrides trace{on,off} */
163 #define DEBUG_TRACE_ALL 8
164 /* l: add line numbers to trace output */
165 #define DEBUG_TRACE_LINE 16
166 /* f: add file name to trace output */
167 #define DEBUG_TRACE_FILE 32
168 /* p: trace path search of include files */
169 #define DEBUG_TRACE_PATH 64
170 /* c: show macro call before args collection */
171 #define DEBUG_TRACE_CALL 128
172 /* i: trace changes of input files */
173 #define DEBUG_TRACE_INPUT 256
174 /* x: add call id to trace output */
175 #define DEBUG_TRACE_CALLID 512
176
177 /* V: very verbose --  print everything */
178 #define DEBUG_TRACE_VERBOSE 1023
179 /* default flags -- equiv: aeq */
180 #define DEBUG_TRACE_DEFAULT 7
181
182 #define DEBUG_PRINT1(Fmt, Arg1) \
183   do                                                            \
184     {                                                           \
185       if (debug != NULL)                                        \
186         xfprintf (debug, Fmt, Arg1);                            \
187     }                                                           \
188   while (0)
189
190 #define DEBUG_PRINT3(Fmt, Arg1, Arg2, Arg3) \
191   do                                                            \
192     {                                                           \
193       if (debug != NULL)                                        \
194         xfprintf (debug, Fmt, Arg1, Arg2, Arg3);                \
195     }                                                           \
196   while (0)
197
198 #define DEBUG_MESSAGE(Fmt) \
199   do                                                            \
200     {                                                           \
201       if (debug != NULL)                                        \
202         {                                                       \
203           debug_message_prefix ();                              \
204           xfprintf (debug, Fmt);                                \
205           putc ('\n', debug);                                   \
206         }                                                       \
207     }                                                           \
208   while (0)
209
210 #define DEBUG_MESSAGE1(Fmt, Arg1) \
211   do                                                            \
212     {                                                           \
213       if (debug != NULL)                                        \
214         {                                                       \
215           debug_message_prefix ();                              \
216           xfprintf (debug, Fmt, Arg1);                          \
217           putc ('\n', debug);                                   \
218         }                                                       \
219     }                                                           \
220   while (0)
221
222 #define DEBUG_MESSAGE2(Fmt, Arg1, Arg2) \
223   do                                                            \
224     {                                                           \
225       if (debug != NULL)                                        \
226         {                                                       \
227           debug_message_prefix ();                              \
228           xfprintf (debug, Fmt, Arg1, Arg2);                    \
229           putc ('\n', debug);                                   \
230         }                                                       \
231     }                                                           \
232   while (0)
233
234 void debug_init (void);
235 int debug_decode (const char *);
236 void debug_flush_files (void);
237 bool debug_set_output (const char *);
238 void debug_message_prefix (void);
239
240 void trace_prepre (const char *, int);
241 void trace_pre (const char *, int, int, token_data **);
242 void trace_post (const char *, int, int, const char *);
243 \f
244 /* File: input.c  --- lexical definitions.  */
245
246 /* Various different token types.  */
247 enum token_type
248 {
249   TOKEN_EOF,                    /* end of file */
250   TOKEN_STRING,                 /* a quoted string or comment */
251   TOKEN_WORD,                   /* an identifier */
252   TOKEN_OPEN,                   /* ( */
253   TOKEN_COMMA,                  /* , */
254   TOKEN_CLOSE,                  /* ) */
255   TOKEN_SIMPLE,                 /* any other single character */
256   TOKEN_MACDEF                  /* a macro's definition (see "defn") */
257 };
258
259 /* The data for a token, a macro argument, and a macro definition.  */
260 enum token_data_type
261 {
262   TOKEN_VOID,
263   TOKEN_TEXT,
264   TOKEN_FUNC
265 };
266
267 struct token_data
268 {
269   enum token_data_type type;
270   union
271     {
272       struct
273         {
274           char *text;
275 #ifdef ENABLE_CHANGEWORD
276           char *original_text;
277 #endif
278         }
279       u_t;
280       builtin_func *func;
281     }
282   u;
283 };
284
285 #define TOKEN_DATA_TYPE(Td)             ((Td)->type)
286 #define TOKEN_DATA_TEXT(Td)             ((Td)->u.u_t.text)
287 #ifdef ENABLE_CHANGEWORD
288 # define TOKEN_DATA_ORIG_TEXT(Td)       ((Td)->u.u_t.original_text)
289 #endif
290 #define TOKEN_DATA_FUNC(Td)             ((Td)->u.func)
291
292 typedef enum token_type token_type;
293 typedef enum token_data_type token_data_type;
294
295 void input_init (void);
296 token_type peek_token (void);
297 token_type next_token (token_data *, int *);
298 void skip_line (void);
299
300 /* push back input */
301 void push_file (FILE *, const char *, bool);
302 void push_macro (builtin_func *);
303 struct obstack *push_string_init (void);
304 const char *push_string_finish (void);
305 void push_wrapup (const char *);
306 bool pop_wrapup (void);
307
308 /* current input file, and line */
309 extern const char *current_file;
310 extern int current_line;
311
312 /* left and right quote, begin and end comment */
313 extern STRING bcomm, ecomm;
314 extern STRING lquote, rquote;
315
316 #define DEF_LQUOTE "`"
317 #define DEF_RQUOTE "\'"
318 #define DEF_BCOMM "#"
319 #define DEF_ECOMM "\n"
320
321 void set_quotes (const char *, const char *);
322 void set_comment (const char *, const char *);
323 #ifdef ENABLE_CHANGEWORD
324 void set_word_regexp (const char *);
325 #endif
326 \f
327 /* File: output.c --- output functions.  */
328 extern int current_diversion;
329 extern int output_current_line;
330
331 void output_init (void);
332 void output_exit (void);
333 void output_text (const char *, int);
334 void shipout_text (struct obstack *, const char *, int, int);
335 void make_diversion (int);
336 void insert_diversion (int);
337 void insert_file (FILE *);
338 void freeze_diversions (FILE *);
339 \f
340 /* File symtab.c  --- symbol table definitions.  */
341
342 /* Operation modes for lookup_symbol ().  */
343 enum symbol_lookup
344 {
345   SYMBOL_LOOKUP,
346   SYMBOL_INSERT,
347   SYMBOL_DELETE,
348   SYMBOL_PUSHDEF,
349   SYMBOL_POPDEF
350 };
351
352 /* Symbol table entry.  */
353 struct symbol
354 {
355   struct symbol *next;
356   bool_bitfield traced : 1;
357   bool_bitfield shadowed : 1;
358   bool_bitfield macro_args : 1;
359   bool_bitfield blind_no_args : 1;
360   bool_bitfield deleted : 1;
361   int pending_expansions;
362
363   char *name;
364   token_data data;
365 };
366
367 #define SYMBOL_NEXT(S)          ((S)->next)
368 #define SYMBOL_TRACED(S)        ((S)->traced)
369 #define SYMBOL_SHADOWED(S)      ((S)->shadowed)
370 #define SYMBOL_MACRO_ARGS(S)    ((S)->macro_args)
371 #define SYMBOL_BLIND_NO_ARGS(S) ((S)->blind_no_args)
372 #define SYMBOL_DELETED(S)       ((S)->deleted)
373 #define SYMBOL_PENDING_EXPANSIONS(S) ((S)->pending_expansions)
374 #define SYMBOL_NAME(S)          ((S)->name)
375 #define SYMBOL_TYPE(S)          (TOKEN_DATA_TYPE (&(S)->data))
376 #define SYMBOL_TEXT(S)          (TOKEN_DATA_TEXT (&(S)->data))
377 #define SYMBOL_FUNC(S)          (TOKEN_DATA_FUNC (&(S)->data))
378
379 typedef enum symbol_lookup symbol_lookup;
380 typedef struct symbol symbol;
381 typedef void hack_symbol (symbol *, void *);
382
383 #define HASHMAX 509             /* default, overridden by -Hsize */
384
385 extern symbol **symtab;
386
387 void free_symbol (symbol *sym);
388 void symtab_init (void);
389 symbol *lookup_symbol (const char *, symbol_lookup);
390 void hack_all_symbols (hack_symbol *, void *);
391 \f
392 /* File: macro.c  --- macro expansion.  */
393
394 void expand_input (void);
395 void call_macro (symbol *, int, token_data **, struct obstack *);
396 \f
397 /* File: builtin.c  --- builtins.  */
398
399 struct builtin
400 {
401   const char *name;
402   bool_bitfield gnu_extension : 1;
403   bool_bitfield groks_macro_args : 1;
404   bool_bitfield blind_if_no_args : 1;
405   builtin_func *func;
406 };
407
408 struct predefined
409 {
410   const char *unix_name;
411   const char *gnu_name;
412   const char *func;
413 };
414
415 typedef struct builtin builtin;
416 typedef struct predefined predefined;
417 struct re_pattern_buffer;
418 struct re_registers;
419
420 /* The default sequence detects multi-digit parameters (obsolete after
421    1.4.x), and any use of extended arguments with the default ${}
422    syntax (new in 2.0).  */
423 #define DEFAULT_MACRO_SEQUENCE "\\$\\({[^}]*}\\|[0-9][0-9]+\\)"
424
425 void builtin_init (void);
426 void define_builtin (const char *, const builtin *, symbol_lookup);
427 void set_macro_sequence (const char *);
428 void free_macro_sequence (void);
429 void define_user_macro (const char *, const char *, symbol_lookup);
430 void undivert_all (void);
431 void expand_user_macro (struct obstack *, symbol *, int, token_data **);
432 void m4_placeholder (struct obstack *, int, token_data **);
433 void init_pattern_buffer (struct re_pattern_buffer *, struct re_registers *);
434 const char *ntoa (int32_t, int);
435
436 const builtin *find_builtin_by_addr (builtin_func *);
437 const builtin *find_builtin_by_name (const char *);
438 \f
439 /* File: path.c  --- path search for include files.  */
440
441 void include_init (void);
442 void include_env_init (void);
443 void add_include_directory (const char *);
444 FILE *m4_path_search (const char *, char **);
445 \f
446 /* File: eval.c  --- expression evaluation.  */
447
448 bool evaluate (const char *, int32_t *);
449 \f
450 /* File: format.c  --- printf like formatting.  */
451
452 void expand_format (struct obstack *, int, token_data **);
453 \f
454 /* File: freeze.c --- frozen state files.  */
455
456 void produce_frozen_state (const char *);
457 void reload_frozen_state (const char *);
458 \f
459 /* Debugging the memory allocator.  */
460
461 #ifdef WITH_DMALLOC
462 # define DMALLOC_FUNC_CHECK
463 # include <dmalloc.h>
464 #endif
465
466 /* Other debug stuff.  */
467
468 #ifdef DEBUG
469 # define DEBUG_INCL   1
470 # define DEBUG_INPUT  1
471 # define DEBUG_MACRO  1
472 # define DEBUG_OUTPUT 1
473 # define DEBUG_STKOVF 1
474 # define DEBUG_SYM    1
475 #endif
476
477 /* Convert a possibly-signed character to an unsigned character.  This is
478    a bit safer than casting to unsigned char, since it catches some type
479    errors that the cast doesn't.  */
480 #if HAVE_INLINE
481 static inline unsigned char to_uchar (char ch) { return ch; }
482 #else
483 # define to_uchar(C) ((unsigned char) (C))
484 #endif
485
486 /* Avoid negative logic when comparing two strings.  */
487 #define STREQ(a, b) (strcmp (a, b) == 0)