Listing 4
int is_c_function_declaration (char *start_ptr) {
int i;
int returnval = TRUE;
int openparen = FALSE;
int lasttoken = ERROR,
lasttoken_2 = ERROR,
lasttoken_3 = ERROR;
int lasttoken_ptr;
char *buf;
char *open_block_ptr;
if ((open_block_ptr = index (start_ptr, '{')) == NULL)
return FALSE;
if ((buf = (char *) calloc (open_block_ptr - start_ptr + 2,
sizeof (char))) == NULL)
error ("Is_c_function_declaration: %s", strerror (errno));
strncpy (buf, start_ptr, open_block_ptr - start_ptr + 1);
buf[open_block_ptr - start_ptr + 1] = 0;
tokenize (buf);
if (c_messages[c_message_ptr + 1] -> tokentype != OPENBLOCK)
parser_error
("Is_c_function_declaration: Function start not found.");
for (i = N_MESSAGES; i > c_message_ptr; i--) {
if ((c_messages[i] -> tokentype == WHITESPACE) ||
(c_messages[i] -> tokentype == NEWLINE))
continue;
switch ( c_messages[i] -> tokentype )
{
case LABEL:
if (!strcmp (c_messages[i] -> name, "main"))
main_declaration = TRUE;
break;
case OPENPAREN:
if ((c_messages[lasttoken_ptr] -> tokentype != LABEL) ||
is_c_keyword (c_messages[lasttoken_ptr]->name))
returnval = FALSE;
if ((lasttoken_2 != LABEL) && (lasttoken_2 != CHAR))
returnval = FALSE;
/* Check for a method declaration. */
if ((lasttoken_3 == LABEL) && (lasttoken_2 == LABEL) &&
(lasttoken == LABEL))
returnval = FALSE;
openparen = TRUE;
break;
case CLOSEPAREN:
if (!openparen)
returnval = FALSE;
break;
case SEMICOLON:
returnval = FALSE;
goto done;
break;
case OPENBLOCK:
if (c_messages[lasttoken_ptr] -> tokentype != CLOSEPAREN)
returnval = FALSE;
break;
case CLOSEBLOCK:
returnval = FALSE;
default:
break;
}
lasttoken_ptr = i;
lasttoken_3 = lasttoken_2;
lasttoken_2 = lasttoken;
lasttoken = c_messages[i] -> tokentype;
}
done:
delete_c_messages ();
free (buf);
return returnval;
}