#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <sys/types.h>
#if __STDC__
# define voidstar void *
#else
# define voidstar char *
#endif
#ifdef PROTOTYPES
# define _(Args) Args
#else
# define _(Args) ()
#endif
#include <stdio.h>
#include <ctype.h>
#include "obstack.h"
#if defined (HAVE_STRING_H) || defined (STDC_HEADERS)
# include <string.h>
# if !defined (STDC_HEADERS) && defined (HAVE_MEMORY_H)
# include <memory.h>
# endif
# ifndef bcopy
# define bcopy(S, D, N) memcpy ((D), (S), (N))
# endif
#else
# include <strings.h>
# ifndef memcpy
# define memcpy(D, S, N) bcopy((S), (D), (N))
# endif
# ifndef strchr
# define strchr(S, C) index ((S), (C))
# endif
# ifndef strrchr
# define strrchr(S, C) rindex ((S), (C))
# endif
# ifndef bcopy
void bcopy ();
# endif
#endif
#ifdef STDC_HEADERS
# include <stdlib.h>
#else
voidstar malloc ();
voidstar realloc ();
char *getenv ();
double atof ();
long strtol ();
#endif
#ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 0
#endif
#ifndef EXIT_FAILURE
# define EXIT_FAILURE 1
#endif
#include <errno.h>
#ifndef errno
extern int errno;
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#ifndef FALSE
typedef enum { FALSE = 0, TRUE = 1 } boolean;
#else
typedef int boolean;
#endif
char *mktemp ();
struct string
{
char *string;
size_t length;
};
typedef struct string STRING;
voidstar xmalloc _((unsigned int));
voidstar xrealloc _((voidstar , unsigned int));
void xfree _((voidstar));
char *xstrdup _((const char *));
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free xfree
void error _((int, int, const char *, ...));
typedef void builtin_func ();
typedef struct token_data token_data;
extern int sync_output;
extern int debug_level;
extern int hash_table_size;
extern int no_gnu_extensions;
extern int prefix_all_builtins;
extern int max_debug_argument_length;
extern int suppress_warnings;
extern int warning_status;
extern int nesting_limit;
#ifdef ENABLE_CHANGEWORD
extern const char *user_word_regexp;
#endif
#define M4ERROR(Arglist) \
(reference_error (), error Arglist)
void reference_error _((void));
#ifdef USE_STACKOVF
void setup_stackovf_trap _((char *const *, char *const *,
void (*handler) (void)));
#endif
extern FILE *debug;
#define DEBUG_TRACE_ARGS 1
#define DEBUG_TRACE_EXPANSION 2
#define DEBUG_TRACE_QUOTE 4
#define DEBUG_TRACE_ALL 8
#define DEBUG_TRACE_LINE 16
#define DEBUG_TRACE_FILE 32
#define DEBUG_TRACE_PATH 64
#define DEBUG_TRACE_CALL 128
#define DEBUG_TRACE_INPUT 256
#define DEBUG_TRACE_CALLID 512
#define DEBUG_TRACE_VERBOSE 1023
#define DEBUG_TRACE_DEFAULT 7
#define DEBUG_PRINT1(Fmt, Arg1) \
do \
{ \
if (debug != NULL) \
fprintf (debug, Fmt, Arg1); \
} \
while (0)
#define DEBUG_PRINT3(Fmt, Arg1, Arg2, Arg3) \
do \
{ \
if (debug != NULL) \
fprintf (debug, Fmt, Arg1, Arg2, Arg3); \
} \
while (0)
#define DEBUG_MESSAGE(Fmt) \
do \
{ \
if (debug != NULL) \
{ \
debug_message_prefix (); \
fprintf (debug, Fmt); \
putc ('\n', debug); \
} \
} \
while (0)
#define DEBUG_MESSAGE1(Fmt, Arg1) \
do \
{ \
if (debug != NULL) \
{ \
debug_message_prefix (); \
fprintf (debug, Fmt, Arg1); \
putc ('\n', debug); \
} \
} \
while (0)
#define DEBUG_MESSAGE2(Fmt, Arg1, Arg2) \
do \
{ \
if (debug != NULL) \
{ \
debug_message_prefix (); \
fprintf (debug, Fmt, Arg1, Arg2); \
putc ('\n', debug); \
} \
} \
while (0)
void debug_init _((void));
int debug_decode _((const char *));
void debug_flush_files _((void));
boolean debug_set_output _((const char *));
void debug_message_prefix _((void));
void trace_prepre _((const char *, int));
void trace_pre _((const char *, int, int, token_data **));
void trace_post _((const char *, int, int, token_data **, const char *));
enum token_type
{
TOKEN_EOF,
TOKEN_STRING,
TOKEN_WORD,
TOKEN_SIMPLE,
TOKEN_MACDEF
};
enum token_data_type
{
TOKEN_VOID,
TOKEN_TEXT,
TOKEN_FUNC
};
struct token_data
{
enum token_data_type type;
union
{
struct
{
char *text;
#ifdef ENABLE_CHANGEWORD
char *original_text;
#endif
}
u_t;
struct
{
builtin_func *func;
boolean traced;
}
u_f;
}
u;
};
#define TOKEN_DATA_TYPE(Td) ((Td)->type)
#define TOKEN_DATA_TEXT(Td) ((Td)->u.u_t.text)
#ifdef ENABLE_CHANGEWORD
# define TOKEN_DATA_ORIG_TEXT(Td) ((Td)->u.u_t.original_text)
#endif
#define TOKEN_DATA_FUNC(Td) ((Td)->u.u_f.func)
#define TOKEN_DATA_FUNC_TRACED(Td) ((Td)->u.u_f.traced)
typedef enum token_type token_type;
typedef enum token_data_type token_data_type;
void input_init _((void));
int peek_input _((void));
token_type next_token _((token_data *));
void skip_line _((void));
void push_file _((FILE *, const char *));
void push_macro _((builtin_func *, boolean));
struct obstack *push_string_init _((void));
const char *push_string_finish _((void));
void push_wrapup _((const char *));
boolean pop_wrapup _((void));
extern const char *current_file;
extern int current_line;
extern STRING bcomm, ecomm;
extern STRING lquote, rquote;
#define DEF_LQUOTE "`"
#define DEF_RQUOTE "\'"
#define DEF_BCOMM "#"
#define DEF_ECOMM "\n"
void set_quotes _((const char *, const char *));
void set_comment _((const char *, const char *));
#ifdef ENABLE_CHANGEWORD
void set_word_regexp _((const char *));
#endif
extern int current_diversion;
extern int output_current_line;
void output_init _((void));
void shipout_text _((struct obstack *, const char *, int));
void make_diversion _((int));
void insert_diversion _((int));
void insert_file _((FILE *));
void freeze_diversions _((FILE *));
enum symbol_lookup
{
SYMBOL_LOOKUP,
SYMBOL_INSERT,
SYMBOL_DELETE,
SYMBOL_PUSHDEF,
SYMBOL_POPDEF
};
struct symbol
{
struct symbol *next;
boolean traced;
boolean shadowed;
boolean macro_args;
boolean blind_no_args;
char *name;
token_data data;
};
#define SYMBOL_NEXT(S) ((S)->next)
#define SYMBOL_TRACED(S) ((S)->traced)
#define SYMBOL_SHADOWED(S) ((S)->shadowed)
#define SYMBOL_MACRO_ARGS(S) ((S)->macro_args)
#define SYMBOL_BLIND_NO_ARGS(S) ((S)->blind_no_args)
#define SYMBOL_NAME(S) ((S)->name)
#define SYMBOL_TYPE(S) (TOKEN_DATA_TYPE (&(S)->data))
#define SYMBOL_TEXT(S) (TOKEN_DATA_TEXT (&(S)->data))
#define SYMBOL_FUNC(S) (TOKEN_DATA_FUNC (&(S)->data))
typedef enum symbol_lookup symbol_lookup;
typedef struct symbol symbol;
typedef void hack_symbol ();
#define HASHMAX 509
extern symbol **symtab;
void symtab_init _((void));
symbol *lookup_symbol _((const char *, symbol_lookup));
void hack_all_symbols _((hack_symbol *, const char *));
void expand_input _((void));
void call_macro _((symbol *, int, token_data **, struct obstack *));
struct builtin
{
const char *name;
boolean gnu_extension;
boolean groks_macro_args;
boolean blind_if_no_args;
builtin_func *func;
};
struct predefined
{
const char *unix_name;
const char *gnu_name;
const char *func;
};
typedef struct builtin builtin;
typedef struct predefined predefined;
void builtin_init _((void));
void define_builtin _((const char *, const builtin *, symbol_lookup, boolean));
void define_user_macro _((const char *, const char *, symbol_lookup));
void undivert_all _((void));
void expand_user_macro _((struct obstack *, symbol *, int, token_data **));
const builtin *find_builtin_by_addr _((builtin_func *));
const builtin *find_builtin_by_name _((const char *));
void include_init _((void));
void include_env_init _((void));
void add_include_directory _((const char *));
FILE *path_search _((const char *));
typedef int eval_t;
typedef unsigned int unsigned_eval_t;
boolean evaluate _((const char *, eval_t *));
void format _((struct obstack *, int, token_data **));
void produce_frozen_state _((const char *));
void reload_frozen_state _((const char *));
#ifdef WITH_DMALLOC
# define DMALLOC_FUNC_CHECK
# include <dmalloc.h>
#endif
#ifdef DEBUG
# define DEBUG_INPUT
# define DEBUG_MACRO
# define DEBUG_SYM
# define DEBUG_INCL
#endif