diff --git a/src/acme.c b/src/acme.c index 4a8ef3f..ce719ed 100644 --- a/src/acme.c +++ b/src/acme.c @@ -343,12 +343,12 @@ static void perform_pass(void) encoding_passinit(); // set default encoding section_passinit(); // set initial zone (untitled) // init variables - pass.undefined_count = 0; - //pass.needvalue_count = 0; FIXME - use - pass.changed_count = 0; - pass.error_count = 0; - pass.warning_count = 0; - // Process toplevel files + pass.counters.undefineds = 0; + //pass.counters.needvalue = 0; FIXME - use + pass.counters.symbolchanges = 0; + pass.counters.errors = 0; + pass.counters.warnings = 0; + // process toplevel files for (ii = 0; ii < toplevel_src_count; ++ii) { fd = fopen(toplevel_sources_plat[ii], FILE_READBINARY); if (fd) { @@ -358,7 +358,7 @@ static void perform_pass(void) fprintf(stderr, "Error: Cannot open toplevel file \"%s\".\n", toplevel_sources_plat[ii]); if (toplevel_sources_plat[ii][0] == '-') fprintf(stderr, "Options (starting with '-') must be given _before_ source files!\n"); - ++pass.error_count; + ++pass.counters.errors; } } output_endofpass(); // make sure last code segment is closed @@ -366,8 +366,8 @@ static void perform_pass(void) // in the future to two general expressions, this is the point where // they would need to be evaluated. if (config.process_verbosity >= 8) - printf("Undefined expressions: %d. Symbol updates: %d.\n", pass.undefined_count, pass.changed_count); - if (pass.error_count) + printf("Undefined expressions: %d. Symbol updates: %d.\n", pass.counters.undefineds, pass.counters.symbolchanges); + if (pass.counters.errors) exit(ACME_finalize(EXIT_FAILURE)); // now increment pass number // this must be done _after_ the pass because assignments done via @@ -396,11 +396,11 @@ static void do_actual_work(void) perform_pass(); // first pass pass.flags.do_segment_checks = FALSE; // FIXME - do in _last_ pass instead! // pretend there has been a previous pass, with one more undefined result - undefs_before = pass.undefined_count + 1; + undefs_before = pass.counters.undefineds + 1; // keep doing passes as long as the number of undefined results keeps decreasing. - // stop on zero (FIXME - zero-check pass.needvalue_count instead!) - while ((pass.undefined_count && (pass.undefined_count < undefs_before)) || pass.changed_count) { - undefs_before = pass.undefined_count; + // stop on zero (FIXME - zero-check pass.counters.needvalue instead!) + while ((pass.counters.undefineds && (pass.counters.undefineds < undefs_before)) || pass.counters.symbolchanges) { + undefs_before = pass.counters.undefineds; perform_pass(); if (--sanity.passes_left < 0) { // FIXME - exit with error @@ -410,7 +410,7 @@ static void do_actual_work(void) } } // any errors left? - if (pass.undefined_count == 0) { // FIXME - use pass.needvalue_count instead! + if (pass.counters.undefineds == 0) { // FIXME - use pass.counters.needvalue instead! // if listing report is wanted and there were no errors, // do another pass to generate listing report if (config.report_filename) { diff --git a/src/alu.c b/src/alu.c index 3d27658..bdf1895 100644 --- a/src/alu.c +++ b/src/alu.c @@ -2513,7 +2513,7 @@ static int parse_expression(struct expression *expression) // not empty. undefined? if (!(result->type->is_defined(result))) { // then count (in all passes) - ++pass.undefined_count; + ++pass.counters.undefineds; } } // do some checks depending on int/float diff --git a/src/global.c b/src/global.c index bff9c2e..eddb3b5 100644 --- a/src/global.c +++ b/src/global.c @@ -533,15 +533,15 @@ void throw_message(enum debuglevel level, const char msg[], struct location *opt // (assembly stops, for example if outbuffer overruns). PLATFORM_SERIOUS(msg); throw_msg(msg, "\033[1m\033[31m", "Serious error", opt_alt_loc); // bold + red - //++pass.error_count; // FIXME - needed when problem below is solved + //++pass.counters.errors; // FIXME - needed when problem below is solved exit(ACME_finalize(EXIT_FAILURE)); // FIXME - this inhibits output of macro call stack case DEBUGLEVEL_ERROR: // output an error // (something is wrong, no output file will be generated). PLATFORM_ERROR(msg); throw_msg(msg, "\033[31m", "Error", opt_alt_loc); // red - ++pass.error_count; - if (pass.error_count >= config.max_errors) + ++pass.counters.errors; + if (pass.counters.errors >= config.max_errors) exit(ACME_finalize(EXIT_FAILURE)); break; case DEBUGLEVEL_WARNING: @@ -552,11 +552,11 @@ void throw_message(enum debuglevel level, const char msg[], struct location *opt break; PLATFORM_WARNING(msg); throw_msg(msg, "\033[33m", "Warning", opt_alt_loc); // yellow - ++pass.warning_count; + ++pass.counters.warnings; // then check if warnings should be handled like errors: if (config.all_warnings_are_errors) { - ++pass.error_count; - if (pass.error_count >= config.max_errors) + ++pass.counters.errors; + if (pass.counters.errors >= config.max_errors) exit(ACME_finalize(EXIT_FAILURE)); } break; diff --git a/src/global.h b/src/global.h index f2774d1..ee4a1b9 100644 --- a/src/global.h +++ b/src/global.h @@ -106,11 +106,17 @@ extern struct config config; struct pass { int number; // counts up from one - int undefined_count; // counts undefined expression results (if this stops decreasing, next pass must list them as errors) - //int needvalue_count; // counts undefined expression results actually needed for output (when this hits zero, we're done) FIXME - use - int changed_count; // count symbol changes (if nonzero, another pass is needed) - int error_count; - int warning_count; + struct { + int undefineds; // counts undefined expression results (if this stops decreasing, next pass must list them as errors) + //int needvalue; // counts undefined expression results actually needed for output (when this hits zero, we're done) FIXME - use + int symbolchanges; // count symbol changes (if nonzero, another pass is needed) + int errors; + int warnings; + // FIXME - add a counter for "errors not reported because pass flags + // said so", because then we can read the value after all symbol changes + // have finally settled and know if the next pass is a victory lap or an + // error output pass. + } counters; struct { char complain_about_undefined; // will be FALSE until error pass is needed char do_segment_checks; // atm only used in pass 1, should be used in _last_ pass! diff --git a/src/macro.c b/src/macro.c index 4057371..d5f4383 100644 --- a/src/macro.c +++ b/src/macro.c @@ -244,7 +244,7 @@ void macro_parse_call(void) // Now GotByte = first char of macro name inputchange_new_ram(&icb); inputchange_macro1_params(&actual_macro->definition, actual_macro->parameter_list); - outer_msg_sum = pass.warning_count + pass.error_count; // remember for call stack decision + outer_msg_sum = pass.counters.warnings + pass.counters.errors; // remember for call stack decision // remember old section outer_section = section_now; @@ -300,7 +300,7 @@ void macro_parse_call(void) // Now GotByte = first char of macro name inputchange_back(&icb); // if needed, dump call stack - if (outer_msg_sum != pass.warning_count + pass.error_count) + if (outer_msg_sum != pass.counters.warnings + pass.counters.errors) Throw_warning("...called from here."); parser_ensure_EOS(); diff --git a/src/output.c b/src/output.c index 2919f21..9381871 100644 --- a/src/output.c +++ b/src/output.c @@ -189,11 +189,11 @@ void output_newdefault(void) { // init memory fill_completely(config.mem_init_value); - // enforce another pass - if (pass.undefined_count == 0) - pass.undefined_count = 1; - //if (pass.needvalue_count == 0) FIXME - use? instead or additionally? - // pass.needvalue_count = 1; + // enforce another pass (FIXME - no, just do a separate output pass anyway!) + if (pass.counters.undefineds == 0) + pass.counters.undefineds = 1; + //if (pass.counters.needvalue == 0) FIXME - use? instead or additionally? + // pass.counters.needvalue = 1; // enforcing another pass is not needed if there hasn't been any // output yet. But that's tricky to detect without too much overhead. // The old solution was to add &&(out->lowest_written < out->highest_written+1) to "if" above diff --git a/src/pseudoopcodes.c b/src/pseudoopcodes.c index 80bf556..b5992a6 100644 --- a/src/pseudoopcodes.c +++ b/src/pseudoopcodes.c @@ -571,8 +571,8 @@ static enum eos po_binary(void) // check whether including is a waste of time // FIXME - future changes ("several-projects-at-once") // may be incompatible with this! - if ((size.val.intval >= 0) && (pass.undefined_count || pass.error_count)) { - //if ((size.val.intval >= 0) && (pass.needvalue_count || pass.error_count)) { FIXME - use! + if ((size.val.intval >= 0) && (pass.counters.undefineds || pass.counters.errors)) { + //if ((size.val.intval >= 0) && (pass.counters.needvalue || pass.counters.errors)) { FIXME - use! output_skip(size.val.intval); // really including is useless anyway } else { // really insert file diff --git a/src/version.h b/src/version.h index c4583fa..418563d 100644 --- a/src/version.h +++ b/src/version.h @@ -9,7 +9,7 @@ #define RELEASE "0.97" // update before release FIXME #define CODENAME "Zem" // update before release -#define CHANGE_DATE "1 Aug" // update before release FIXME +#define CHANGE_DATE "2 Aug" // update before release FIXME #define CHANGE_YEAR "2024" // update before release //#define HOME_PAGE "http://home.pages.de/~mac_bacon/smorbrod/acme/" #define HOME_PAGE "http://sourceforge.net/p/acme-crossass/" // FIXME