emit_function_start (name, !emit_public);
statement_ends_control_flow = 0;
+ set_current_function_name (name);
parse_block ();
+
+ set_current_function_name (0);
check_goto_labels ();
if (current_function_is_noreturn && !current_function_has_return_statement && !statement_ends_control_flow) {
emit_function_start (name, !emit_public);
statement_ends_control_flow = 0;
+ set_current_function_name (name);
parse_block ();
+
+ set_current_function_name (0);
check_goto_labels ();
if (current_function_is_noreturn && !current_function_has_return_statement && !statement_ends_control_flow) {
}
+static char *current_function_name = 0;
+
+void set_current_function_name (const char *name) {
+
+ if (current_function_name) {
+
+ free (current_function_name);
+ current_function_name = 0;
+
+ }
+
+ if (name) {
+ current_function_name = xstrdup (name);
+ }
+
+}
+
void get_token (void) {
struct history *history;
if (tok.kind == TOK_IDENT) {
+ if (current_function_name && strcmp (tok.ident, "__FUNCTION__") == 0) {
+
+ char *value = xmalloc (strlen (current_function_name) + 3);
+ sprintf (value, "\"%s\"", current_function_name);
+
+ free (tok.ident);
+
+ tok.ident = value;
+ tok.kind = TOK_PPSTR;
+
+ return;
+
+ }
+
tok.kind = find_kind (tok.start, tok.caret, tok.ident);;
return;
struct punct *find_punct (char *p);
int init_tokenizer (const char *ifile);
+void set_current_function_name (const char *name);
+
#endif /* _TOKEN_H */