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; }