25 |
#endif |
#endif |
26 |
|
|
27 |
#include <assert.h> |
#include <assert.h> |
|
#include <m4module.h> |
|
28 |
|
|
29 |
|
#include "m4module.h" |
30 |
|
|
31 |
|
typedef enum { |
32 |
|
M4_SYMBOL_VOID, |
33 |
|
M4_SYMBOL_TEXT, |
34 |
|
M4_SYMBOL_FUNC |
35 |
|
} m4__symbol_type; |
36 |
|
|
37 |
|
#define BIT_TEST(flags, bit) (((flags) & (bit)) == (bit)) |
38 |
|
#define BIT_SET(flags, bit) ((flags) |= (bit)) |
39 |
|
#define BIT_RESET(flags, bit) ((flags) &= ~(bit)) |
40 |
|
|
41 |
|
|
42 |
/* --- CONTEXT MANAGEMENT --- */ |
/* --- CONTEXT MANAGEMENT --- */ |
45 |
m4_symtab *symtab; |
m4_symtab *symtab; |
46 |
}; |
}; |
47 |
|
|
48 |
#define M4_SYMTAB(context) ((context)->symtab) |
#ifdef NDEBUG |
49 |
|
# define m4_get_symtab(context) ((context)->symtab) |
50 |
#define m4_get_symtab(context) ((context)->symtab) |
#endif |
|
|
|
51 |
|
|
52 |
|
|
53 |
/* --- MODULE MANAGEMENT --- */ |
/* --- MODULE MANAGEMENT --- */ |
67 |
|
|
68 |
/* --- SYMBOL TABLE MANAGEMENT --- */ |
/* --- SYMBOL TABLE MANAGEMENT --- */ |
69 |
|
|
70 |
extern void m4__symtab_remove_module_references (m4_symtab*, lt_dlhandle); |
struct m4_symbol |
71 |
|
{ |
72 |
|
boolean traced; |
73 |
/* TRUE iff strlen(rquote) == strlen(lquote) == 1 */ |
m4_symbol_value * value; |
|
extern boolean m4__single_quotes; |
|
|
|
|
|
/* TRUE iff strlen(bcomm) == strlen(ecomm) == 1 */ |
|
|
extern boolean m4__single_comments; |
|
|
|
|
|
/* TRUE iff some character has M4_SYNTAX_ESCAPE */ |
|
|
extern boolean m4__use_macro_escape; |
|
|
|
|
|
struct m4_symbol_arg { |
|
|
int index; |
|
|
int flags; |
|
|
char * default_val; |
|
74 |
}; |
}; |
75 |
|
|
|
#define SYMBOL_ARG_INDEX(A) ((A)->index) |
|
|
#define SYMBOL_ARG_FLAGS(A) ((A)->flags) |
|
|
#define SYMBOL_ARG_DEFAULT(A) ((A)->default_val) |
|
|
|
|
|
/* m4_symbol_arg.flags bit masks: */ |
|
|
|
|
|
#define SYMBOL_ARG_REST_BIT (1 << 0) |
|
|
#define SYMBOL_ARG_KEY_BIT (1 << 1) |
|
|
|
|
76 |
struct m4_symbol_value { |
struct m4_symbol_value { |
77 |
m4_symbol_value * next; |
m4_symbol_value * next; |
78 |
lt_dlhandle handle; |
lt_dlhandle handle; |
81 |
m4_hash * arg_signature; |
m4_hash * arg_signature; |
82 |
int min_args, max_args; |
int min_args, max_args; |
83 |
|
|
84 |
m4_symbol_type type; |
m4__symbol_type type; |
85 |
union { |
union { |
86 |
char * text; |
char * text; |
87 |
m4_builtin_func * func; |
m4_builtin_func * func; |
94 |
#define VALUE_ARG_SIGNATURE(T) ((T)->arg_signature) |
#define VALUE_ARG_SIGNATURE(T) ((T)->arg_signature) |
95 |
#define VALUE_MIN_ARGS(T) ((T)->min_args) |
#define VALUE_MIN_ARGS(T) ((T)->min_args) |
96 |
#define VALUE_MAX_ARGS(T) ((T)->max_args) |
#define VALUE_MAX_ARGS(T) ((T)->max_args) |
97 |
#define VALUE_TYPE(T) ((T)->type) |
|
98 |
#define VALUE_TEXT(T) ((T)->u.text) |
#define SYMBOL_NEXT(S) (VALUE_NEXT ((S)->value)) |
99 |
#define VALUE_FUNC(T) ((T)->u.func) |
#define SYMBOL_HANDLE(S) (VALUE_HANDLE ((S)->value)) |
100 |
|
#define SYMBOL_FLAGS(S) (VALUE_FLAGS ((S)->value)) |
101 |
|
#define SYMBOL_ARG_SIGNATURE(S) (VALUE_ARG_SIGNATURE ((S)->value)) |
102 |
|
#define SYMBOL_MIN_ARGS(S) (VALUE_MIN_ARGS ((S)->value)) |
103 |
|
#define SYMBOL_MAX_ARGS(S) (VALUE_MAX_ARGS ((S)->value)) |
104 |
|
|
105 |
|
#ifdef NDEBUG |
106 |
|
# define m4_get_symbol_traced(S) ((S)->traced) |
107 |
|
# define m4_set_symbol_traced(S, V) ((S)->traced = (V)) |
108 |
|
|
109 |
|
# define m4_symbol_value_create() (XCALLOC (m4_symbol_value, 1)) |
110 |
|
# define m4_symbol_value_delete(V) (XFREE (V)) |
111 |
|
|
112 |
|
# define m4_is_symbol_value_text(V) ((V)->type == M4_SYMBOL_TEXT) |
113 |
|
# define m4_is_symbol_value_func(V) ((V)->type == M4_SYMBOL_FUNC) |
114 |
|
# define m4_get_symbol_value_text(V) ((V)->u.text) |
115 |
|
# define m4_get_symbol_value_func(V) ((V)->u.func) |
116 |
|
|
117 |
|
# define m4_set_symbol_value_text(V, T) \ |
118 |
|
((V)->type = M4_SYMBOL_TEXT, (V)->u.text = (T)) |
119 |
|
# define m4_set_symbol_value_func(V, F) \ |
120 |
|
((V)->type = M4_SYMBOL_FUNC, (V)->u.func = (F)) |
121 |
|
#endif |
122 |
|
|
123 |
|
|
124 |
|
|
125 |
/* m4_symbol_value.flags bit masks: */ |
/* m4_symbol_value.flags bit masks: */ |
126 |
|
|
127 |
#define VALUE_MACRO_ARGS_BIT (1 << 0) |
#define VALUE_MACRO_ARGS_BIT (1 << 0) |
128 |
#define VALUE_BLIND_ARGS_BIT (1 << 1) |
#define VALUE_BLIND_ARGS_BIT (1 << 1) |
129 |
|
|
|
#define BIT_TEST(flags, bit) (((flags) & (bit)) == (bit)) |
|
|
#define BIT_SET(flags, bit) ((flags) |= (bit)) |
|
|
#define BIT_RESET(flags, bit) ((flags) &= ~(bit)) |
|
130 |
|
|
131 |
|
struct m4_symbol_arg { |
132 |
|
int index; |
133 |
|
int flags; |
134 |
|
char * default_val; |
135 |
|
}; |
136 |
|
|
137 |
|
#define SYMBOL_ARG_INDEX(A) ((A)->index) |
138 |
|
#define SYMBOL_ARG_FLAGS(A) ((A)->flags) |
139 |
|
#define SYMBOL_ARG_DEFAULT(A) ((A)->default_val) |
140 |
|
|
141 |
|
/* m4_symbol_arg.flags bit masks: */ |
142 |
|
|
143 |
/* Redefine the exported function to this faster |
#define SYMBOL_ARG_REST_BIT (1 << 0) |
144 |
macro based version for internal use by the m4 code. */ |
#define SYMBOL_ARG_KEY_BIT (1 << 1) |
|
#undef M4ARG |
|
|
#define M4ARG(i) (argc > (i) ? VALUE_TEXT (argv[i]) : "") |
|
145 |
|
|
146 |
|
extern void m4__symtab_remove_module_references (m4_symtab*, lt_dlhandle); |
147 |
|
|
|
struct m4_symbol |
|
|
{ |
|
|
boolean traced; |
|
|
m4_symbol_value * value; |
|
|
}; |
|
148 |
|
|
|
#define SYMBOL_TRACED(S) ((S)->traced) |
|
|
#define SYMBOL_VALUE(S) ((S)->value) |
|
149 |
|
|
150 |
#define SYMBOL_NEXT(S) (VALUE_NEXT (SYMBOL_VALUE (S))) |
|
151 |
#define SYMBOL_HANDLE(S) (VALUE_HANDLE (SYMBOL_VALUE (S))) |
/* TRUE iff strlen(rquote) == strlen(lquote) == 1 */ |
152 |
#define SYMBOL_FLAGS(S) (VALUE_FLAGS (SYMBOL_VALUE (S))) |
extern boolean m4__single_quotes; |
|
#define SYMBOL_ARG_SIGNATURE(S) (VALUE_ARG_SIGNATURE (SYMBOL_VALUE (S))) |
|
|
#define SYMBOL_MIN_ARGS(S) (VALUE_MIN_ARGS (SYMBOL_VALUE (S))) |
|
|
#define SYMBOL_MAX_ARGS(S) (VALUE_MAX_ARGS (SYMBOL_VALUE (S))) |
|
|
#define SYMBOL_TYPE(S) (VALUE_TYPE (SYMBOL_VALUE (S))) |
|
|
#define SYMBOL_TEXT(S) (VALUE_TEXT (SYMBOL_VALUE (S))) |
|
|
#define SYMBOL_FUNC(S) (VALUE_FUNC (SYMBOL_VALUE (S))) |
|
153 |
|
|
154 |
|
/* TRUE iff strlen(bcomm) == strlen(ecomm) == 1 */ |
155 |
|
extern boolean m4__single_comments; |
156 |
|
|
157 |
|
/* TRUE iff some character has M4_SYNTAX_ESCAPE */ |
158 |
|
extern boolean m4__use_macro_escape; |
159 |
|
|
160 |
/* Various different token types. */ |
/* Various different token types. */ |
161 |
typedef enum { |
typedef enum { |