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