home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / m / m4v05as.zip / M4.H < prev    next >
C/C++ Source or Header  |  1992-02-22  |  9KB  |  350 lines

  1. /*
  2.  * GNU m4 -- A simple macro processor
  3.  * Copyright (C) 1989, 1990 Free Software Foundation, Inc. 
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 1, or (at your option)
  8.  * any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19.  
  20. /*
  21.  * MS-DOS port (c) 1990 by Thorsten Ohl, ohl@gnu.ai.mit.edu
  22.  * This port is also distributed under the terms of the
  23.  * GNU General Public License as published by the
  24.  * Free Software Foundation.
  25.  *
  26.  * Please note that this file is not identical to the
  27.  * original GNU release, you should have received this
  28.  * code as patch to the official release.
  29.  *
  30.  * $Header: e:/gnu/m4/RCS/m4.h 0.5.1.0 90/09/28 18:35:05 tho Exp $
  31.  */
  32.  
  33. #include <stdio.h>
  34. #include <ctype.h>
  35. #ifdef MSDOS
  36. #include <stdarg.h>
  37. #else
  38. #include <varargs.h>
  39. #endif
  40.  
  41. #include "obstack.h"
  42.  
  43. #ifdef MSDOS
  44. #include <stdlib.h>
  45. #else /* not MSDOS */
  46. extern char *malloc();
  47. extern char *realloc();
  48. extern void free();
  49. extern char *mktemp();
  50. extern int mkstemp();
  51. #endif /* not MSDOS */
  52.  
  53. #ifdef USG
  54. #include <string.h>
  55. #define    index(s, c)    strchr((s), (c))
  56. #define    rindex(s, c)    strrchr((s), (c))
  57.  
  58. #include <memory.h>
  59. #define bcmp(s1, s2, n)    memcmp ((s1), (s2), (n))
  60. #define bzero(s, n)    memset ((s), 0, (n))
  61. #define bcopy(s, d, n)    memcpy ((d), (s), (n))
  62.  
  63. #else /* not USG */
  64. #include <strings.h>
  65.  
  66. extern int bcmp ();
  67. extern void bzero (), bcopy ();
  68. #endif /* USG */
  69.  
  70.  
  71. #define obstack_chunk_alloc    xmalloc
  72. #define obstack_chunk_free    xfree
  73.  
  74. #define nil 0
  75.  
  76. typedef enum boolean { false = 0, true = 1 } boolean;
  77.  
  78. #ifndef MSDOS
  79. extern int errno;
  80. extern int sys_nerr;
  81. extern char *sys_errlist[];
  82. #endif /* not MSDOS */
  83.  
  84. #define syserr() ((errno > 0 && errno < sys_nerr) ? sys_errlist[errno] : "Unknown error")
  85.  
  86.  
  87. /* miscellaneous, that must be first */
  88. typedef void builtin_func();
  89.  
  90.  
  91. /* File: m4.c  --- global definitions*/
  92.  
  93. /* Option flags */
  94. extern int interactive;            /* -e */
  95. extern int sync_output;            /* -s */
  96. extern int debug_level;            /* -d */
  97. extern int hash_table_size;        /* -H */
  98. extern int no_gnu_extensions;        /* -g */
  99.  
  100. /* Error handling */
  101. #ifdef MSDOS
  102. extern void warning (char *fmt, ...);
  103. extern void error (char *fmt, ...);
  104. extern void fatal (char *fmt, ...);
  105. extern void internal_error (char *fmt, ...);
  106. #else /* not MSDOS */
  107. extern void warning();
  108. extern void error();
  109. extern void fatal();
  110. extern void internal_error();
  111. #endif /* not MSDOS */
  112.  
  113. /* Memory allocation */
  114. #ifdef MSDOS
  115. extern char *xmalloc (unsigned int size);
  116. extern void xfree (char *p);
  117. extern char *xstrdup (char *s);
  118. #else /* not MSDOS */
  119. extern char *xmalloc();
  120. extern char *xrealloc();
  121. extern void xfree();
  122. extern char *xstrdup();
  123. #endif /* not MSDOS */
  124.  
  125.  
  126. /* File: input.c  --- lexical definitions */
  127.  
  128. /* Various different token types */
  129. enum token_type {
  130.     TOKEN_EOF,                /* end of file */
  131.     TOKEN_STRING,            /* a quoted string */
  132.     TOKEN_WORD,                /* an identifier */
  133.     TOKEN_SIMPLE,            /* a single character */
  134.     TOKEN_MACDEF,            /* a macros definition (see "defn") */
  135. };
  136.  
  137. /* The amount of data for a token, a macro argument, and a macro definition */
  138. enum token_data_type {
  139.     TOKEN_VOID,
  140.     TOKEN_TEXT,
  141.     TOKEN_FUNC,
  142. };
  143.  
  144. struct token_data {
  145.     enum token_data_type type;
  146.     union {
  147.     char *text;
  148.     builtin_func *func;
  149.     } u;
  150. };
  151.  
  152. #define TOKEN_DATA_TYPE(td)    ((td)->type)
  153. #define TOKEN_DATA_TEXT(td)    ((td)->u.text)
  154. #define TOKEN_DATA_FUNC(td)    ((td)->u.func)
  155.  
  156. typedef enum token_type token_type;
  157. typedef enum token_data_type token_data_type;
  158. typedef struct token_data token_data;
  159.  
  160. #ifdef MSDOS
  161. extern void input_init (void);
  162. extern int peek_input (void);
  163. extern enum token_type next_token (struct token_data *td);
  164. extern void skip_line (void);
  165. #else /* not MSDOS */
  166. extern void input_init();
  167. extern int peek_input();
  168. extern token_type next_token();
  169. extern void skip_line();
  170. #endif /* not MSDOS */
  171.  
  172. /* push back input */
  173. #ifdef MSDOS
  174. extern void push_file (FILE *fp, char *title);
  175. extern void push_macro (void (*func) ());
  176. extern struct obstack *push_string_init (void);
  177. extern char *push_string_finish (void);
  178. extern void push_wrapup (char *s);
  179. extern enum boolean pop_wrapup (void);
  180. #else /* not MSDOS */
  181. extern void push_file();
  182. extern void push_macro();
  183. extern void push_string();
  184. extern struct obstack *push_string_init();
  185. extern char *push_string_finish();
  186. extern void push_wrapup();
  187. extern boolean pop_wrapup();
  188. #endif /* not MSDOS */
  189.  
  190. /* current input file, and line */
  191. extern char *current_file;
  192. extern int current_line;
  193.  
  194. /* left and right quote, begin and end comment */
  195. extern char lquote, rquote, bcomm, ecomm;
  196.  
  197. #define DEF_LQUOTE '`'
  198. #define DEF_RQUOTE '\''
  199. #define DEF_BCOMM '#'
  200. #define DEF_ECOMM '\n'
  201.  
  202.  
  203. /* File: output.c --- output functions */
  204. extern int output_lines;
  205. extern int output_current_line;
  206.  
  207. #ifdef MSDOS
  208. extern void output_init (void);
  209. extern void sync_line (int line, char *file);
  210. extern void shipout_text (struct obstack *obs, char *text);
  211. extern void make_divertion (int divnum);
  212. extern void insert_divertion (int divnum);
  213. #else /* not MSDOS */
  214. extern void output_init();
  215. extern void sync_line();
  216. extern void shipout_text();
  217. extern void make_divertion();
  218. extern void insert_divertion();
  219. #endif /* not MSDOS */
  220.  
  221.  
  222. /* File symtab.c  --- symbol table definitions */
  223.  
  224. /* Operation modes for lookup_symbol() */
  225. enum symbol_lookup {
  226.     SYMBOL_LOOKUP,
  227.     SYMBOL_INSERT,
  228.     SYMBOL_DELETE,
  229.     SYMBOL_PUSHDEF,
  230.     SYMBOL_POPDEF,
  231. };
  232.  
  233. /* Symbol table entry */
  234. struct symbol {
  235.     struct symbol *next;
  236.     boolean traced;
  237.     boolean shadowed;
  238.     boolean macro_args;
  239.  
  240.     char *name;
  241.     token_data data;
  242. };
  243.  
  244. #define SYMBOL_NEXT(s)        ((s)->next)
  245. #define SYMBOL_TRACED(s)    ((s)->traced)
  246. #define SYMBOL_SHADOWED(s)    ((s)->shadowed)
  247. #define SYMBOL_MACRO_ARGS(s)    ((s)->macro_args)
  248. #define SYMBOL_NAME(s)        ((s)->name)
  249. #define SYMBOL_TYPE(s)        (TOKEN_DATA_TYPE(&(s)->data))
  250. #define SYMBOL_TEXT(s)        (TOKEN_DATA_TEXT(&(s)->data))
  251. #define SYMBOL_FUNC(s)        (TOKEN_DATA_FUNC(&(s)->data))
  252.  
  253. typedef enum symbol_lookup symbol_lookup;
  254. typedef struct symbol symbol;
  255. #ifdef MSDOS
  256. typedef void hack_symbol(symbol *sym, char *data);
  257. #else /* not MSDOS */
  258. typedef void hack_symbol();
  259. #endif /* not MSDOS */
  260.  
  261. #define HASHMAX 509            /* Default, overridden by -Hsize */
  262.  
  263. extern symbol **symtab;
  264.  
  265. #ifdef MSDOS
  266. extern void symtab_init (void);
  267. extern struct symbol *lookup_symbol (char *name, enum symbol_lookup mode);
  268. extern void hack_all_symbols (hack_symbol *func, char *data);
  269. #else /* not MSDOS */
  270. extern void symtab_init();
  271. extern symbol *lookup_symbol();
  272. extern hack_symbol hack_all_symbols();
  273. #endif /* not MSDOS */
  274.  
  275.  
  276. /* File: macro.c  --- macro expansion */
  277.  
  278. #ifdef MSDOS
  279. extern void expand_input (void);
  280. #else /* not MSDOS */
  281. extern void expand_input();
  282. #endif /* not MSDOS */
  283.  
  284.  
  285. /* File: builtin.c  --- builtins */
  286.  
  287. struct builtin {
  288.     char *name;
  289.     boolean gnu_extension;
  290.     boolean groks_macro_args;
  291.     builtin_func *func;
  292. };
  293.  
  294. struct predefined {
  295.     char *name;
  296.     boolean gnu_extension;
  297.     char *func;
  298. };
  299.  
  300. typedef struct builtin builtin;
  301. typedef struct predefined predefined;
  302.  
  303. #ifdef MSDOS
  304. extern void builtin_init (void);
  305. extern void define_user_macro (char *name, char *text,\
  306.                    enum symbol_lookup mode);
  307. extern void undivert_all (void);
  308. extern void expand_user_macro (struct obstack *obs, struct symbol *sym,\
  309.                    int argc, struct token_data **argv);
  310. #else /* not MSDOS */
  311. extern void builtin_init();
  312. extern void define_user_macro();
  313. extern void undivert_all();
  314. extern void expand_user_macro();
  315. #endif /* not MSDOS */
  316.  
  317.  
  318. /* File: eval.c  --- expression evaluation */
  319.  
  320. #ifdef MSDOS
  321. typedef long eval_t;        /* use 32-bit arithmetic */
  322. extern enum boolean evaluate (char *expr, eval_t *val);        /* eval.c */
  323. #else /* not MSDOS */
  324. typedef int eval_t;
  325. extern boolean evaluate();
  326. #endif /* not MSDOS */
  327.  
  328.  
  329. /* Debug stuff */
  330.  
  331. #ifdef DEBUG
  332. #define DEBUG_INPUT
  333. #define DEBUG_MACRO
  334. #define DEBUG_SYM
  335.  
  336. #endif
  337.  
  338.  
  339. /* Obstack stuff.  */
  340.  
  341. #ifdef MSDOS
  342. extern void _obstack_free (struct obstack *h, void *obj);
  343. extern void _obstack_begin (struct obstack *h, int size, int alignment,\
  344.                 void * (*chunkfun) (unsigned int size),\
  345.                 void (*freefun) (char *p));
  346. extern void _obstack_newchunk (struct obstack *h, int length);
  347. extern int _obstack_allocated_p (struct obstack *h, void *obj);
  348. #endif /* MSDOS */
  349.  
  350.