From 046783dce88cfc4c761515b1b9aa47d791d63b05 Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Mon, 12 Aug 2024 22:55:37 -0500 Subject: [PATCH] Bugfix: FSS Extended Read needs to properly handle --total when using --select and also --empty. The use of --select 0 and --total should result in either 0 or 1. The presence of --empty must also be taken into consideration. --- level_3/fss_extended_read/c/private-read.c | 100 ++++++++++++++++++++++------- 1 file changed, 77 insertions(+), 23 deletions(-) diff --git a/level_3/fss_extended_read/c/private-read.c b/level_3/fss_extended_read/c/private-read.c index fc17785..fd98325 100644 --- a/level_3/fss_extended_read/c/private-read.c +++ b/level_3/fss_extended_read/c/private-read.c @@ -666,47 +666,101 @@ extern "C" { f_status_t fss_extended_read_process_total(fll_program_data_t * const main, fss_extended_read_data_t * const data, bool names[]) { f_array_length_t total = 0; + f_array_length_t i = 0; - // This standard only has one Content per line, however it has multiple Contents within that line. - if ((data->option & fss_extended_read_data_option_object_d) || (data->option & fss_extended_read_data_option_content_d) && (data->option & fss_extended_read_data_option_empty_d)) { - for (f_array_length_t i = 0; i < data->objects.used; ++i) { + if (data->option & fss_extended_read_data_option_select_d) { + for (; i < data->contents.used; ++i) { if (!names[i]) continue; - ++total; + if (!((++main->signal_check) % fss_extended_read_signal_check_d)) { + if (fll_program_standard_signal_received(main)) { + fss_extended_read_print_signal_received(main); + + return F_status_set_error(F_interrupt); + } + + main->signal_check = 0; + } + + if (data->contents.array[i].used) { + if (data->select < data->contents.array[i].used) { + if ((data->option & fss_extended_read_data_option_empty_d) || data->contents.array[i].array[data->select].start <= data->contents.array[i].array[data->select].stop) { + ++total; + } + } + } + else if (!data->select && (data->option & fss_extended_read_data_option_empty_d)) { + ++total; + } } // for } else { - f_array_length_t i = 0; - f_array_length_t j = 0; - for (; i < data->contents.used; ++i) { + // This standard only has one Content per line, however it has multiple Contents within that line. + if ((data->option & fss_extended_read_data_option_object_d) || (data->option & fss_extended_read_data_option_content_d) && (data->option & fss_extended_read_data_option_empty_d)) { + for (; i < data->objects.used; ++i) { - if (!names[i]) continue; - if (!data->contents.array[i].used) continue; + if (!names[i]) continue; - if ((data->option & fss_extended_read_data_option_select_d) && data->contents.array[i].used <= data->select) { - continue; - } + if (!((++main->signal_check) % fss_extended_read_signal_check_d)) { + if (fll_program_standard_signal_received(main)) { + fss_extended_read_print_signal_received(main); - for (j = 0; j < data->contents.array[i].used; ++j) { + return F_status_set_error(F_interrupt); + } - if (data->contents.array[i].array[j].start <= data->contents.array[i].array[j].stop) { - if (data->option & fss_extended_read_data_option_select_d) { - if (j == data->select) { - ++total; + main->signal_check = 0; + } - break; - } + ++total; + } // for + } + else { + for (f_array_length_t j = 0; i < data->contents.used; ++i) { + + if (!names[i]) continue; + if (!data->contents.array[i].used) continue; + + if (!((++main->signal_check) % fss_extended_read_signal_check_d)) { + if (fll_program_standard_signal_received(main)) { + fss_extended_read_print_signal_received(main); + + return F_status_set_error(F_interrupt); } - else { - ++total; - break; + main->signal_check = 0; + } + + if (data->option & fss_extended_read_data_option_select_d) { + if (data->select < data->contents.array[i].used) { + if (data->contents.array[i].array[data->select].start <= data->contents.array[data->select].array[j].stop) { + ++total; + } } } + else { + for (j = 0; j < data->contents.array[i].used; ++j) { + + if (!((++main->signal_check) % fss_extended_read_signal_check_d)) { + if (fll_program_standard_signal_received(main)) { + fss_extended_read_print_signal_received(main); + + return F_status_set_error(F_interrupt); + } + + main->signal_check = 0; + } + + if (data->contents.array[i].array[j].start <= data->contents.array[i].array[j].stop) { + ++total; + + break; + } + } // for + } } // for - } // for + } } flockfile(main->output.to.stream); -- 1.8.3.1