コード例 #1
0
ファイル: utils.cpp プロジェクト: RickyXwang/transf-badapple
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
}
コード例 #2
0
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;
}
コード例 #3
0
ファイル: utils.cpp プロジェクト: C-Elegans/spasm-ng
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);
}
コード例 #4
0
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;
}