From f75b5ee4f368e5a5f6a97a4de0d6a784c12c7e11 Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Fri, 6 Sep 2024 19:09:52 -0500 Subject: [PATCH] Bugfix: Get the FSS Embedded List Read working as expected based on runtime tests. A good portion of clean ups and design changes to address special cases or anything overlooked. The runtime tests now pass as expected. There are still some situations that need to be fixed. --- level_1/fl_fss/c/fss/embedded_list.c | 264 +++++++-------------- level_1/fl_fss/c/private-fss.c | 26 +- level_2/fll_fss/c/fss/embedded_list.c | 6 +- level_3/fss_embedded_list_read/c/private-print.c | 32 ++- level_3/fss_embedded_list_read/c/private-print.h | 8 +- level_3/fss_embedded_list_read/c/private-read.c | 29 +-- .../test-0003-object_space-content-select-0.expect | 2 +- .../test-0003-object_space-content-trim.expect | 2 +- .../expect/test-0003-object_space-content.expect | 2 +- ...003-object_space-object_and_content-at-0.expect | 4 +- ...003-object_space-object_and_content-at-1.expect | 4 +- ...3-object_space-object_and_content-line-6.expect | 2 +- ..._space-object_and_content-name--select-0.expect | 4 +- ...03-object_space-object_and_content-name-.expect | 4 +- ...object_and_content-name-a-original-empty.expect | 4 +- ...space-object_and_content-name-a-original.expect | 4 +- ...space-object_and_content-name-a-select-0.expect | 4 +- ...3-object_space-object_and_content-name-a.expect | 4 +- ...\262\320\265\321\202_has_space-select-0.expect" | 4 +- ...object_space-object_and_content-original.expect | 22 +- ...ace-object_and_content-select-0-original.expect | 2 - ...object_space-object_and_content-select-0.expect | 20 +- ...003-object_space-object_and_content-trim.expect | 20 +- ...est-0003-object_space-object_and_content.expect | 20 +- level_3/fss_extended_list_read/c/private-print.c | 22 +- 25 files changed, 222 insertions(+), 293 deletions(-) diff --git a/level_1/fl_fss/c/fss/embedded_list.c b/level_1/fl_fss/c/fss/embedded_list.c index 48c7293..2c667ef 100644 --- a/level_1/fl_fss/c/fss/embedded_list.c +++ b/level_1/fl_fss/c/fss/embedded_list.c @@ -60,11 +60,8 @@ extern "C" { f_array_length_t slash_last = 0; f_array_length_t before_list_open = position_previous; - // Designate that this is the first graph character. - // 0x0 = false, 0x1 = true, 0x2 = false, but there is a delimited comment, comment_delimit is set. - uint8_t graph_first = 0x1; - uint8_t is_open = F_false; - uint8_t is_object = F_false; + // 0x0 = is false for all, 0x1 = is first graph, 0x2 = is delimited comment, 0x4 = is open, 0x8 = is object, 0x10 = is delimited close. + uint8_t is_state = 0x1; // Initialize depth 1 start position. // Positions_start.used is used as a max depth (such that positions_start.used == max depth + 1). @@ -87,33 +84,20 @@ extern "C" { } if (buffer.string[range->start] == f_fss_eol_s.string[0]) { - if (graph_first == 0x2) { + if (is_state & 0x2) { status = f_array_lengths_increase(state.step_small, delimits); if (F_status_is_error(status)) break; delimits->array[delimits->used++] = comment_delimit; } - newline_last = range->start; - position_previous = range->start++; - graph_first = 0x1; + newline_last = position_previous = range->start++; line_start = range->start; - - if (depth) { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_end_not_nest_eos, F_end_not_nest_stop); - } - else { - private_macro_fl_fss_nest_return_on_overflow_delimited((buffer), (*range), (*found), positions_start, objects, slashes, F_none_eos, F_none_stop); - } - - continue; + is_state = 0x1; } - - if (buffer.string[range->start] == f_fss_delimit_slash_s.string[0]) { - slash_first = range->start; - slash_last = range->start; + else if (buffer.string[range->start] == f_fss_delimit_slash_s.string[0] && (is_state & 0x1)) { + slash_first = slash_last = position_previous = range->start++; slashes.array[depth] = 1; - position_previous = range->start++; for (; range->start <= range->stop && range->start < buffer.used && (buffer.string[range->start] == f_fss_delimit_placeholder_s.string[0] || buffer.string[range->start] == f_fss_delimit_slash_s.string[0]); ++range->start) { @@ -135,14 +119,7 @@ extern "C" { } } // for - if (F_status_is_error(status)) break; - - if (depth) { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_end_not_nest_eos, F_end_not_nest_stop); - } - else { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_data_not_eos, F_data_not_stop); - } + if (F_status_is_error(status) || range->start >= buffer.used || range->start > range->stop) break; // All slashes for an open are delimited (because it could represent a slash in the object name). // For example 'object {' = valid open, name 'object', 'object \{' represents 'object {', 'object \\{' = valid open, name 'object \', 'object \\\{' represents 'object \{', etc.. @@ -150,25 +127,23 @@ extern "C" { // For example '}' = valid close, '\}' represents '}', '\\}' represents '\}', '\\\}' represents '\\}', '\\\\}' represents '\\\}', and so on.. // When slash is odd and a (delimited) valid open/close is found, then save delimited positions and continue. if (buffer.string[range->start] == f_fss_eol_s.string[0]) { - if (graph_first == 0x2) { + if (is_state & 0x2) { status = f_array_lengths_increase(state.step_small, delimits); if (F_status_is_error(status)) break; delimits->array[delimits->used++] = comment_delimit; } - newline_last = range->start; - position_previous = range->start++; + newline_last = position_previous = range->start++; line_start = range->start; - graph_first = 0x1; + is_state = 0x1; } else if (buffer.string[range->start] == f_fss_embedded_list_open_s.string[0] || buffer.string[range->start] == f_fss_embedded_list_close_s.string[0]) { before_list_open = position_previous; - is_open = F_false; - graph_first = 0x0; + is_state &= ~0x15; if (buffer.string[range->start] == f_fss_embedded_list_open_s.string[0]) { - is_open = F_true; + is_state |= 0x4; } position_previous = range->start++; @@ -185,20 +160,7 @@ extern "C" { } } - if (buffer.string[range->start] == f_fss_eol_s.string[0]) { - if (graph_first == 0x2) { - status = f_array_lengths_increase(state.step_small, delimits); - if (F_status_is_error(status)) break; - - delimits->array[delimits->used++] = comment_delimit; - } - - newline_last = range->start; - line_start = range->start + 1; - graph_first = 0x1; - - break; - } + if (buffer.string[range->start] == f_fss_eol_s.string[0]) break; if (buffer.string[range->start] != f_fss_delimit_placeholder_s.string[0]) { status = f_fss_is_space(state, buffer, *range); @@ -211,23 +173,21 @@ extern "C" { if (F_status_is_error(status)) break; } // while - if (F_status_is_error(status)) break; - - if (depth) { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_end_not_nest_eos, F_end_not_nest_stop); - } - else { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_data_not_eos, F_data_not_stop); - } + if (F_status_is_error(status) || range->start >= buffer.used || range->start > range->stop) break; // This is a valid object open/close that has been delimited, save the slash delimit positions. if (buffer.string[range->start] == f_fss_eol_s.string[0]) { newline_last = range->start; - line_start = range->start + 1; - graph_first = 0x1; + line_start = newline_last + 1; + + if (is_state & 0x4) { + if (slashes.array[depth] % 2 == 0) { + is_state |= 0x8; + } + else { + is_state &= ~0x8; + } - if (is_open) { - is_object = slashes.array[depth] % 2 == 0 ? F_true : F_false; range->start = slash_first; status = f_array_lengths_increase_by((slashes.array[depth] / 2) + 1, delimits); @@ -249,22 +209,25 @@ extern "C" { } // while // When slashes are even, the object is valid and needs to be processed. - if (is_object) { + if (is_state & 0x8) { if (++depth >= objects.size) { status = f_string_ranges_resize(depth + 2, &objects); - if (F_status_is_error(status)) break; } if (depth >= positions_start.size) { - status = f_array_lengths_resize(depth + 2, &positions_start); - if (F_status_is_error(status)) break; + if (F_status_is_error_not(status)) { + status = f_array_lengths_resize(depth + 2, &positions_start); + } } if (depth >= slashes.size) { - status = f_array_lengths_resize(depth + 2, &slashes); - if (F_status_is_error(status)) break; + if (F_status_is_error_not(status)) { + status = f_array_lengths_resize(depth + 2, &slashes); + } } + if (F_status_is_error(status)) break; + objects.array[depth].start = line_start; objects.array[depth].stop = before_list_open; positions_start.array[depth] = newline_last + 1; @@ -284,25 +247,31 @@ extern "C" { } } else { + is_state |= 0x10; + } + + if (is_state & 0x12) { status = f_array_lengths_increase(state.step_small, delimits); if (F_status_is_error(status)) break; delimits->array[delimits->used++] = slash_last; } - range->start = newline_last; + range->start = line_start; + is_state = 0x1; } } - else if (graph_first == 0x1 && buffer.string[range->start] == f_fss_comment_s.string[0]) { - graph_first = 0x2; + else if (buffer.string[range->start] == f_fss_comment_s.string[0] && (is_state & 0x1)) { + is_state |= 0x2; + is_state &= ~0x1; comment_delimit = slash_first; } else { - graph_first = 0x0; + is_state &= ~0x1; } } else if (buffer.string[range->start] == f_fss_embedded_list_open_s.string[0]) { - graph_first = 0x0; + is_state &= ~0x1; before_list_open = position_previous; position_previous = range->start; @@ -334,14 +303,7 @@ extern "C" { if (F_status_is_error(status)) break; } // while - if (F_status_is_error(status)) break; - - if (depth) { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_end_not_nest_eos, F_end_not_nest_stop); - } - else { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_data_not_eos, F_data_not_stop); - } + if (F_status_is_error(status) || range->start >= buffer.used || range->start > range->stop) break; if (buffer.string[range->start] == f_fss_eol_s.string[0]) { if (++depth >= objects.size) { @@ -350,15 +312,19 @@ extern "C" { } if (depth >= positions_start.size) { - status = f_array_lengths_resize(depth + 2, &positions_start); - if (F_status_is_error(status)) break; + if (F_status_is_error_not(status)) { + status = f_array_lengths_resize(depth + 2, &positions_start); + } } if (depth >= slashes.size) { - status = f_array_lengths_resize(depth + 2, &slashes); - if (F_status_is_error(status)) break; + if (F_status_is_error_not(status)) { + status = f_array_lengths_resize(depth + 2, &slashes); + } } + if (F_status_is_error(status)) break; + objects.array[depth].start = line_start; objects.array[depth].stop = before_list_open; positions_start.array[depth] = range->start + 1; @@ -376,7 +342,7 @@ extern "C" { slashes.used = depth + 1; } - if (graph_first == 0x2) { + if (is_state & 0x2) { status = f_array_lengths_increase(state.step_small, delimits); if (F_status_is_error(status)) break; @@ -384,8 +350,8 @@ extern "C" { } newline_last = range->start; - line_start = range->start + 1; - graph_first = 0x1; + line_start = newline_last + 1; + is_state = 0x1; } else { @@ -393,7 +359,7 @@ extern "C" { status = f_fss_seek_to_eol(state, buffer, range); if (F_status_is_error(status)) break; - if (graph_first == 0x2) { + if (is_state & 0x2) { status = f_array_lengths_increase(state.step_small, delimits); if (F_status_is_error(status)) break; @@ -401,46 +367,11 @@ extern "C" { } newline_last = range->start; - line_start = range->start + 1; - graph_first = 0x1; - - while (range->start <= range->stop && range->start < buffer.used) { - - if (state.interrupt) { - status = state.interrupt((void *) &state, 0); - - if (F_status_set_fine(status) == F_interrupt) { - status = F_status_set_error(F_interrupt); - - break; - } - } - - if (buffer.string[range->start] == f_fss_eol_s.string[0]) { - newline_last = range->start; - line_start = range->start + 1; - graph_first = 0x1; - - break; - } - - position_previous = range->start; - - status = f_utf_buffer_increment(buffer, range, 1); - if (F_status_is_error(status)) break; - } // while - - if (F_status_is_error(status)) break; - - if (depth) { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_end_not_nest_eos, F_end_not_nest_stop); - } - else { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_data_not_eos, F_data_not_stop); - } + line_start = newline_last + 1; + is_state = 0x1; } } - else if (buffer.string[range->start] == f_fss_embedded_list_close_s.string[0]) { + else if (buffer.string[range->start] == f_fss_embedded_list_close_s.string[0] && (is_state & 0x1)) { while (range->start <= range->stop && range->start < buffer.used) { if (state.interrupt) { @@ -456,9 +387,7 @@ extern "C" { position_previous = range->start; status = f_utf_buffer_increment(buffer, range, 1); - - if (F_status_is_error(status)) break; - if (buffer.string[range->start] == f_fss_eol_s.string[0]) break; + if (F_status_is_error(status) || buffer.string[range->start] == f_fss_eol_s.string[0]) break; if (buffer.string[range->start] != f_fss_delimit_placeholder_s.string[0]) { status = f_fss_is_space(state, buffer, *range); @@ -466,33 +395,29 @@ extern "C" { } } // while - if (F_status_is_error(status)) break; - - if (depth) { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_end_not_nest_eos, F_end_not_nest_stop); - } - else { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_data_not_eos, F_data_not_stop); - } + if (F_status_is_error(status) || range->start >= buffer.used || range->start > range->stop) break; if (buffer.string[range->start] == f_fss_eol_s.string[0]) { if (depth >= found->used) { status = f_fss_nest_resize(depth + 2, found); - if (F_status_is_error(status)) break; } if (found->depth[depth].used >= found->depth[depth].size) { - status = f_fss_items_increase(state.step_small, &found->depth[depth]); - if (F_status_is_error(status)) break; + if (F_status_is_error_not(status)) { + status = f_fss_items_increase(state.step_small, &found->depth[depth]); + } } position = found->depth[depth].used; if (found->depth[depth].array[position].content.size != 1) { - status = f_string_ranges_resize(1, &found->depth[depth].array[position].content); - if (F_status_is_error(status)) break; + if (F_status_is_error_not(status)) { + status = f_string_ranges_resize(1, &found->depth[depth].array[position].content); + } } + if (F_status_is_error(status)) break; + if (depth) { found->depth[depth].array[position].parent = found->depth[depth - 1].used; @@ -521,7 +446,7 @@ extern "C" { found->used = depth + 1; } - if (graph_first == 0x2) { + if (is_state & 0x2) { status = f_array_lengths_increase(state.step_small, delimits); if (F_status_is_error(status)) break; @@ -529,8 +454,8 @@ extern "C" { } newline_last = range->start; - line_start = range->start + 1; - graph_first = 0x1; + line_start = newline_last + 1; + is_state = 0x1; if (!depth) { status = f_utf_buffer_increment(buffer, range, 1); @@ -563,7 +488,7 @@ extern "C" { } if (buffer.string[range->start] == f_fss_eol_s.string[0]) { - if (graph_first == 0x2) { + if (is_state & 0x2) { status = f_array_lengths_increase(state.step_small, delimits); if (F_status_is_error(status)) break; @@ -571,8 +496,8 @@ extern "C" { } newline_last = range->start; - line_start = range->start + 1; - graph_first = 0x1; + line_start = newline_last + 1; + is_state = 0x1; break; } @@ -583,17 +508,10 @@ extern "C" { if (F_status_is_error(status)) break; } // while - if (F_status_is_error(status)) break; - - if (depth) { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_end_not_nest_eos, F_end_not_nest_stop) - } - else { - private_macro_fl_fss_nest_return_on_overflow((buffer), (*range), (*found), (*delimits), delimits_used, (*comments), comments_used, positions_start, objects, slashes, F_data_not_eos, F_data_not_stop) - } + if (F_status_is_error(status) || range->start >= buffer.used || range->start > range->stop) break; } } - else if (buffer.string[range->start] == f_fss_comment_s.string[0] && (graph_first == 0x1 || graph_first == 0x2)) { + else if (buffer.string[range->start] == f_fss_comment_s.string[0] && (is_state & 0x1)) { // The newline_last is initialized to the range->start, which may not actually be a new line. position = (buffer.string[newline_last] == f_string_eol_s.string[0]) ? newline_last + 1 : newline_last; @@ -605,7 +523,7 @@ extern "C" { --range->start; } else { - if (graph_first == 0x2) { + if (is_state & 0x2) { status = f_array_lengths_increase(state.step_small, delimits); if (F_status_is_error(status)) break; @@ -613,7 +531,8 @@ extern "C" { } newline_last = range->start; - graph_first = 0x1; + line_start = newline_last + 1; + is_state = 0x1; } status = f_string_ranges_increase(state.step_small, comments); @@ -621,33 +540,24 @@ extern "C" { comments->array[comments->used].start = position; comments->array[comments->used++].stop = range->start++; - - continue; } else if (buffer.string[range->start] != f_fss_eol_s.string[0]) { position_previous = range->start; - if (graph_first == 0x1) { + if (is_state & 0x1) { status = f_fss_is_space(state, buffer, *range); - if (F_status_is_error(status)) break; if (status == F_false) { - graph_first = 0x0; + is_state &= ~0x1; } } - status = f_utf_buffer_increment(buffer, range, 1); - if (F_status_is_error(status)) break; - - if (range->start >= buffer.used || range->start > range->stop) break; + if (F_status_is_error_not(status)) { + status = f_utf_buffer_increment(buffer, range, 1); + } - continue; + if (F_status_is_error(status)) break; } - - position_previous = range->start; - - status = f_utf_buffer_increment(buffer, range, 1); - if (F_status_is_error(status)) break; } // while f_array_lengths_resize(0, &positions_start); diff --git a/level_1/fl_fss/c/private-fss.c b/level_1/fl_fss/c/private-fss.c index 025d6b8..89792e8 100644 --- a/level_1/fl_fss/c/private-fss.c +++ b/level_1/fl_fss/c/private-fss.c @@ -199,7 +199,8 @@ extern "C" { continue; } - else if (buffer.string[range->start] == list_open.string[0]) { + + if (buffer.string[range->start] == list_open.string[0]) { ++range->start; while (range->start <= range->stop && range->start < buffer.used) { @@ -251,23 +252,22 @@ extern "C" { continue; } - else { - status = f_fss_is_space(state, buffer, *range); - if (F_status_is_error(status)) { - delimits->used = delimits_used; + status = f_fss_is_space(state, buffer, *range); - return status; - } + if (F_status_is_error(status)) { + delimits->used = delimits_used; - if (status == F_false) { - if (graph_first) { - graph_first = F_false; - start = range->start; - } + return status; + } - stop = range->start; + if (status == F_false) { + if (graph_first) { + graph_first = F_false; + start = range->start; } + + stop = range->start; } status = f_utf_buffer_increment(buffer, range, 1); diff --git a/level_2/fll_fss/c/fss/embedded_list.c b/level_2/fll_fss/c/fss/embedded_list.c index 3b9e70b..e5d7471 100644 --- a/level_2/fll_fss/c/fss/embedded_list.c +++ b/level_2/fll_fss/c/fss/embedded_list.c @@ -16,7 +16,7 @@ extern "C" { f_status_t status = F_none; f_array_length_t initial_used = 0; - bool found_data = F_false; + uint8_t found_data = F_false; if (!nest->used) { status = f_fss_nest_resize(state.step_small, nest); @@ -28,7 +28,7 @@ extern "C" { do { do { - status = f_fss_items_resize(state.step_small, &nest->depth[0]); + status = f_fss_items_increase(state.step_small, &nest->depth[0]); if (F_status_is_error(status)) return status; nest->depth[nest->used].used = 0; @@ -43,6 +43,8 @@ extern "C" { return F_fss_found_object_content_not; } + if (status == F_data_not) return status; + if (found_data) { if (range->start >= buffer.used) return F_none_eos; diff --git a/level_3/fss_embedded_list_read/c/private-print.c b/level_3/fss_embedded_list_read/c/private-print.c index 9a55445..25a805e 100644 --- a/level_3/fss_embedded_list_read/c/private-print.c +++ b/level_3/fss_embedded_list_read/c/private-print.c @@ -13,7 +13,10 @@ extern "C" { if (contents.used && contents.array[0].start <= contents.array[0].stop) { if (contents.array[0].stop + 1 < data->buffer.used) { - before.start = contents.array[0].stop; + before.start = contents.array[0].stop + 1; + + // Seek past any NULLs. + while (before.start < data->buffer.used && !data->buffer.string[before.start]) ++before.start; } else { return before; @@ -24,12 +27,21 @@ extern "C" { } else { before.start = object.stop; - } - while (before.start < data->buffer.used && data->buffer.string[before.start] != f_fss_eol_s.string[0]) ++before.start; + while (before.start < data->buffer.used && data->buffer.string[before.start] != f_fss_eol_s.string[0]) ++before.start; - if (before.start + 1 < data->buffer.used && data->buffer.string[before.start] == f_fss_eol_s.string[0]) { - before.stop = ++before.start; + if (before.start >= data->buffer.used || data->buffer.string[before.start] != f_fss_eol_s.string[0]) { + before.start = 1; + before.stop = 0; + + return before; + } + + ++before.start; + } + + if (before.start < data->buffer.used) { + before.stop = before.start; while (before.stop < data->buffer.used && data->buffer.string[before.stop] != f_fss_embedded_list_close_s.string[0]) ++before.stop; @@ -64,7 +76,7 @@ extern "C" { if (!data->buffer.used) return; - if (data->main->parameters.array[fss_embedded_list_read_parameter_content_e].result == f_console_result_found_e && (data->main->parameters.array[fss_embedded_list_read_parameter_original_e].result != f_console_result_found_e || data->main->parameters.array[fss_embedded_list_read_parameter_trim_e].result == f_console_result_found_e)) { + if (data->main->parameters.array[fss_embedded_list_read_parameter_content_e].result == f_console_result_found_e) { const f_string_range_t before = fss_embedded_list_read_print_at_determine_begin(data, object, contents); if (before.start <= before.stop) { @@ -132,13 +144,19 @@ extern "C" { #endif // _di_fss_embedded_list_read_print_object_end_ #ifndef _di_fss_embedded_list_read_print_set_end_ - void fss_embedded_list_read_print_set_end(fss_embedded_list_read_data_t * const data) { + void fss_embedded_list_read_print_set_end(fss_embedded_list_read_data_t * const data, f_fss_items_t * const items, const f_array_length_t at, const f_fss_delimits_t objects_delimits) { if (data->main->parameters.array[fss_embedded_list_read_parameter_pipe_e].result == f_console_result_found_e) { f_print_dynamic_raw(fss_embedded_list_read_pipe_content_end_s, data->main->output.to.stream); } else { if (data->main->parameters.array[fss_embedded_list_read_parameter_object_e].result == f_console_result_found_e && data->main->parameters.array[fss_embedded_list_read_parameter_content_e].result == f_console_result_found_e) { + const f_string_range_t before = fss_embedded_list_read_print_at_determine_begin(data, items->array[at].object, items->array[at].content); + + if (before.start <= before.stop) { + f_print_except_dynamic_partial(data->buffer, before, objects_delimits, data->main->output.to.stream); + } + f_print_dynamic_raw(f_fss_embedded_list_close_s, data->main->output.to.stream); f_print_dynamic_raw(f_fss_embedded_list_close_end_s, data->main->output.to.stream); } diff --git a/level_3/fss_embedded_list_read/c/private-print.h b/level_3/fss_embedded_list_read/c/private-print.h index 4ebe6af..e23ad2d 100644 --- a/level_3/fss_embedded_list_read/c/private-print.h +++ b/level_3/fss_embedded_list_read/c/private-print.h @@ -78,9 +78,15 @@ extern "C" { * * @param data * The program data. + * @param items + * The items set to process. + * @param at + * The position within the Object and Contents array to print. + * @param objects_delimits + * The Object delimits array. */ #ifndef _di_fss_embedded_list_read_print_set_end_ - extern void fss_embedded_list_read_print_set_end(fss_embedded_list_read_data_t * const data) F_attribute_visibility_internal_d; + extern void fss_embedded_list_read_print_set_end(fss_embedded_list_read_data_t * const data, f_fss_items_t * const items, const f_array_length_t at, const f_fss_delimits_t objects_delimits) F_attribute_visibility_internal_d; #endif // _di_fss_embedded_list_read_print_set_end_ #ifdef __cplusplus diff --git a/level_3/fss_embedded_list_read/c/private-read.c b/level_3/fss_embedded_list_read/c/private-read.c index b1cd777..655c918 100644 --- a/level_3/fss_embedded_list_read/c/private-read.c +++ b/level_3/fss_embedded_list_read/c/private-read.c @@ -272,18 +272,9 @@ extern "C" { return status; } - f_array_length_t i = 0; - f_array_length_t j = 0; - - // Comments are not to be part of the file, so remove them. - for (; i < comments->used; ++i) { - - for (j = comments->array[i].start; j <= comments->array[i].stop; ++j) { - - if (j < data->buffer.used) { - data->buffer.string[j] = f_fss_delimit_placeholder_s.string[0]; - } - } // for + // Comments are not to be part of the file, so remove them.ed); + for (f_array_length_t i = 0; i < comments->used; ++i) { + memset(data->buffer.string + comments->array[i].start, f_fss_delimit_placeholder_s.string[0], (comments->array[i].stop - comments->array[i].start) + 1); } // for } @@ -598,7 +589,7 @@ extern "C" { // If the matched line is after the stop, then this matches the end of Object line. if (j > items->array[i].content.array[0].stop) { - fss_embedded_list_read_print_set_end(data); + fss_embedded_list_read_print_set_end(data, items, i, *objects_delimits); } else { for (; j <= items->array[i].content.array[0].stop; ++j) { @@ -635,7 +626,7 @@ extern "C" { // Handle the Object end. if (line_current++ == line) { - fss_embedded_list_read_print_set_end(data); + fss_embedded_list_read_print_set_end(data, items, i, *objects_delimits); break; } @@ -660,19 +651,11 @@ extern "C" { fss_embedded_list_read_print_object_end(data); if (items->array[i].content.used) { - if (data->main->parameters.array[fss_embedded_list_read_parameter_object_e].result == f_console_result_found_e) { - const f_string_range_t before = fss_embedded_list_read_print_at_determine_begin(data, items->array[i].object, items->array[i].content); - - if (before.start <= before.stop) { - f_print_except_dynamic_partial(data->buffer, before, *objects_delimits, data->main->output.to.stream); - } - } - f_print_except_dynamic_partial(data->buffer, items->array[i].content.array[0], *contents_delimits, data->main->output.to.stream); } } - fss_embedded_list_read_print_set_end(data); + fss_embedded_list_read_print_set_end(data, items, i, *objects_delimits); } // for funlockfile(data->main->output.to.stream); diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-content-select-0.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-content-select-0.expect index 0522138..56ad473 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-content-select-0.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-content-select-0.expect @@ -6,7 +6,7 @@ inside { } with content. - \### Nested valid Object { + ### Nested valid Object { with nested content. } and outside. diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-content-trim.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-content-trim.expect index 0522138..56ad473 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-content-trim.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-content-trim.expect @@ -6,7 +6,7 @@ inside { } with content. - \### Nested valid Object { + ### Nested valid Object { with nested content. } and outside. diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-content.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-content.expect index 0522138..56ad473 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-content.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-content.expect @@ -6,7 +6,7 @@ inside { } with content. - \### Nested valid Object { + ### Nested valid Object { with nested content. } and outside. diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-at-0.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-at-0.expect index a8c8f7c..ef39d57 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-at-0.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-at-0.expect @@ -1,7 +1,7 @@ a{ - + stuff This has Several lines -} + } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-at-1.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-at-1.expect index 7711572..9549598 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-at-1.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-at-1.expect @@ -1,4 +1,4 @@ привет has space{ - inside { + inside { } -} + } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-line-6.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-line-6.expect index 5c34318..a8317d6 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-line-6.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-line-6.expect @@ -1 +1 @@ -} + } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name--select-0.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name--select-0.expect index e8e0365..4dcdeaf 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name--select-0.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name--select-0.expect @@ -1,3 +1,3 @@ { - Has no Object name (only white space) and is oddly spaced. -} +Has no Object name (only white space) and is oddly spaced. + } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-.expect index e8e0365..4dcdeaf 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-.expect @@ -1,3 +1,3 @@ { - Has no Object name (only white space) and is oddly spaced. -} +Has no Object name (only white space) and is oddly spaced. + } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a-original-empty.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a-original-empty.expect index d9bd647..01aa0ba 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a-original-empty.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a-original-empty.expect @@ -1,7 +1,7 @@ a { - + stuff This has Several lines -} + } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a-original.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a-original.expect index d9bd647..01aa0ba 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a-original.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a-original.expect @@ -1,7 +1,7 @@ a { - + stuff This has Several lines -} + } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a-select-0.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a-select-0.expect index a8c8f7c..ef39d57 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a-select-0.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a-select-0.expect @@ -1,7 +1,7 @@ a{ - + stuff This has Several lines -} + } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a.expect index a8c8f7c..ef39d57 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-a.expect @@ -1,7 +1,7 @@ a{ - + stuff This has Several lines -} + } diff --git "a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-\320\277\321\200\320\270\320\262\320\265\321\202_has_space-select-0.expect" "b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-\320\277\321\200\320\270\320\262\320\265\321\202_has_space-select-0.expect" index 7711572..9549598 100644 --- "a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-\320\277\321\200\320\270\320\262\320\265\321\202_has_space-select-0.expect" +++ "b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-name-\320\277\321\200\320\270\320\262\320\265\321\202_has_space-select-0.expect" @@ -1,4 +1,4 @@ привет has space{ - inside { + inside { } -} + } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-original.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-original.expect index f28125f..2acd827 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-original.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-original.expect @@ -1,26 +1,26 @@ a { - + stuff This has Several lines -} + } привет has space { - inside { + inside { } -} + } \# Valid Object { - with content. -} + with content. + } \# Valid Object { - \### Nested valid Object { + \### Nested valid Object { with nested content. } and outside. -} -{ - Has no Object name (only white space) and is oddly spaced. -} + } + { +Has no Object name (only white space) and is oddly spaced. + } мир { мирмирмир } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-select-0-original.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-select-0-original.expect index 04fbb74..27dbce4 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-select-0-original.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-select-0-original.expect @@ -25,10 +25,8 @@ Has no Object name (only white space) and is oddly spaced. мирмирмир } hi { - # Comment inside. } nested { empty { } - # Comment after. } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-select-0.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-select-0.expect index 546e287..c2e7627 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-select-0.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-select-0.expect @@ -1,26 +1,26 @@ a{ - + stuff This has Several lines -} + } привет has space{ - inside { + inside { } -} + } # Valid Object{ - with content. -} + with content. + } # Valid Object{ - \### Nested valid Object { + ### Nested valid Object { with nested content. } and outside. -} + } { - Has no Object name (only white space) and is oddly spaced. -} +Has no Object name (only white space) and is oddly spaced. + } мир{ мирмирмир } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-trim.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-trim.expect index 546e287..c2e7627 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-trim.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content-trim.expect @@ -1,26 +1,26 @@ a{ - + stuff This has Several lines -} + } привет has space{ - inside { + inside { } -} + } # Valid Object{ - with content. -} + with content. + } # Valid Object{ - \### Nested valid Object { + ### Nested valid Object { with nested content. } and outside. -} + } { - Has no Object name (only white space) and is oddly spaced. -} +Has no Object name (only white space) and is oddly spaced. + } мир{ мирмирмир } diff --git a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content.expect b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content.expect index 546e287..c2e7627 100644 --- a/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content.expect +++ b/level_3/fss_embedded_list_read/tests/runtime/fss_0008/expect/test-0003-object_space-object_and_content.expect @@ -1,26 +1,26 @@ a{ - + stuff This has Several lines -} + } привет has space{ - inside { + inside { } -} + } # Valid Object{ - with content. -} + with content. + } # Valid Object{ - \### Nested valid Object { + ### Nested valid Object { with nested content. } and outside. -} + } { - Has no Object name (only white space) and is oddly spaced. -} +Has no Object name (only white space) and is oddly spaced. + } мир{ мирмирмир } diff --git a/level_3/fss_extended_list_read/c/private-print.c b/level_3/fss_extended_list_read/c/private-print.c index c8821c6..d2bb5f2 100644 --- a/level_3/fss_extended_list_read/c/private-print.c +++ b/level_3/fss_extended_list_read/c/private-print.c @@ -53,7 +53,10 @@ extern "C" { if (at < data->contents.used) { if (data->contents.used && data->contents.array[at].array[0].start <= data->contents.array[at].array[0].stop) { if (data->contents.array[at].array[0].stop + 1 < data->buffer.used) { - before.start = data->contents.array[at].array[0].stop; + before.start = data->contents.array[at].array[0].stop + 1; + + // Seek past any NULLs. + while (before.start < data->buffer.used && !data->buffer.string[before.start]) ++before.start; } else { return before; @@ -64,12 +67,21 @@ extern "C" { } else { before.start = data->objects.array[at].stop; - } - while (before.start < data->buffer.used && data->buffer.string[before.start] != f_fss_eol_s.string[0]) ++before.start; + while (before.start < data->buffer.used && data->buffer.string[before.start] != f_fss_eol_s.string[0]) ++before.start; + + if (before.start >= data->buffer.used || data->buffer.string[before.start] != f_fss_eol_s.string[0]) { + before.start = 1; + before.stop = 0; + + return before; + } + + ++before.start; + } - if (before.start + 1 < data->buffer.used && data->buffer.string[before.start] == f_fss_eol_s.string[0]) { - before.stop = ++before.start; + if (before.start < data->buffer.used) { + before.stop = before.start; while (before.stop < data->buffer.used && data->buffer.string[before.stop] != f_fss_extended_list_close_s.string[0]) ++before.stop; -- 1.8.3.1