71 |
} |
} |
72 |
|
|
73 |
m4_symbol * |
m4_symbol * |
74 |
m4_builtin_pushdef (const char *name, lt_dlhandle handle, |
m4_symbol_token (const char *name, m4_data_t type, m4_token *token, |
75 |
m4_builtin_func *func, int flags, int min_args, |
m4_symbol *(*getter) (const char *name), |
76 |
int max_args) |
m4_symbol *(*setter) (m4_symbol *, m4_token *)) |
77 |
{ |
{ |
78 |
m4_symbol *symbol; |
m4_symbol *symbol; |
79 |
|
|
80 |
assert (name); |
assert (name); |
81 |
assert (handle); |
assert (!token || (TOKEN_TYPE (token) == type)); |
82 |
assert (func); |
assert (getter); |
83 |
|
assert (setter); |
84 |
|
|
85 |
symbol = m4_symbol_pushdef (name); |
symbol = (*getter) (name); |
86 |
|
|
87 |
if (symbol) |
if (symbol) |
88 |
m4_symbol_builtin (symbol, handle, func, flags, min_args, max_args); |
{ |
89 |
|
m4_token empty; |
|
return symbol; |
|
|
} |
|
|
|
|
|
m4_symbol * |
|
|
m4_builtin_define (const char *name, lt_dlhandle handle, |
|
|
m4_builtin_func *func, int flags, |
|
|
int min_args, int max_args) |
|
|
{ |
|
|
m4_symbol *symbol; |
|
90 |
|
|
91 |
assert (name); |
if (!token) |
92 |
assert (handle); |
{ |
93 |
assert (func); |
bzero (&empty, sizeof (m4_token)); |
94 |
|
TOKEN_TYPE (&empty) = type; |
95 |
|
switch (type) |
96 |
|
{ |
97 |
|
case M4_TOKEN_TEXT: |
98 |
|
TOKEN_TEXT (&empty) = ""; |
99 |
|
break; |
100 |
|
|
101 |
|
case M4_TOKEN_FUNC: |
102 |
|
case M4_TOKEN_VOID: |
103 |
|
break; |
104 |
|
} |
105 |
|
|
106 |
symbol = m4_symbol_define (name); |
token = ∅ |
107 |
|
} |
108 |
|
|
109 |
if (symbol) |
(*setter) (symbol, token); |
110 |
m4_symbol_builtin (symbol, handle, func, flags, min_args, max_args); |
} |
111 |
|
|
112 |
return symbol; |
return symbol; |
113 |
} |
} |
116 |
m4_builtin_table_install (lt_dlhandle handle, const m4_builtin *table) |
m4_builtin_table_install (lt_dlhandle handle, const m4_builtin *table) |
117 |
{ |
{ |
118 |
const m4_builtin *bp; |
const m4_builtin *bp; |
119 |
|
m4_token token; |
120 |
|
|
121 |
assert (handle); |
assert (handle); |
122 |
assert (table); |
assert (table); |
123 |
|
|
124 |
|
bzero (&token, sizeof (m4_token)); |
125 |
|
TOKEN_TYPE (&token) = M4_TOKEN_FUNC; |
126 |
|
TOKEN_HANDLE (&token) = handle; |
127 |
|
|
128 |
for (bp = table; bp->name != NULL; bp++) |
for (bp = table; bp->name != NULL; bp++) |
129 |
{ |
{ |
130 |
int flags = 0; |
int flags = 0; |
131 |
char *key; |
char *name; |
132 |
|
|
133 |
if (prefix_all_builtins) |
if (prefix_all_builtins) |
134 |
{ |
{ |
135 |
static const char prefix[] = "m4_"; |
static const char prefix[] = "m4_"; |
136 |
size_t len = strlen (prefix) + strlen (bp->name); |
size_t len = strlen (prefix) + strlen (bp->name); |
137 |
|
|
138 |
key = (char *) xmalloc (1+ len); |
name = (char *) xmalloc (1+ len); |
139 |
snprintf (key, 1+ len, "%s%s", prefix, bp->name); |
snprintf (name, 1+ len, "%s%s", prefix, bp->name); |
140 |
} |
} |
141 |
else |
else |
142 |
key = (char *) bp->name; |
name = (char *) bp->name; |
143 |
|
|
144 |
if (bp->groks_macro_args) BIT_SET (flags, TOKEN_MACRO_ARGS_BIT); |
if (bp->groks_macro_args) BIT_SET (flags, TOKEN_MACRO_ARGS_BIT); |
145 |
if (bp->blind_if_no_args) BIT_SET (flags, TOKEN_BLIND_ARGS_BIT); |
if (bp->blind_if_no_args) BIT_SET (flags, TOKEN_BLIND_ARGS_BIT); |
146 |
|
|
147 |
m4_builtin_pushdef (key, handle, bp->func, flags, |
TOKEN_FUNC (&token) = bp->func; |
148 |
bp->min_args, bp->max_args); |
TOKEN_FLAGS (&token) = flags; |
149 |
|
TOKEN_MIN_ARGS (&token) = bp->min_args; |
150 |
|
TOKEN_MAX_ARGS (&token) = bp->max_args; |
151 |
|
|
152 |
|
m4_builtin_pushdef (name, &token); |
153 |
|
|
154 |
if (prefix_all_builtins) |
if (prefix_all_builtins) |
155 |
xfree (key); |
xfree (name); |
156 |
} |
} |
157 |
} |
} |
158 |
|
|
|
m4_symbol * |
|
|
m4_macro_pushdef (const char *name, lt_dlhandle handle, const char *text, |
|
|
int flags, int min_args, int max_args) |
|
|
{ |
|
|
m4_symbol *symbol; |
|
|
|
|
|
assert (name); |
|
|
assert (text); |
|
|
|
|
|
symbol = m4_symbol_pushdef (name); |
|
|
|
|
|
if (symbol) |
|
|
m4_symbol_macro (symbol, handle, text, flags, min_args, max_args); |
|
|
|
|
|
return symbol; |
|
|
} |
|
|
|
|
|
m4_symbol * |
|
|
m4_macro_define (const char *name, lt_dlhandle handle, const char *text, |
|
|
int flags, int min_args, int max_args) |
|
|
{ |
|
|
m4_symbol *symbol; |
|
|
|
|
|
assert (name); |
|
|
assert (text); |
|
|
|
|
|
symbol = m4_symbol_define (name); |
|
|
|
|
|
if (symbol) |
|
|
m4_symbol_macro (symbol, handle, text, flags, min_args, max_args); |
|
|
|
|
|
return symbol; |
|
|
} |
|
|
|
|
|
|
|
159 |
void |
void |
160 |
m4_macro_table_install (lt_dlhandle handle, const m4_macro *table) |
m4_macro_table_install (lt_dlhandle handle, const m4_macro *table) |
161 |
{ |
{ |
162 |
const m4_macro *mp; |
const m4_macro *mp; |
163 |
|
m4_token token; |
164 |
|
|
165 |
|
bzero (&token, sizeof (m4_token)); |
166 |
|
TOKEN_TYPE (&token) = M4_TOKEN_TEXT; |
167 |
|
TOKEN_HANDLE (&token) = handle; |
168 |
|
|
169 |
for (mp = table; mp->name != NULL; mp++) |
for (mp = table; mp->name != NULL; mp++) |
170 |
m4_macro_pushdef (mp->name, handle, mp->value, 0, 0, -1); |
{ |
171 |
|
TOKEN_TEXT (&token) = (char *) mp->value; |
172 |
|
m4_macro_pushdef (mp->name, &token); |
173 |
|
} |
174 |
} |
} |