void error_missing_close_block(void) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "{} block not closed" ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void warn_symbol_different(char *name, char *used) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "symbol '%s' used as '%s'", name, used ); do_error( ErrWarn, str_data(msg) ); STR_DELETE(msg); }
void error_syntax(void) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "syntax error" ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_no_src_file(void) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "source filename missing" ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_illegal_src_filename(char *filename) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "illegal source filename '%s'", filename ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_not_lib_file(char *filename) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "file '%s' not a library file", filename ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_include_recursion(char *filename) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "cannot include file '%s' recursively", filename ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_symbol_redefined(char *symbol) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "symbol '%s' already defined", symbol ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_symbol_redefined_module(char *symbol, char *module) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "symbol '%s' already defined in module '%s'", symbol, module ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_illegal_ident(void) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "illegal identifier" ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_jr_not_local(void) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "relative jump address must be local" ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_not_defined(char *name) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "symbol '%s' not defined", name ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_unbalanced_struct(void) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "unbalanced control structure" ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_unbalanced_struct_at(char *filename, int line_nr) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "unbalanced control structure started at file '%s' line %d", filename, line_nr ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void warn_org_ignored(char *filename, char *section_name) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "--relocatable ignores ORG at file '%s', section '%s'", filename, section_name ); do_error( ErrWarn, str_data(msg) ); STR_DELETE(msg); }
void error_symbol_decl_local(char *symbol) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "symbol '%s' already declared local", symbol ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_env_not_defined(char *var) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "environment variable '%s' not defined", var ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_symbol_redecl(char *symbol) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "re-declaration of '%s' not allowed", symbol ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_int_range(long value) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "integer '%ld' out of range", value ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_max_codesize(long size) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "max. code size of %ld bytes reached", size ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void warn_option_deprecated(char *option) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "option '%s' is deprecated", option ); do_error( ErrWarn, str_data(msg) ); STR_DELETE(msg); }
void error_module_redefined(void) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "module name already defined" ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_illegal_option(char *option) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "illegal option '%s'", option ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void error_write_file(char *filename) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "cannot write file '%s'", filename ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void info_total_errors(void) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "%d errors occurred during assembly", get_num_errors() ); do_error( ErrInfo, str_data(msg) ); STR_DELETE(msg); }
void error_org_redefined(void) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "ORG redefined" ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
void warn_deprecated(char *old_stmt, char *new_stmt) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "'%s' is deprecated, use '%s' instead", old_stmt, new_stmt ); do_error( ErrWarn, str_data(msg) ); STR_DELETE(msg); }
void error_invalid_org_option(char *org_hex) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "invalid ORG option '%s'", org_hex ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }
/*----------------------------------------------------------------------------- * Output error message *----------------------------------------------------------------------------*/ static void do_error( enum ErrType err_type, char *message ) { STR_DEFINE(msg, STR_SIZE); size_t len_at, len_prefix; init_module(); /* init empty message */ str_clear( msg ); /* Information messages have no prefix */ if ( err_type != ErrInfo ) { str_append( msg, err_type == ErrWarn ? "Warning" : "Error" ); /* prepare to remove " at" if no prefix */ len_at = str_len(msg); str_append( msg, " at" ); len_prefix = str_len(msg); /* output filename */ if ( errors.filename && *errors.filename ) str_append_sprintf( msg, " file '%s'", errors.filename ); /* output module */ if ( errors.module != NULL && *errors.module ) str_append_sprintf( msg, " module '%s'", errors.module ); /* output line number */ if ( errors.line > 0 ) str_append_sprintf( msg, " line %d", errors.line ); /* remove at if no prefix */ if ( len_prefix == str_len(msg) ) /* no prefix loaded to string */ { str_data(msg)[ len_at ] = '\0'; /* go back 3 chars to before at */ str_sync_len( msg ); } str_append( msg, ": " ); } /* output error message */ str_append( msg, message ); str_append_char( msg, '\n' ); /* CH_0001 : Assembly error messages should appear on stderr */ fputs( str_data(msg), stderr ); /* send to error file */ puts_error_file( str_data(msg) ); if ( err_type == ErrError ) errors.count++; /* count number of errors */ STR_DELETE(msg); }
void error_divide_by_zero(void) { STR_DEFINE(msg, STR_SIZE); str_append_sprintf( msg, "division by zero" ); do_error( ErrError, str_data(msg) ); STR_DELETE(msg); }