* m4/m4private.h (enum m4__symbol_chain_type): New enum.
(struct m4_symbol_chain): Rename...
(struct m4__symbol_chain): ...to this, since it is internal.
* m4/symtab.c (m4_symbol_value_copy, m4_symbol_value_print): All
callers updated.
* m4/input.c (struct m4_input_block, m4__push_symbol)
(composite_peek, composite_read, composite_unget)
(composite_clean, m4__make_text_link, append_quote_token): Likewise.
* m4/macro.c (expand_macro, arg_mark, m4_arg_symbol, m4_arg_text)
(m4_arg_equal, m4_arg_len, m4_make_argv_ref, m4_push_arg)
(m4_push_args): Likewise.
Signed-off-by: Eric Blake <ebb9@byu.net>
index 81643e732210a33b5585de70f5ee9838256f7a38..a3f821ed37503db5582deb6acfb07d81e8e7844f 100644 (file)
+2008年01月26日 Eric Blake <ebb9@byu.net>
+
+ Stage 12a: make m4_symbol_chain a union.
+ Shrink size of symbol chains by using a union.
+ Memory impact: slight improvement, due to smaller struct.
+ Speed impact: slight improvement, due to less bookkeeping.
+ * m4/m4private.h (enum m4__symbol_chain_type): New enum.
+ (struct m4_symbol_chain): Rename...
+ (struct m4__symbol_chain): ...to this, since it is internal.
+ * m4/symtab.c (m4_symbol_value_copy, m4_symbol_value_print): All
+ callers updated.
+ * m4/input.c (struct m4_input_block, m4__push_symbol)
+ (composite_peek, composite_read, composite_unget)
+ (composite_clean, composite_print, m4__make_text_link)
+ (append_quote_token): Likewise.
+ * m4/macro.c (expand_macro, arg_mark, m4_arg_symbol, m4_arg_text)
+ (m4_arg_equal, m4_arg_len, m4_make_argv_ref, m4_push_arg)
+ (m4_push_args): Likewise.
+
2008年01月23日 Eric Blake <ebb9@byu.net>
Adjust to recent libtool interface change.
index 0dcb0ae1bec8de431fe22e29e008887d58627914..f45db187a5376b87661df7b1620aba5f2601ed1e 100644 (file)
u_b; /* See builtin_funcs. */
struct
{
- m4_symbol_chain *chain; /* Current link in chain. */
- m4_symbol_chain *end; /* Last link in chain. */
+ m4__symbol_chain *chain; /* Current link in chain. */
+ m4__symbol_chain *end; /* Last link in chain. */
}
u_c; /* See composite_funcs. */
}
bool
m4__push_symbol (m4 *context, m4_symbol_value *value, size_t level)
{
- m4_symbol_chain *chain;
+ m4__symbol_chain *chain;
bool result = false;
assert (next);
@@ -562,20 +562,18 @@ m4__push_symbol (m4 *context, m4_symbol_value *value, size_t level)
next->u.u_c.chain = next->u.u_c.end = NULL;
}
m4__make_text_link (current_input, &next->u.u_c.chain, &next->u.u_c.end);
- chain = (m4_symbol_chain *) obstack_alloc (current_input, sizeof *chain);
+ chain = (m4__symbol_chain *) obstack_alloc (current_input, sizeof *chain);
if (next->u.u_c.end)
next->u.u_c.end->next = chain;
else
next->u.u_c.chain = chain;
next->u.u_c.end = chain;
chain->next = NULL;
+ chain->type = M4__CHAIN_STR;
chain->quote_age = m4_get_symbol_value_quote_age (value);
- chain->str = m4_get_symbol_value_text (value);
- chain->len = m4_get_symbol_value_len (value);
- chain->level = level;
- chain->argv = NULL;
- chain->index = 0;
- chain->flatten = false;
+ chain->u.u_s.str = m4_get_symbol_value_text (value);
+ chain->u.u_s.len = m4_get_symbol_value_len (value);
+ chain->u.u_s.level = level;
if (level < SIZE_MAX)
{
m4__adjust_refcount (context, level, true);
static int
composite_peek (m4_input_block *me)
{
- m4_symbol_chain *chain = me->u.u_c.chain;
+ m4__symbol_chain *chain = me->u.u_c.chain;
while (chain)
{
- if (chain->str)
- {
- if (chain->len)
- return to_uchar (chain->str[0]);
- }
- else
+ switch (chain->type)
{
+ case M4__CHAIN_STR:
+ if (chain->u.u_s.len)
+ return to_uchar (chain->u.u_s.str[0]);
+ break;
+ case M4__CHAIN_ARGV:
/* TODO - peek into argv. */
- assert (!"implemented yet");
+ default:
+ assert (!"composite_peek");
abort ();
}
chain = chain->next;
static int
composite_read (m4_input_block *me, m4 *context, bool allow_quote, bool safe)
{
- m4_symbol_chain *chain = me->u.u_c.chain;
+ m4__symbol_chain *chain = me->u.u_c.chain;
while (chain)
{
if (allow_quote && chain->quote_age == m4__quote_age (M4SYNTAX))
return CHAR_QUOTE;
- if (chain->str)
+ switch (chain->type)
{
- if (chain->len)
+ case M4__CHAIN_STR:
+ if (chain->u.u_s.len)
{
/* Partial consumption invalidates quote age. */
chain->quote_age = 0;
- chain->len--;
- return to_uchar (*chain->str++);
+ chain->u.u_s.len--;
+ return to_uchar (*chain->u.u_s.str++);
}
- }
- else
- {
+ if (chain->u.u_s.level < SIZE_MAX)
+ m4__adjust_refcount (context, chain->u.u_s.level, false);
+ break;
+ case M4__CHAIN_ARGV:
/* TODO - peek into argv. */
- assert (!"implemented yet");
+ default:
+ assert (!"composite_read");
abort ();
}
- if (chain->level < SIZE_MAX)
- m4__adjust_refcount (context, chain->level, false);
me->u.u_c.chain = chain = chain->next;
}
return CHAR_RETRY;
@@ -685,17 +685,18 @@ composite_read (m4_input_block *me, m4 *context, bool allow_quote, bool safe)
static void
composite_unget (m4_input_block *me, int ch)
{
- m4_symbol_chain *chain = me->u.u_c.chain;
- if (chain->str)
- {
- assert (ch < CHAR_EOF && to_uchar (chain->str[-1]) == ch);
- chain->str--;
- chain->len++;
- }
- else
+ m4__symbol_chain *chain = me->u.u_c.chain;
+ switch (chain->type)
{
+ case M4__CHAIN_STR:
+ assert (ch < CHAR_EOF && to_uchar (chain->u.u_s.str[-1]) == ch);
+ chain->u.u_s.str--;
+ chain->u.u_s.len++;
+ break;
+ case M4__CHAIN_ARGV:
/* TODO support argv ref. */
- assert (!"implemented yet");
+ default:
+ assert (!"composite_unget");
abort ();
}
}
static bool
composite_clean (m4_input_block *me, m4 *context, bool cleanup)
{
- m4_symbol_chain *chain = me->u.u_c.chain;
+ m4__symbol_chain *chain = me->u.u_c.chain;
assert (!chain || !cleanup);
while (chain)
{
- if (chain->str)
- assert (!chain->len);
- else
+ switch (chain->type)
{
+ case M4__CHAIN_STR:
+ assert (!chain->u.u_s.len);
+ if (chain->u.u_s.level < SIZE_MAX)
+ m4__adjust_refcount (context, chain->u.u_s.level, false);
+ break;
+ case M4__CHAIN_ARGV:
/* TODO - peek into argv. */
- assert (!"implemented yet");
+ default:
+ assert (!"composite_clean");
abort ();
}
- if (chain->level < SIZE_MAX)
- m4__adjust_refcount (context, chain->level, false);
me->u.u_c.chain = chain = chain->next;
}
return true;
@@ -727,7 +731,7 @@ composite_print (m4_input_block *me, m4 *context, m4_obstack *obs)
{
bool quote = m4_is_debug_bit (context, M4_DEBUG_TRACE_QUOTE);
size_t maxlen = m4_get_max_debug_arg_length_opt (context);
- m4_symbol_chain *chain = me->u.u_c.chain;
+ m4__symbol_chain *chain = me->u.u_c.chain;
const char *lquote = m4_get_syntax_lquote (M4SYNTAX);
const char *rquote = m4_get_syntax_rquote (M4SYNTAX);
@@ -736,9 +740,9 @@ composite_print (m4_input_block *me, m4 *context, m4_obstack *obs)
while (chain)
{
/* TODO support argv refs as well. */
- assert (chain->str);
- if (m4_shipout_string_trunc (context, obs, chain->str, chain->len, false,
- &maxlen))
+ assert (chain->type == M4__CHAIN_STR);
+ if (m4_shipout_string_trunc (context, obs, chain->u.u_s.str,
+ chain->u.u_s.len, false, &maxlen))
break;
chain = chain->next;
}
@@ -750,30 +754,28 @@ composite_print (m4_input_block *me, m4 *context, m4_obstack *obs)
chain that starts at *START and ends at *END. START may be NULL if
*END is non-NULL. */
void
-m4__make_text_link (m4_obstack *obs, m4_symbol_chain **start,
- m4_symbol_chain **end)
+m4__make_text_link (m4_obstack *obs, m4__symbol_chain **start,
+ m4__symbol_chain **end)
{
- m4_symbol_chain *chain;
+ m4__symbol_chain *chain;
size_t len = obstack_object_size (obs);
assert (end && (start || *end));
if (len)
{
char *str = (char *) obstack_finish (obs);
- chain = (m4_symbol_chain *) obstack_alloc (obs, sizeof *chain);
+ chain = (m4__symbol_chain *) obstack_alloc (obs, sizeof *chain);
if (*end)
(*end)->next = chain;
else
*start = chain;
*end = chain;
chain->next = NULL;
+ chain->type = M4__CHAIN_STR;
chain->quote_age = 0;
- chain->str = str;
- chain->len = len;
- chain->level = SIZE_MAX;
- chain->argv = NULL;
- chain->index = 0;
- chain->flatten = false;
+ chain->u.u_s.str = str;
+ chain->u.u_s.len = len;
+ chain->u.u_s.level = SIZE_MAX;
}
}
@@ -918,8 +920,8 @@ init_builtin_token (m4 *context, m4_symbol_value *token)
static void
append_quote_token (m4_obstack *obs, m4_symbol_value *value)
{
- m4_symbol_chain *src_chain = isp->u.u_c.chain;
- m4_symbol_chain *chain;
+ m4__symbol_chain *src_chain = isp->u.u_c.chain;
+ m4__symbol_chain *chain;
assert (isp->funcs == &composite_funcs && obs);
if (value->type == M4_SYMBOL_VOID)
@@ -929,7 +931,7 @@ append_quote_token (m4_obstack *obs, m4_symbol_value *value)
}
assert (value->type == M4_SYMBOL_COMP);
m4__make_text_link (obs, &value->u.u_c.chain, &value->u.u_c.end);
- chain = (m4_symbol_chain *) obstack_copy (obs, src_chain, sizeof *chain);
+ chain = (m4__symbol_chain *) obstack_copy (obs, src_chain, sizeof *chain);
if (value->u.u_c.end)
value->u.u_c.end->next = chain;
else
index 6a084554712b941f60e70fcf53c5039a07075715..dab41c0a68dd94e15d766c8e8e7965ff0e17ed7c 100644 (file)
@@ -185,7 +185,7 @@ extern m4_module * m4__module_find (const char *name);
\f
/* --- SYMBOL TABLE MANAGEMENT --- */
-typedef struct m4_symbol_chain m4_symbol_chain;
+typedef struct m4__symbol_chain m4__symbol_chain;
struct m4_symbol
{
m4_symbol_value *value; /* Linked list of pushdef'd values. */
};
+/* Type of a link in a symbol chain. */
+enum m4__symbol_chain_type
+{
+ M4__CHAIN_STR, /* Link contains a string, u.u_s is valid. */
+ /* TODO Add M4__CHAIN_FUNC. */
+ M4__CHAIN_ARGV /* Link contains a $@ reference, u.u_a is valid. */
+};
+
/* Composite symbols are built of a linked list of chain objects. */
-struct m4_symbol_chain
+struct m4__symbol_chain
{
- m4_symbol_chain *next;/* Pointer to next link of chain. */
- unsigned int quote_age; /* Quote_age of this link of chain, or 0. */
- const char *str; /* NUL-terminated string if text, or NULL. */
- size_t len; /* Length of str, or 0. */
- size_t level; /* Expansion level of content, or SIZE_MAX. */
- m4_macro_args *argv; /* Reference to earlier $@. */
- unsigned int index; /* Argument index within argv. */
- bool flatten; /* True to treat builtins as text. */
+ m4__symbol_chain *next; /* Pointer to next link of chain. */
+ enum m4__symbol_chain_type type; /* Type of this link. */
+ unsigned int quote_age; /* Quote_age of this link, or 0. */
+ union
+ {
+ struct
+ {
+ const char *str; /* Pointer to text. */
+ size_t len; /* Remaining length of str. */
+ size_t level; /* Expansion level of content, or SIZE_MAX. */
+ } u_s; /* M4__CHAIN_STR. */
+ struct
+ {
+ m4_macro_args *argv; /* Reference to earlier $@. */
+ unsigned int index; /* Argument index within argv. */
+ bool flatten; /* True to treat builtins as text. */
+ } u_a; /* M4__CHAIN_ARGV. */
+ } u;
};
/* A symbol value is used both for values associated with a macro
const m4_builtin * builtin;/* Valid when type is FUNC. */
struct
{
- m4_symbol_chain * chain; /* First link of the chain. */
- m4_symbol_chain * end; /* Last link of the chain. */
+ m4__symbol_chain *chain; /* First link of the chain. */
+ m4__symbol_chain *end; /* Last link of the chain. */
} u_c; /* Valid when type is COMP. */
} u;
};
M4_TOKEN_MACDEF /* Macro's definition (see "defn"), M4_SYMBOL_FUNC. */
} m4__token_type;
-extern void m4__make_text_link (m4_obstack *, m4_symbol_chain **,
- m4_symbol_chain **);
+extern void m4__make_text_link (m4_obstack *, m4__symbol_chain **,
+ m4__symbol_chain **);
extern bool m4__push_symbol (m4 *, m4_symbol_value *, size_t);
extern m4__token_type m4__next_token (m4 *, m4_symbol_value *, int *,
m4_obstack *, const char *);
index 683dd26eb1a3e4e75d9f09fffa6cf0da03427cb2..6671c9c850b1e6e3299598fc11548cde138256eb 100644 (file)
@@ -525,7 +525,7 @@ recursion limit of %zu exceeded, use -L<N> to change it"),
/* If argv contains references, those refcounts must be reduced now. */
if (argv->has_ref)
{
- m4_symbol_chain *chain;
+ m4__symbol_chain *chain;
size_t i;
for (i = 0; i < argv->arraylen; i++)
if (argv->array[i]->type == M4_SYMBOL_COMP)
@@ -533,8 +533,9 @@ recursion limit of %zu exceeded, use -L<N> to change it"),
chain = argv->array[i]->u.u_c.chain;
while (chain)
{
- if (chain->level < SIZE_MAX)
- m4__adjust_refcount (context, chain->level, false);
+ assert (chain->type == M4__CHAIN_STR);
+ if (chain->u.u_s.level < SIZE_MAX)
+ m4__adjust_refcount (context, chain->u.u_s.level, false);
chain = chain->next;
}
}
assert (argv->arraylen == 1
&& argv->array[0]->type == M4_SYMBOL_COMP
&& !argv->array[0]->u.u_c.chain->next
- && !argv->array[0]->u.u_c.chain->str);
- argv->array[0]->u.u_c.chain->argv->inuse = true;
+ && argv->array[0]->u.u_c.chain->type == M4__CHAIN_ARGV);
+ argv->array[0]->u.u_c.chain->u.u_a.argv->inuse = true;
}
}
value = argv->array[i];
if (value->type == M4_SYMBOL_COMP)
{
- m4_symbol_chain *chain = value->u.u_c.chain;
+ m4__symbol_chain *chain = value->u.u_c.chain;
/* TODO - for now we support only a single $@ chain. */
- assert (!chain->next && !chain->str);
- if (index < chain->argv->argc - (chain->index - 1))
+ assert (!chain->next && chain->type == M4__CHAIN_ARGV);
+ if (index < chain->u.u_a.argv->argc - (chain->u.u_a.index - 1))
{
- value = m4_arg_symbol (chain->argv, chain->index - 1 + index);
- if (chain->flatten && m4_is_symbol_value_func (value))
+ value = m4_arg_symbol (chain->u.u_a.argv,
+ chain->u.u_a.index - 1 + index);
+ if (chain->u.u_a.flatten && m4_is_symbol_value_func (value))
value = &empty_symbol;
break;
}
- index -= chain->argv->argc - chain->index;
+ index -= chain->u.u_a.argv->argc - chain->u.u_a.index;
}
else if (--index == 0)
break;
m4_arg_text (m4 *context, m4_macro_args *argv, unsigned int index)
{
m4_symbol_value *value;
- m4_symbol_chain *chain;
+ m4__symbol_chain *chain;
m4_obstack *obs;
if (index == 0)
@@ -1085,8 +1087,8 @@ m4_arg_text (m4 *context, m4_macro_args *argv, unsigned int index)
obs = m4_arg_scratch (context);
while (chain)
{
- assert (chain->str);
- obstack_grow (obs, chain->str, chain->len);
+ assert (chain->type == M4__CHAIN_STR);
+ obstack_grow (obs, chain->u.u_s.str, chain->u.u_s.len);
chain = chain->next;
}
obstack_1grow (obs, '0円');
@@ -1103,10 +1105,10 @@ m4_arg_equal (m4_macro_args *argv, unsigned int indexa, unsigned int indexb)
{
m4_symbol_value *sa = m4_arg_symbol (argv, indexa);
m4_symbol_value *sb = m4_arg_symbol (argv, indexb);
- m4_symbol_chain tmpa;
- m4_symbol_chain tmpb;
- m4_symbol_chain *ca = &tmpa;
- m4_symbol_chain *cb = &tmpb;
+ m4__symbol_chain tmpa;
+ m4__symbol_chain tmpb;
+ m4__symbol_chain *ca = &tmpa;
+ m4__symbol_chain *cb = &tmpb;
/* Quick tests. */
if (sa == &empty_symbol || sb == &empty_symbol)
@@ -1122,8 +1124,9 @@ m4_arg_equal (m4_macro_args *argv, unsigned int indexa, unsigned int indexb)
if (m4_is_symbol_value_text (sa))
{
tmpa.next = NULL;
- tmpa.str = m4_get_symbol_value_text (sa);
- tmpa.len = m4_get_symbol_value_len (sa);
+ tmpa.type = M4__CHAIN_STR;
+ tmpa.u.u_s.str = m4_get_symbol_value_text (sa);
+ tmpa.u.u_s.len = m4_get_symbol_value_len (sa);
}
else
{
@@ -1133,8 +1136,9 @@ m4_arg_equal (m4_macro_args *argv, unsigned int indexa, unsigned int indexb)
if (m4_is_symbol_value_text (sb))
{
tmpb.next = NULL;
- tmpb.str = m4_get_symbol_value_text (sb);
- tmpb.len = m4_get_symbol_value_len (sb);
+ tmpb.type = M4__CHAIN_STR;
+ tmpb.u.u_s.str = m4_get_symbol_value_text (sb);
+ tmpb.u.u_s.len = m4_get_symbol_value_len (sb);
}
else
{
@@ -1146,32 +1150,32 @@ m4_arg_equal (m4_macro_args *argv, unsigned int indexa, unsigned int indexb)
while (ca && cb)
{
/* TODO support comparison against $@ refs. */
- assert (ca->str && cb->str);
- if (ca->len == cb->len)
+ assert (ca->type == M4__CHAIN_STR && cb->type == M4__CHAIN_STR);
+ if (ca->u.u_s.len == cb->u.u_s.len)
{
- if (memcmp (ca->str, cb->str, ca->len) != 0)
+ if (memcmp (ca->u.u_s.str, cb->u.u_s.str, ca->u.u_s.len) != 0)
return false;
ca = ca->next;
cb = cb->next;
}
- else if (ca->len < cb->len)
+ else if (ca->u.u_s.len < cb->u.u_s.len)
{
- if (memcmp (ca->str, cb->str, ca->len) != 0)
+ if (memcmp (ca->u.u_s.str, cb->u.u_s.str, ca->u.u_s.len) != 0)
return false;
tmpb.next = cb->next;
- tmpb.str = cb->str + ca->len;
- tmpb.len = cb->len - ca->len;
+ tmpb.u.u_s.str = cb->u.u_s.str + ca->u.u_s.len;
+ tmpb.u.u_s.len = cb->u.u_s.len - ca->u.u_s.len;
ca = ca->next;
cb = &tmpb;
}
else
{
- assert (cb->len < ca->len);
- if (memcmp (ca->str, cb->str, cb->len) != 0)
+ assert (cb->u.u_s.len < ca->u.u_s.len);
+ if (memcmp (ca->u.u_s.str, cb->u.u_s.str, cb->u.u_s.len) != 0)
return false;
tmpa.next = ca->next;
- tmpa.str = ca->str + cb->len;
- tmpa.len = ca->len - cb->len;
+ tmpa.u.u_s.str = ca->u.u_s.str + cb->u.u_s.len;
+ tmpa.u.u_s.len = ca->u.u_s.len - cb->u.u_s.len;
ca = &tmpa;
cb = cb->next;
}
m4_arg_len (m4_macro_args *argv, unsigned int index)
{
m4_symbol_value *value;
- m4_symbol_chain *chain;
+ m4__symbol_chain *chain;
size_t len;
if (index == 0)
@@ -1215,8 +1219,8 @@ m4_arg_len (m4_macro_args *argv, unsigned int index)
len = 0;
while (chain)
{
- assert (chain->str);
- len += chain->len;
+ assert (chain->type == M4__CHAIN_STR);
+ len += chain->u.u_s.len;
chain = chain->next;
}
assert (len);
@@ -1244,7 +1248,7 @@ m4_make_argv_ref (m4 *context, m4_macro_args *argv, const char *argv0,
{
m4_macro_args *new_argv;
m4_symbol_value *value;
- m4_symbol_chain *chain;
+ m4__symbol_chain *chain;
unsigned int index = skip ? 2 : 1;
m4_obstack *obs = m4_arg_scratch (context);
@@ -1255,9 +1259,9 @@ m4_make_argv_ref (m4 *context, m4_macro_args *argv, const char *argv0,
/* TODO for now we support only a single-length $@ chain. */
assert (argv->arraylen == 1 && argv->array[0]->type == M4_SYMBOL_COMP);
chain = argv->array[0]->u.u_c.chain;
- assert (!chain->next && !chain->str);
- argv = chain->argv;
- index += chain->index - 1;
+ assert (!chain->next && chain->type == M4__CHAIN_ARGV);
+ argv = chain->u.u_a.argv;
+ index += chain->u.u_a.index - 1;
}
if (argv->argc <= index)
{
@@ -1272,7 +1276,7 @@ m4_make_argv_ref (m4 *context, m4_macro_args *argv, const char *argv0,
array)
+ sizeof value));
value = (m4_symbol_value *) obstack_alloc (obs, sizeof *value);
- chain = (m4_symbol_chain *) obstack_alloc (obs, sizeof *chain);
+ chain = (m4__symbol_chain *) obstack_alloc (obs, sizeof *chain);
new_argv->arraylen = 1;
new_argv->array[0] = value;
new_argv->wrapper = true;
@@ -1280,13 +1284,11 @@ m4_make_argv_ref (m4 *context, m4_macro_args *argv, const char *argv0,
value->type = M4_SYMBOL_COMP;
value->u.u_c.chain = value->u.u_c.end = chain;
chain->next = NULL;
+ chain->type = M4__CHAIN_ARGV;
chain->quote_age = argv->quote_age;
- chain->str = NULL;
- chain->len = 0;
- chain->level = context->expansion_level - 1;
- chain->argv = argv;
- chain->index = index;
- chain->flatten = flatten;
+ chain->u.u_a.argv = argv;
+ chain->u.u_a.index = index;
+ chain->u.u_a.flatten = flatten;
}
new_argv->argc = argv->argc - (index - 1);
new_argv->inuse = false;
@@ -1326,11 +1328,11 @@ m4_push_arg (m4 *context, m4_obstack *obs, m4_macro_args *argv,
{
/* TODO - really handle composites; for now, just flatten the
composite and push its text. */
- m4_symbol_chain *chain = value->u.u_c.chain;
+ m4__symbol_chain *chain = value->u.u_c.chain;
while (chain)
{
- assert (chain->str);
- obstack_grow (obs, chain->str, chain->len);
+ assert (chain->type == M4__CHAIN_STR);
+ obstack_grow (obs, chain->u.u_s.str, chain->u.u_s.len);
chain = chain->next;
}
}
@@ -1345,7 +1347,7 @@ m4_push_args (m4 *context, m4_obstack *obs, m4_macro_args *argv, bool skip,
bool quote)
{
m4_symbol_value *value;
- m4_symbol_chain *chain;
+ m4__symbol_chain *chain;
unsigned int i = skip ? 2 : 1;
const char *sep = ",";
size_t sep_len = 1;
@@ -1398,8 +1400,8 @@ m4_push_args (m4 *context, m4_obstack *obs, m4_macro_args *argv, bool skip,
chain = value->u.u_c.chain;
while (chain)
{
- assert (chain->str);
- obstack_grow (obs, chain->str, chain->len);
+ assert (chain->type == M4__CHAIN_STR);
+ obstack_grow (obs, chain->u.u_s.str, chain->u.u_s.len);
chain = chain->next;
}
}
index 3ff6f0d3f336e3c8d62cf4a4056d18ac4b0fc65c..1c419eb75c1690fa1a0f783b7e3179d7f0c33e77 100644 (file)
@@ -454,23 +454,23 @@ m4_symbol_value_copy (m4_symbol_value *dest, m4_symbol_value *src)
break;
case M4_SYMBOL_COMP:
{
- m4_symbol_chain *chain = src->u.u_c.chain;
+ m4__symbol_chain *chain = src->u.u_c.chain;
size_t len = 0;
char *str;
char *p;
while (chain)
{
/* TODO for now, only text links are supported. */
- assert (chain->str);
- len += chain->len;
+ assert (chain->type == M4__CHAIN_STR);
+ len += chain->u.u_s.len;
chain = chain->next;
}
p = str = xcharalloc (len + 1);
chain = src->u.u_c.chain;
while (chain)
{
- memcpy (p, chain->str, chain->len);
- p += chain->len;
+ memcpy (p, chain->u.u_s.str, chain->u.u_s.len);
+ p += chain->u.u_s.len;
chain = chain->next;
}
*p = '0円';
@@ -576,15 +576,15 @@ m4_symbol_value_print (m4_symbol_value *value, m4_obstack *obs, bool quote,
break;
case M4_SYMBOL_COMP:
{
- m4_symbol_chain *chain = value->u.u_c.chain;
+ m4__symbol_chain *chain = value->u.u_c.chain;
if (quote)
obstack_grow (obs, lquote, strlen (lquote));
while (chain)
{
/* TODO for now, assume all links are text. */
- assert (chain->str);
- if (m4_shipout_string_trunc (NULL, obs, chain->str, chain->len,
- false, &maxlen))
+ assert (chain->type == M4__CHAIN_STR);
+ if (m4_shipout_string_trunc (NULL, obs, chain->u.u_s.str,
+ chain->u.u_s.len, NULL, &maxlen))
break;
chain = chain->next;
}