void show_fatal_error(const char *text, ...) { #ifdef WIN32 WORD attr = save_console_attributes(); set_console_attributes (COLOR_RED); #endif va_list args; if (exit_code < EXIT_FATAL_ERROR) exit_code = EXIT_FATAL_ERROR; show_error_prefix(curr_input_file, line_num); #ifdef WIN32 OutputDebugString(text); OutputDebugString(TEXT("\n")); #endif va_start(args, text); vprintf (text, args); putchar ('\n'); error_occurred = true; #ifdef WIN32 restore_console_attributes(attr); #endif }
label_t *add_label (char *name, int value) { label_t *new_label; define_t *conflict_define; if (mode & MODE_CODE_COUNTER) { free(name); return NULL; } if (!case_sensitive) { char *new_name = strup (name); free (name); name = new_name; } if ((conflict_define = search_defines(name))) { show_error ("conflicting definition of '%s'", name); //if (suppress_errors == false) { show_error_prefix (conflict_define->input_file, conflict_define->line_num); WORD attr = save_console_attributes(); set_console_attributes (COLOR_RED); printf ("previous definition of '%s' was here\n", name); restore_console_attributes(attr); //} return NULL; } if ((new_label = search_labels (name))) { if (value != new_label->value) { new_label->value = value; show_warning ("redefinition of '%s'", name); show_warning_prefix (new_label->input_file, new_label->line_num); WORD attr = save_console_attributes(); set_console_attributes (COLOR_YELLOW); printf ("previous definition of '%s' was here\n", name); restore_console_attributes(attr); } } else { new_label = (label_t *)malloc (sizeof (label_t)); if (new_label != NULL) { new_label->name = name; new_label->line_num = line_num; new_label->input_file = strdup(curr_input_file); new_label->value = value; hash_insert (label_table, new_label); } } return new_label; }
void show_error(const char *text, ...) { WORD attr = save_console_attributes(); va_list args; if (exit_code < EXIT_ERRORS) exit_code = EXIT_ERRORS; show_error_prefix(curr_input_file, line_num); set_console_attributes (COLOR_RED); va_start(args, text); vprintf (text, args); putchar ('\n'); restore_console_attributes(attr); }
define_t *add_define (char *name, bool *redefined, bool search_local) { define_t *define; label_t *conflict_label; if (strlen(name) == 0) { SetLastSPASMError(SPASM_ERR_NAME_EXPECTED); free(name); return NULL; } if (!case_sensitive) { char *new_name = strup (name); free (name); name = new_name; } if ((conflict_label = search_labels(name))) { show_error ("conflicting definition of '%s'", name); //if (suppress_errors == false) { show_error_prefix (conflict_label->input_file, conflict_label->line_num); WORD attr = save_console_attributes(); set_console_attributes (COLOR_RED); printf ("previous definition of '%s' was here\n", name); restore_console_attributes(attr); //} return NULL; } // handle redefinitions if ((define = search_defines (name, search_local))) { int curr_arg; free (name); //define->line_num = line_num; //define->input_file = curr_input_file; /* Don't clear the contents of the #define, because if it's being redefined references to itself may need to be expanded, which will require the original contents - all handled by set_define */ for (curr_arg = 0; curr_arg < define->num_args; curr_arg++) { if (define->args[curr_arg] != NULL) { free(define->args[curr_arg]); define->args[curr_arg] = NULL; } } define->num_args = 0; if (redefined != NULL) *redefined = true; return define; } if (redefined != NULL) *redefined = false; define = (define_t *) malloc (sizeof (define_t)); if (define != NULL) { int curr_arg; define->name = name; define->line_num = line_num; define->input_file = strdup(curr_input_file); define->contents = NULL; define->num_args = 0; for (curr_arg = 0; curr_arg < MAX_ARGS; curr_arg++) define->args[curr_arg] = NULL; hash_insert (define_table, define); } return define; }