Listing 5
int macro_subexpr (MESSAGE **messages, int start_ptr,
int end_ptr)
{
int i, inner_start, inner_end, inner_result, result;
/* Look for an inner set of parentheses and evaluate
that expression first. */
if ((inner_start =
scanforward (messages, start_ptr - 1, end_ptr, OPENPAREN))
!= -1) {
if ((inner_end =
match_paren (messages, inner_start, end_ptr + 1))
!= -1) {
inner_result = macro_subexpr (messages, inner_start,
inner_end);
}
}
result = macro_parse (NULL, start_ptr - 1, end_ptr + 1);
for (i = start_ptr; i >= end_ptr; i--) {
++(messages[i] -> evaled);
messages[i] -> tokentype = PREPROCESS_EVALED;
sprintf (messages[i] -> value, "%d", result);
}
return result;
}