The `F_okay_eos` and `F_okay_stop` must actually be returned after all.
Add additional comments in code as well as the documentation comments on the function to clarify.
Switch to `fll_flags` from `found_data` for managing flags within a function.
}
if (F_status_is_error_not(state->status)) {
+
+ // The EOS and stop cases only happen here when EOL is not found, so do not increment found.used.
+ if (range->start >= buffer.used) {
+ found->array[found->used].stop = buffer.used - 1;
+ state->status = F_okay_eos;
+
+ return;
+ }
+
+ if (range->start > range->stop) {
+ found->array[found->used].stop = range->stop;
+ state->status = F_okay_stop;
+
+ return;
+ }
+
if (range->start > begin) {
found->array[found->used].start = begin;
found->array[found->used++].stop = range->start - 1;
}
state->status = f_utf_buffer_increment(buffer, range, 1);
- }
- if (F_status_is_error(state->status)) return;
-
- state->status = F_fss_found_content;
+ if (F_status_is_error_not(state->status)) {
+ state->status = F_fss_found_content;
+ }
+ }
}
#endif // _di_fl_fss_basic_content_read_
}
if (state->status == F_data_not) return;
- if (F_status_is_error(state->status)) break;
- if (range->start > range->stop || range->start >= buffer.used) break;
+ if (F_status_is_error(state->status) || range->start > range->stop || range->start >= buffer.used) break;
if (state->status == F_okay_eol) {
newline_last = line_start;
else if ((flag_fl & ___fl_flag_has_graph_first___) && buffer.string[range->start] == f_fss_comment_s.string[0]) {
++range->start;
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ f_fss_skip_past_delimit(buffer, range, state);
+
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
flag_fl &= ~___fl_flag_has_graph_first_do_escape___;
slash_count = 0;
// Found a valid object, set stop point to last newline.
if (state->status == F_okay_eol) {
if (newline_last == found->array[found->used].start) {
- found->array[found->used++].stop = range->start++;
+ found->array[found->used].start = 1;
+ found->array[found->used++].stop = 0;
+ range->start = newline_last;
}
else {
range->start = newline_last + 1;
if ((flag_fl & ___fl_flag_has_graph_first___) && buffer.string[range->start] == f_fss_comment_s.string[0]) {
previous = range->start++;
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ f_fss_skip_past_delimit(buffer, range, state);
+
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
flag_fl &= ~___fl_flag_has_graph_first_do_escape___;
slash_count = 0;
return;
}
+ // The EOS and stop cases only happen here when content is not found, so do not increment found.used.
+ if (range->start >= buffer.used) {
+ found->array[found->used].stop = buffer.used - 1;
+ state->status = F_okay_eos;
+
+ return;
+ }
+
+ if (range->start > range->stop) {
+ found->array[found->used].stop = range->stop;
+ state->status = F_okay_stop;
+
+ return;
+ }
+
+ state->status = F_fss_found_content;
+
if (range->start > begin) {
- if (range->start >= buffer.used) {
- found->array[found->used++].stop = buffer.used - 1;
- }
- else if (range->start > range->stop) {
- found->array[found->used++].stop = range->stop;
- }
- else {
- found->array[found->used++].stop = range->start - 1;
- }
+ found->array[found->used++].stop = range->start - 1;
}
else {
found->array[found->used].start = 1;
found->array[found->used++].stop = 0;
}
- state->status = F_fss_found_content;
-
#undef ___fl_flag_do_escape___
#undef ___fl_flag_has_graph_first___
#undef ___fl_flag_has_delimit_comment___
f_fss_skip_past_delimit(content, range, state);
- if (state->status == F_okay) {
- if (f_fss_is_combining_joiner(content, *range, state)) {
- if (state->status == F_combarudoo) {
- flag_fl |= ___fl_flag_is_combining_graph___;
- }
- else if (state->status == F_bound) {
- flag_fl |= ___fl_flag_is_joiner_graph___;
- }
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(content, *range, state) == F_true) {
+ if (state->status == F_combarudoo) {
+ flag_fl |= ___fl_flag_is_combining_graph___;
+ }
+ else if (state->status == F_bound) {
+ flag_fl |= ___fl_flag_is_joiner_graph___;
}
}
f_fss_skip_past_delimit(object, range, state);
- if (state->status == F_okay) {
- if (f_fss_is_combining_joiner(object, *range, state)) {
- if (state->status == F_combarudoo) {
- flag_fl |= ___fl_flag_is_combining_graph___;
- }
- else if (state->status == F_bound) {
- flag_fl |= ___fl_flag_is_joiner_graph___;
- }
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(object, *range, state) == F_true) {
+ if (state->status == F_combarudoo) {
+ flag_fl |= ___fl_flag_is_combining_graph___;
+ }
+ else if (state->status == F_bound) {
+ flag_fl |= ___fl_flag_is_joiner_graph___;
}
}
*
* Combining spaces at the start must be handled by the caller to avoid F_complete_not_utf_start errors relating to combining characters.
*
+ * The content is still technically valid on F_okay_eos and F_okay_stop state.status values, but because this function cannot actually know it will not increment found.used.
+ * However, the start and stop values that are technically valid content are still stored.
+ * The caller should check for the F_okay_eos and F_okay_stop values and increment found.used as desired.
+ *
* @param buffer
* The buffer to read from.
* @param range
else if (buffer.string[range->start] == f_fss_slash_s.string[0] && (flag_fl & ___fl_flag_has_graph_first___)) {
previous = range->start++;
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ f_fss_skip_past_delimit(buffer, range, state);
+
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
// This cannot be a valid object close at this point, seek until EOL.
f_fss_seek_to_eol(buffer, range, state);
if (buffer.string[previous] == f_fss_slash_s.string[0]) {
++range->start;
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ f_fss_skip_past_delimit(buffer, range, state);
+
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
cache->slashes->array[depth] = 0;
flag_fl |= ___fl_flag_has_joiner_combining___;
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 = range->start++;
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ f_fss_skip_past_delimit(buffer, range, state);
+
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
// This cannot be a valid object close at this point, seek until EOL.
f_fss_seek_to_eol(buffer, range, state);
else if (buffer.string[range->start] == f_fss_comment_s.string[0] && (flag_fl & ___fl_flag_has_graph_first___)) {
previous = range->start++;
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ f_fss_skip_past_delimit(buffer, range, state);
+
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
// This cannot be a valid object close at this point, seek until EOL.
f_fss_seek_to_eol(buffer, range, state);
return;
}
- state->status = F_fss_found_content;
+ if (range->start >= buffer.used) {
+ state->status = F_okay_eos;
+ } else if (range->start > range->stop) {
+ state->status = F_okay_stop;
+ }
+ else {
+ state->status = F_fss_found_content;
+ }
return;
}
else if (buffer.string[range->start] == f_fss_comment_s.string[0] && (flag_fl & ___fl_flag_has_graph_first___)) {
previous = range->start++;
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ f_fss_skip_past_delimit(buffer, range, state);
+
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
// This cannot be a valid object close at this point, seek until EOL.
f_fss_seek_to_eol(buffer, range, state);
f_fss_skip_past_delimit(content, range, state);
- if (state->status == F_okay) {
- if (f_fss_is_combining_joiner(content, *range, state) == F_true) {
- if (state->status == F_combarudoo) {
- flag |= ___fl_flag_is_combining_graph___;
- }
- else if (state->status == F_bound) {
- flag |= ___fl_flag_is_joiner_graph___;
- }
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(content, *range, state) == F_true) {
+ if (state->status == F_combarudoo) {
+ flag |= ___fl_flag_is_combining_graph___;
+ }
+ else if (state->status == F_bound) {
+ flag |= ___fl_flag_is_joiner_graph___;
}
}
f_fss_skip_past_delimit(object, range, state);
- if (state->status == F_okay) {
- if (f_fss_is_combining_joiner(object, *range, state) == F_true) {
- if (state->status == F_combarudoo) {
- flag |= ___fl_flag_is_combining_graph___;
- }
- else if (state->status == F_bound) {
- flag |= ___fl_flag_is_joiner_graph___;
- }
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(object, *range, state) == F_true) {
+ if (state->status == F_combarudoo) {
+ flag |= ___fl_flag_is_combining_graph___;
+ }
+ else if (state->status == F_bound) {
+ flag |= ___fl_flag_is_joiner_graph___;
}
}
else if (buffer.string[range->start] == f_fss_comment_s.string[0]) {
previous = ++range->start;
+ f_fss_skip_past_delimit(buffer, range, state);
+ if (F_status_is_error(state->status)) break;
+
if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
f_fss_skip_past_combining_joiner(buffer, range, state);
if (F_status_is_error(state->status)) break;
if (buffer.string[range->start] == f_fss_comment_s.string[0]) {
previous = ++range->start;
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ f_fss_skip_past_delimit(buffer, range, state);
+
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
f_fss_skip_past_combining_joiner(buffer, range, state);
if (F_status_is_error(state->status)) break;
f_fss_skip_past_delimit(content, range, state);
- if (state->status == F_okay) {
- if (f_fss_is_combining_joiner(content, *range, state)) {
- if (state->status == F_combarudoo) {
- flag |= ___fl_flag_is_combining_graph___;
- }
- else if (state->status == F_bound) {
- flag |= ___fl_flag_is_joiner_graph___;
- }
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(content, *range, state) == F_true) {
+ if (state->status == F_combarudoo) {
+ flag |= ___fl_flag_is_combining_graph___;
+ }
+ else if (state->status == F_bound) {
+ flag |= ___fl_flag_is_joiner_graph___;
}
}
f_fss_skip_past_delimit(object, range, state);
- if (state->status == F_okay) {
- if (f_fss_is_combining_joiner(object, *range, state)) {
- if (state->status == F_combarudoo) {
- flag |= ___fl_flag_is_combining_graph___;
- }
- else if (state->status == F_bound) {
- flag |= ___fl_flag_is_joiner_graph___;
- }
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(object, *range, state) == F_true) {
+ if (state->status == F_combarudoo) {
+ flag |= ___fl_flag_is_combining_graph___;
+ }
+ else if (state->status == F_bound) {
+ flag |= ___fl_flag_is_joiner_graph___;
}
}
f_number_unsigned_t location = 0;
f_number_unsigned_t slash_first = 0;
f_number_unsigned_t slash_count = 0;
- f_number_unsigned_t start = 1;
- f_number_unsigned_t stop = 0;
+ f_number_unsigned_t line_start = 1;
+ f_number_unsigned_t line_stop = 0;
uint8_t flag_fl = ___fl_flag_has_graph_first___;
f_fss_skip_past_delimit(buffer, range, state);
// If first slash has a combining/joiner following it, then there is no escaping at all but this is not a valid escaping slash.
- if (F_status_is_error_not(state->status)) {
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
- flag_fl &= ~___fl_flag_do_escape___;
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ flag_fl &= ~___fl_flag_do_escape___;
- f_fss_skip_past_combining_joiner(buffer, range, state);
- }
+ f_fss_skip_past_combining_joiner(buffer, range, state);
}
if (flag_fl & ___fl_flag_do_escape___) {
if (buffer.string[range->start] == list_open.string[0]) {
flag_fl &= ~___fl_flag_has_graph_first___;
- stop = range->start++;
+ line_stop = range->start++;
f_fss_skip_past_delimit(buffer, range, state);
- if (F_status_is_error_not(state->status)) {
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
- flag_fl &= ~___fl_flag_do_escape___;
- slash_count = 0;
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ flag_fl &= ~___fl_flag_do_escape___;
+ slash_count = 0;
- f_fss_skip_past_combining_joiner(buffer, range, state);
+ f_fss_skip_past_combining_joiner(buffer, range, state);
- continue;
- }
+ continue;
}
if (F_status_is_error_not(state->status)) {
} // while
range->start = found->stop + 1;
- found->start = stop;
- found->stop = stop;
+ found->start = line_stop;
+ found->stop = line_stop;
state->status = f_utf_buffer_decrement(buffer, found, 1);
}
found->stop = found->start;
- found->start = start;
+ found->start = line_start;
state->status = F_fss_found_object;
}
else {
}
else if ((flag_fl & ___fl_flag_has_graph_first___) && buffer.string[range->start] == f_fss_comment_s.string[0]) {
flag_fl &= ~___fl_flag_has_graph_first___;
- start = slash_first;
+ line_start = slash_first;
location = range->start++;
f_fss_skip_past_delimit(buffer, range, state);
- if (F_status_is_error_not(state->status)) {
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
- flag_fl &= ~___fl_flag_do_escape___;
- slash_count = 0;
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ flag_fl &= ~___fl_flag_do_escape___;
+ slash_count = 0;
- f_fss_skip_past_combining_joiner(buffer, range, state);
+ f_fss_skip_past_combining_joiner(buffer, range, state);
- continue;
- }
+ continue;
}
if (F_status_is_error(state->status)) break;
}
delimits->array[delimits->used++] = slash_first;
- stop = range->start++;
+ line_stop = range->start++;
}
else {
flag_fl &= ~___fl_flag_has_graph_first___;
- stop = range->start;
+ line_stop = range->start;
}
continue;
}
if (state->status == F_okay_eol) {
- found->start = start;
- found->stop = stop + macro_f_utf_byte_width(buffer.string[stop]) - 1;
+ found->start = line_start;
+ found->stop = line_stop + macro_f_utf_byte_width(buffer.string[line_stop]) - 1;
++range->start;
state->status = F_fss_found_object;
if (flag_fl & ___fl_flag_has_graph_first___) {
flag_fl &= ~___fl_flag_has_graph_first___;
- start = 1;
- stop = 0;
+ line_start = 1;
+ line_stop = 0;
}
else {
- stop = range->start;
+ line_stop = range->start;
}
continue;
}
if (f_fss_is_space(buffer, *range, state) == F_false) {
- if (F_status_is_error_not(state->status)) {
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
- f_fss_skip_past_combining_joiner(buffer, range, state);
- }
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ f_fss_skip_past_combining_joiner(buffer, range, state);
}
if (F_status_is_error_not(state->status)) {
if (flag_fl & ___fl_flag_has_graph_first___) {
flag_fl &= ~___fl_flag_has_graph_first___;
- start = range->start;
+ line_start = range->start;
}
- stop = range->start;
+ line_stop = range->start;
}
}
}
// If first slash has a combining/joiner following it, then there is no escaping at all so slash_first is the start of an object and is not considered an escaping character.
- if (F_status_is_error_not(state->status)) {
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
- flag_fl &= ~___fl_flag_do_escape___;
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ flag_fl &= ~___fl_flag_do_escape___;
- f_fss_skip_past_combining_joiner(buffer, range, state);
- }
+ f_fss_skip_past_combining_joiner(buffer, range, state);
}
if (F_status_is_error(state->status)) return;
else if (!(flag & 0x2) && (buffer.string[range->start] == f_fss_quote_single_s.string[0] || buffer.string[range->start] == f_fss_quote_double_s.string[0] || buffer.string[range->start] == f_fss_quote_grave_s.string[0])) {
previous = range->start++;
+ f_fss_skip_past_delimit(buffer, range, state);
+ if (F_status_is_error(state->status)) return;
+
if (range->start <= range->stop && range->start < buffer.used) {
if (f_fss_is_combining_joiner(buffer, *range, state) == F_false) {
if (F_status_is_error(state->status)) return;
flag_fl &= ~___fl_flag_has_joiner_combining___;
state->status = f_utf_buffer_increment(buffer, range, 1);
- if (F_status_is_error(state->status)) return;
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ if (F_status_is_error_not(state->status)) {
+ f_fss_skip_past_delimit(buffer, range, state);
+ }
+
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
flag_fl |= ___fl_flag_has_joiner_combining___;
}
else {
state->status = f_utf_buffer_increment(buffer, range, 1);
if (F_status_is_error(state->status)) return;
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ f_fss_skip_past_delimit(buffer, range, state);
+
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
flag_fl |= ___fl_flag_has_joiner_combining___;
}
else {
}
f_fss_skip_past_delimit(buffer, range, state);
- if (F_status_is_error(state->status)) return;
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
f_fss_skip_past_combining_joiner(buffer, range, state);
if (F_status_is_error_not(state->status)) continue;
}
}
f_fss_skip_past_delimit(buffer, range, state);
- if (F_status_is_error(state->status)) return;
- if (f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
+ if (F_status_is_error_not(state->status) && f_fss_is_combining_joiner(buffer, *range, state) == F_true) {
f_fss_skip_past_combining_joiner(buffer, range, state);
if (F_status_is_error_not(state->status)) continue;
}
} while (state->status == F_fss_found_object_not);
+ // The fl_fss_basic_list_content_read() returns F_okay_eos and F_okay_stop but doesn't increment found.used given that it has no way of knowing.
+ // This function will treat these states as known and declare that this is found content (and therefore found an object).
if (state->status == F_okay_eos || state->status == F_okay_stop) {
++contents->array[contents->used++].used;
++objects->used;
f_status_t status = F_okay;
f_number_unsigned_t initial_used = objects->used;
- // 0x1 = found data, 0x2 = found payload object.
- uint8_t found_data = 0;
+ #define ___fll_flag_has_data___ 0x1
+ #define ___fll_flag_has_payload___ 0x2
+
+ uint8_t fll_flag = 0x0;
do {
state->status = f_memory_array_increase(state->step_small, sizeof(f_range_t), (void **) &objects->array, &objects->used, &objects->size);
if (F_status_is_error(state->status)) return;
if (f_compare_dynamic_partial_string(f_fss_payload_s.string, buffer, f_fss_payload_s.used, objects->array[objects->used]) == F_equal_to) {
- found_data |= 0x2;
+ fll_flag |= ___fll_flag_has_payload___;
}
if (range->start >= range->stop || range->start >= buffer.used) {
break;
}
- if (found_data & 0x1) {
+ if (fll_flag & ___fll_flag_has_data___) {
state->status = F_status_set_error((range->start >= buffer.used) ? F_okay_eos : F_okay_stop);
}
else {
}
if (state->status == F_fss_found_object) {
- found_data |= 0x1;
+ fll_flag |= ___fll_flag_has_data___;
contents->array[contents->used].used = 0;
if (f_compare_dynamic_partial_string(f_fss_payload_s.string, buffer, f_fss_payload_s.used, objects->array[objects->used]) == F_equal_to) {
}
if (state->status == F_fss_found_object_content_not) {
- found_data |= 0x1;
+ fll_flag |= ___fll_flag_has_data___;
break;
}
} while (state->status == F_fss_found_object_not);
+ // The fl_fss_basic_list_content_read() returns F_okay_eos and F_okay_stop but doesn't increment found.used given that it has no way of knowing.
+ // This function will treat these states as known and declare that this is found content (and therefore found an object).
if (state->status == F_okay_eos || state->status == F_okay_stop) {
++contents->array[contents->used].used;
++objects->used;
++contents->used;
// Returning without a "payload" is an error.
- if (!(found_data & 0x2)) {
+ if (!(fll_flag & ___fll_flag_has_payload___)) {
state->status = F_status_set_error(state->status);
}
if (objects->used > initial_used) {
// Returning without a "payload" is an error.
- if (found_data & 0x2) {
+ if (fll_flag & ___fll_flag_has_payload___) {
state->status = (state->status == F_data_not_eos) ? F_okay_eos : F_okay_stop;
}
else {
}
if (state->status == F_fss_found_object_content_not) {
- found_data |= 0x1;
+ fll_flag |= ___fll_flag_has_data___;
status = f_memory_array_increase(state->step_small, sizeof(f_range_t), (void **) &contents->array[contents->used].array, &contents->array[contents->used].used, &contents->array[contents->used].size);
}
// Returning without a "payload" is an error.
- if (found_data & 0x2) {
+ if (fll_flag & ___fll_flag_has_payload___) {
state->status = (range->start >= buffer.used) ? F_okay_eos : F_okay_stop;
}
else {
} while (range->start < F_string_t_size_d);
+ #undef ___fll_flag_has_data___
+ #undef ___fll_flag_has_payload___
+
state->status = F_status_is_error(F_number_overflow);
}
#endif // _di_fll_fss_payload_read_