60 |
|
|
61 |
/* --- CONTEXT MANAGEMENT --- */ |
/* --- CONTEXT MANAGEMENT --- */ |
62 |
|
|
63 |
extern m4 *m4_create (void); |
extern m4 * m4_create (void); |
64 |
extern void m4_delete (m4 *); |
extern void m4_delete (m4 *); |
65 |
extern m4_symtab *m4_get_symtab (m4 *); |
extern m4_symtab *m4_get_symtab (m4 *); |
66 |
|
|
67 |
#define M4SYMTAB (m4_get_symtab (context)) |
#define M4SYMTAB (m4_get_symtab (context)) |
68 |
|
|
69 |
|
|
70 |
|
|
71 |
/* --- MODULE MANAGEMENT --- */ |
/* --- MODULE MANAGEMENT --- */ |
72 |
|
|
76 |
extern lt_dlhandle m4_module_load (m4 *, const char*, struct obstack*); |
extern lt_dlhandle m4_module_load (m4 *, const char*, struct obstack*); |
77 |
extern void m4_module_unload (m4 *, const char*, struct obstack*); |
extern void m4_module_unload (m4 *, const char*, struct obstack*); |
78 |
|
|
79 |
extern const char *m4_get_module_name (lt_dlhandle); |
extern const char *m4_get_module_name (lt_dlhandle); |
80 |
extern m4_builtin *m4_get_module_builtin_table (lt_dlhandle); |
extern m4_builtin *m4_get_module_builtin_table (lt_dlhandle); |
81 |
extern m4_macro *m4_get_module_macro_table (lt_dlhandle); |
extern m4_macro *m4_get_module_macro_table (lt_dlhandle); |
82 |
|
|
83 |
|
extern void m4_set_module_macro_table (m4 *context, lt_dlhandle handle, |
84 |
|
const m4_macro *table); |
85 |
|
extern void m4_set_module_builtin_table (m4 *context, lt_dlhandle handle, |
86 |
|
const m4_builtin *table); |
87 |
|
|
88 |
|
|
89 |
/* --- SYMBOL TABLE MANAGEMENT --- */ |
/* --- SYMBOL TABLE MANAGEMENT --- */ |
90 |
|
|
91 |
|
|
92 |
typedef int m4_symtab_apply_func (m4_symtab *symtab, const void *key, void *value, void *data); |
typedef int m4_symtab_apply_func (m4_symtab *symtab, const void *key, |
93 |
|
void *value, void *data); |
94 |
|
|
95 |
extern m4_symtab *m4_symtab_create (size_t); |
extern m4_symtab *m4_symtab_create (size_t); |
96 |
extern void m4_symtab_delete (m4_symtab*); |
extern void m4_symtab_delete (m4_symtab*); |
99 |
#define m4_symtab_apply(symtab, func, userdata) \ |
#define m4_symtab_apply(symtab, func, userdata) \ |
100 |
(m4_hash_apply ((m4_hash*)(symtab), (m4_hash_apply_func*)(func), (userdata))) |
(m4_hash_apply ((m4_hash*)(symtab), (m4_hash_apply_func*)(func), (userdata))) |
101 |
|
|
102 |
|
|
103 |
extern m4_symbol *m4_symbol_lookup (m4_symtab*, const char *); |
extern m4_symbol *m4_symbol_lookup (m4_symtab*, const char *); |
104 |
extern m4_symbol *m4_symbol_pushdef (m4_symtab*, const char *); |
extern m4_symbol *m4_symbol_pushdef (m4_symtab*, const char *, m4_token *); |
105 |
extern m4_symbol *m4_symbol_define (m4_symtab*, const char *); |
extern m4_symbol *m4_symbol_define (m4_symtab*, const char *, m4_token *); |
106 |
extern void m4_symbol_popdef (m4_symtab*, const char *); |
extern void m4_symbol_popdef (m4_symtab*, const char *); |
107 |
extern void m4_symbol_delete (m4_symtab*, const char *); |
extern void m4_symbol_delete (m4_symtab*, const char *); |
108 |
|
|
110 |
while (m4_symbol_lookup ((symtab), (name))) \ |
while (m4_symbol_lookup ((symtab), (name))) \ |
111 |
m4_symbol_popdef ((symtab), (name)); } M4_STMT_END |
m4_symbol_popdef ((symtab), (name)); } M4_STMT_END |
112 |
|
|
113 |
|
extern void m4_set_symbol_traced (m4_symtab*, const char *); |
114 |
|
|
115 |
|
|
116 |
/* Various different token types. */ |
/* Various different token types. */ |
117 |
typedef enum { |
typedef enum { |
136 |
|
|
137 |
/* --- MACRO (and builtin) MANAGEMENT --- */ |
/* --- MACRO (and builtin) MANAGEMENT --- */ |
138 |
|
|
|
extern m4_symbol *m4_symbol_set_token (m4 *context, const char *name, |
|
|
m4_symbol_type type, m4_token *token, |
|
|
m4_symbol *(*getter) (m4_symtab *, const char *), |
|
|
m4_symbol *(*setter) (m4_symbol *, m4_token *)); |
|
|
|
|
|
extern void m4_set_module_macro_table (m4 *context, lt_dlhandle handle, |
|
|
const m4_macro *table); |
|
|
extern void m4_set_module_builtin_table (m4 *context, lt_dlhandle handle, |
|
|
const m4_builtin *table); |
|
|
|
|
139 |
extern const m4_builtin *m4_builtin_find_by_name ( |
extern const m4_builtin *m4_builtin_find_by_name ( |
140 |
const m4_builtin *, const char *); |
const m4_builtin *, const char *); |
141 |
extern const m4_builtin *m4_builtin_find_by_func ( |
extern const m4_builtin *m4_builtin_find_by_func ( |
142 |
const m4_builtin *, m4_builtin_func *); |
const m4_builtin *, m4_builtin_func *); |
143 |
|
|
|
|
|
|
/* These 2 functions are not part of the documented API, but we need to |
|
|
declare them here so that the macros below will work. */ |
|
|
extern m4_symbol *m4__symbol_set_builtin (m4_symbol*, m4_token*); |
|
|
extern m4_symbol *m4__symbol_set_macro (m4_symbol*, m4_token*); |
|
|
|
|
|
#define m4_macro_pushdef(context, name, macro) \ |
|
|
m4_symbol_set_token ((context), (name), M4_TOKEN_TEXT, (macro), \ |
|
|
m4_symbol_pushdef, m4__symbol_set_macro) |
|
|
#define m4_macro_define(context, name, macro) \ |
|
|
m4_symbol_set_token ((context), (name), M4_TOKEN_TEXT, (macro), \ |
|
|
m4_symbol_define, m4__symbol_set_macro) |
|
|
#define m4_builtin_pushdef(context, name, builtin) \ |
|
|
m4_symbol_set_token ((context), (name), M4_TOKEN_FUNC, (builtin), \ |
|
|
m4_symbol_pushdef, m4__symbol_set_builtin) |
|
|
#define m4_builtin_define(context, name, builtin) \ |
|
|
m4_symbol_set_token ((context), (name), M4_TOKEN_FUNC, (builtin), \ |
|
|
m4_symbol_define, m4__symbol_set_builtin) |
|
|
|
|
144 |
extern m4__token_type m4_token_get_type (m4_token *); |
extern m4__token_type m4_token_get_type (m4_token *); |
145 |
extern char *m4_token_text (m4_token *); |
extern char *m4_token_text (m4_token *); |
146 |
extern m4_builtin_func *m4_token_func (m4_token *); |
extern m4_builtin_func *m4_token_func (m4_token *); |