home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / m4-1.4-src.tgz / tar.out / fsf / m4 / src / m4.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  12KB  |  476 lines

  1. /* GNU m4 -- A simple macro processor
  2.    Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
  3.  
  4.    This program is free software; you can redistribute it and/or modify
  5.    it under the terms of the GNU General Public License as published by
  6.    the Free Software Foundation; either version 2, or (at your option)
  7.    any later version.
  8.  
  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.
  13.  
  14.    You should have received a copy of the GNU General Public License
  15.    along with this program; if not, write to the Free Software
  16.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18.  
  19. /* We use <config.h> instead of "config.h" so that a compilation
  20.    using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
  21.    (which it would do because it found this file in $srcdir).  */
  22.  
  23. #ifdef HAVE_CONFIG_H
  24. # include <config.h>
  25. #endif
  26.  
  27. #include <sys/types.h>
  28.  
  29. #if __STDC__
  30. # define voidstar void *
  31. #else
  32. # define voidstar char *
  33. #endif
  34.  
  35. #ifdef PROTOTYPES
  36. # define _(Args) Args
  37. #else
  38. # define _(Args) ()
  39. #endif
  40.  
  41. #include <stdio.h>
  42. #include <ctype.h>
  43.  
  44. #include "obstack.h"
  45.  
  46. /* An ANSI string.h and pre-ANSI memory.h might conflict.  */
  47.  
  48. #if defined (HAVE_STRING_H) || defined (STDC_HEADERS)
  49. # include <string.h>
  50. # if !defined (STDC_HEADERS) && defined (HAVE_MEMORY_H)
  51. #  include <memory.h>
  52. # endif
  53. /* This is for obstack code -- should live in obstack.h.  */
  54. # ifndef bcopy
  55. #  define bcopy(S, D, N) memcpy ((D), (S), (N))
  56. # endif
  57. #else
  58. # include <strings.h>
  59. # ifndef memcpy
  60. #  define memcpy(D, S, N) bcopy((S), (D), (N))
  61. # endif
  62. # ifndef strchr
  63. #  define strchr(S, C) index ((S), (C))
  64. # endif
  65. # ifndef strrchr
  66. #  define strrchr(S, C) rindex ((S), (C))
  67. # endif
  68. # ifndef bcopy
  69. void bcopy ();
  70. # endif
  71. #endif
  72.  
  73. #ifdef STDC_HEADERS
  74. # include <stdlib.h>
  75. #else /* not STDC_HEADERS */
  76.  
  77. voidstar malloc ();
  78. voidstar realloc ();
  79. char *getenv ();
  80. double atof ();
  81. long strtol ();
  82.  
  83. #endif /* STDC_HEADERS */
  84.  
  85. /* Some systems do not define EXIT_*, even with STDC_HEADERS.  */
  86. #ifndef EXIT_SUCCESS
  87. # define EXIT_SUCCESS 0
  88. #endif
  89. #ifndef EXIT_FAILURE
  90. # define EXIT_FAILURE 1
  91. #endif
  92.  
  93. #include <errno.h>
  94. #ifndef errno
  95. extern int errno;
  96. #endif
  97.  
  98. #ifdef HAVE_UNISTD_H
  99. # include <unistd.h>
  100. #endif
  101.  
  102. /* If FALSE is defined, we presume TRUE is defined too.  In this case,
  103.    merely typedef boolean as being int.  Or else, define these all.  */
  104. #ifndef FALSE
  105. /* Do not use `enum boolean': this tag is used in SVR4 <sys/types.h>.  */
  106. typedef enum { FALSE = 0, TRUE = 1 } boolean;
  107. #else
  108. typedef int boolean;
  109. #endif
  110.  
  111. char *mktemp ();
  112.  
  113. /* Various declarations.  */
  114.  
  115. struct string
  116.   {
  117.     char *string;        /* characters of the string */
  118.     size_t length;        /* length of the string */
  119.   };
  120. typedef struct string STRING;
  121.  
  122. /* Memory allocation.  */
  123. voidstar xmalloc _((unsigned int));
  124. voidstar xrealloc _((voidstar , unsigned int));
  125. void xfree _((voidstar));
  126. char *xstrdup _((const char *));
  127. #define obstack_chunk_alloc    xmalloc
  128. #define obstack_chunk_free    xfree
  129.  
  130. /* Other library routines.  */
  131. void error _((int, int, const char *, ...));
  132.  
  133. /* Those must come first.  */
  134. typedef void builtin_func ();
  135. typedef struct token_data token_data;
  136.  
  137. /* File: m4.c  --- global definitions.  */
  138.  
  139. /* Option flags.  */
  140. extern int sync_output;            /* -s */
  141. extern int debug_level;            /* -d */
  142. extern int hash_table_size;        /* -H */
  143. extern int no_gnu_extensions;        /* -G */
  144. extern int prefix_all_builtins;        /* -P */
  145. extern int max_debug_argument_length;    /* -l */
  146. extern int suppress_warnings;        /* -Q */
  147. extern int warning_status;        /* -E */
  148. extern int nesting_limit;        /* -L */
  149. #ifdef ENABLE_CHANGEWORD
  150. extern const char *user_word_regexp;    /* -W */
  151. #endif
  152.  
  153. /* Error handling.  */
  154. #define M4ERROR(Arglist) \
  155.   (reference_error (), error Arglist)
  156.  
  157. void reference_error _((void));
  158.  
  159. #ifdef USE_STACKOVF
  160. void setup_stackovf_trap _((char *const *, char *const *,
  161.                 void (*handler) (void)));
  162. #endif
  163.  
  164. /* File: debug.c  --- debugging and tracing function.  */
  165.  
  166. extern FILE *debug;
  167.  
  168. /* The value of debug_level is a bitmask of the following.  */
  169.  
  170. /* a: show arglist in trace output */
  171. #define DEBUG_TRACE_ARGS 1
  172. /* e: show expansion in trace output */
  173. #define DEBUG_TRACE_EXPANSION 2
  174. /* q: quote args and expansion in trace output */
  175. #define DEBUG_TRACE_QUOTE 4
  176. /* t: trace all macros -- overrides trace{on,off} */
  177. #define DEBUG_TRACE_ALL 8
  178. /* l: add line numbers to trace output */
  179. #define DEBUG_TRACE_LINE 16
  180. /* f: add file name to trace output */
  181. #define DEBUG_TRACE_FILE 32
  182. /* p: trace path search of include files */
  183. #define DEBUG_TRACE_PATH 64
  184. /* c: show macro call before args collection */
  185. #define DEBUG_TRACE_CALL 128
  186. /* i: trace changes of input files */
  187. #define DEBUG_TRACE_INPUT 256
  188. /* x: add call id to trace output */
  189. #define DEBUG_TRACE_CALLID 512
  190.  
  191. /* V: very verbose --  print everything */
  192. #define DEBUG_TRACE_VERBOSE 1023
  193. /* default flags -- equiv: aeq */
  194. #define DEBUG_TRACE_DEFAULT 7
  195.  
  196. #define DEBUG_PRINT1(Fmt, Arg1) \
  197.   do                                \
  198.     {                                \
  199.       if (debug != NULL)                    \
  200.     fprintf (debug, Fmt, Arg1);                \
  201.     }                                \
  202.   while (0)
  203.  
  204. #define DEBUG_PRINT3(Fmt, Arg1, Arg2, Arg3) \
  205.   do                                \
  206.     {                                \
  207.       if (debug != NULL)                    \
  208.     fprintf (debug, Fmt, Arg1, Arg2, Arg3);            \
  209.     }                                \
  210.   while (0)
  211.  
  212. #define DEBUG_MESSAGE(Fmt) \
  213.   do                                \
  214.     {                                \
  215.       if (debug != NULL)                    \
  216.     {                            \
  217.       debug_message_prefix ();                \
  218.       fprintf (debug, Fmt);                    \
  219.       putc ('\n', debug);                    \
  220.     }                            \
  221.     }                                \
  222.   while (0)
  223.  
  224. #define DEBUG_MESSAGE1(Fmt, Arg1) \
  225.   do                                \
  226.     {                                \
  227.       if (debug != NULL)                    \
  228.     {                            \
  229.       debug_message_prefix ();                \
  230.       fprintf (debug, Fmt, Arg1);                \
  231.       putc ('\n', debug);                    \
  232.     }                            \
  233.     }                                \
  234.   while (0)
  235.  
  236. #define DEBUG_MESSAGE2(Fmt, Arg1, Arg2) \
  237.   do                                \
  238.     {                                \
  239.       if (debug != NULL)                    \
  240.     {                            \
  241.       debug_message_prefix ();                \
  242.       fprintf (debug, Fmt, Arg1, Arg2);            \
  243.       putc ('\n', debug);                    \
  244.     }                            \
  245.     }                                \
  246.   while (0)
  247.  
  248. void debug_init _((void));
  249. int debug_decode _((const char *));
  250. void debug_flush_files _((void));
  251. boolean debug_set_output _((const char *));
  252. void debug_message_prefix _((void));
  253.  
  254. void trace_prepre _((const char *, int));
  255. void trace_pre _((const char *, int, int, token_data **));
  256. void trace_post _((const char *, int, int, token_data **, const char *));
  257.  
  258. /* File: input.c  --- lexical definitions.  */
  259.  
  260. /* Various different token types.  */
  261. enum token_type
  262. {
  263.   TOKEN_EOF,            /* end of file */
  264.   TOKEN_STRING,            /* a quoted string */
  265.   TOKEN_WORD,            /* an identifier */
  266.   TOKEN_SIMPLE,            /* a single character */
  267.   TOKEN_MACDEF            /* a macros definition (see "defn") */
  268. };
  269.  
  270. /* The data for a token, a macro argument, and a macro definition.  */
  271. enum token_data_type
  272. {
  273.   TOKEN_VOID,
  274.   TOKEN_TEXT,
  275.   TOKEN_FUNC
  276. };
  277.  
  278. struct token_data
  279. {
  280.   enum token_data_type type;
  281.   union
  282.     {
  283.       struct
  284.     {
  285.       char *text;
  286. #ifdef ENABLE_CHANGEWORD
  287.       char *original_text;
  288. #endif
  289.     }
  290.       u_t;
  291.       struct
  292.     {
  293.       builtin_func *func;
  294.       boolean traced;
  295.     }
  296.       u_f;
  297.     }
  298.   u;
  299. };
  300.  
  301. #define TOKEN_DATA_TYPE(Td)        ((Td)->type)
  302. #define TOKEN_DATA_TEXT(Td)        ((Td)->u.u_t.text)
  303. #ifdef ENABLE_CHANGEWORD
  304. # define TOKEN_DATA_ORIG_TEXT(Td)    ((Td)->u.u_t.original_text)
  305. #endif
  306. #define TOKEN_DATA_FUNC(Td)        ((Td)->u.u_f.func)
  307. #define TOKEN_DATA_FUNC_TRACED(Td)     ((Td)->u.u_f.traced)
  308.  
  309. typedef enum token_type token_type;
  310. typedef enum token_data_type token_data_type;
  311.  
  312. void input_init _((void));
  313. int peek_input _((void));
  314. token_type next_token _((token_data *));
  315. void skip_line _((void));
  316.  
  317. /* push back input */
  318. void push_file _((FILE *, const char *));
  319. void push_macro _((builtin_func *, boolean));
  320. struct obstack *push_string_init _((void));
  321. const char *push_string_finish _((void));
  322. void push_wrapup _((const char *));
  323. boolean pop_wrapup _((void));
  324.  
  325. /* current input file, and line */
  326. extern const char *current_file;
  327. extern int current_line;
  328.  
  329. /* left and right quote, begin and end comment */
  330. extern STRING bcomm, ecomm;
  331. extern STRING lquote, rquote;
  332.  
  333. #define DEF_LQUOTE "`"
  334. #define DEF_RQUOTE "\'"
  335. #define DEF_BCOMM "#"
  336. #define DEF_ECOMM "\n"
  337.  
  338. void set_quotes _((const char *, const char *));
  339. void set_comment _((const char *, const char *));
  340. #ifdef ENABLE_CHANGEWORD
  341. void set_word_regexp _((const char *));
  342. #endif
  343.  
  344. /* File: output.c --- output functions.  */
  345. extern int current_diversion;
  346. extern int output_current_line;
  347.  
  348. void output_init _((void));
  349. void shipout_text _((struct obstack *, const char *, int));
  350. void make_diversion _((int));
  351. void insert_diversion _((int));
  352. void insert_file _((FILE *));
  353. void freeze_diversions _((FILE *));
  354.  
  355. /* File symtab.c  --- symbol table definitions.  */
  356.  
  357. /* Operation modes for lookup_symbol ().  */
  358. enum symbol_lookup
  359. {
  360.   SYMBOL_LOOKUP,
  361.   SYMBOL_INSERT,
  362.   SYMBOL_DELETE,
  363.   SYMBOL_PUSHDEF,
  364.   SYMBOL_POPDEF
  365. };
  366.  
  367. /* Symbol table entry.  */
  368. struct symbol
  369. {
  370.   struct symbol *next;
  371.   boolean traced;
  372.   boolean shadowed;
  373.   boolean macro_args;
  374.   boolean blind_no_args;
  375.  
  376.   char *name;
  377.   token_data data;
  378. };
  379.  
  380. #define SYMBOL_NEXT(S)        ((S)->next)
  381. #define SYMBOL_TRACED(S)    ((S)->traced)
  382. #define SYMBOL_SHADOWED(S)    ((S)->shadowed)
  383. #define SYMBOL_MACRO_ARGS(S)    ((S)->macro_args)
  384. #define SYMBOL_BLIND_NO_ARGS(S)    ((S)->blind_no_args)
  385. #define SYMBOL_NAME(S)        ((S)->name)
  386. #define SYMBOL_TYPE(S)        (TOKEN_DATA_TYPE (&(S)->data))
  387. #define SYMBOL_TEXT(S)        (TOKEN_DATA_TEXT (&(S)->data))
  388. #define SYMBOL_FUNC(S)        (TOKEN_DATA_FUNC (&(S)->data))
  389.  
  390. typedef enum symbol_lookup symbol_lookup;
  391. typedef struct symbol symbol;
  392. typedef void hack_symbol ();
  393.  
  394. #define HASHMAX 509        /* default, overridden by -Hsize */
  395.  
  396. extern symbol **symtab;
  397.  
  398. void symtab_init _((void));
  399. symbol *lookup_symbol _((const char *, symbol_lookup));
  400. void hack_all_symbols _((hack_symbol *, const char *));
  401.  
  402. /* File: macro.c  --- macro expansion.  */
  403.  
  404. void expand_input _((void));
  405. void call_macro _((symbol *, int, token_data **, struct obstack *));
  406.  
  407. /* File: builtin.c  --- builtins.  */
  408.  
  409. struct builtin
  410. {
  411.   const char *name;
  412.   boolean gnu_extension;
  413.   boolean groks_macro_args;
  414.   boolean blind_if_no_args;
  415.   builtin_func *func;
  416. };
  417.  
  418. struct predefined
  419. {
  420.   const char *unix_name;
  421.   const char *gnu_name;
  422.   const char *func;
  423. };
  424.  
  425. typedef struct builtin builtin;
  426. typedef struct predefined predefined;
  427.  
  428. void builtin_init _((void));
  429. void define_builtin _((const char *, const builtin *, symbol_lookup, boolean));
  430. void define_user_macro _((const char *, const char *, symbol_lookup));
  431. void undivert_all _((void));
  432. void expand_user_macro _((struct obstack *, symbol *, int, token_data **));
  433.  
  434. const builtin *find_builtin_by_addr _((builtin_func *));
  435. const builtin *find_builtin_by_name _((const char *));
  436.  
  437. /* File: path.c  --- path search for include files.  */
  438.  
  439. void include_init _((void));
  440. void include_env_init _((void));
  441. void add_include_directory _((const char *));
  442. FILE *path_search _((const char *));
  443.  
  444. /* File: eval.c  --- expression evaluation.  */
  445.  
  446. /* eval_t and unsigned_eval_t should be at least 32 bits.  */
  447. typedef int eval_t;
  448. typedef unsigned int unsigned_eval_t;
  449.  
  450. boolean evaluate _((const char *, eval_t *));
  451.  
  452. /* File: format.c  --- printf like formatting.  */
  453.  
  454. void format _((struct obstack *, int, token_data **));
  455.  
  456. /* File: freeze.c --- frozen state files.  */
  457.  
  458. void produce_frozen_state _((const char *));
  459. void reload_frozen_state _((const char *));
  460.  
  461. /* Debugging the memory allocator.  */
  462.  
  463. #ifdef WITH_DMALLOC
  464. # define DMALLOC_FUNC_CHECK
  465. # include <dmalloc.h>
  466. #endif
  467.  
  468. /* Other debug stuff.  */
  469.  
  470. #ifdef DEBUG
  471. # define DEBUG_INPUT
  472. # define DEBUG_MACRO
  473. # define DEBUG_SYM
  474. # define DEBUG_INCL
  475. #endif
  476.