}
#endif // _di_iki_read_process_buffer_
+#ifndef _di_iki_read_process_buffer_at_
+ f_status_t iki_read_process_buffer_at(iki_read_data_t * const data, const f_iki_data_t iki_data, const iki_read_substitution_t replacement, const iki_read_substitution_t wrap, const iki_read_substitutions_t substitutions, const iki_read_substitutions_t reassignments, const f_number_unsigned_t index, f_string_dynamic_t * const expand) {
+
+ if (!data) return F_status_set_error(F_parameter);
+
+ const f_number_unsigned_t original = expand->used;
+
+ if (index >= iki_data.vocabulary.used) return F_data_not;
+
+ f_number_unsigned_t i = reassignments.used;
+ f_string_range_t range = f_string_range_t_initialize;
+ f_status_t status = F_none;
+
+ if (reassignments.used && (data->main->parameters.array[iki_read_parameter_content_e].result == f_console_result_found_e || data->main->parameters.array[iki_read_parameter_literal_e].result == f_console_result_found_e)) {
+ if (reassignments.used) {
+ i = reassignments.used - 1;
+ }
+ }
+
+ if (i < reassignments.used) {
+ if (data->main->parameters.array[iki_read_parameter_content_e].result == f_console_result_found_e) {
+ status = f_string_dynamic_append_nulless(reassignments.array[i].with, expand);
+ }
+ else {
+ range.start = iki_data.variable.array[index].start;
+ range.stop = iki_data.content.array[index].start - 1;
+
+ status = f_string_dynamic_partial_append_nulless(data->buffer, range, expand);
+
+ if (F_status_is_error_not(status)) {
+ status = f_string_dynamic_append_nulless(reassignments.array[i].with, expand);
+ }
+
+ if (F_status_is_error_not(status)) {
+ range.start = iki_data.content.array[index].stop + 1;
+ range.stop = iki_data.variable.array[index].stop;
+
+ status = f_string_dynamic_partial_append_nulless(data->buffer, range, expand);
+ }
+ }
+ }
+ else {
+ i = substitutions.used;
+
+ if (substitutions.used && (data->main->parameters.array[iki_read_parameter_content_e].result == f_console_result_found_e || data->main->parameters.array[iki_read_parameter_literal_e].result == f_console_result_found_e )) {
+ if (substitutions.used) {
+ i = substitutions.used - 1;
+ }
+ }
+
+ if (i < substitutions.used) {
+ if (data->main->parameters.array[iki_read_parameter_content_e].result == f_console_result_found_e && wrap.replace.used) {
+ status = f_string_dynamic_append_nulless(wrap.replace, expand);
+
+ if (F_status_is_error_not(status)) {
+ status = f_string_dynamic_append_nulless(substitutions.array[i].with, expand);
+ }
+
+ if (F_status_is_error_not(status) && wrap.with.used) {
+ status = f_string_dynamic_append_nulless(wrap.with, expand);
+ }
+ }
+ else {
+ range.start = iki_data.variable.array[index].start;
+ range.stop = iki_data.content.array[index].start - 1;
+
+ status = f_string_dynamic_partial_append_nulless(data->buffer, range, expand);
+
+ if (F_status_is_error_not(status) && wrap.replace.used) {
+ status = f_string_dynamic_append_nulless(wrap.replace, expand);
+ }
+
+ if (F_status_is_error_not(status)) {
+ status = f_string_dynamic_append_nulless(substitutions.array[i].with, expand);
+ }
+
+ if (F_status_is_error_not(status) && wrap.with.used) {
+ status = f_string_dynamic_append_nulless(wrap.with, expand);
+ }
+
+ if (F_status_is_error_not(status)) {
+ range.start = iki_data.content.array[index].stop + 1;
+ range.stop = iki_data.variable.array[index].stop;
+
+ status = f_string_dynamic_partial_append_nulless(data->buffer, range, expand);
+ }
+ }
+ }
+ else if (replacement.replace.used) {
+ if (data->main->parameters.array[iki_read_parameter_content_e].result == f_console_result_found_e && wrap.replace.used) {
+ status = f_string_dynamic_append_nulless(wrap.replace, expand);
+
+ if (F_status_is_error_not(status) && replacement.with.used) {
+ status = f_string_dynamic_append_nulless(replacement.with, expand);
+ }
+
+ if (F_status_is_error_not(status) && wrap.with.used) {
+ status = f_string_dynamic_append_nulless(wrap.with, expand);
+ }
+ }
+ else if (data->main->parameters.array[iki_read_parameter_object_e].result == f_console_result_found_e) {
+ status = f_string_dynamic_append_nulless(replacement.replace, expand);
+ }
+ else {
+ range.start = iki_data.variable.array[index].start;
+ range.stop = iki_data.content.array[index].start - 1;
+
+ status = f_string_dynamic_partial_append_nulless(data->buffer, range, expand);
+
+ if (F_status_is_error_not(status) && wrap.replace.used) {
+ status = f_string_dynamic_append_nulless(wrap.replace, expand);
+ }
+
+ if (F_status_is_error_not(status)) {
+ status = f_string_dynamic_append_nulless(replacement.with, expand);
+ }
+
+ if (F_status_is_error_not(status) && wrap.with.used) {
+ status = f_string_dynamic_append_nulless(wrap.with, expand);
+ }
+
+ if (F_status_is_error_not(status)) {
+ range.start = iki_data.content.array[index].stop + 1;
+ range.stop = iki_data.variable.array[index].stop;
+
+ status = f_string_dynamic_partial_append_nulless(data->buffer, range, expand);
+ }
+ }
+ }
+ else if (data->main->parameters.array[iki_read_parameter_content_e].result == f_console_result_found_e) {
+ if (wrap.replace.used) {
+ status = f_string_dynamic_append_nulless(wrap.replace, expand);
+ }
+
+ if (F_status_is_error_not(status)) {
+ status = f_string_dynamic_partial_append_nulless(data->buffer, iki_data.content.array[index], expand);
+ }
+
+ if (F_status_is_error_not(status) && wrap.with.used) {
+ status = f_string_dynamic_append_nulless(wrap.with, expand);
+ }
+ }
+ else if (data->main->parameters.array[iki_read_parameter_object_e].result == f_console_result_found_e) {
+ status = f_string_dynamic_partial_append_nulless(data->buffer, iki_data.vocabulary.array[index], expand);
+ }
+ else {
+ range.start = iki_data.variable.array[index].start;
+ range.stop = iki_data.content.array[index].start - 1;
+
+ status = f_string_dynamic_partial_append_nulless(data->buffer, range, expand);
+
+ if (F_status_is_error_not(status) && wrap.replace.used) {
+ status = f_string_dynamic_append_nulless(wrap.replace, expand);
+ }
+
+ if (F_status_is_error_not(status)) {
+ status = f_string_dynamic_partial_append_nulless(data->buffer, iki_data.content.array[index], expand);
+ }
+
+ if (F_status_is_error_not(status) && wrap.with.used) {
+ status = f_string_dynamic_append_nulless(wrap.with, expand);
+ }
+
+ if (F_status_is_error_not(status)) {
+ range.start = iki_data.content.array[index].stop + 1;
+ range.stop = iki_data.variable.array[index].stop;
+
+ status = f_string_dynamic_partial_append_nulless(data->buffer, range, expand);
+ }
+ }
+ }
+
+ if (F_status_is_error(status)) return status;
+
+ return expand->used == original ? F_data_not : F_none;
+ }
+#endif // _di_iki_read_process_buffer_at_
+
#ifndef _di_iki_read_process_buffer_ranges_
f_status_t iki_read_process_buffer_ranges(iki_read_data_t * const data, f_string_range_t *buffer_range, f_iki_data_t *iki_data, f_string_ranges_t *ranges) {
return status;
}
- if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e && data->main->parameters.array[iki_read_parameter_name_e].result == f_console_result_none_e) {
- fll_print_format(
- "%ul%r",
- data->main->output.to.stream,
- (data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_additional_e)
- ? data->at < iki_data->variable.used ? 1 : 0
- : iki_data->variable.used,
- f_string_eol_s
- );
+ // When --at and --line are specified, the only value for --line that will print anything is 0 when using --object.
+ if (data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_additional_e && data->main->parameters.array[iki_read_parameter_line_e].result == f_console_result_additional_e) {
+ if (data->mode == iki_read_mode_object_e && data->line) {
+ if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
+ fll_print_format("0%r", data->main->output.to.stream, f_string_eol_s);
+ }
- return F_none;
+ return F_data_not;
+ }
}
f_array_length_t i = 0;
data->buffer.string[iki_data->delimits.array[i]] = f_iki_syntax_placeholder_s.string[0];
} // for
- const bool content_only = data->mode == iki_read_mode_content_e;
- bool unmatched = F_true;
-
iki_read_substitution_t replacements[iki_data->variable.used];
iki_read_substitution_t wraps[iki_data->variable.used];
iki_read_substitutions_t reassignments[iki_data->variable.used];
memset(reassignments, 0, sizeof(iki_read_substitutions_t) * iki_data->variable.used);
memset(substitutionss, 0, sizeof(iki_read_substitutions_t) * iki_data->variable.used);
- if (data->mode == iki_read_mode_literal_e || (data->mode == iki_read_mode_content_e && data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_none_e)) {
+ if (data->mode == iki_read_mode_literal_e || data->mode == iki_read_mode_content_e) {
status = iki_read_replacements_identify(data, &iki_data->vocabulary, replacements);
if (F_status_is_error(status)) {
}
}
+ const bool content_only = data->mode == iki_read_mode_content_e;
+ f_string_dynamic_t expand = f_string_dynamic_t_initialize;
+
if (data->main->parameters.array[iki_read_parameter_name_e].result == f_console_result_additional_e) {
f_string_dynamic_t name = f_string_dynamic_t_initialize;
-
f_array_length_t index = 0;
f_array_length_t j = 0;
f_array_length_t matches = 0;
+ uint8_t matched = 0x0; // 0x0 = unmatched, 0x1 = matched.
+ uint8_t errors = 0x0; // 0x0 = dynamic append, 0x1 = process buffer at.
buffer_range->start = 0;
- for (i = 0; i < data->main->parameters.array[iki_read_parameter_name_e].values.used; ++i) {
+ if (data->main->parameters.array[iki_read_parameter_name_e].values.used) {
+
+ // Only the last name parameter is valid for use.
+ i = data->main->parameters.array[iki_read_parameter_name_e].values.used - 1;
index = data->main->parameters.array[iki_read_parameter_name_e].values.array[i];
name.used = 0;
status = f_string_dynamic_append_nulless(data->argv[index], &name);
- if (F_status_is_error(status)) {
- fll_error_print(data->main->error, F_status_set_fine(status), "f_string_dynamic_append_nulless", F_true);
+ if (F_status_is_error_not(status)) {
+ buffer_range->stop = name.used - 1;
- for (j = 0; j < iki_data->variable.used; ++j) {
- macro_iki_read_substitutions_t_delete_simple(reassignments[j]);
- } // for
-
- for (j = 0; j < iki_data->variable.used; ++j) {
- macro_iki_read_substitutions_t_delete_simple(substitutionss[j]);
- } // for
+ for (j = 0; j < iki_data->vocabulary.used; ++j) {
- f_string_dynamic_resize(0, &name);
+ status = fl_string_dynamic_partial_compare(name, data->buffer, *buffer_range, iki_data->vocabulary.array[j]);
- return status;
- }
+ if (status == F_equal_to) {
+ matched |= 0x1;
- buffer_range->stop = name.used - 1;
+ if (data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_additional_e) {
+ if (matches < data->at) {
+ matches++;
- flockfile(data->main->output.to.stream);
+ continue;
+ }
- for (j = 0; j < iki_data->vocabulary.used; ++j) {
+ if (matches++ > data->at) break;
+ }
- // The variable parts, when not using --wrap, each is represented on its own line.
- if (data->main->parameters.array[iki_read_parameter_line_e].result == f_console_result_additional_e) {
- if (j < data->line) continue;
- if (j > data->line) break;
- }
+ if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
+ if (data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_none_e) {
+ ++matches;
+ }
- status = fl_string_dynamic_partial_compare(name, data->buffer, *buffer_range, iki_data->vocabulary.array[j]);
+ if (data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_additional_e || data->main->parameters.array[iki_read_parameter_line_e].result == f_console_result_additional_e) {
+ status = iki_read_process_buffer_at(data, *iki_data, replacements[j], wraps[j], substitutionss[j], reassignments[j], j, &expand);
- if (status == F_equal_to) {
- unmatched = F_false;
+ if (F_status_is_error(status)) {
+ errors = 0x1;
- if (data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_additional_e) {
- if (matches++ != data->at) continue;
- }
+ break;
+ }
- if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
- if (data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_none_e) {
- ++matches;
+ status = f_string_dynamic_append_nulless(f_string_eol_s, &expand);
+ if (F_status_is_error(status)) break;
+ }
}
- }
- else {
- if (replacements[j].replace.used || wraps[j].replace.used || wraps[j].with.used || substitutionss[j].used || reassignments[j].used) {
- iki_read_substitutions_print(data, *iki_data, *ranges, replacements[j], wraps[j], substitutionss[j], reassignments[j], j, content_only);
+ else if (data->main->parameters.array[iki_read_parameter_line_e].result == f_console_result_additional_e) {
+ status = iki_read_process_buffer_at(data, *iki_data, replacements[j], wraps[j], substitutionss[j], reassignments[j], j, &expand);
+
+ if (F_status_is_error(status)) {
+ errors = 0x1;
+
+ break;
+ }
+
+ status = f_string_dynamic_append_nulless(f_string_eol_s, &expand);
+ if (F_status_is_error(status)) break;
}
else {
- f_print_dynamic_partial(data->buffer, ranges->array[j], data->main->output.to.stream);
- }
+ flockfile(data->main->output.to.stream);
+
+ if (replacements[j].replace.used || wraps[j].replace.used || wraps[j].with.used || substitutionss[j].used || reassignments[j].used) {
+ iki_read_substitutions_print(data, *iki_data, *ranges, replacements[j], wraps[j], substitutionss[j], reassignments[j], j, content_only);
+ }
+ else {
+ f_print_dynamic_partial(data->buffer, ranges->array[j], data->main->output.to.stream);
+ }
+
+ f_print_dynamic_raw(f_string_eol_s, data->main->output.to.stream);
- f_print_dynamic_raw(f_string_eol_s, data->main->output.to.stream);
+ funlockfile(data->main->output.to.stream);
+ }
}
- }
- } // for
+ } // for
+ }
- funlockfile(data->main->output.to.stream);
- } // for
+ if (F_status_is_error(status)) {
+ fll_error_print(data->main->error, F_status_set_fine(status), errors ? "iki_read_process_buffer_at" : "f_string_dynamic_append_nulless", F_true);
- if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
- fll_print_format(
- "%ul%r",
- data->main->output.to.stream,
- data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_additional_e
- ? data->at < matches ? 1 : 0
- : matches,
- f_string_eol_s
- );
- }
+ for (j = 0; j < iki_data->variable.used; ++j) {
+ macro_iki_read_substitutions_t_delete_simple(reassignments[j]);
+ } // for
- f_string_dynamic_resize(0, &name);
+ for (j = 0; j < iki_data->variable.used; ++j) {
+ macro_iki_read_substitutions_t_delete_simple(substitutionss[j]);
+ } // for
+
+ f_string_dynamic_resize(0, &name);
+ f_string_dynamic_resize(0, &expand);
+
+ return status;
+ }
+ }
- if (unmatched) {
- status = F_data_not;
+ if (data->main->parameters.array[iki_read_parameter_line_e].result == f_console_result_additional_e) {
+ if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
+ iki_read_line_total_expand_print(data, &data->main->output, expand);
+ }
+ else {
+ iki_read_line_print(data, &data->main->output, expand);
+ }
}
- else {
- status = F_none;
+ else if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
+ if (data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_additional_e) {
+ iki_read_line_total_expand_print(data, &data->main->output, expand);
+ }
+ else {
+ fll_print_format("%ul%r", data->main->output.to.stream, matches, f_string_eol_s);
+ }
}
+
+ f_string_dynamic_resize(0, &name);
+
+ status = matched ? F_none : F_data_not;
}
else if (ranges->used) {
f_array_length_t line = 0;
if (data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_additional_e) {
+ if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
+ if (data->mode != iki_read_mode_object_e || data->main->parameters.array[iki_read_parameter_line_e].result == f_console_result_additional_e) {
+ if (data->at < iki_data->variable.used) {
+ status = iki_read_process_buffer_at(data, *iki_data, replacements[data->at], wraps[data->at], substitutionss[data->at], reassignments[data->at], data->at, &expand);
+ }
+ else {
+ status = F_status_set_error(F_parameter);
+ }
+
+ if (F_status_is_error(status)) {
+ fll_error_print(data->main->error, F_status_set_fine(status), "iki_read_process_buffer_at", F_true);
+ }
+ else {
+ status = f_string_dynamic_append_nulless(f_string_eol_s, &expand);
+
+ if (F_status_is_error(status)) {
+ fll_error_print(data->main->error, F_status_set_fine(status), "f_string_dynamic_append_nulless", F_true);
+ }
+ else {
+ status = iki_read_line_total_expand_print(data, &data->main->output, expand);
+
+ if (F_status_is_error(status)) {
+ fll_error_print(data->main->error, F_status_set_fine(status), "iki_read_process_buffer_at", F_true);
+ }
+ }
+ }
+ }
+ else {
+ fll_print_format("1%r", data->main->output.to.stream, f_string_eol_s);
+ }
+ }
// The --line is processed after the --at and so any value greater than 0 should produce no results.
- if (data->at < ranges->used && (data->main->parameters.array[iki_read_parameter_line_e].result != f_console_result_additional_e || data->line == 0)) {
+ else if (data->at < ranges->used && (data->main->parameters.array[iki_read_parameter_line_e].result != f_console_result_additional_e || data->line == 0)) {
flockfile(data->main->output.to.stream);
if (replacements[data->at].replace.used || wraps[data->at].replace.used || wraps[data->at].with.used || substitutionss[data->at].used || reassignments[data->at].used) {
status = F_data_not;
}
}
+ else if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
+ if (data->mode == iki_read_mode_object_e) {
+ fll_print_format(
+ "%ul%r",
+ data->main->output.to.stream,
+ (data->main->parameters.array[iki_read_parameter_line_e].result == f_console_result_additional_e)
+ ? data->line < iki_data->variable.used ? 1 : 0
+ : iki_data->variable.used,
+ f_string_eol_s
+ );
+ }
+ else {
+ for (i = 0; i < ranges->used; ++i) {
+
+ if (!((++data->main->signal_check) % iki_read_signal_check_d)) {
+ if (fll_program_standard_signal_received(data->main)) {
+ iki_read_print_signal_received(data);
+
+ status = F_status_set_error(F_interrupt);
+
+ break;
+ }
+
+ data->main->signal_check = 0;
+ }
+
+ status = iki_read_process_buffer_at(data, *iki_data, replacements[i], wraps[i], substitutionss[i], reassignments[i], i, &expand);
+
+ if (F_status_is_error(status)) {
+ fll_error_print(data->main->error, F_status_set_fine(status), "iki_read_process_buffer_at", F_true);
+
+ break;
+ }
+
+ status = f_string_dynamic_append_nulless(f_string_eol_s, &expand);
+
+ if (F_status_is_error(status)) {
+ fll_error_print(data->main->error, F_status_set_fine(status), "f_string_dynamic_append_nulless", F_true);
+
+ break;
+ }
+ } // for
+
+ if (F_status_is_error_not(status)) {
+ status = iki_read_line_total_expand_print(data, &data->main->output, expand);
+
+ if (F_status_is_error(status)) {
+ fll_error_print(data->main->error, F_status_set_fine(status), "iki_read_process_buffer_at", F_true);
+ }
+ }
+ }
+ }
else {
flockfile(data->main->output.to.stream);
for (i = 0; i < ranges->used; ++i) {
+ if (!((++data->main->signal_check) % iki_read_signal_check_d)) {
+ if (fll_program_standard_signal_received(data->main)) {
+ funlockfile(data->main->output.to.stream);
+
+ iki_read_print_signal_received(data);
+
+ status = F_status_set_error(F_interrupt);
+
+ break;
+ }
+
+ data->main->signal_check = 0;
+ }
+
// The variable parts, when not using --wrap, each is represented on its own line.
if (data->main->parameters.array[iki_read_parameter_line_e].result == f_console_result_additional_e) {
if (i < data->line) continue;
status = F_data_not;
}
+ f_string_dynamic_resize(0, &expand);
+
for (i = 0; i < iki_data->variable.used; ++i) {
macro_iki_read_substitutions_t_delete_simple(reassignments[i]);
} // for