Fix several problems with the status code processing, namely missing or incomplete data.
Add status code max size defines.
Add missing "#ifndef _di_f_status_codes_" to status codes.
Update cases where 'error' was not renamed to 'code' in status code sources.
Add missing status codes.
Fix incorrect define, "#ifdef _di_fl_status_invalid_" should instead be "#ifndef _di_fl_status_invalid_".
Fix incorrect sizes associated with status code output strings.
Prepare pipe support (not yet implemented).
Ensure f_utf is included and linked in all appriopriate dependencies.
Treat f_utf as a core level_0 project and update documentation accodingly.
Relocate fl_console_parameter_process() into f_console_parameter_process().
- f_status: provides status codes and other status codes to be used by the entire set of FLL projects.
- f_memory: provides common memory allocation/deallocation to be used by the entire set of FLL projects.
- f_string: provides common string management to be used by the entire set of the FLL projects.
+- f_utf: provides common UTF-8 related string management to be used by the entire set of the FLL projects.
-The above projects should be installed first, and in the provided order (f_type, then f_status, then f_memory, and finally f_string).
-No other level_0 project should depend on another and can be installed in any order (future designs may add f_utf to this list).
+The above projects should be installed first, and in the provided order (f_type, then f_status, then f_memory, f_string, and finally f_utf).
+No other level_0 project should depend on another and can be installed in any order.
See: data/build/dependencies for specific dependencies of this project.
}
#endif // _di_f_console_identify_
+#ifndef _di_f_console_parameter_process_
+ f_return_status f_console_parameter_process(const f_console_arguments arguments, f_console_parameters parameters, f_string_lengths *remaining) {
+ #ifndef _di_level_0_parameter_checking_
+ if (remaining == 0) return f_status_set_error(f_invalid_parameter);
+ #endif // _di_level_0_parameter_checking_
+
+ f_status status = f_none;
+ f_console_id result = 0;
+ bool found = f_false;
+
+ unsigned long location = 1; // Parameter 0 represents the program name so skip it.
+ f_string_length sub_location = 0;
+ f_string_length increment_by = 0;
+ f_string_length string_length = 0;
+ f_array_length parameter_counter = 0;
+
+ unsigned short console_short = f_console_none;
+ unsigned short console_long = f_console_none;
+ unsigned short console_type = f_console_type_normal;
+
+ f_string_lengths needs_additional = f_string_lengths_initialize;
+
+ unsigned short width = 0;
+
+ // loop through and read all parameters.
+ while (location < arguments.argc) {
+ f_console_identify(arguments.argv[location], &result);
+
+ string_length = strnlen(arguments.argv[location], f_console_max_size);
+
+ // process the current parameter.
+ if (result == f_console_short_enable || result == f_console_short_disable) {
+ increment_by = 1;
+ sub_location = 1;
+ }
+ else if (result == f_console_long_enable || result == f_console_long_disable) {
+ increment_by = string_length;
+ sub_location = 2;
+ }
+ else {
+ increment_by = string_length;
+ sub_location = 0;
+ }
+
+ // Handle the normal commands.
+ if (result == f_console_short_enable || result == f_console_long_enable) {
+ console_short = f_console_short_enable;
+ console_long = f_console_long_enable;
+ console_type = f_console_type_normal;
+ }
+ else if (result == f_console_short_disable || result == f_console_long_disable) {
+ console_short = f_console_short_disable;
+ console_long = f_console_long_disable;
+ console_type = f_console_type_inverse;
+ }
+ else {
+ console_short = f_console_none;
+ }
+
+ // Additional parameters must always follow what requests them.
+ if (needs_additional.used > 0) {
+ parameter_counter = needs_additional.array[0];
+
+ if (parameters.parameter[parameter_counter].additional.used >= parameters.parameter[parameter_counter].additional.size) {
+ f_status allocation_status = f_none;
+
+ f_macro_string_lengths_resize(allocation_status, parameters.parameter[parameter_counter].additional, parameters.parameter[parameter_counter].additional.size + f_console_default_allocation_step);
+
+ if (f_status_is_error(allocation_status)) {
+ f_macro_string_lengths_delete(status, needs_additional);
+ return f_status_set_error(allocation_status);
+ }
+ }
+
+ parameters.parameter[parameter_counter].result = f_console_result_additional;
+ parameters.parameter[parameter_counter].additional.array[parameters.parameter[parameter_counter].additional.used] = location;
+ parameters.parameter[parameter_counter].additional.used++;
+
+ needs_additional.used--;
+
+ // Pop the matched parameter off of the top of the needs_additional array.
+ for (f_string_length i = 0; i < needs_additional.used; i++) {
+ needs_additional.array[i] = needs_additional.array[i + 1];
+ } // for
+ }
+ else if (console_short != f_console_none) {
+ // The sub_location is used on a per increment basis (such as 'tar -xcf', the '-' would have an increment of 1, therefore x, c, and f would all be three separate parameters).
+ while (sub_location < string_length) {
+ for (parameter_counter = 0; parameter_counter < parameters.used; parameter_counter++) {
+ if (parameters.parameter[parameter_counter].type != console_type) {
+ continue;
+ }
+
+ if (result == console_short) {
+ if (parameters.parameter[parameter_counter].symbol_short == 0) {
+ continue;
+ }
+
+ width = f_macro_utf_byte_width_is(arguments.argv[location][sub_location]);
+ if (width > 0) {
+ increment_by = width;
+ }
+
+ if (arguments.argv[location][sub_location] != *parameters.parameter[parameter_counter].symbol_short) {
+ continue;
+ }
+
+ if (width > 0) {
+ f_utf_character character_argument_utf = 0;
+ f_utf_character character_console_utf = 0;
+
+ unsigned short max_width = string_length - sub_location;
+
+ status = f_utf_char_to_character(arguments.argv[location] + sub_location, max_width, &character_argument_utf);
+
+ if (status != f_none) {
+ f_macro_string_lengths_delete(status, needs_additional);
+ return status;
+ }
+
+ max_width = strlen(parameters.parameter[parameter_counter].symbol_short);
+
+ status = f_utf_char_to_character((f_string) parameters.parameter[parameter_counter].symbol_short, max_width, &character_console_utf);
+
+ if (status != f_none) {
+ f_macro_string_lengths_delete(status, needs_additional);
+ return status;
+ }
+
+ if (character_argument_utf != character_console_utf) {
+ continue;
+ }
+ }
+ }
+ else if (result == console_long) {
+ if (parameters.parameter[parameter_counter].symbol_long == 0) {
+ continue;
+ }
+
+ if (strncmp(&arguments.argv[location][sub_location], parameters.parameter[parameter_counter].symbol_long, increment_by + 1) != 0) {
+ continue;
+ }
+ }
+ else {
+ continue;
+ }
+
+ if (parameters.parameter[parameter_counter].locations.used >= parameters.parameter[parameter_counter].locations.size) {
+ f_status allocation_status = f_none;
+
+ f_macro_string_lengths_resize(allocation_status, parameters.parameter[parameter_counter].locations, parameters.parameter[parameter_counter].locations.size + f_console_default_allocation_step);
+
+ if (f_status_is_error(allocation_status)) {
+ f_macro_string_lengths_delete(status, needs_additional);
+ return f_status_set_error(allocation_status);
+ }
+ }
+
+ parameters.parameter[parameter_counter].locations.array[parameters.parameter[parameter_counter].locations.used] = location;
+ parameters.parameter[parameter_counter].locations.used++;
+
+ parameters.parameter[parameter_counter].result = f_console_result_found;
+ parameters.parameter[parameter_counter].location = location;
+ parameters.parameter[parameter_counter].location_sub = 0;
+ parameters.parameter[parameter_counter].total++;
+
+ if (result == console_short) {
+ parameters.parameter[parameter_counter].location_sub = sub_location;
+ }
+
+ if (parameters.parameter[parameter_counter].has_additional) {
+ if (needs_additional.used + parameters.parameter[parameter_counter].has_additional > needs_additional.size) {
+ f_status allocation_status = f_none;
+
+ f_macro_string_lengths_resize(allocation_status, needs_additional, needs_additional.used + parameters.parameter[parameter_counter].has_additional);
+
+ if (f_status_is_error(allocation_status)) {
+ f_macro_string_lengths_delete(status, needs_additional);
+ return f_status_set_error(allocation_status);
+ }
+ }
+
+ for (f_array_length additional = 0; additional < parameters.parameter[parameter_counter].has_additional; additional++) {
+ needs_additional.array[needs_additional.used] = parameter_counter;
+ needs_additional.used++;
+ } // for
+ }
+
+ break;
+ } // for
+
+ sub_location += increment_by;
+ } // while
+ }
+ else {
+ found = f_false;
+
+ for (parameter_counter = 0; parameter_counter < parameters.used; parameter_counter++) {
+ if (parameters.parameter[parameter_counter].type != f_console_type_other) {
+ continue;
+ }
+
+ if (parameters.parameter[parameter_counter].symbol_other == 0) {
+ continue;
+ }
+
+ if (strncmp(arguments.argv[location], parameters.parameter[parameter_counter].symbol_other, string_length + 1) != 0) {
+ continue;
+ }
+
+ if (parameters.parameter[parameter_counter].locations.used >= parameters.parameter[parameter_counter].locations.size) {
+ f_status allocation_status = f_none;
+
+ f_macro_string_lengths_resize(allocation_status, parameters.parameter[parameter_counter].locations, parameters.parameter[parameter_counter].locations.size + f_console_default_allocation_step);
+
+ if (f_status_is_error(allocation_status)) {
+ f_macro_string_lengths_delete(status, needs_additional);
+ return f_status_set_error(allocation_status);
+ }
+ }
+
+ parameters.parameter[parameter_counter].locations.array[parameters.parameter[parameter_counter].locations.used] = location;
+ parameters.parameter[parameter_counter].locations.used++;
+
+ parameters.parameter[parameter_counter].result = f_console_result_found;
+ parameters.parameter[parameter_counter].location = location;
+ parameters.parameter[parameter_counter].location_sub = 0;
+ parameters.parameter[parameter_counter].total++;
+
+ if (parameters.parameter[parameter_counter].has_additional) {
+ if (needs_additional.used + parameters.parameter[parameter_counter].has_additional > needs_additional.size) {
+ f_status allocation_status = f_none;
+
+ f_macro_string_lengths_resize(allocation_status, needs_additional, needs_additional.used + parameters.parameter[parameter_counter].has_additional);
+
+ if (f_status_is_error(allocation_status)) {
+ f_macro_string_lengths_delete(status, needs_additional);
+ return f_status_set_error(allocation_status);
+ }
+ }
+
+ for (f_array_length additional = 0; additional < parameters.parameter[parameter_counter].has_additional; additional++) {
+ needs_additional.array[needs_additional.used] = parameter_counter;
+ needs_additional.used++;
+ } // for
+ }
+
+ found = f_true;
+ break;
+ } // for
+
+ if (!found) {
+ // populate list of remaining parameters.parameter not associated with anything.
+ if (remaining->used >= remaining->size) {
+ f_status allocation_status = f_none;
+
+ f_macro_string_lengths_resize(allocation_status, (*remaining), remaining->size + f_console_default_allocation_step);
+
+ if (f_status_is_error(allocation_status)) {
+ f_macro_string_lengths_delete(status, needs_additional);
+ return f_status_set_error(allocation_status);
+ }
+ }
+
+ remaining->array[remaining->used] = location;
+ remaining->used++;
+ }
+ }
+
+ location++;
+ } // while
+
+ if (needs_additional.used > 0) {
+ status = f_no_data;
+ }
+ else {
+ status = f_none;
+ }
+
+ {
+ f_status allocation_status = f_none;
+ f_macro_string_lengths_delete(allocation_status, needs_additional);
+ }
+
+ return status;
+ }
+#endif // _di_f_console_parameter_process_
+
+#ifndef _di_f_console_parameter_prioritize_
+ f_return_status f_console_parameter_prioritize(const f_console_parameters parameters, const f_console_parameter_ids choices, f_console_parameter_id *decision) {
+ #ifndef _di_level_0_parameter_checking_
+ if (decision == 0) return f_status_set_error(f_invalid_parameter);
+ if (parameters.used == 0) return f_status_set_error(f_invalid_parameter);
+ if (choices.id == 0) return f_status_set_error(f_invalid_parameter);
+ if (choices.used == 0) return f_status_set_error(f_invalid_parameter);
+ #endif // _di_level_0_parameter_checking_
+
+ f_array_length location = 0;
+ f_array_length location_sub = 0;
+ f_console_parameter_id priority = 0;
+
+ for (f_array_length i = 0; i < choices.used; i++) {
+ if (choices.id[i] > parameters.used) return f_status_set_error(f_invalid_parameter);
+
+ if (parameters.parameter[choices.id[i]].result == f_console_result_found) {
+ if (parameters.parameter[choices.id[i]].location > location) {
+ location = parameters.parameter[choices.id[i]].location;
+ location_sub = parameters.parameter[choices.id[i]].location_sub;
+ priority = choices.id[i];
+ }
+ else if (parameters.parameter[choices.id[i]].location == location && parameters.parameter[choices.id[i]].location_sub > location_sub) {
+ location_sub = parameters.parameter[choices.id[i]].location_sub;
+ priority = choices.id[i];
+ }
+ }
+ } // for
+
+ // The first parameter location (argc = 0) is the program name, therefore if the location is 0, then no matches were found.
+ if (location == 0) {
+ return f_no_data;
+ }
+
+ *decision = priority;
+
+ return f_none;
+ }
+#endif // _di_f_console_parameter_prioritize_
+
#ifdef __cplusplus
} // extern "C"
#endif
#include <level_0/status.h>
#include <level_0/type.h>
#include <level_0/string.h>
+#include <level_0/utf.h>
#ifdef __cplusplus
extern "C" {
extern f_return_status f_console_identify(const f_string input, f_console_id *result);
#endif // _di_f_console_identify_
+/**
+ * Process console parameters.
+ *
+ * Short parameters are processed as follows:
+ * - Begin with either '-' or '+'.
+ * - "Empty" parameters are allow, such that '-' or '+' are valid parameters.
+ * - Are one character long.
+ * - May be grouped as a single parameter, such as "tar -xcf" and "tar -x -c -f" are equivalent.
+ * - Additional parameters must immediately follow the parameter or grouped parameters, such as "tar -xfc file.tar.gz" or "tar -x -f file.tar.gz -c".
+ *
+ * Long parameters are processed as follows:
+ * - Begin with either '--' or '++'.
+ * - "Empty" parameters are allow, such that '--' or '++' are valid parameters.
+ * - Are any length long so long as it is less than f_console_max_size.
+ * - May not be grouped and must be separated from any subsequent parameter, such as: "tar --extract --create --file".
+ * - Additional parameters must immediately follow the parameter, such as "tar --extract --file file.tar.gz --create".
+ *
+ * Other parameters are processed as follows:
+ * - Anything that does not begin with '-', '+', '--', or '++'.
+ * - Are any length long so long as it is less than f_console_max_size.
+ * - May not be grouped and must be separated from any subsequent parameter, such as: "tar extract create file".
+ * - Additional parameters must immediately follow the parameter, such as "tar extract file file.tar.gz create".
+ *
+ * @param arguments
+ * The parameters passed to the process.
+ * @param parameters
+ * The console parameters to look for.
+ * This will be updated by this function with the results.
+ * @param remaining
+ * A list of remaining parameters not associated with anything.
+ *
+ * @return
+ * f_none on success.
+ * f_no_data if "additional" parameters were expected but not found.
+ * f_failure (with error bit) if width is not long enough to convert when processing arguments as UTF-8.
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ * f_invalid_utf (with error bit) if character is an invalid UTF-8 character, when processing arguments.
+ * f_reallocation_error (with error bit) on memory reallocation error.
+ */
+#ifndef _di_f_console_parameter_process_
+ extern f_return_status f_console_parameter_process(const f_console_arguments arguments, f_console_parameters parameters, f_string_lengths *remaining);
+#endif // _di_f_console_parameter_process_
+
+/**
+ * Given a set of parameter choices, determine which one has the highest priority.
+ *
+ * The priority is determined by viewing the parameters from left to right.
+ * The right-most parameter defined in the set has the priority over others.
+ *
+ * For example, the color context modes override each other, so only one gets priority.
+ * If given, say "+l ++no_color +d", the "+d" would be the right-most parameter "+l" and "++no_color".
+ * The decision would be "+d".
+ *
+ * This also applies to short parameters combined into one, such as "+lnd", the "d" would again be the decision.
+ *
+ * @param parameters
+ * The parameters to process.
+ * @param choices
+ * An array of numeric ids, each representing a parameter within the parameters variable.
+ * The order does not matter.
+ * @param decision
+ * The resulting decision.
+ * If none of the parameters are found, then this will not be updated (therefore it is safe to have it pre-initialized to the default).
+ *
+ * @return
+ * f_none on success.
+ * f_no_data if no parameters were found.
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_f_console_parameter_prioritize__
+ extern f_return_status f_console_parameter_prioritize(const f_console_parameters parameters, const f_console_parameter_ids choices, f_console_parameter_id *decision);
+#endif // _di_f_console_parameter_prioritize__
+
#ifdef __cplusplus
} // extern "C"
#endif
f_status
f_memory
f_string
+f_utf
build_compiler gcc
build_linker ar
-build_libraries -lc
-build_libraries_fll -lf_memory
+build_libraries -lc
+build_libraries_fll -lf_utf -lf_memory
build_sources_library console.c
-build_sources_program
+build_sources_program
build_sources_headers console.h
build_sources_bash
build_sources_settings
#define f_status_set_signal(status) (status | f_status_bit_signal)
#define f_status_set_warning(status) (status | f_status_bit_warning)
- // use f_status_set_fine to remove the error, warning, and signal bits
+ // Use f_status_set_fine to remove the error, warning, and signal bits.
#define f_status_set_fine(status) (status & f_status_mask_fine)
+
+ // Maximum size of the status code.
+ #define f_status_size_max 0x3fff
+ #define f_status_size_max_with_signal 0x10000
#endif // _di_f_status_masks_
/**
*
* The code f_status_code_last is intended to be used as the starting point for anything extending this and povided its own status codes.
*/
-enum {
- #ifndef _di_f_status_booleans_
- f_false = 0,
- f_true,
- #endif // _di_f_status_booleans_
+#ifndef _di_f_status_codes_
+ enum {
+ #ifndef _di_f_status_booleans_
+ f_false = 0,
+ f_true,
+ #endif // _di_f_status_booleans_
- #ifndef _di_f_status_signals_
- f_signal_hangup = 1,
- f_signal_interrupt,
- f_signal_quit,
- f_signal_illegal,
- f_signal_trap,
- f_signal_abort,
- f_signal_bus_error,
- f_signal_floating_point_exception,
- f_signal_kill, // unblockable
- f_signal_user_1,
- f_signal_segmentation_fault,
- f_signal_user_2,
- f_signal_broken_pipe,
- f_signal_alarm_clock,
- f_signal_termination,
- f_signal_stack_fault,
- f_signal_child,
- f_signal_continue,
- f_signal_stop, // unblockable
- f_signal_keyboard_stop,
- f_signal_tty_in,
- f_signal_tty_out,
- f_signal_urgent,
- f_signal_cpu_limit,
- f_signal_file_size_limit,
- f_signal_virtual_alarm_clock,
- f_signal_profile_alarm_clock,
- f_signal_window_size_change,
- f_signal_pollable_event,
- f_signal_power_failure,
- f_signal_bad_system_call,
- f_signal_reserved_32,
- f_signal_reserved_33,
- f_signal_reserved_34,
- f_signal_reserved_35,
- f_signal_reserved_36,
- f_signal_reserved_37,
- f_signal_reserved_38,
- f_signal_reserved_39,
- f_signal_reserved_40,
- f_signal_reserved_41,
- f_signal_reserved_42,
- f_signal_reserved_43,
- f_signal_reserved_44,
- f_signal_reserved_45,
- f_signal_reserved_46,
- f_signal_reserved_47,
- f_signal_reserved_48,
- f_signal_reserved_49,
- f_signal_reserved_50,
- f_signal_reserved_51,
- f_signal_reserved_52,
- f_signal_reserved_53,
- f_signal_reserved_54,
- f_signal_reserved_55,
- f_signal_reserved_56,
- f_signal_reserved_57,
- f_signal_reserved_58,
- f_signal_reserved_59,
- f_signal_reserved_60,
- f_signal_reserved_61,
- f_signal_reserved_62,
- f_signal_reserved_63,
- f_signal_reserved_64,
- #endif // _di_f_status_signals_
+ #ifndef _di_f_status_signals_
+ f_signal_hangup = 1,
+ f_signal_interrupt,
+ f_signal_quit,
+ f_signal_illegal,
+ f_signal_trap,
+ f_signal_abort,
+ f_signal_bus_error,
+ f_signal_floating_point_exception,
+ f_signal_kill, // unblockable
+ f_signal_user_1,
+ f_signal_segmentation_fault,
+ f_signal_user_2,
+ f_signal_broken_pipe,
+ f_signal_alarm_clock,
+ f_signal_termination,
+ f_signal_stack_fault,
+ f_signal_child,
+ f_signal_continue,
+ f_signal_stop, // unblockable
+ f_signal_keyboard_stop,
+ f_signal_tty_in,
+ f_signal_tty_out,
+ f_signal_urgent,
+ f_signal_cpu_limit,
+ f_signal_file_size_limit,
+ f_signal_virtual_alarm_clock,
+ f_signal_profile_alarm_clock,
+ f_signal_window_size_change,
+ f_signal_pollable_event,
+ f_signal_power_failure,
+ f_signal_bad_system_call,
+ f_signal_reserved_32,
+ f_signal_reserved_33,
+ f_signal_reserved_34,
+ f_signal_reserved_35,
+ f_signal_reserved_36,
+ f_signal_reserved_37,
+ f_signal_reserved_38,
+ f_signal_reserved_39,
+ f_signal_reserved_40,
+ f_signal_reserved_41,
+ f_signal_reserved_42,
+ f_signal_reserved_43,
+ f_signal_reserved_44,
+ f_signal_reserved_45,
+ f_signal_reserved_46,
+ f_signal_reserved_47,
+ f_signal_reserved_48,
+ f_signal_reserved_49,
+ f_signal_reserved_50,
+ f_signal_reserved_51,
+ f_signal_reserved_52,
+ f_signal_reserved_53,
+ f_signal_reserved_54,
+ f_signal_reserved_55,
+ f_signal_reserved_56,
+ f_signal_reserved_57,
+ f_signal_reserved_58,
+ f_signal_reserved_59,
+ f_signal_reserved_60,
+ f_signal_reserved_61,
+ f_signal_reserved_62,
+ f_signal_reserved_63,
+ f_signal_reserved_64,
+ #endif // _di_f_status_signals_
- #ifndef _di_f_status_basic_
- f_none = 197, // start at 197 to allow compatibility with the reserved bash return codes (keep in mind fss return codes can be larger than 255).
- f_maybe,
- f_dummy, // to only be used as a placeholder
- f_warn, // warning
- f_critical,
- f_unknown, // For the "code should never get here" errors. (this is an EMERGENCY error)
- f_unsupported,
- f_no_data, // warning
- f_out_of_memory,
- f_input_error,
- f_output_error,
- f_input_output_error,
- f_does_not_exist,
- f_not_connected,
- f_failure,
- f_interrupted, // usually by a signal.
- f_loop, // such as infinite recursion.
- f_incomplete, // incomplete information
- #endif // _di_f_status_basic_
+ #ifndef _di_f_status_basic_
+ f_none = 197, // Start at 197 to allow compatibility with the reserved bash return codes (keep in mind fss return codes can be larger than 255).
+ f_maybe,
+ f_dummy, // To only be used as a placeholder.
+ f_warn, // Warning.
+ f_critical,
+ f_unknown, // For the "code should never get here" errors. (this is an EMERGENCY error).
+ f_unsupported,
+ f_no_data, // Warning.
+ f_out_of_memory,
+ f_input_error,
+ f_output_error,
+ f_input_output_error,
+ f_does_not_exist,
+ f_not_connected,
+ f_failure,
+ f_interrupted, // Usually by a signal.
+ f_loop, // Such as infinite recursion.
+ f_incomplete, // Incomplete information.
+ #endif // _di_f_status_basic_
- #ifndef _di_f_status_invalid_
- f_invalid,
- f_invalid_name,
- f_invalid_parameter,
- f_invalid_syntax,
- f_invalid_data,
- f_invalid_file,
- f_invalid_directory,
- f_invalid_descriptor,
- f_invalid_socket,
- f_invalid_device,
- f_invalid_link,
- f_invalid_pipe,
- f_invalid_address,
- f_invalid_port,
- f_invalid_value, // similar to f_invalid_parameter, but the parameter value is invalid (example: an integer value representing aboolean and having a 3 as a value).
- f_invalid_buffer,
- f_invalid_process,
- f_invalid_utf,
- f_invalid_on_eof,
- f_invalid_on_eol,
- f_invalid_on_eos,
- f_invalid_on_stop,
- #endif // _di_f_status_invalid_
+ #ifndef _di_f_status_invalid_
+ f_invalid,
+ f_invalid_name,
+ f_invalid_parameter,
+ f_invalid_syntax,
+ f_invalid_data,
+ f_invalid_file,
+ f_invalid_directory,
+ f_invalid_descriptor,
+ f_invalid_socket,
+ f_invalid_device,
+ f_invalid_link,
+ f_invalid_pipe,
+ f_invalid_address,
+ f_invalid_port,
+ f_invalid_value,
+ f_invalid_buffer,
+ f_invalid_process,
+ f_invalid_utf,
+ f_invalid_on_eof,
+ f_invalid_on_eol,
+ f_invalid_on_eos,
+ f_invalid_on_stop,
+ #endif // _di_f_status_invalid_
- #ifndef _di_f_status_busy_
- f_busy, // such as address in use, or port in use.
- f_busy_address,
- f_busy_port,
- f_busy_socket,
- f_busy_device,
- f_busy_pipe,
- f_busy_buffer,
- f_busy_process,
- #endif // _di_f_status_busy_
+ #ifndef _di_f_status_busy_
+ f_busy,
+ f_busy_address,
+ f_busy_port,
+ f_busy_socket,
+ f_busy_device,
+ f_busy_pipe,
+ f_busy_buffer,
+ f_busy_process,
+ #endif // _di_f_status_busy_
- #ifndef _di_f_status_unavailable_
- f_unavailable,
- f_unavailable_address,
- f_unavailable_port,
- f_unavailable_socket,
- f_unavailable_device,
- f_unavailable_pipe,
- f_unavailable_buffer,
- f_unavailable_process,
- #endif // _di_f_status_unavailable_
+ #ifndef _di_f_status_unavailable_
+ f_unavailable,
+ f_unavailable_address,
+ f_unavailable_port,
+ f_unavailable_socket,
+ f_unavailable_device,
+ f_unavailable_pipe,
+ f_unavailable_buffer,
+ f_unavailable_process,
+ #endif // _di_f_status_unavailable_
- #ifndef _di_f_status_digits_
- f_underflow,
- f_overflow,
- f_divide_by_zero,
- f_negative_number,
- f_positive_number,
- f_zero_number,
- f_decimal_number,
- f_invalid_number,
- #endif // _di_f_status_digits_
+ #ifndef _di_f_status_digits_
+ f_underflow,
+ f_overflow,
+ f_divide_by_zero,
+ f_negative_number,
+ f_positive_number,
+ f_zero_number,
+ f_decimal_number,
+ f_whole_number,
+ f_invalid_number,
+ #endif // _di_f_status_digits_
- #ifndef _di_f_status_buffers_
- f_no_data_on_eof, // warning
- f_no_data_on_eol, // warning
- f_no_data_on_eos, // warning
- f_no_data_on_stop, // warning
- f_none_on_eof, // warning
- f_none_on_eol, // warning
- f_none_on_eos, // warning
- f_none_on_stop, // "stop" location was reached
- f_error_on_eof,
- f_error_on_eol,
- f_error_on_eos,
- f_error_on_stop,
- f_buffer_too_small,
- f_buffer_too_large,
- f_string_too_small,
- f_string_too_large,
- f_unterminated_nest,
- f_unterminated_nest_on_eof,
- f_unterminated_nest_on_eol,
- f_unterminated_nest_on_eos,
- f_unterminated_nest_on_stop,
- f_unterminated_group,
- f_unterminated_group_on_eof,
- f_unterminated_group_on_eol,
- f_unterminated_group_on_eos,
- f_unterminated_group_on_stop,
- f_incomplete_utf,
- f_incomplete_utf_on_eof,
- f_incomplete_utf_on_eol,
- f_incomplete_utf_on_eos,
- f_incomplete_utf_on_stop,
- #endif // _di_f_status_buffers_
+ #ifndef _di_f_status_buffers_
+ f_no_data_on_eof,
+ f_no_data_on_eol,
+ f_no_data_on_eos,
+ f_no_data_on_stop,
+ f_none_on_eof,
+ f_none_on_eol,
+ f_none_on_eos,
+ f_none_on_stop,
+ f_error_on_eof,
+ f_error_on_eol,
+ f_error_on_eos,
+ f_error_on_stop,
+ f_buffer_too_small,
+ f_buffer_too_large,
+ f_string_too_small,
+ f_string_too_large,
+ f_unterminated_nest,
+ f_unterminated_nest_on_eof,
+ f_unterminated_nest_on_eol,
+ f_unterminated_nest_on_eos,
+ f_unterminated_nest_on_stop,
+ f_unterminated_group,
+ f_unterminated_group_on_eof,
+ f_unterminated_group_on_eol,
+ f_unterminated_group_on_eos,
+ f_unterminated_group_on_stop,
+ f_incomplete_utf,
+ f_incomplete_utf_on_eof,
+ f_incomplete_utf_on_eol,
+ f_incomplete_utf_on_eos,
+ f_incomplete_utf_on_stop,
+ #endif // _di_f_status_buffers_
- #ifndef _di_f_status_allocation_
- f_allocation_error,
- f_reallocation_error,
- #endif // _di_f_status_allocation_
+ #ifndef _di_f_status_allocation_
+ f_allocation_error,
+ f_reallocation_error,
+ f_deallocation_error,
+ #endif // _di_f_status_allocation_
- #ifndef _di_f_status_fork_
- f_fork_failed,
- f_too_many_processes,
- #endif // _di_f_status_fork_
+ #ifndef _di_f_status_fork_
+ f_fork_failed,
+ f_too_many_processes,
+ #endif // _di_f_status_fork_
- #ifndef _di_f_status_file_
- f_file_seek_error,
- f_file_read_error,
- f_file_write_error,
- f_file_flush_error,
- f_file_purge_error,
- f_file_open_error,
- f_file_close_error,
- f_file_synchronize_error,
- f_file_descriptor_error,
- f_file_not_found,
- f_file_found,
- f_file_is_empty,
- f_file_not_open,
- f_file_allocation_error,
- f_file_reallocation_error,
- f_file_stat_error,
- f_file_error,
- f_file_not_utf,
- #endif // _di_f_status_file_
+ #ifndef _di_f_status_file_
+ f_file_seek_error,
+ f_file_read_error,
+ f_file_write_error,
+ f_file_flush_error,
+ f_file_purge_error,
+ f_file_open_error,
+ f_file_close_error,
+ f_file_synchronize_error,
+ f_file_descriptor_error,
+ f_file_not_found,
+ f_file_found,
+ f_file_is_empty,
+ f_file_not_open,
+ f_file_allocation_error,
+ f_file_reallocation_error,
+ f_file_deallocation_error,
+ f_file_stat_error,
+ f_file_error,
+ f_file_not_utf,
+ #endif // _di_f_status_file_
- // most of these are a guess until I get around to researching & implementing linux directory I/O
- #ifndef _di_f_status_directory_
- f_directory_read_error,
- f_directory_write_error,
- f_directory_flush_error,
- f_directory_purge_error,
- f_directory_open_error,
- f_directory_close_error,
- f_directory_synchronize_error,
- f_directory_descriptor_error,
- f_directory_not_found,
- f_directory_is_empty,
- f_directory_not_open,
- f_directory_allocation_error,
- f_directory_reallocation_error,
- f_directory_error,
- f_directory_not_utf,
- #endif // _di_f_status_directory_
+ // Most of these are a guess until I get around to researching & implementing linux directory I/O.
+ #ifndef _di_f_status_directory_
+ f_directory_read_error,
+ f_directory_write_error,
+ f_directory_flush_error,
+ f_directory_purge_error,
+ f_directory_open_error,
+ f_directory_close_error,
+ f_directory_synchronize_error,
+ f_directory_descriptor_error,
+ f_directory_not_found,
+ f_directory_is_empty,
+ f_directory_not_open,
+ f_directory_allocation_error,
+ f_directory_reallocation_error,
+ f_directory_error,
+ f_directory_not_utf,
+ #endif // _di_f_status_directory_
- #ifndef _di_f_status_socket_
- f_socket_connection_client_error,
- f_socket_connection_target_error,
- f_socket_receive_error,
- f_socket_send_error,
- #endif // _di_f_status_socket_
+ #ifndef _di_f_status_socket_
+ f_socket_connection_client_error,
+ f_socket_connection_target_error,
+ f_socket_receive_error,
+ f_socket_send_error,
+ #endif // _di_f_status_socket_
- #ifndef _di_f_status_non_
- f_less_than,
- f_equal_to,
- f_not_equal_to,
- f_greater_than,
- #endif // _di_f_status_non_
+ #ifndef _di_f_status_non_
+ f_less_than,
+ f_equal_to,
+ f_not_equal_to,
+ f_greater_than,
+ #endif // _di_f_status_non_
- #ifndef _di_f_status_access_denied_
- f_access_denied,
- f_access_denied_user,
- f_access_denied_group,
- f_access_denied_world,
- f_access_denied_read,
- f_access_denied_write,
- f_access_denied_execute,
- f_access_denied_super, // not super user (aka: not root).
- #endif // _di_f_status_access_denied_
+ #ifndef _di_f_status_access_denied_
+ f_access_denied,
+ f_access_denied_user,
+ f_access_denied_group,
+ f_access_denied_world,
+ f_access_denied_read,
+ f_access_denied_write,
+ f_access_denied_execute,
+ f_access_denied_super, // Not super user (aka: not root).
+ #endif // _di_f_status_access_denied_
- // required
- f_status_code_last
-}; // enum
+ // Required.
+ f_status_code_last
+ }; // enum
+#endif // _di_f_status_codes_
#ifdef __cplusplus
} // extern "C"
build_linker ar
build_libraries -lc
build_libraries_fll -lf_memory
-build_sources_library
+build_sources_library
build_sources_program
build_sources_headers string.h
build_sources_bash
#ifndef _di_f_type_status_
typedef uint16_t f_status;
- // The c language gives warnings about return types of constants.
- // Remove the const for c, but keep it for c++, which is only for function call declarations & prototypes.
- // Do not declare these for the return data types themselves, instead use f_status; only use these for function prototypes and declarations.
+ /**
+ * The c language gives warnings about return types of constants.
+ * Remove the const for c, but keep it for c++, which is only for function call declarations & prototypes.
+ * Do not declare these for the return data types themselves, instead use f_status; only use these for function prototypes and declarations.
+ */
#ifdef __cplusplus
#define f_return_status const f_status
#else
}
#endif // _fl_console_parameter_to_number_unsigned_
-#ifndef _di_fl_console_parameter_process_
- f_return_status fl_console_parameter_process(const f_console_arguments arguments, f_console_parameters parameters, f_string_lengths *remaining) {
- #ifndef _di_level_1_parameter_checking_
- if (remaining == 0) return f_status_set_error(f_invalid_parameter);
- #endif // _di_level_1_parameter_checking_
-
- f_status status = f_none;
- f_console_id result = 0;
- bool found = f_false;
-
- unsigned long location = 1; // Parameter 0 represents the program name so skip it.
- f_string_length sub_location = 0;
- f_string_length increment_by = 0;
- f_string_length string_length = 0;
- f_array_length parameter_counter = 0;
-
- unsigned short console_short = f_console_none;
- unsigned short console_long = f_console_none;
- unsigned short console_type = f_console_type_normal;
-
- f_string_lengths needs_additional = f_string_lengths_initialize;
-
- unsigned short width = 0;
-
- // loop through and read all parameters.
- while (location < arguments.argc) {
- f_console_identify(arguments.argv[location], &result);
-
- string_length = strnlen(arguments.argv[location], f_console_max_size);
-
- // process the current parameter.
- if (result == f_console_short_enable || result == f_console_short_disable) {
- increment_by = 1;
- sub_location = 1;
- }
- else if (result == f_console_long_enable || result == f_console_long_disable) {
- increment_by = string_length;
- sub_location = 2;
- }
- else {
- increment_by = string_length;
- sub_location = 0;
- }
-
- // Handle the normal commands.
- if (result == f_console_short_enable || result == f_console_long_enable) {
- console_short = f_console_short_enable;
- console_long = f_console_long_enable;
- console_type = f_console_type_normal;
- }
- else if (result == f_console_short_disable || result == f_console_long_disable) {
- console_short = f_console_short_disable;
- console_long = f_console_long_disable;
- console_type = f_console_type_inverse;
- }
- else {
- console_short = f_console_none;
- }
-
- // Additional parameters must always follow what requests them.
- if (needs_additional.used > 0) {
- parameter_counter = needs_additional.array[0];
-
- if (parameters.parameter[parameter_counter].additional.used >= parameters.parameter[parameter_counter].additional.size) {
- f_status allocation_status = f_none;
-
- f_macro_string_lengths_resize(allocation_status, parameters.parameter[parameter_counter].additional, parameters.parameter[parameter_counter].additional.size + f_console_default_allocation_step);
-
- if (f_status_is_error(allocation_status)) {
- f_macro_string_lengths_delete(status, needs_additional);
- return f_status_set_error(allocation_status);
- }
- }
-
- parameters.parameter[parameter_counter].result = f_console_result_additional;
- parameters.parameter[parameter_counter].additional.array[parameters.parameter[parameter_counter].additional.used] = location;
- parameters.parameter[parameter_counter].additional.used++;
-
- needs_additional.used--;
-
- // Pop the matched parameter off of the top of the needs_additional array.
- for (f_string_length i = 0; i < needs_additional.used; i++) {
- needs_additional.array[i] = needs_additional.array[i + 1];
- } // for
- }
- else if (console_short != f_console_none) {
- // The sub_location is used on a per increment basis (such as 'tar -xcf', the '-' would have an increment of 1, therefore x, c, and f would all be three separate parameters).
- while (sub_location < string_length) {
- for (parameter_counter = 0; parameter_counter < parameters.used; parameter_counter++) {
- if (parameters.parameter[parameter_counter].type != console_type) {
- continue;
- }
-
- if (result == console_short) {
- if (parameters.parameter[parameter_counter].symbol_short == 0) {
- continue;
- }
-
- width = f_macro_utf_byte_width_is(arguments.argv[location][sub_location]);
- if (width > 0) {
- increment_by = width;
- }
-
- if (arguments.argv[location][sub_location] != *parameters.parameter[parameter_counter].symbol_short) {
- continue;
- }
-
- if (width > 0) {
- f_utf_character character_argument_utf = 0;
- f_utf_character character_console_utf = 0;
-
- unsigned short max_width = string_length - sub_location;
-
- status = f_utf_char_to_character(arguments.argv[location] + sub_location, max_width, &character_argument_utf);
-
- if (status != f_none) {
- f_macro_string_lengths_delete(status, needs_additional);
- return status;
- }
-
- max_width = strlen(parameters.parameter[parameter_counter].symbol_short);
-
- status = f_utf_char_to_character((f_string) parameters.parameter[parameter_counter].symbol_short, max_width, &character_console_utf);
-
- if (status != f_none) {
- f_macro_string_lengths_delete(status, needs_additional);
- return status;
- }
-
- if (character_argument_utf != character_console_utf) {
- continue;
- }
- }
- }
- else if (result == console_long) {
- if (parameters.parameter[parameter_counter].symbol_long == 0) {
- continue;
- }
-
- if (strncmp(&arguments.argv[location][sub_location], parameters.parameter[parameter_counter].symbol_long, increment_by + 1) != 0) {
- continue;
- }
- }
- else {
- continue;
- }
-
- if (parameters.parameter[parameter_counter].locations.used >= parameters.parameter[parameter_counter].locations.size) {
- f_status allocation_status = f_none;
-
- f_macro_string_lengths_resize(allocation_status, parameters.parameter[parameter_counter].locations, parameters.parameter[parameter_counter].locations.size + f_console_default_allocation_step);
-
- if (f_status_is_error(allocation_status)) {
- f_macro_string_lengths_delete(status, needs_additional);
- return f_status_set_error(allocation_status);
- }
- }
-
- parameters.parameter[parameter_counter].locations.array[parameters.parameter[parameter_counter].locations.used] = location;
- parameters.parameter[parameter_counter].locations.used++;
-
- parameters.parameter[parameter_counter].result = f_console_result_found;
- parameters.parameter[parameter_counter].location = location;
- parameters.parameter[parameter_counter].location_sub = 0;
- parameters.parameter[parameter_counter].total++;
-
- if (result == console_short) {
- parameters.parameter[parameter_counter].location_sub = sub_location;
- }
-
- if (parameters.parameter[parameter_counter].has_additional) {
- if (needs_additional.used + parameters.parameter[parameter_counter].has_additional > needs_additional.size) {
- f_status allocation_status = f_none;
-
- f_macro_string_lengths_resize(allocation_status, needs_additional, needs_additional.used + parameters.parameter[parameter_counter].has_additional);
-
- if (f_status_is_error(allocation_status)) {
- f_macro_string_lengths_delete(status, needs_additional);
- return f_status_set_error(allocation_status);
- }
- }
-
- for (f_array_length additional = 0; additional < parameters.parameter[parameter_counter].has_additional; additional++) {
- needs_additional.array[needs_additional.used] = parameter_counter;
- needs_additional.used++;
- } // for
- }
-
- break;
- } // for
-
- sub_location += increment_by;
- } // while
- }
- else {
- found = f_false;
-
- for (parameter_counter = 0; parameter_counter < parameters.used; parameter_counter++) {
- if (parameters.parameter[parameter_counter].type != f_console_type_other) {
- continue;
- }
-
- if (parameters.parameter[parameter_counter].symbol_other == 0) {
- continue;
- }
-
- if (strncmp(arguments.argv[location], parameters.parameter[parameter_counter].symbol_other, string_length + 1) != 0) {
- continue;
- }
-
- if (parameters.parameter[parameter_counter].locations.used >= parameters.parameter[parameter_counter].locations.size) {
- f_status allocation_status = f_none;
-
- f_macro_string_lengths_resize(allocation_status, parameters.parameter[parameter_counter].locations, parameters.parameter[parameter_counter].locations.size + f_console_default_allocation_step);
-
- if (f_status_is_error(allocation_status)) {
- f_macro_string_lengths_delete(status, needs_additional);
- return f_status_set_error(allocation_status);
- }
- }
-
- parameters.parameter[parameter_counter].locations.array[parameters.parameter[parameter_counter].locations.used] = location;
- parameters.parameter[parameter_counter].locations.used++;
-
- parameters.parameter[parameter_counter].result = f_console_result_found;
- parameters.parameter[parameter_counter].location = location;
- parameters.parameter[parameter_counter].location_sub = 0;
- parameters.parameter[parameter_counter].total++;
-
- if (parameters.parameter[parameter_counter].has_additional) {
- if (needs_additional.used + parameters.parameter[parameter_counter].has_additional > needs_additional.size) {
- f_status allocation_status = f_none;
-
- f_macro_string_lengths_resize(allocation_status, needs_additional, needs_additional.used + parameters.parameter[parameter_counter].has_additional);
-
- if (f_status_is_error(allocation_status)) {
- f_macro_string_lengths_delete(status, needs_additional);
- return f_status_set_error(allocation_status);
- }
- }
-
- for (f_array_length additional = 0; additional < parameters.parameter[parameter_counter].has_additional; additional++) {
- needs_additional.array[needs_additional.used] = parameter_counter;
- needs_additional.used++;
- } // for
- }
-
- found = f_true;
- break;
- } // for
-
- if (!found) {
- // populate list of remaining parameters.parameter not associated with anything.
- if (remaining->used >= remaining->size) {
- f_status allocation_status = f_none;
-
- f_macro_string_lengths_resize(allocation_status, (*remaining), remaining->size + f_console_default_allocation_step);
-
- if (f_status_is_error(allocation_status)) {
- f_macro_string_lengths_delete(status, needs_additional);
- return f_status_set_error(allocation_status);
- }
- }
-
- remaining->array[remaining->used] = location;
- remaining->used++;
- }
- }
-
- location++;
- } // while
-
- if (needs_additional.used > 0) {
- status = f_no_data;
- }
- else {
- status = f_none;
- }
-
- {
- f_status allocation_status = f_none;
- f_macro_string_lengths_delete(allocation_status, needs_additional);
- }
-
- return status;
- }
-#endif // _di_fl_console_parameter_process_
-
-#ifndef _di_fl_console_parameter_prioritize_
- f_return_status fl_console_parameter_prioritize(const f_console_parameters parameters, const f_console_parameter_ids choices, f_console_parameter_id *decision) {
- #ifndef _di_level_1_parameter_checking_
- if (decision == 0) return f_status_set_error(f_invalid_parameter);
- if (parameters.used == 0) return f_status_set_error(f_invalid_parameter);
- if (choices.id == 0) return f_status_set_error(f_invalid_parameter);
- if (choices.used == 0) return f_status_set_error(f_invalid_parameter);
- #endif // _di_level_1_parameter_checking_
-
- f_array_length location = 0;
- f_array_length location_sub = 0;
- f_console_parameter_id priority = 0;
-
- for (f_array_length i = 0; i < choices.used; i++) {
- if (choices.id[i] > parameters.used) return f_status_set_error(f_invalid_parameter);
-
- if (parameters.parameter[choices.id[i]].result == f_console_result_found) {
- if (parameters.parameter[choices.id[i]].location > location) {
- location = parameters.parameter[choices.id[i]].location;
- location_sub = parameters.parameter[choices.id[i]].location_sub;
- priority = choices.id[i];
- }
- else if (parameters.parameter[choices.id[i]].location == location && parameters.parameter[choices.id[i]].location_sub > location_sub) {
- location_sub = parameters.parameter[choices.id[i]].location_sub;
- priority = choices.id[i];
- }
- }
- } // for
-
- // The first parameter location (argc = 0) is the program name, therefore if the location is 0, then no matches were found.
- if (location == 0) {
- return f_no_data;
- }
-
- *decision = priority;
-
- return f_none;
- }
-#endif // _di_fl_console_parameter_prioritize_
-
#ifdef __cplusplus
} // extern "C"
#endif
f_return_status fl_console_parameter_to_number_unsigned(const f_string argument, f_number_unsigned *number);
#endif // _fl_console_parameter_to_number_unsigned_
-/**
- * Process console parameters.
- *
- * Short parameters are processed as follows:
- * - Begin with either '-' or '+'.
- * - "Empty" parameters are allow, such that '-' or '+' are valid parameters.
- * - Are one character long.
- * - May be grouped as a single parameter, such as "tar -xcf" and "tar -x -c -f" are equivalent.
- * - Additional parameters must immediately follow the parameter or grouped parameters, such as "tar -xfc file.tar.gz" or "tar -x -f file.tar.gz -c".
- *
- * Long parameters are processed as follows:
- * - Begin with either '--' or '++'.
- * - "Empty" parameters are allow, such that '--' or '++' are valid parameters.
- * - Are any length long so long as it is less than f_console_max_size.
- * - May not be grouped and must be separated from any subsequent parameter, such as: "tar --extract --create --file".
- * - Additional parameters must immediately follow the parameter, such as "tar --extract --file file.tar.gz --create".
- *
- * Other parameters are processed as follows:
- * - Anything that does not begin with '-', '+', '--', or '++'.
- * - Are any length long so long as it is less than f_console_max_size.
- * - May not be grouped and must be separated from any subsequent parameter, such as: "tar extract create file".
- * - Additional parameters must immediately follow the parameter, such as "tar extract file file.tar.gz create".
- *
- * @param arguments
- * The parameters passed to the process.
- * @param parameters
- * The console parameters to look for.
- * This will be updated by this function with the results.
- * @param remaining
- * A list of remaining parameters not associated with anything.
- *
- * @return
- * f_none on success.
- * f_no_data if "additional" parameters were expected but not found.
- * f_failure (with error bit) if width is not long enough to convert when processing arguments as UTF-8.
- * f_invalid_parameter (with error bit) if a parameter is invalid.
- * f_invalid_utf (with error bit) if character is an invalid UTF-8 character, when processing arguments.
- * f_reallocation_error (with error bit) on memory reallocation error.
- */
-#ifndef _di_fl_console_parameter_process_
- extern f_return_status fl_console_parameter_process(const f_console_arguments arguments, f_console_parameters parameters, f_string_lengths *remaining);
-#endif // _di_fl_console_parameter_process_
-
-/**
- * Given a set of parameter choices, determine which one has the highest priority.
- *
- * The priority is determined by viewing the parameters from left to right.
- * The right-most parameter defined in the set has the priority over others.
- *
- * For example, the color context modes override each other, so only one gets priority.
- * If given, say "+l ++no_color +d", the "+d" would be the right-most parameter "+l" and "++no_color".
- * The decision would be "+d".
- *
- * This also applies to short parameters combined into one, such as "+lnd", the "d" would again be the decision.
- *
- * @param parameters
- * The parameters to process.
- * @param choices
- * An array of numeric ids, each representing a parameter within the parameters variable.
- * The order does not matter.
- * @param decision
- * The resulting decision.
- * If none of the parameters are found, then this will not be updated (therefore it is safe to have it pre-initialized to the default).
- *
- * @return
- * f_none on success.
- * f_no_data if no parameters were found.
- * f_invalid_parameter (with error bit) if a parameter is invalid.
- */
-#ifndef _di_fl_console_parameter_prioritize__
- extern f_return_status fl_console_parameter_prioritize(const f_console_parameters parameters, const f_console_parameter_ids choices, f_console_parameter_id *decision);
-#endif // _di_fl_console_parameter_prioritize__
-
#ifdef __cplusplus
} // extern "C"
#endif
if (string == 0) return f_status_set_error(f_invalid_parameter);
#endif // _di_level_1_parameter_checking_
- f_status umasked_error = f_status_set_fine(code);
+ f_status unmasked_code = f_status_set_fine(code);
- switch (umasked_error) {
+ switch (unmasked_code) {
#ifndef _di_fl_status_booleans_
case f_false:
*string = fl_status_string_false;
break;
#endif // _di_fl_status_basic_
- #ifdef _di_fl_status_invalid_
+ #ifndef _di_fl_status_invalid_
case f_invalid:
*string = fl_status_string_invalid;
break;
case f_decimal_number:
*string = fl_status_string_decimal_number;
break;
+ case f_whole_number:
+ *string = fl_status_string_whole_number;
+ break;
case f_invalid_number:
*string = fl_status_string_invalid_number;
break;
case f_reallocation_error:
*string = fl_status_string_reallocation_error;
break;
+ case f_deallocation_error:
+ *string = fl_status_string_deallocation_error;
+ break;
#endif // _di_fl_status_allocation_
#ifndef _di_fl_status_fork_
case f_file_reallocation_error:
*string = fl_status_string_file_reallocation_error;
break;
+ case f_file_deallocation_error:
+ *string = fl_status_string_file_deallocation_error;
+ break;
case f_file_stat_error:
*string = fl_status_string_file_stat_error;
break;
break;
#endif // _di_fl_status_directory_
+ #ifndef _di_fl_status_socket_
+ case f_socket_connection_client_error:
+ *string = fl_status_string_socket_connection_client_error;
+ break;
+ case f_socket_connection_target_error:
+ *string = fl_status_string_socket_connection_target_error;
+ break;
+ case f_socket_receive_error:
+ *string = fl_status_string_socket_receive_error;
+ break;
+ case f_socket_send_error:
+ *string = fl_status_string_socket_send_error;
+ break;
+ #endif // _di_fl_status_socket_
+
#ifndef _di_fll_error_non_
case f_less_than:
*string = fl_status_string_less_than;
#define fl_status_string_zero_number_length 14
#define fl_status_string_decimal_number "f_decimal_number"
- #define fl_status_string_decimal_number_length 15
+ #define fl_status_string_decimal_number_length 17
+
+ #define fl_status_string_whole_number "f_whole_number"
+ #define fl_status_string_whole_number_length 15
#define fl_status_string_invalid_number "f_invalid_number"
- #define fl_status_string_invalid_number_length 15
+ #define fl_status_string_invalid_number_length 17
#endif // _di_fl_status_digits_
#ifndef _di_fl_status_buffers_
#define fl_status_string_reallocation_error "f_reallocation_error"
#define fl_status_string_reallocation_error_length 21
+
+ #define fl_status_string_deallocation_error "f_deallocation_error"
+ #define fl_status_string_deallocation_error_length 21
#endif // _di_fl_status_allocation_
#ifndef _di_fl_status_fork_
#define fl_status_string_file_reallocation_error "f_file_reallocation_error"
#define fl_status_string_file_reallocation_error_length 26
+ #define fl_status_string_file_deallocation_error "f_file_deallocation_error"
+ #define fl_status_string_file_deallocation_error_length 26
+
#define fl_status_string_file_stat_error "f_file_stat_error"
#define fl_status_string_file_stat_error_length 18
extern "C" {
#endif
+#ifndef _di_fl_string_compare_
+ f_return_status fl_string_compare(const f_string string1, const f_string string2, const f_string_length length1, const f_string_length length2) {
+ #ifndef _di_level_1_parameter_checking_
+ if (length1 <= 0) return f_status_set_error(f_invalid_parameter);
+ if (length2 <= 0) return f_status_set_error(f_invalid_parameter);
+ #endif // _di_level_1_parameter_checking_
+
+ f_string_length i1 = 0;
+ f_string_length i2 = 0;
+
+ for (; i1 < length1 && i2 < length2; i1++, i2++) {
+ // skip past newlines in string1.
+ while (i1 < length1 && string1[i1] == f_string_eos) i1++;
+ if (i1 == length1) break;
+
+ // skip past newlines in string2.
+ while (i2 < length2 && string2[i2] == f_string_eos) i2++;
+ if (i2 == length2) break;
+
+ if (string1[i1] != string2[i2]) return f_not_equal_to;
+ } // for
+
+ // only return f_equal_to if all remaining characters are NULL.
+ while (i1 < length1) {
+ if (string1[i1] != f_string_eos) return f_not_equal_to;
+ i1++;
+ } // while
+
+ while (i2 < length2) {
+ if (string2[i2] != f_string_eos) return f_not_equal_to;
+ i2++;
+ } // while
+
+ return f_equal_to;
+ }
+#endif // _di_fl_string_compare_
+
+#ifndef _di_f_string_dynamics_compare_
+ f_return_status f_string_dynamics_compare(const f_string_dynamic string1, const f_string_dynamic string2) {
+ #ifndef _di_level_1_parameter_checking_
+ if (string1.used <= 0) return f_status_set_error(f_invalid_parameter);
+ if (string2.used <= 0) return f_status_set_error(f_invalid_parameter);
+ #endif // _di_level_1_parameter_checking_
+
+ f_string_length i1 = 0;
+ f_string_length i2 = 0;
+
+ for (; i1 < string1.used && i2 < string2.used; i1++, i2++) {
+ // skip past newlines in string1.
+ while (i1 < string1.used && string1.string[i1] == f_string_eos) i1++;
+ if (i1 == string1.used) break;
+
+ // skip past newlines in string2.
+ while (i2 < string2.used && string2.string[i2] == f_string_eos) i2++;
+ if (i2 == string2.used) break;
+
+ if (string1.string[i1] != string2.string[i2]) return f_not_equal_to;
+ } // for
+
+ // only return f_equal_to if all remaining characters are NULL.
+ while (i1 < string1.used) {
+ if (string1.string[i1] != f_string_eos) return f_not_equal_to;
+ i1++;
+ } // while
+
+ while (i2 < string2.used) {
+ if (string2.string[i2] != f_string_eos) return f_not_equal_to;
+ i2++;
+ } // while
+
+ return f_equal_to;
+ }
+#endif // _di_f_string_dynamics_compare_
+
+#ifndef _di_fl_string_dynamic_partial_compare_
+ f_return_status fl_string_dynamic_partial_compare(const f_string_dynamic string1, const f_string_dynamic string2, const f_string_location offset1, const f_string_location offset2) {
+ #ifndef _di_level_1_parameter_checking_
+ if (string1.used <= 0) return f_status_set_error(f_invalid_parameter);
+ if (string2.used <= 0) return f_status_set_error(f_invalid_parameter);
+
+ if (offset1.start > offset1.stop) return f_status_set_error(f_invalid_parameter);
+ if (offset2.start > offset2.stop) return f_status_set_error(f_invalid_parameter);
+
+ if (string1.used <= offset1.stop) return f_status_set_error(f_invalid_parameter);
+ if (string2.used <= offset2.stop) return f_status_set_error(f_invalid_parameter);
+ #endif // _di_level_1_parameter_checking_
+
+ f_string_length i1 = offset1.start;
+ f_string_length i2 = offset2.start;
+
+ const f_string_length stop1 = offset1.stop + 1;
+ const f_string_length stop2 = offset2.stop + 1;
+
+ for (; i1 < stop1 && i2 < stop2; i1++, i2++) {
+ // skip past newlines in string1.
+ while (i1 < stop1 && string1.string[i1] == f_string_eos) i1++;
+ if (i1 == stop1) break;
+
+ // skip past newlines in string2.
+ while (i2 < stop2 && string2.string[i2] == f_string_eos) i2++;
+ if (i2 == stop2) break;
+
+ if (string1.string[i1] != string2.string[i2]) return f_not_equal_to;
+ } // for
+
+ // only return f_equal_to if all remaining characters are NULL.
+ while (i1 < stop1) {
+ if (string1.string[i1] != f_string_eos) return f_not_equal_to;
+ i1++;
+ } // while
+
+ while (i2 < stop2) {
+ if (string2.string[i2] != f_string_eos) return f_not_equal_to;
+ i2++;
+ } // while
+
+ return f_equal_to;
+ }
+#endif // _di_fl_string_dynamic_partial_compare_
+
#ifndef _di_fl_string_rip_
f_return_status fl_string_rip(const f_string_dynamic buffer, const f_string_location location, f_string_dynamic *result) {
#ifndef _di_level_1_parameter_checking_
if (location.start >= buffer.used) return f_status_set_error(f_invalid_parameter);
#endif // _di_level_1_parameter_checking_
- // the start and stop point are inclusive locations, and therefore start - stop is actually 1 too few locations
+ // The start and stop point are inclusive locations, and therefore start - stop is actually 1 too few locations.
f_string_length size = (location.stop - location.start) + 1;
if (size > 0) {
}
#endif // _di_fl_string_rip_
-#ifndef _di_fl_string_seek_line_until_graph_
- f_return_status fl_string_seek_line_until_graph(const f_string_dynamic buffer, f_string_location *location, const int8_t placeholder) {
+#ifndef _di_fl_string_seek_line_to_
+ f_return_status fl_string_seek_line_to(const f_string_dynamic buffer, f_string_location *location, const int8_t seek_to_this) {
+ #ifndef _di_level_1_parameter_checking_
+ if (location == 0) return f_status_set_error(f_invalid_parameter);
+ if (location->start < 0) return f_status_set_error(f_invalid_parameter);
+ if (location->stop < location->start) return f_status_set_error(f_invalid_parameter);
+ if (buffer.used <= 0) return f_status_set_error(f_invalid_parameter);
+ if (location->start >= buffer.used) return f_status_set_error(f_invalid_parameter);
+ #endif // _di_level_1_parameter_checking_
+
+ while (buffer.string[location->start] != seek_to_this) {
+ if (buffer.string[location->start] == f_string_eol) return f_none_on_eol;
+
+ location->start++;
+
+ if (location->start >= buffer.used) return f_none_on_eos;
+ if (location->start > location->stop) return f_none_on_stop;
+ } // while
+
+ return f_none;
+ }
+#endif // _di_fl_string_seek_line_to_
+
+#ifndef _di_fl_string_seek_line_to_utf_character_
+ f_return_status fl_string_seek_line_to_utf_character(const f_string_dynamic buffer, f_string_location *location, const f_utf_character seek_to_this) {
#ifndef _di_level_1_parameter_checking_
if (location == 0) return f_status_set_error(f_invalid_parameter);
if (location->start < 0) return f_status_set_error(f_invalid_parameter);
if (location->start >= buffer.used) return f_status_set_error(f_invalid_parameter);
#endif // _di_level_1_parameter_checking_
+ const unsigned short seek_width = f_macro_utf_character_width(seek_to_this);
+
f_status status = f_none;
+
unsigned short width = 0;
- f_string_length max_width = (location->stop - location->start) + 1;
+ f_string_length max_width = 0;
- if (max_width > buffer.used - location->start) {
- max_width = buffer.used - location->start;
- }
+ while (location->start < buffer.used) {
+ max_width = (location->stop - location->start) + 1;
- while (buffer.string[location->start] == placeholder || (status = f_utf_is_graph(buffer.string + location->start, max_width)) == f_false) {
- if (f_status_is_error(status)) {
- return status;
+ if (max_width > buffer.used - location->start) {
+ max_width = buffer.used - location->start;
}
- if (buffer.string[location->start] == f_string_eol) return f_none_on_eol;
-
width = f_macro_utf_byte_width_is(buffer.string[location->start]);
if (width == 0) {
width = 1;
+
+ if (buffer.string[location->start] == f_string_eol) return f_none_on_eol;
+
+ if (seek_width == width) {
+ if (buffer.string[location->start] == seek_to_this) return f_none;
+ }
}
// Do not operate on UTF-8 fragments that are not the first byte of the character.
else if (width == 1) {
else {
if (location->start + width >= buffer.used) return f_status_set_error(f_incomplete_utf_on_eos);
if (location->start + width > location->stop) return f_status_set_error(f_incomplete_utf_on_stop);
- }
-
- location->start += width;
- if (location->start >= buffer.used) return f_none_on_eos;
- if (location->start > location->stop) return f_none_on_stop;
+ if (width == seek_width) {
+ f_utf_character character = 0;
+ status = f_utf_char_to_character(buffer.string + location->start, max_width, &character);
- max_width = (location->stop - location->start) + 1;
+ if (f_status_is_error(status)) {
+ return status;
+ }
- if (max_width > buffer.used - location->start) {
- max_width = buffer.used - location->start;
+ if (character == seek_to_this) {
+ return f_none;
+ }
+ }
}
- } // while
- if (f_status_is_error(status)) {
- return status;
- }
+ location->start += width;
- return f_none;
+ if (location->start >= location->stop) return f_none_on_stop;
+ } // while
+
+ return f_none_on_eos;
}
-#endif // _di_fl_string_seek_line_until_graph_
+#endif // _di_fl_string_seek_line_to_utf_character_
-#ifndef _di_fl_string_seek_line_until_non_graph_
- f_return_status fl_string_seek_line_until_non_graph(const f_string_dynamic buffer, f_string_location *location, const int8_t placeholder) {
+#ifndef _di_fl_string_seek_line_until_graph_
+ f_return_status fl_string_seek_line_until_graph(const f_string_dynamic buffer, f_string_location *location, const int8_t placeholder) {
#ifndef _di_level_1_parameter_checking_
if (location == 0) return f_status_set_error(f_invalid_parameter);
if (location->start < 0) return f_status_set_error(f_invalid_parameter);
max_width = buffer.used - location->start;
}
- while (buffer.string[location->start] == placeholder || (status = f_utf_is_whitespace(buffer.string + location->start, max_width)) == f_false) {
+ while (buffer.string[location->start] == placeholder || (status = f_utf_is_graph(buffer.string + location->start, max_width)) == f_false) {
if (f_status_is_error(status)) {
return status;
}
return f_none;
}
-#endif // _di_fl_string_seek_line_until_non_graph_
-
-#ifndef _di_fl_string_seek_line_to_
- f_return_status fl_string_seek_line_to(const f_string_dynamic buffer, f_string_location *location, const int8_t seek_to_this) {
- #ifndef _di_level_1_parameter_checking_
- if (location == 0) return f_status_set_error(f_invalid_parameter);
- if (location->start < 0) return f_status_set_error(f_invalid_parameter);
- if (location->stop < location->start) return f_status_set_error(f_invalid_parameter);
- if (buffer.used <= 0) return f_status_set_error(f_invalid_parameter);
- if (location->start >= buffer.used) return f_status_set_error(f_invalid_parameter);
- #endif // _di_level_1_parameter_checking_
-
- while (buffer.string[location->start] != seek_to_this) {
- if (buffer.string[location->start] == f_string_eol) return f_none_on_eol;
-
- location->start++;
-
- if (location->start >= buffer.used) return f_none_on_eos;
- if (location->start > location->stop) return f_none_on_stop;
- } // while
-
- return f_none;
- }
-#endif // _di_fl_string_seek_line_to_
+#endif // _di_fl_string_seek_line_until_graph_
-#ifndef _di_fl_string_seek_line_to_utf_character_
- f_return_status fl_string_seek_line_to_utf_character(const f_string_dynamic buffer, f_string_location *location, const f_utf_character seek_to_this) {
+#ifndef _di_fl_string_seek_line_until_non_graph_
+ f_return_status fl_string_seek_line_until_non_graph(const f_string_dynamic buffer, f_string_location *location, const int8_t placeholder) {
#ifndef _di_level_1_parameter_checking_
if (location == 0) return f_status_set_error(f_invalid_parameter);
if (location->start < 0) return f_status_set_error(f_invalid_parameter);
if (location->start >= buffer.used) return f_status_set_error(f_invalid_parameter);
#endif // _di_level_1_parameter_checking_
- const unsigned short seek_width = f_macro_utf_character_width(seek_to_this);
-
f_status status = f_none;
-
unsigned short width = 0;
- f_string_length max_width = 0;
+ f_string_length max_width = (location->stop - location->start) + 1;
- while (location->start < buffer.used) {
- max_width = (location->stop - location->start) + 1;
+ if (max_width > buffer.used - location->start) {
+ max_width = buffer.used - location->start;
+ }
- if (max_width > buffer.used - location->start) {
- max_width = buffer.used - location->start;
+ while (buffer.string[location->start] == placeholder || (status = f_utf_is_whitespace(buffer.string + location->start, max_width)) == f_false) {
+ if (f_status_is_error(status)) {
+ return status;
}
+ if (buffer.string[location->start] == f_string_eol) return f_none_on_eol;
+
width = f_macro_utf_byte_width_is(buffer.string[location->start]);
if (width == 0) {
width = 1;
-
- if (buffer.string[location->start] == f_string_eol) return f_none_on_eol;
-
- if (seek_width == width) {
- if (buffer.string[location->start] == seek_to_this) return f_none;
- }
}
// Do not operate on UTF-8 fragments that are not the first byte of the character.
else if (width == 1) {
else {
if (location->start + width >= buffer.used) return f_status_set_error(f_incomplete_utf_on_eos);
if (location->start + width > location->stop) return f_status_set_error(f_incomplete_utf_on_stop);
-
- if (width == seek_width) {
- f_utf_character character = 0;
- status = f_utf_char_to_character(buffer.string + location->start, max_width, &character);
-
- if (f_status_is_error(status)) {
- return status;
- }
-
- if (character == seek_to_this) {
- return f_none;
- }
- }
}
location->start += width;
- if (location->start >= location->stop) return f_none_on_stop;
+ if (location->start >= buffer.used) return f_none_on_eos;
+ if (location->start > location->stop) return f_none_on_stop;
+
+ max_width = (location->stop - location->start) + 1;
+
+ if (max_width > buffer.used - location->start) {
+ max_width = buffer.used - location->start;
+ }
} // while
- return f_none_on_eos;
+ if (f_status_is_error(status)) {
+ return status;
+ }
+
+ return f_none;
}
-#endif // _di_fl_string_seek_line_to_utf_character_
+#endif // _di_fl_string_seek_line_until_non_graph_
#ifndef _di_fl_string_seek_to_
f_return_status fl_string_seek_to(const f_string_dynamic buffer, f_string_location *location, const int8_t seek_to_this) {
}
#endif // _di_fl_string_seek_to_utf_character_
-#ifndef _di_fl_string_compare_
- f_return_status fl_string_compare(const f_string string1, const f_string string2, const f_string_length length1, const f_string_length length2) {
- #ifndef _di_level_1_parameter_checking_
- if (length1 <= 0) return f_status_set_error(f_invalid_parameter);
- if (length2 <= 0) return f_status_set_error(f_invalid_parameter);
- #endif // _di_level_1_parameter_checking_
-
- f_string_length i1 = 0;
- f_string_length i2 = 0;
-
- for (; i1 < length1 && i2 < length2; i1++, i2++) {
- // skip past newlines in string1.
- while (i1 < length1 && string1[i1] == f_string_eos) i1++;
- if (i1 == length1) break;
-
- // skip past newlines in string2.
- while (i2 < length2 && string2[i2] == f_string_eos) i2++;
- if (i2 == length2) break;
-
- if (string1[i1] != string2[i2]) return f_not_equal_to;
- } // for
-
- // only return f_equal_to if all remaining characters are NULL.
- while (i1 < length1) {
- if (string1[i1] != f_string_eos) return f_not_equal_to;
- i1++;
- } // while
-
- while (i2 < length2) {
- if (string2[i2] != f_string_eos) return f_not_equal_to;
- i2++;
- } // while
-
- return f_equal_to;
- }
-#endif // _di_fl_string_compare_
-
-#ifndef _di_fl_string_dynamics_compare_
- f_return_status fl_string_dynamics_compare(const f_string_dynamic string1, const f_string_dynamic string2) {
- #ifndef _di_level_1_parameter_checking_
- if (string1.used <= 0) return f_status_set_error(f_invalid_parameter);
- if (string2.used <= 0) return f_status_set_error(f_invalid_parameter);
- #endif // _di_level_1_parameter_checking_
-
- f_string_length i1 = 0;
- f_string_length i2 = 0;
-
- for (; i1 < string1.used && i2 < string2.used; i1++, i2++) {
- // skip past newlines in string1.
- while (i1 < string1.used && string1.string[i1] == f_string_eos) i1++;
- if (i1 == string1.used) break;
-
- // skip past newlines in string2.
- while (i2 < string2.used && string2.string[i2] == f_string_eos) i2++;
- if (i2 == string2.used) break;
-
- if (string1.string[i1] != string2.string[i2]) return f_not_equal_to;
- } // for
-
- // only return f_equal_to if all remaining characters are NULL.
- while (i1 < string1.used) {
- if (string1.string[i1] != f_string_eos) return f_not_equal_to;
- i1++;
- } // while
-
- while (i2 < string2.used) {
- if (string2.string[i2] != f_string_eos) return f_not_equal_to;
- i2++;
- } // while
-
- return f_equal_to;
- }
-#endif // _di_fl_string_dynamics_compare_
-
-#ifndef _di_fl_string_dynamic_partial_compare_
- f_return_status fl_string_dynamic_partial_compare(const f_string_dynamic string1, const f_string_dynamic string2, const f_string_location offset1, const f_string_location offset2) {
- #ifndef _di_level_1_parameter_checking_
- if (string1.used <= 0) return f_status_set_error(f_invalid_parameter);
- if (string2.used <= 0) return f_status_set_error(f_invalid_parameter);
-
- if (offset1.start > offset1.stop) return f_status_set_error(f_invalid_parameter);
- if (offset2.start > offset2.stop) return f_status_set_error(f_invalid_parameter);
-
- if (string1.used <= offset1.stop) return f_status_set_error(f_invalid_parameter);
- if (string2.used <= offset2.stop) return f_status_set_error(f_invalid_parameter);
- #endif // _di_level_1_parameter_checking_
-
- f_string_length i1 = offset1.start;
- f_string_length i2 = offset2.start;
-
- const f_string_length stop1 = offset1.stop + 1;
- const f_string_length stop2 = offset2.stop + 1;
-
- for (; i1 < stop1 && i2 < stop2; i1++, i2++) {
- // skip past newlines in string1.
- while (i1 < stop1 && string1.string[i1] == f_string_eos) i1++;
- if (i1 == stop1) break;
-
- // skip past newlines in string2.
- while (i2 < stop2 && string2.string[i2] == f_string_eos) i2++;
- if (i2 == stop2) break;
-
- if (string1.string[i1] != string2.string[i2]) return f_not_equal_to;
- } // for
-
- // only return f_equal_to if all remaining characters are NULL.
- while (i1 < stop1) {
- if (string1.string[i1] != f_string_eos) return f_not_equal_to;
- i1++;
- } // while
-
- while (i2 < stop2) {
- if (string2.string[i2] != f_string_eos) return f_not_equal_to;
- i2++;
- } // while
-
- return f_equal_to;
- }
-#endif // _di_fl_string_dynamic_partial_compare_
-
#ifdef __cplusplus
} // extern "C"
#endif
#endif
/**
+ * Compare two strings, similar to strncmp().
+ *
+ * This does not stop on NULL.
+ * NULL characters are ignored.
+ *
+ * @param string1
+ * String to compare.
+ * @param string2
+ * String to compare.
+ * @param length1
+ * Length of string1.
+ * @param length2
+ * Length of string2.
+ *
+ * @return
+ * f_equal_to when both strings equal.
+ * f_not_equal_to when both strings do not equal.
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ *
+ * @see f_string_dynamics_compare()
+ * @see fl_string_dynamic_partial_compare()
+ */
+#ifndef _di_fl_string_compare_
+ extern f_return_status fl_string_compare(const f_string string1, const f_string string2, const f_string_length length1, const f_string_length length2);
+#endif // _di_fl_string_compare_
+
+/**
+ * Compare two strings, similar to strncmp().
+ *
+ * This does not stop on NULL.
+ * NULL characters are ignored.
+ *
+ * @param string1
+ * String to compare.
+ * @param string2
+ * String to compare.
+ *
+ * @return
+ * f_equal_to when both strings equal.
+ * f_not_equal_to when both strings do not equal.
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ *
+ * @see fl_string_compare()
+ * @see fl_string_dynamic_partial_compare()
+ */
+#ifndef _di_f_string_dynamics_compare_
+ extern f_return_status f_string_dynamics_compare(const f_string_dynamic string1, const f_string_dynamic string2);
+#endif // _di_f_string_dynamics_compare_
+
+/**
+ * Compare two strings, similar to strncmp(), but restricted to the given ranges.
+ *
+ * This does not stop on NULL.
+ * NULL characters are ignored.
+ *
+ * @param string1
+ * String to compare.
+ * @param string2
+ * String to compare.
+ * @param offset1
+ * A range within the string1 to restrict the comparison to.
+ * @param offset2
+ * A range within the string2 to restrict the comparison to.
+ *
+ * @return
+ * f_equal_to when both strings equal.
+ * f_not_equal_to when both strings do not equal.
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ *
+ * @see fl_string_compare()
+ * @see f_string_dynamics_compare()
+ */
+#ifndef _di_fl_string_dynamic_partial_compare_
+ extern f_return_status fl_string_dynamic_partial_compare(const f_string_dynamic string1, const f_string_dynamic string2, const f_string_location offset1, const f_string_location offset2);
+#endif // _di_fl_string_dynamic_partial_compare_
+
+/**
* Allocated a new string from the provided range in the buffer.
*
* @param buffer
#endif // _di_fl_string_rip_
/**
- * Increment buffer location until a graph character (including UTF-8) or an EOL is matched.
+ * Seek the buffer location forward until the character (1-byte wide) or EOL is reached.
*
* @param buffer
* The buffer to traverse.
* @param location
* A range within the buffer representing the start and stop locations.
- * @param placeholder
- * A single-width character representing a placeholder to ignore (may be NULL).
+ * The start location will be incremented by seek.
+ * @param seek_to_this
+ * A single-width character representing a character to seek to.
*
* @return
* f_none on success.
* f_none_on_eol on success, but stopped at EOL.
* f_none_on_eos on success, but stopped at end of buffer.
- * f_incomplete_utf (with error bit) if character is an incomplete UTF-8 fragment.
- * f_incomplete_utf_on_stop (with error bit) if the stop location is reached before the complete UTF-8 character can be processed.
- * f_incomplete_utf_on_eos (with error bit) if end of string is reached before a complete UTF-8 character can be processed.
+ * f_none_on_stop on success, but stopped stop location.
* f_invalid_parameter (with error bit) if a parameter is invalid.
- * f_allocation_error (with error bit) on memory allocation error.
- * f_reallocation_error (with error bit) on memory reallocation error.
+ *
+ * @see fl_string_seek_line_to_utf_character()
*/
-#ifndef _di_fl_string_seek_line_until_graph_
- extern f_return_status fl_string_seek_line_until_graph(const f_string_dynamic buffer, f_string_location *location, const int8_t placeholder);
-#endif // _di_fl_string_seek_line_until_graph_
+#ifndef _di_fl_string_seek_line_to_
+ extern f_return_status fl_string_seek_line_to(const f_string_dynamic buffer, f_string_location *location, const int8_t seek_to_this);
+#endif // _di_fl_string_seek_line_to_
/**
- * Increment buffer location until a non-graph character (including UTF-8) or an EOL is matched.
+ * Seek the buffer location forward until the character (up to 4-byte wide) or EOL is reached.
*
* @param buffer
* The buffer to traverse.
* @param location
* A range within the buffer representing the start and stop locations.
- * @param placeholder
- * A single-width character representing a placeholder to ignore (may be NULL).
+ * The start location will be incremented by seek.
+ * @param seek_to_this
+ * A 1-width, 2-width, 3-width, or 4-width character representing a character to seek to.
*
* @return
* f_none on success.
* f_none_on_eol on success, but stopped at EOL.
* f_none_on_eos on success, but stopped at end of buffer.
- * f_none_on_stop on success, but stopped stop location.
+ * f_invalid_utf (with error bit) if character is an invalid UTF-8 character.
* f_incomplete_utf (with error bit) if character is an incomplete UTF-8 fragment.
* f_incomplete_utf_on_stop (with error bit) if the stop location is reached before the complete UTF-8 character can be processed.
* f_incomplete_utf_on_eos (with error bit) if end of string is reached before a complete UTF-8 character can be processed.
* f_invalid_parameter (with error bit) if a parameter is invalid.
- * f_allocation_error (with error bit) on memory allocation error.
- * f_reallocation_error (with error bit) on memory reallocation error.
+ *
+ * @see fl_string_seek_line_to()
*/
-#ifndef _di_fl_string_seek_line_until_non_graph_
- extern f_return_status fl_string_seek_line_until_non_graph(const f_string_dynamic buffer, f_string_location *location, const int8_t placeholder);
-#endif // _di_fl_string_seek_line_until_non_graph_
+#ifndef _di_fl_string_seek_line_to_utf_character_
+ extern f_return_status fl_string_seek_line_to_utf_character(const f_string_dynamic buffer, f_string_location *location, const f_utf_character seek_to_this);
+#endif // _di_fl_string_seek_line_to_utf_character_
/**
- * Seek the buffer location forward until the character (1-byte wide) or EOL is reached.
+ * Increment buffer location until a graph character (including UTF-8) or an EOL is matched.
*
* @param buffer
* The buffer to traverse.
* @param location
* A range within the buffer representing the start and stop locations.
- * The start location will be incremented by seek.
- * @param seek_to_this
- * A single-width character representing a character to seek to.
+ * @param placeholder
+ * A single-width character representing a placeholder to ignore (may be NULL).
*
* @return
* f_none on success.
* f_none_on_eol on success, but stopped at EOL.
* f_none_on_eos on success, but stopped at end of buffer.
- * f_none_on_stop on success, but stopped stop location.
+ * f_incomplete_utf (with error bit) if character is an incomplete UTF-8 fragment.
+ * f_incomplete_utf_on_stop (with error bit) if the stop location is reached before the complete UTF-8 character can be processed.
+ * f_incomplete_utf_on_eos (with error bit) if end of string is reached before a complete UTF-8 character can be processed.
* f_invalid_parameter (with error bit) if a parameter is invalid.
- *
- * @see fl_string_seek_line_to_utf_character()
+ * f_allocation_error (with error bit) on memory allocation error.
+ * f_reallocation_error (with error bit) on memory reallocation error.
*/
-#ifndef _di_fl_string_seek_line_to_
- extern f_return_status fl_string_seek_line_to(const f_string_dynamic buffer, f_string_location *location, const int8_t seek_to_this);
-#endif // _di_fl_string_seek_line_to_
+#ifndef _di_fl_string_seek_line_until_graph_
+ extern f_return_status fl_string_seek_line_until_graph(const f_string_dynamic buffer, f_string_location *location, const int8_t placeholder);
+#endif // _di_fl_string_seek_line_until_graph_
/**
- * Seek the buffer location forward until the character (up to 4-byte wide) or EOL is reached.
+ * Increment buffer location until a non-graph character (including UTF-8) or an EOL is matched.
*
* @param buffer
* The buffer to traverse.
* @param location
* A range within the buffer representing the start and stop locations.
- * The start location will be incremented by seek.
- * @param seek_to_this
- * A 1-width, 2-width, 3-width, or 4-width character representing a character to seek to.
+ * @param placeholder
+ * A single-width character representing a placeholder to ignore (may be NULL).
*
* @return
* f_none on success.
* f_none_on_eol on success, but stopped at EOL.
* f_none_on_eos on success, but stopped at end of buffer.
- * f_invalid_utf (with error bit) if character is an invalid UTF-8 character.
+ * f_none_on_stop on success, but stopped stop location.
* f_incomplete_utf (with error bit) if character is an incomplete UTF-8 fragment.
* f_incomplete_utf_on_stop (with error bit) if the stop location is reached before the complete UTF-8 character can be processed.
* f_incomplete_utf_on_eos (with error bit) if end of string is reached before a complete UTF-8 character can be processed.
* f_invalid_parameter (with error bit) if a parameter is invalid.
- *
- * @see fl_string_seek_line_to()
+ * f_allocation_error (with error bit) on memory allocation error.
+ * f_reallocation_error (with error bit) on memory reallocation error.
*/
-#ifndef _di_fl_string_seek_line_to_utf_character_
- extern f_return_status fl_string_seek_line_to_utf_character(const f_string_dynamic buffer, f_string_location *location, const f_utf_character seek_to_this);
-#endif // _di_fl_string_seek_line_to_utf_character_
+#ifndef _di_fl_string_seek_line_until_non_graph_
+ extern f_return_status fl_string_seek_line_until_non_graph(const f_string_dynamic buffer, f_string_location *location, const int8_t placeholder);
+#endif // _di_fl_string_seek_line_until_non_graph_
/**
* Seek the buffer location forward until the character (1-byte wide) is reached.
extern f_return_status fl_string_seek_to_utf_character(const f_string_dynamic buffer, f_string_location *location, const f_utf_character seek_to_this);
#endif // _di_fl_string_seek_to_utf_character_
-/**
- * Compare two strings, similar to strncmp().
- *
- * This does not stop on NULL.
- * NULL characters are ignored.
- *
- * @param string1
- * String to compare.
- * @param string2
- * String to compare.
- * @param length1
- * Length of string1.
- * @param length2
- * Length of string2.
- *
- * @return
- * f_equal_to when both strings equal.
- * f_not_equal_to when both strings do not equal.
- * f_invalid_parameter (with error bit) if a parameter is invalid.
- *
- * @see fl_string_dynamics_compare()
- * @see fl_string_dynamic_partial_compare()
- */
-#ifndef _di_fl_string_compare_
- extern f_return_status fl_string_compare(const f_string string1, const f_string string2, const f_string_length length1, const f_string_length length2);
-#endif // _di_fl_string_compare_
-
-/**
- * Compare two strings, similar to strncmp().
- *
- * This does not stop on NULL.
- * NULL characters are ignored.
- *
- * @param string1
- * String to compare.
- * @param string2
- * String to compare.
- *
- * @return
- * f_equal_to when both strings equal.
- * f_not_equal_to when both strings do not equal.
- * f_invalid_parameter (with error bit) if a parameter is invalid.
- *
- * @see fl_string_compare()
- * @see fl_string_dynamic_partial_compare()
- */
-#ifndef _di_fl_string_dynamics_compare_
- extern f_return_status fl_string_dynamics_compare(const f_string_dynamic string1, const f_string_dynamic string2);
-#endif // _di_fl_string_dynamics_compare_
-
-/**
- * Compare two strings, similar to strncmp(), but restricted to the given ranges.
- *
- * This does not stop on NULL.
- * NULL characters are ignored.
- *
- * @param string1
- * String to compare.
- * @param string2
- * String to compare.
- * @param offset1
- * A range within the string1 to restrict the comparison to.
- * @param offset2
- * A range within the string2 to restrict the comparison to.
- *
- * @return
- * f_equal_to when both strings equal.
- * f_not_equal_to when both strings do not equal.
- * f_invalid_parameter (with error bit) if a parameter is invalid.
- *
- * @see fl_string_compare()
- * @see fl_string_dynamics_compare()
- */
-#ifndef _di_fl_string_dynamic_partial_compare_
- extern f_return_status fl_string_dynamic_partial_compare(const f_string_dynamic string1, const f_string_dynamic string2, const f_string_location offset1, const f_string_location offset2);
-#endif // _di_fl_string_dynamic_partial_compare_
-
#ifdef __cplusplus
} // extern "C"
#endif
#endif
#ifndef _di_fll_fss_status_from_string_
- f_return_status fll_fss_status_from_string(const f_string string, f_status *error) {
+ f_return_status fll_fss_status_from_string(const f_string string, f_status *code) {
#ifndef _di_level_1_parameter_checking_
- if (error == 0) return f_status_set_error(f_invalid_parameter);
+ if (code == 0) return f_status_set_error(f_invalid_parameter);
#endif // _di_level_1_parameter_checking_
f_status status = f_none;
#ifndef _di_fll_fss_status_error_
if (fl_string_compare(string, fll_fss_status_string_invalid_format, length, fll_fss_status_string_invalid_format_length) == f_equal_to) {
- *error = fl_fss_invalid_format;
+ *code = fl_fss_invalid_format;
return f_none;
}
if (fl_string_compare(string, fll_fss_status_string_invalid_format_eos, length, fll_fss_status_string_invalid_format_eos_length) == f_equal_to) {
- *error = fl_fss_invalid_format_eos;
+ *code = fl_fss_invalid_format_eos;
return f_none;
}
#endif // _di_fll_fss_status_error_
#ifndef _di_fll_fss_status_warning_
if (fl_string_compare(string, fll_fss_status_string_no_header, length, fll_fss_status_string_no_header_length) == f_equal_to) {
- *error = fl_fss_no_header;
+ *code = fl_fss_no_header;
return f_none;
}
if (fl_string_compare(string, fll_fss_status_string_accepted_but_invalid, length, fll_fss_status_string_accepted_but_invalid_length) == f_equal_to) {
- *error = fl_fss_accepted_but_invalid;
+ *code = fl_fss_accepted_but_invalid;
return f_none;
}
if (fl_string_compare(string, fll_fss_status_string_no_header_eos, length, fll_fss_status_string_no_header_eos_length) == f_equal_to) {
- *error = fl_fss_no_header_eos;
+ *code = fl_fss_no_header_eos;
return f_none;
}
if (fl_string_compare(string, fll_fss_status_string_accepted_but_invalid_eos, length, fll_fss_status_string_accepted_but_invalid_eos_length) == f_equal_to) {
- *error = fl_fss_accepted_but_invalid_eos;
+ *code = fl_fss_accepted_but_invalid_eos;
return f_none;
}
#endif // _di_fll_fss_status_warning_
#ifndef _di_fll_fss_status_success_
if (fl_string_compare(string, fll_fss_status_string_found_object, length, fll_fss_status_string_found_object_length) == f_equal_to) {
- *error = fl_fss_found_object;
+ *code = fl_fss_found_object;
return f_none;
}
if (fl_string_compare(string, fll_fss_status_string_found_content, length, fll_fss_status_string_found_content_length) == f_equal_to) {
- *error = fl_fss_found_content;
+ *code = fl_fss_found_content;
return f_none;
}
if (fl_string_compare(string, fll_fss_status_string_found_no_object, length, fll_fss_status_string_found_no_object_length) == f_equal_to) {
- *error = fl_fss_found_no_object;
+ *code = fl_fss_found_no_object;
return f_none;
}
if (fl_string_compare(string, fll_fss_status_string_found_no_content, length, fll_fss_status_string_found_no_content_length) == f_equal_to) {
- *error = fl_fss_found_no_content;
+ *code = fl_fss_found_no_content;
return f_none;
}
if (fl_string_compare(string, fll_fss_status_string_found_object_no_content, length, fll_fss_status_string_found_object_no_content_length) == f_equal_to) {
- *error = fl_fss_found_object_no_content;
+ *code = fl_fss_found_object_no_content;
return f_none;
}
#endif // _di_fll_fss_status_success_
#ifndef _di_fll_fss_status_codes_
if (fl_string_compare(string, fll_fss_status_string_found_comment, length, fll_fss_status_string_found_comment_length) == f_equal_to) {
- *error = fl_fss_found_object;
+ *code = fl_fss_found_object;
return f_none;
}
#endif // _di_fll_fss_status_codes_
if (fl_string_compare(string, fll_fss_status_string_status_code_first, length, fll_fss_status_string_status_code_first_length) == f_equal_to) {
- *error = fl_fss_status_code_first;
+ *code = fl_fss_status_code_first;
return f_none;
}
if (fl_string_compare(string, fll_fss_status_string_status_code_last, length, fll_fss_status_string_status_code_last_length) == f_equal_to) {
- *error = fl_fss_status_code_last;
+ *code = fl_fss_status_code_last;
return f_none;
}
#endif // _di_fll_fss_status_from_string_
#ifndef _di_fll_fss_status_to_string_
- f_return_status fll_fss_status_to_string(const f_status error, f_string *string) {
+ f_return_status fll_fss_status_to_string(const f_status code, f_string *string) {
#ifndef _di_level_2_parameter_checking_
if (string == 0) return f_status_set_error(f_invalid_parameter);
#endif // _di_level_2_parameter_checking_
- f_status unmasked_error = f_status_set_fine(error);
+ f_status unmasked_code = f_status_set_fine(code);
- switch (unmasked_error) {
+ switch (unmasked_code) {
#ifndef _di_fll_fss_status_error_
case fl_fss_invalid_format:
*string = fll_fss_status_string_invalid_format;
break;
default:
- return fl_status_to_string(error, string);
+ return fl_status_to_string(code, string);
}
return f_none;
#endif // _di_fll_status_to_string_
#ifndef _di_fll_fss_status_is_error_
- f_return_status fll_fss_status_is_error(const f_status error) {
- if (fll_fss_status_is_fine(error) == f_true) {
+ f_return_status fll_fss_status_is_error(const f_status code) {
+ if (fll_fss_status_is_fine(code) == f_true) {
return f_false;
}
- else if (fll_fss_status_is_warning(error) == f_true) {
+ else if (fll_fss_status_is_warning(code) == f_true) {
return f_false;
}
#endif // _di_fll_fss_status_is_error_
#ifndef _di_fll_fss_status_is_warning_
- f_return_status fll_fss_status_is_warning(const f_status error) {
- switch (error) {
+ f_return_status fll_fss_status_is_warning(const f_status code) {
+ switch (code) {
#ifndef _di_fll_fss_status_basic_
case f_no_data:
return f_true;
#endif // _di_fll_fss_status_is_warning_
#ifndef _di_fll_fss_status_is_fine_
- f_return_status fll_fss_status_is_fine(const f_status error) {
- switch (error) {
+ f_return_status fll_fss_status_is_fine(const f_status code) {
+ switch (code) {
#ifndef _di_fll_fss_status_booleans_
case f_false:
return f_true;
#ifndef _di_fll_fss_status_string_
#ifndef _di_fll_fss_status_error_
- #define fll_fss_status_string_invalid_format "invalid_format"
- #define fll_fss_status_string_invalid_format_length 15
+ #define fll_fss_status_string_invalid_format "fl_fss_invalid_format"
+ #define fll_fss_status_string_invalid_format_length 22
- #define fll_fss_status_string_invalid_format_eos "invalid_format_eos"
- #define fll_fss_status_string_invalid_format_eos_length 19
+ #define fll_fss_status_string_invalid_format_eos "fl_fss_invalid_format_eos"
+ #define fll_fss_status_string_invalid_format_eos_length 26
#endif // _di_fll_fss_status_error_
#ifndef _di_fll_fss_status_warning_
/**
* Convert FSS status codes from their string equivalents to a status code.
*
- * Error, warning, and signal flags will not be assigned to the error.
+ * Error, warning, and signal flags will not be assigned to the code.
*
* This process the string until either a match or NULL is reached.
*
* @param string
- * The error name to process.
- * @param error
- * The error code a matched string represents.
+ * The code name to process.
+ * @param code
+ * The code code a matched string represents.
*
* @return
* f_none on success.
* f_no_data if string is empty.
- * f_invalid_data if not found.
+ * f_invalid_data (with error bit) if not found.
* f_invalid_parameter (with error bit) if a parameter is invalid.
*
* @see fll_status_from_string
*/
#ifndef _di_fll_fss_status_from_string_
- extern f_return_status fll_fss_status_from_string(const f_string string, f_status *error);
+ extern f_return_status fll_fss_status_from_string(const f_string string, f_status *code);
#endif // _di_fll_fss_status_to_string_
#ifndef _di_fll_fss_status_to_string_
/**
- * Convert error codes to their string equivalents.
+ * Convert code codes to their string equivalents.
*/
- extern f_return_status fll_fss_status_to_string(const f_status error, f_string *string);
+ extern f_return_status fll_fss_status_to_string(const f_status code, f_string *string);
#endif // _di_fll_status_to_string_
#ifndef _di_fll_fss_status_is_error_
/**
- * Returns true or false depending on whether the standard context of the error code represents an error.
- * Keep in mind that many of the error codes are context-specific and may be reported as an error here when it is in fact not an error.
+ * Returns true or false depending on whether the standard context of the code code represents an code.
+ * Keep in mind that many of the code codes are context-specific and may be reported as an code here when it is in fact not an code.
*/
- extern f_return_status fll_fss_status_is_error(const f_status error);
+ extern f_return_status fll_fss_status_is_error(const f_status code);
#endif // _di_fll_fss_status_is_error_
#ifndef _di_fll_fss_status_is_warning_
/**
- * Returns true or false depending on whether the standard context of the error code represents a warning.
- * Keep in mind that many of the error codes are context-specific and may be reported as a warning here when it is in fact not a warning.
+ * Returns true or false depending on whether the standard context of the code code represents a warning.
+ * Keep in mind that many of the code codes are context-specific and may be reported as a warning here when it is in fact not a warning.
*/
- extern f_return_status fll_fss_status_is_warning(const f_status error);
+ extern f_return_status fll_fss_status_is_warning(const f_status code);
#endif // _di_fll_fss_status_is_warning_
#ifndef _di_fll_fss_status_is_fine_
/**
- * Returns true or false depending on whether the standard context of the error code represents an normal return status and not an error.
- * Keep in mind that many of the error codes are context-specific and may be reported as "fine" here when it is in fact not fine.
+ * Returns true or false depending on whether the standard context of the code code represents an normal return status and not an code.
+ * Keep in mind that many of the code codes are context-specific and may be reported as "fine" here when it is in fact not fine.
*/
- extern f_return_status fll_fss_status_is_fine(const f_status error);
+ extern f_return_status fll_fss_status_is_fine(const f_status code);
#endif // _di_fll_fss_status_is_fine_
#ifdef __cplusplus
f_status status = f_none;
f_status allocation_status = f_none;
- status = fl_console_parameter_process(arguments, parameters, remaining);
+ status = f_console_parameter_process(arguments, parameters, remaining);
f_console_parameter_id decision = choices.id[2];
- fl_console_parameter_prioritize(parameters, choices, &decision);
+ f_console_parameter_prioritize(parameters, choices, &decision);
// load colors unless told not to.
if (decision != choices.id[0]) {
}
else if (status == f_invalid_utf) {
fl_color_print(f_standard_error, context->error, context->reset, "ENCODING ERROR: Invalid UTF-8 character in parameter when calling ");
- fl_color_print(f_standard_error, context->notable, context->reset, "fl_console_parameter_process()");
+ fl_color_print(f_standard_error, context->notable, context->reset, "f_console_parameter_process()");
fl_color_print_line(f_standard_error, context->error, context->reset, ".");
}
else if (status == f_invalid_parameter) {
fl_color_print(f_standard_error, context->error, context->reset, "INTERNAL ERROR: Invalid parameter when calling ");
- fl_color_print(f_standard_error, context->notable, context->reset, "fl_console_parameter_process()");
+ fl_color_print(f_standard_error, context->notable, context->reset, "f_console_parameter_process()");
fl_color_print_line(f_standard_error, context->error, context->reset, ".");
}
else {
fl_color_print(f_standard_error, context->error, context->reset, "INTERNAL ERROR: An unhandled error (");
fl_color_print(f_standard_error, context->notable, context->reset, "%u", status);
fl_color_print(f_standard_error, context->error, context->reset, ") has occured while calling ");
- fl_color_print(f_standard_error, context->notable, context->reset, "fl_console_parameter_process()");
+ fl_color_print(f_standard_error, context->notable, context->reset, "f_console_parameter_process()");
fl_color_print_line(f_standard_error, context->error, context->reset, ".");
}
// fll-1 includes
#include <level_1/color.h>
-#include <level_1/console.h>
#ifdef __cplusplus
extern "C" {
f_string
f_console
fl_color
-fl_console
build_compiler gcc
build_linker ar
build_libraries -lc
-build_libraries_fll -lfl_console -lf_utf -lfl_color -lf_print -lf_file -lf_console -lf_memory
+build_libraries_fll -lfl_color -lf_utf -lf_print -lf_file -lf_console -lf_memory
build_sources_library program.c
build_sources_program
build_sources_headers program.h
return f_none;
}
+ if (fl_string_compare(string, fl_status_string_whole_number, length, fl_status_string_whole_number_length) == f_equal_to) {
+ *code = f_whole_number;
+ return f_none;
+ }
+
if (fl_string_compare(string, fl_status_string_invalid_number, length, fl_status_string_invalid_number_length) == f_equal_to) {
*code = f_invalid_number;
return f_none;
*code = f_reallocation_error;
return f_none;
}
+
+ if (fl_string_compare(string, fl_status_string_deallocation_error, length, fl_status_string_deallocation_error_length) == f_equal_to) {
+ *code = f_deallocation_error;
+ return f_none;
+ }
#endif // _di_fll_status_allocation_
#ifndef _di_fll_status_fork_
return f_none;
}
+ if (fl_string_compare(string, fl_status_string_file_deallocation_error, length, fl_status_string_file_deallocation_error_length) == f_equal_to) {
+ *code = f_file_deallocation_error;
+ return f_none;
+ }
+
if (fl_string_compare(string, fl_status_string_file_stat_error, length, fl_status_string_file_stat_error_length) == f_equal_to) {
*code = f_file_stat_error;
return f_none;
choices.id = ids;
choices.used = 5;
- status = fl_console_parameter_prioritize(parameters, choices, &choice);
+ status = f_console_parameter_prioritize(parameters, choices, &choice);
if (f_status_is_error(status)) {
byte_dump_delete_data(data);
choices.id = ids;
choices.used = 3;
- status = fl_console_parameter_prioritize(parameters, choices, &choice);
+ status = f_console_parameter_prioritize(parameters, choices, &choice);
if (f_status_is_error(status)) {
byte_dump_delete_data(data);
status = f_none;
- // Execute parameter results.
if (data->parameters[byte_dump_parameter_help].result == f_console_result_found) {
byte_dump_print_help(*data);
}
status = f_none;
- // Execute parameter results.
if (data->parameters[firewall_parameter_help].result == f_console_result_found) {
firewall_print_help(*data);
}
status = f_none;
}
- // Execute parameter results.
if (data->parameters[fss_basic_list_read_parameter_help].result == f_console_result_found) {
fss_basic_list_read_print_help(*data);
}
build_compiler gcc
build_linker ar
build_libraries -lc
-build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lf_utf -lfl_color -lf_file -lf_print -lf_pipe -lf_console -lf_memory
+build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lfl_color -lf_utf -lf_file -lf_print -lf_pipe -lf_console -lf_memory
#build_libraries_fll-level -lfll_2 -lfll_1 -lfll_0
#build_libraries_fll-monolithic -lfll
build_sources_library fss_basic_list_read.c private-fss_basic_list_read.c
status = f_none;
- // Execute parameter results.
if (data->parameters[fss_basic_list_write_parameter_help].result == f_console_result_found) {
fss_basic_list_write_print_help(*data);
}
build_compiler gcc
build_linker ar
build_libraries -lc
-build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lf_utf -lfl_color -lf_file -lf_print -lf_pipe -lf_console -lf_memory
+build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lfl_color -lf_utf -lf_file -lf_print -lf_pipe -lf_console -lf_memory
#build_libraries_fll-level -lfll_2 -lfll_1 -lfll_0
#build_libraries_fll-monolithic -lfll
build_sources_library fss_basic_list_write.c
status = f_none;
}
- // Execute parameter results.
if (data->parameters[fss_basic_read_parameter_help].result == f_console_result_found) {
fss_basic_read_print_help(*data);
}
build_compiler gcc
build_linker ar
build_libraries -lc
-build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lf_utf -lfl_color -lf_file -lf_print -lf_pipe -lf_console -lf_memory
+build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lfl_color -lf_utf -lf_file -lf_print -lf_pipe -lf_console -lf_memory
#build_libraries_fll-level -lfll_2 -lfll_1 -lfll_0
#build_libraries_fll-monolithic -lfll
build_sources_library fss_basic_read.c private-fss_basic_read.c
status = f_none;
- // Execute parameter results.
if (data->parameters[fss_basic_write_parameter_help].result == f_console_result_found) {
fss_basic_write_print_help(*data);
}
build_compiler gcc
build_linker ar
build_libraries -lc
-build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lf_utf -lfl_color -lf_file -lf_print -lf_pipe -lf_console -lf_memory
+build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lfl_color -lf_utf -lf_file -lf_print -lf_pipe -lf_console -lf_memory
#build_libraries_fll-level -lfll_2 -lfll_1 -lfll_0
#build_libraries_fll-monolithic -lfll
build_sources_library fss_basic_write.c
f_status status2 = f_none;
- // Execute parameter results.
if (data->parameters[fss_extended_list_read_parameter_help].result == f_console_result_found) {
fss_extended_list_read_print_help(*data);
}
build_compiler gcc
build_linker ar
build_libraries -lc
-build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lf_utf -lfl_color -lf_file -lf_print -lf_pipe -lf_console -lf_memory
+build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lfl_color -lf_utf -lf_file -lf_print -lf_pipe -lf_console -lf_memory
#build_libraries_fll-level -lfll_2 -lfll_1 -lfll_0
#build_libraries_fll-monolithic -lfll
build_sources_library fss_extended_list_read.c private-fss_extended_list_read.c
status = f_none;
}
- // Execute parameter results.
if (data->parameters[fss_extended_read_parameter_help].result == f_console_result_found) {
fss_extended_read_print_help(*data);
}
build_compiler gcc
build_linker ar
build_libraries -lc
-build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lf_utf -lfl_color -lf_file -lf_print -lf_pipe -lf_console -lf_memory
+build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lfl_color -lf_utf -lf_file -lf_print -lf_pipe -lf_console -lf_memory
#build_libraries_fll-level -lfll_2 -lfll_1 -lfll_0
#build_libraries_fll-monolithic -lfll
build_sources_library fss_extended_read.c private-fss_extended_read.c
fl_color_print_line(f_standard_error, data->context.error, data->context.reset, "CRITICAL ERROR: Unable to allocate memory.");
}
else if (status == f_invalid_utf) {
- fl_color_print_line(f_standard_error, data->context.error, data->context.reset, "ENCODING ERROR: Invalid UTF-8 character in parameter when calling fl_console_parameter_process().");
+ fl_color_print_line(f_standard_error, data->context.error, data->context.reset, "ENCODING ERROR: Invalid UTF-8 character in parameter when calling f_console_parameter_process().");
}
else if (status == f_invalid_parameter) {
- fl_color_print_line(f_standard_error, data->context.error, data->context.reset, "INTERNAL ERROR: Invalid parameter when calling fl_console_parameter_process().");
+ fl_color_print_line(f_standard_error, data->context.error, data->context.reset, "INTERNAL ERROR: Invalid parameter when calling f_console_parameter_process().");
}
else {
- fl_color_print_line(f_standard_error, data->context.error, data->context.reset, "INTERNAL ERROR: An unhandled error (%u) has occured while calling fl_console_parameter_process().", status);
+ fl_color_print_line(f_standard_error, data->context.error, data->context.reset, "INTERNAL ERROR: An unhandled error (%u) has occured while calling f_console_parameter_process().", status);
}
fss_extended_write_delete_data(data);
return f_status_set_error(status);
}
- // Execute parameter results.
if (data->parameters[fss_extended_write_parameter_help].result == f_console_result_found) {
fss_extended_write_print_help(*data);
}
// fll-1 includes
#include <level_1/color.h>
-#include <level_1/console.h>
#include <level_1/status.h>
#include <level_1/file.h>
#include <level_1/fss_extended.h>
f_pipe
f_print
fl_color
-fl_console
fl_directory
fl_file
fl_fss
build_compiler gcc
build_linker ar
build_libraries -lc
-build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_console -lf_utf -lfl_color -lf_file -lf_print -lf_pipe -lf_console -lf_memory
+build_libraries_fll -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_file -lfl_directory -lfl_color -lf_utf -lf_file -lf_print -lf_pipe -lf_console -lf_memory
#build_libraries_fll-level -lfll_2 -lfll_1 -lfll_0
#build_libraries_fll-monolithic -lfll
build_sources_library fss_extended_write.c
#include <level_3/fss_status_code.h>
+#include "private-fss_status_code.h"
#ifdef __cplusplus
extern "C" {
printf("%c", f_string_eol);
- fll_program_print_help_option(data.context, fss_status_code_short_is_fine, fss_status_code_long_is_fine, f_console_symbol_short_enable, f_console_symbol_long_enable, " Print f_true if the error code is not an error.");
- fll_program_print_help_option(data.context, fss_status_code_short_is_warning, fss_status_code_long_is_warning, f_console_symbol_short_enable, f_console_symbol_long_enable, "Print f_true if the error code is a warning.");
- fll_program_print_help_option(data.context, fss_status_code_short_is_error, fss_status_code_long_is_error, f_console_symbol_short_enable, f_console_symbol_long_enable, " Print f_true if the error code is an error.");
+ fll_program_print_help_option(data.context, fss_status_code_short_is_fine, fss_status_code_long_is_fine, f_console_symbol_short_enable, f_console_symbol_long_enable, " Print f_true if the error code is not an error, f_false otherwise.");
+ fll_program_print_help_option(data.context, fss_status_code_short_is_warning, fss_status_code_long_is_warning, f_console_symbol_short_enable, f_console_symbol_long_enable, "Print f_true if the error code is a warning, f_false otherwise.");
+ fll_program_print_help_option(data.context, fss_status_code_short_is_error, fss_status_code_long_is_error, f_console_symbol_short_enable, f_console_symbol_long_enable, " Print f_true if the error code is an error, f_false otherwise.");
fll_program_print_help_option(data.context, fss_status_code_short_number, fss_status_code_long_number, f_console_symbol_short_enable, f_console_symbol_long_enable, " Convert status code name to number.");
fll_program_print_help_usage(data.context, fss_status_code_name, "status code(s)");
return f_status_set_error(status);
}
+ f_status status2 = f_none;
status = f_none;
- // Execute parameter results.
if (data->parameters[fss_status_code_parameter_help].result == f_console_result_found) {
fss_status_code_print_help(*data);
+ fss_status_code_delete_data(data);
+ return f_none;
}
else if (data->parameters[fss_status_code_parameter_version].result == f_console_result_found) {
fll_program_print_version(fss_status_code_version);
+ fss_status_code_delete_data(data);
+ return f_none;
}
- else if (data->parameters[fss_status_code_parameter_is_error].result == f_console_result_found) {
- if (data->remaining.used > 0) {
- f_array_length counter = 0;
- f_status code = f_none;
- unsigned int is_true = 0;
-
- for (; counter < data->remaining.used; counter++) {
- // only numbers are valid status codes.
- if (f_conversion_character_is_decimal(arguments.argv[data->remaining.array[counter]][0]) == f_false) {
- status = f_false;
- continue;
- }
+ if (data->parameters[fss_status_code_parameter_is_error].result == f_console_result_found) {
+ if (data->parameters[fss_status_code_parameter_is_warning].result == f_console_result_found) {
+ fl_color_print(f_standard_error, data->context.error, data->context.reset, "ERROR: The parameter '");
+ fl_color_print(f_standard_error, data->context.notable, data->context.reset, "--%s", fss_status_code_long_is_error);
+ fl_color_print(f_standard_error, data->context.error, data->context.reset, "' cannot be used with the parameter ");
+ fl_color_print(f_standard_error, data->context.notable, data->context.reset, "--%s", fss_status_code_long_is_warning);
+ fl_color_print_line(f_standard_error, data->context.error, data->context.reset, ".");
- long long number = atoll(arguments.argv[data->remaining.array[counter]]);
- if (number >= 0x10000 || number < 0) {
- status = f_false;
- continue;
- }
-
- code = (f_status) number;
- is_true = f_status_is_error(code) && !f_status_is_warning(code);
-
- if (status == f_none) {
- status = f_true;
- }
-
- if (is_true) {
- printf("%s\n", fl_status_string_true);
- }
- else {
- printf("%s\n", fl_status_string_false);
- }
- } // for
+ fss_status_code_delete_data(data);
+ return f_status_set_error(status);
}
- else {
- status = f_false;
+ else if (data->parameters[fss_status_code_parameter_is_fine].result == f_console_result_found) {
+ fl_color_print(f_standard_error, data->context.error, data->context.reset, "ERROR: The parameter '");
+ fl_color_print(f_standard_error, data->context.notable, data->context.reset, "--%s", fss_status_code_long_is_error);
+ fl_color_print(f_standard_error, data->context.error, data->context.reset, "' cannot be used with the parameter ");
+ fl_color_print(f_standard_error, data->context.notable, data->context.reset, "--%s", fss_status_code_long_is_fine);
+ fl_color_print_line(f_standard_error, data->context.error, data->context.reset, ".");
+
+ fss_status_code_delete_data(data);
+ return f_status_set_error(status);
}
}
- else if (data->parameters[fss_status_code_parameter_is_warning].result == f_console_result_found) {
- if (data->remaining.used > 0) {
- f_array_length counter = 0;
-
- f_status code = f_none;
- unsigned int is_true = 0;
-
- for (; counter < data->remaining.used; counter++) {
- // only numbers are valid status codes.
- if (f_conversion_character_is_decimal(arguments.argv[data->remaining.array[counter]][0]) == f_false) {
- status = f_false;
- continue;
- }
+ else if (data->parameters[fss_status_code_parameter_is_warning].result == f_console_result_found && data->parameters[fss_status_code_parameter_is_fine].result == f_console_result_found) {
+ fl_color_print(f_standard_error, data->context.error, data->context.reset, "ERROR: The parameter '");
+ fl_color_print(f_standard_error, data->context.notable, data->context.reset, "--%s", fss_status_code_long_is_warning);
+ fl_color_print(f_standard_error, data->context.error, data->context.reset, "' cannot be used with the parameter ");
+ fl_color_print(f_standard_error, data->context.notable, data->context.reset, "--%s", fss_status_code_long_is_fine);
+ fl_color_print_line(f_standard_error, data->context.error, data->context.reset, ".");
- long long number = atoll(arguments.argv[data->remaining.array[counter]]);
- if (number >= 0x10000 || number < 0) {
- status = f_false;
- continue;
- }
-
- code = (f_status) number;
- is_true = f_status_is_warning(code) && !f_status_is_error(code);
-
- if (status == f_none) {
- status = f_true;
- }
-
- if (is_true) {
- printf("%s\n", fl_status_string_true);
- }
- else {
- printf("%s\n", fl_status_string_false);
- }
- } // for
- }
- else {
- status = f_false;
- }
+ fss_status_code_delete_data(data);
+ return f_status_set_error(status);
}
- else if (data->parameters[fss_status_code_parameter_is_fine].result == f_console_result_found) {
- if (data->remaining.used > 0) {
- f_array_length counter = 0;
-
- f_status code = f_none;
- unsigned int is_true = 0;
- for (; counter < data->remaining.used; counter++) {
- // only numbers are valid status codes.
- if (f_conversion_character_is_decimal(arguments.argv[data->remaining.array[counter]][0]) == f_false) {
- status = f_false;
- continue;
- }
+ if (data->remaining.used == 0 && !data->process_pipe) {
+ fl_color_print_line(f_standard_error, data->context.error, data->context.reset, "ERROR: you failed to specify an error code.");
- long long number = atoll(arguments.argv[data->remaining.array[counter]]);
- if (number >= 0x10000 || number < 0) {
- status = f_false;
- continue;
- }
+ fss_status_code_delete_data(data);
+ return f_status_set_error(f_invalid_parameter);
+ }
- code = (f_status) number;
- is_true = f_status_is_fine(code);
+ if (data->parameters[fss_status_code_parameter_is_error].result == f_console_result_found || data->parameters[fss_status_code_parameter_is_warning].result == f_console_result_found || data->parameters[fss_status_code_parameter_is_fine].result == f_console_result_found) {
+ if (data->process_pipe) {
+ // @todo: call fss_status_code_process_check() here for all data from pipe that is space separated.
+ }
- if (status == f_none) {
- status = f_true;
- }
+ if (data->remaining.used > 0) {
+ for (f_array_length i = 0; i < data->remaining.used; i++) {
+ status2 = fss_status_code_process_check(*data, arguments.argv[data->remaining.array[i]]);
- if (is_true) {
- printf("%s\n", fl_status_string_true);
- }
- else {
- printf("%s\n", fl_status_string_false);
+ if (f_status_is_error(status2) && status == f_none) {
+ status = status2;
}
} // for
}
- else {
- status = f_false;
- }
}
else if (data->parameters[fss_status_code_parameter_number].result == f_console_result_found) {
- if (data->remaining.used > 0) {
- f_array_length counter = 0;
- f_status code = f_none;
- f_status status2 = f_none;
-
- for (; counter < data->remaining.used; counter++) {
- // Numbers are not valid status code strings.
- if (f_conversion_character_is_decimal(arguments.argv[data->remaining.array[counter]][0]) == f_true) {
- status = f_false;
- continue;
- }
+ if (data->process_pipe) {
+ // @todo: call fss_status_code_process_number() here for all data from pipe that is space separated.
+ }
- status2 = fll_fss_status_from_string(arguments.argv[data->remaining.array[counter]], &code);
+ if (data->remaining.used > 0) {
+ for (f_array_length i = 0; i < data->remaining.used; i++) {
+ status2 = fss_status_code_process_number(*data, arguments.argv[data->remaining.array[i]]);
- if (f_status_is_error(status2)) {
+ if (f_status_is_error(status2) && status == f_none) {
status = status2;
- break;
- }
- else if (status2 == f_invalid_data) {
- status = f_false;
- continue;
}
- else if (status == f_none) {
- status = f_true;
- }
-
- printf("%u\n", code);
} // for
}
- else {
- status = f_false;
- }
}
- else if (data->remaining.used > 0 || data->process_pipe) {
- f_array_length counter = 0;
-
+ else {
if (data->process_pipe) {
- // TODO: how should this be done?
+ // @todo: call fss_status_code_process_normal() here for all data from pipe that is space separated.
}
if (data->remaining.used > 0) {
- for (; counter < data->remaining.used; counter++) {
- // only numbers are valid status code.
- if (f_conversion_character_is_decimal(arguments.argv[data->remaining.array[counter]][0]) == f_false) {
- status = f_false;
- continue;
- }
-
- long long number = atoll(arguments.argv[data->remaining.array[counter]]);
- if (number >= 0x10000 || number < 0) {
- status = f_false;
- continue;
- }
- else if (status == f_none) {
- status = f_true;
- }
-
- f_status code = (f_status) number;
- f_string string = 0;
+ for (f_array_length i = 0; i < data->remaining.used; i++) {
+ status2 = fss_status_code_process_normal(*data, arguments.argv[data->remaining.array[i]]);
- if (fll_fss_status_to_string(code, &string) == f_none) {
- printf("%s\n", string);
- }
- else {
- status = f_false;
+ if (f_status_is_error(status2) && status == f_none) {
+ status = status2;
}
} // for
}
- else {
- status = f_false;
- }
- }
- else {
- fl_color_print_line(f_standard_error, data->context.error, data->context.reset, "ERROR: you failed to specify an error code.");
- status = f_status_set_error(f_invalid_parameter);
}
fss_status_code_delete_data(data);
#include <level_0/console.h>
#include <level_0/pipe.h>
#include <level_0/print.h>
+#include <level_0/status.h>
#include <level_0/string.h>
#include <level_0/type.h>
--- /dev/null
+#include <level_3/fss_status_code.h>
+#include "private-fss_status_code.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _di_fss_status_code_process_check_
+ f_return_status fss_status_code_process_check(const fss_status_code_data data, const f_string value) {
+ f_number_unsigned number = 0;
+ f_status status = fss_status_code_convert_number(data, value, &number);
+
+ if (f_status_is_error(status)) {
+ return status;
+ }
+
+ if (data.parameters[fss_status_code_parameter_is_error].result == f_console_result_found) {
+ if (f_status_is_error(number)) {
+ printf("%s\n", fl_status_string_true);
+ }
+ else {
+ printf("%s\n", fl_status_string_false);
+ }
+ }
+ else if (data.parameters[fss_status_code_parameter_is_warning].result == f_console_result_found) {
+ if (f_status_is_warning(number)) {
+ printf("%s\n", fl_status_string_true);
+ }
+ else {
+ printf("%s\n", fl_status_string_false);
+ }
+ }
+ else if (data.parameters[fss_status_code_parameter_is_fine].result == f_console_result_found) {
+ if (f_status_is_fine(number)) {
+ printf("%s\n", fl_status_string_true);
+ }
+ else {
+ printf("%s\n", fl_status_string_false);
+ }
+ }
+
+ return f_none;
+ }
+#endif // _di_fss_status_code_process_check_
+
+#ifndef _di_fss_status_code_process_number_
+ f_return_status fss_status_code_process_number(const fss_status_code_data data, const f_string value) {
+ f_status status = f_none;
+
+ {
+ f_number_unsigned number = 0;
+
+ status = fl_console_parameter_to_number_unsigned(value, &number);
+
+ if (status == f_none) {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "invalid name");
+
+ return f_status_set_error(f_invalid_parameter);
+ }
+
+ if (status == f_no_data || f_status_set_fine(status) == f_invalid_parameter) {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "invalid data");
+
+ return status;
+ }
+ }
+
+ f_status code = f_none;
+
+ status = fll_fss_status_from_string(value, &code);
+
+ if (f_status_is_error(status)) {
+ if (f_status_set_fine(status) == f_invalid_data) {
+ status = fll_status_from_string(value, &code);
+ }
+
+ if (f_status_is_error(status)) {
+ if (f_status_set_fine(status) == f_invalid_data) {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "unknown name");
+ }
+ else {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "failed to convert");
+ }
+
+ return status;
+ }
+ }
+
+ if (status == f_invalid_data) {
+ fl_color_print_line(f_standard_output, data.context.warning, data.context.reset, "unknown code");
+
+ return f_none;
+ }
+
+ printf("%u\n", code);
+
+ return f_none;
+ }
+#endif // _di_fss_status_code_process_number_
+
+#ifndef _di_fss_status_code_process_normal_
+ f_return_status fss_status_code_process_normal(const fss_status_code_data data, const f_string value) {
+ f_number_unsigned number = 0;
+ f_status status = fss_status_code_convert_number(data, value, &number);
+
+ if (f_status_is_error(status)) {
+ return status;
+ }
+
+ f_status code = (f_status) number;
+ f_string string = 0;
+
+ status = fll_fss_status_to_string(code, &string);
+
+ if (f_status_is_error(status)) {
+ if (f_status_set_fine(status) == f_invalid_data) {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "unknown code");
+ }
+ else {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "failed to convert");
+ }
+
+ return status;
+ }
+
+ printf("%s\n", string);
+
+ return f_none;
+ }
+#endif // _di_fss_status_code_process_normal_
+
+#ifndef _di_fss_status_code_convert_number_
+ f_return_status fss_status_code_convert_number(const fss_status_code_data data, const f_string value, f_number_unsigned *number) {
+ f_status status = fl_console_parameter_to_number_unsigned(value, number);
+
+ if (*number > f_status_size_max_with_signal) {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "out of range");
+
+ return status;
+ }
+
+ if (f_status_is_error(status)) {
+ if (f_status_set_fine(status) == f_negative_number) {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "out of range");
+ }
+ else {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "invalid number");
+ }
+
+ return status;
+ }
+
+ return f_none;
+ }
+#endif // _di_fss_status_code_convert_number_
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
--- /dev/null
+/**
+ * FLL - Level 3
+ *
+ * Project: FSS
+ * API Version: 0.5
+ * Licenses: lgplv2.1
+ */
+#ifndef _PRIVATE_fss_status_code_h
+#define _PRIVATE_fss_status_code_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Perform the 'check' processes, such as --fine or --error.
+ *
+ * @param data
+ * The program data.
+ * @param value
+ * The parameter value to process.
+ *
+ * @return
+ * f_none on success.
+ * f_no_data (with error bit) if string starts wth a null (length is 0).
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ * f_invalid_number (with error bit) if parameter is not a number.
+ * f_negative_number (with error bit) on negative value.
+ * f_overflow (with error bit) on integer overflow.
+ * f_incomplete_utf (with error bit) if an incomplete UTF-8 fragment is found.
+ */
+#ifndef _di_fss_status_code_process_check_
+ extern f_return_status fss_status_code_process_check(const fss_status_code_data data, const f_string value);
+#endif // _di_fss_status_code_process_check_
+
+/**
+ * Perform the 'number' processes, such as --number.
+ *
+ * @param data
+ * The program data.
+ * @param value
+ * The parameter value to process.
+ *
+ * @return
+ * f_none on success.
+ * f_no_data (with error bit) if string is empty.
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fss_status_code_process_number_
+ extern f_return_status fss_status_code_process_number(const fss_status_code_data data, const f_string value);
+#endif // _di_fss_status_code_process_number_
+
+/**
+ * Perform the normal processes.
+ *
+ * @param data
+ * The program data.
+ * @param value
+ * The parameter value to process.
+ *
+ * @return
+ * f_none on success.
+ * f_no_data (with error bit) if string starts wth a null (length is 0).
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ * f_invalid_number (with error bit) if parameter is not a number.
+ * f_negative_number (with error bit) on negative value.
+ * f_overflow (with error bit) on integer overflow.
+ * f_incomplete_utf (with error bit) if an incomplete UTF-8 fragment is found.
+ */
+#ifndef _di_fss_status_code_process_normal_
+ extern f_return_status fss_status_code_process_normal(const fss_status_code_data data, const f_string value);
+#endif // _di_fss_status_code_process_normal_
+
+/**
+ * Convert the value string to the number, reporting any errors.
+ *
+ * @param data
+ * The program data.
+ * @param value
+ * The parameter value to process.
+ * @param number
+ * The converted number.
+ * Will not be updated on error.
+ *
+ * @return
+ * f_none on success.
+ * f_no_data (with error bit) if string starts wth a null (length is 0).
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ * f_invalid_number (with error bit) if parameter is not a number.
+ * f_negative_number (with error bit) on negative value.
+ * f_overflow (with error bit) on integer overflow.
+ * f_incomplete_utf (with error bit) if an incomplete UTF-8 fragment is found.
+ */
+#ifndef _di_fss_status_code_convert_number_
+ extern f_return_status fss_status_code_convert_number(const fss_status_code_data data, const f_string value, f_number_unsigned *number);
+#endif // _di_fss_status_code_convert_number_
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // _PRIVATE_fss_status_code_h
build_libraries_fll -lfll_status -lfll_program -lfll_fss -lfll_execute -lfl_utf -lfl_string -lfl_status -lfl_fss -lfl_file -lfl_directory -lfl_console -lfl_color -lf_utf -lf_print -lf_pipe -lf_file -lf_conversion -lf_console -lf_memory
#build_libraries_fll-level -lfll_2 -lfll_1 -lfll_0
#build_libraries_fll-monolithic -lfll
-build_sources_library fss_status_code.c
+build_sources_library fss_status_code.c private-fss_status_code.c
build_sources_program main.c
build_sources_headers fss_status_code.h
build_sources_bash
--- /dev/null
+#include <level_3/status_code.h>
+#include "private-status_code.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _di_status_code_process_check_
+ f_return_status status_code_process_check(const status_code_data data, const f_string value) {
+ f_number_unsigned number = 0;
+ f_status status = status_code_convert_number(data, value, &number);
+
+ if (f_status_is_error(status)) {
+ return status;
+ }
+
+ if (data.parameters[status_code_parameter_is_error].result == f_console_result_found) {
+ if (f_status_is_error(number)) {
+ printf("%s\n", fl_status_string_true);
+ }
+ else {
+ printf("%s\n", fl_status_string_false);
+ }
+ }
+ else if (data.parameters[status_code_parameter_is_warning].result == f_console_result_found) {
+ if (f_status_is_warning(number)) {
+ printf("%s\n", fl_status_string_true);
+ }
+ else {
+ printf("%s\n", fl_status_string_false);
+ }
+ }
+ else if (data.parameters[status_code_parameter_is_fine].result == f_console_result_found) {
+ if (f_status_is_fine(number)) {
+ printf("%s\n", fl_status_string_true);
+ }
+ else {
+ printf("%s\n", fl_status_string_false);
+ }
+ }
+
+ return f_none;
+ }
+#endif // _di_status_code_process_check_
+
+#ifndef _di_status_code_process_number_
+ f_return_status status_code_process_number(const status_code_data data, const f_string value) {
+ f_status status = f_none;
+
+ {
+ f_number_unsigned number = 0;
+
+ status = fl_console_parameter_to_number_unsigned(value, &number);
+
+ if (status == f_none) {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "invalid name");
+
+ return f_status_set_error(f_invalid_parameter);
+ }
+
+ if (status == f_no_data || f_status_set_fine(status) == f_invalid_parameter) {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "invalid data");
+
+ return status;
+ }
+ }
+
+ f_status code = f_none;
+
+ status = fll_status_from_string(value, &code);
+
+ if (f_status_is_error(status)) {
+ if (f_status_set_fine(status) == f_invalid_data) {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "unknown name");
+ }
+ else {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "failed to convert");
+ }
+
+ return status;
+ }
+
+ if (status == f_invalid_data) {
+ fl_color_print_line(f_standard_output, data.context.warning, data.context.reset, "unknown code");
+
+ return f_none;
+ }
+
+ printf("%u\n", code);
+
+ return f_none;
+ }
+#endif // _di_status_code_process_number_
+
+#ifndef _di_status_code_process_normal_
+ f_return_status status_code_process_normal(const status_code_data data, const f_string value) {
+ f_number_unsigned number = 0;
+ f_status status = status_code_convert_number(data, value, &number);
+
+ if (f_status_is_error(status)) {
+ return status;
+ }
+
+ f_status code = (f_status) number;
+ f_string string = 0;
+
+ status = fl_status_to_string(code, &string);
+
+ if (f_status_is_error(status)) {
+ if (f_status_set_fine(status) == f_invalid_data) {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "unknown code");
+ }
+ else {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "failed to convert");
+ }
+
+ return status;
+ }
+
+ printf("%s\n", string);
+
+ return f_none;
+ }
+#endif // _di_status_code_process_normal_
+
+#ifndef _di_status_code_convert_number_
+ f_return_status status_code_convert_number(const status_code_data data, const f_string value, f_number_unsigned *number) {
+ f_status status = fl_console_parameter_to_number_unsigned(value, number);
+
+ if (*number > f_status_size_max_with_signal) {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "out of range");
+
+ return status;
+ }
+
+ if (f_status_is_error(status)) {
+ if (f_status_set_fine(status) == f_negative_number) {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "out of range");
+ }
+ else {
+ fl_color_print_line(f_standard_output, data.context.error, data.context.reset, "invalid number");
+ }
+
+ return status;
+ }
+
+ return f_none;
+ }
+#endif // _di_status_code_convert_number_
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
--- /dev/null
+/**
+ * FLL - Level 3
+ *
+ * Project: Status Code
+ * API Version: 0.5
+ * Licenses: lgplv2.1
+ */
+#ifndef _PRIVATE_status_code_h
+#define _PRIVATE_status_code_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Perform the 'check' processes, such as --fine or --error.
+ *
+ * @param data
+ * The program data.
+ * @param value
+ * The parameter value to process.
+ *
+ * @return
+ * f_none on success.
+ * f_no_data (with error bit) if string starts wth a null (length is 0).
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ * f_invalid_number (with error bit) if parameter is not a number.
+ * f_negative_number (with error bit) on negative value.
+ * f_overflow (with error bit) on integer overflow.
+ * f_incomplete_utf (with error bit) if an incomplete UTF-8 fragment is found.
+ */
+#ifndef _di_status_code_process_check_
+ extern f_return_status status_code_process_check(const status_code_data data, const f_string value);
+#endif // _di_status_code_process_check_
+
+/**
+ * Perform the 'number' processes, such as --number.
+ *
+ * @param data
+ * The program data.
+ * @param value
+ * The parameter value to process.
+ *
+ * @return
+ * f_none on success.
+ * f_no_data (with error bit) if string is empty.
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_status_code_process_number_
+ extern f_return_status status_code_process_number(const status_code_data data, const f_string value);
+#endif // _di_status_code_process_number_
+
+/**
+ * Perform the normal processes.
+ *
+ * @param data
+ * The program data.
+ * @param value
+ * The parameter value to process.
+ *
+ * @return
+ * f_none on success.
+ * f_no_data (with error bit) if string starts wth a null (length is 0).
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ * f_invalid_number (with error bit) if parameter is not a number.
+ * f_negative_number (with error bit) on negative value.
+ * f_overflow (with error bit) on integer overflow.
+ * f_incomplete_utf (with error bit) if an incomplete UTF-8 fragment is found.
+ */
+#ifndef _di_status_code_process_normal_
+ extern f_return_status status_code_process_normal(const status_code_data data, const f_string value);
+#endif // _di_status_code_process_normal_
+
+/**
+ * Convert the value string to the number, reporting any errors.
+ *
+ * @param data
+ * The program data.
+ * @param value
+ * The parameter value to process.
+ * @param number
+ * The converted number.
+ * Will not be updated on error.
+ *
+ * @return
+ * f_none on success.
+ * f_no_data (with error bit) if string starts wth a null (length is 0).
+ * f_invalid_parameter (with error bit) if a parameter is invalid.
+ * f_invalid_number (with error bit) if parameter is not a number.
+ * f_negative_number (with error bit) on negative value.
+ * f_overflow (with error bit) on integer overflow.
+ * f_incomplete_utf (with error bit) if an incomplete UTF-8 fragment is found.
+ */
+#ifndef _di_status_code_convert_number_
+ extern f_return_status status_code_convert_number(const status_code_data data, const f_string value, f_number_unsigned *number);
+#endif // _di_status_code_convert_number_
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // _PRIVATE_status_code_h
#include <level_3/status_code.h>
+#include "private-status_code.h"
#ifdef __cplusplus
extern "C" {
printf("%c", f_string_eol);
- fll_program_print_help_option(data.context, status_code_short_is_fine, status_code_long_is_fine, f_console_symbol_short_enable, f_console_symbol_long_enable, " Print f_true if the error code is not an error.");
- fll_program_print_help_option(data.context, status_code_short_is_warning, status_code_long_is_warning, f_console_symbol_short_enable, f_console_symbol_long_enable, "Print f_true if the error code is a warning.");
- fll_program_print_help_option(data.context, status_code_short_is_error, status_code_long_is_error, f_console_symbol_short_enable, f_console_symbol_long_enable, " Print f_true if the error code is an error.");
+ fll_program_print_help_option(data.context, status_code_short_is_fine, status_code_long_is_fine, f_console_symbol_short_enable, f_console_symbol_long_enable, " Print f_true if the error code is not an error, f_false otherwise.");
+ fll_program_print_help_option(data.context, status_code_short_is_warning, status_code_long_is_warning, f_console_symbol_short_enable, f_console_symbol_long_enable, "Print f_true if the error code is a warning, f_false otherwise.");
+ fll_program_print_help_option(data.context, status_code_short_is_error, status_code_long_is_error, f_console_symbol_short_enable, f_console_symbol_long_enable, " Print f_true if the error code is an error, f_false otherwise.");
fll_program_print_help_option(data.context, status_code_short_number, status_code_long_number, f_console_symbol_short_enable, f_console_symbol_long_enable, " Convert status code name to number.");
fll_program_print_help_usage(data.context, status_code_name, "status code(s)");
return f_status_set_error(status);
}
+ f_status status2 = f_none;
status = f_none;
- // Execute parameter results.
if (data->parameters[status_code_parameter_help].result == f_console_result_found) {
status_code_print_help(*data);
+ status_code_delete_data(data);
+ return f_none;
}
else if (data->parameters[status_code_parameter_version].result == f_console_result_found) {
fll_program_print_version(status_code_version);
+ status_code_delete_data(data);
+ return f_none;
}
- else if (data->parameters[status_code_parameter_is_error].result == f_console_result_found) {
- if (data->remaining.used > 0) {
- f_array_length counter = 0;
-
- f_status code = f_none;
- unsigned short is_true = 0;
-
- for (; counter < data->remaining.used; counter++) {
- // only numbers are valid status codes.
- if (f_conversion_character_is_decimal(arguments.argv[data->remaining.array[counter]][0]) == f_false) {
- status = f_false;
- continue;
- }
-
- long long number = atoll(arguments.argv[data->remaining.array[counter]]);
- if (number >= 0x10000 || number < 0) {
- status = f_false;
- continue;
- }
- code = (f_status) number;
- is_true = f_status_is_error(code) && !f_status_is_warning(code);
+ if (data->parameters[status_code_parameter_is_error].result == f_console_result_found) {
+ if (data->parameters[status_code_parameter_is_warning].result == f_console_result_found) {
+ fl_color_print(f_standard_error, data->context.error, data->context.reset, "ERROR: The parameter '");
+ fl_color_print(f_standard_error, data->context.notable, data->context.reset, "--%s", status_code_long_is_error);
+ fl_color_print(f_standard_error, data->context.error, data->context.reset, "' cannot be used with the parameter ");
+ fl_color_print(f_standard_error, data->context.notable, data->context.reset, "--%s", status_code_long_is_warning);
+ fl_color_print_line(f_standard_error, data->context.error, data->context.reset, ".");
- if (status == f_none) {
- status = f_true;
- }
-
- if (is_true) {
- printf("%s\n", fl_status_string_true);
- }
- else {
- printf("%s\n", fl_status_string_false);
- }
- } // for
+ status_code_delete_data(data);
+ return f_status_set_error(status);
}
- else {
- status = f_false;
+ else if (data->parameters[status_code_parameter_is_fine].result == f_console_result_found) {
+ fl_color_print(f_standard_error, data->context.error, data->context.reset, "ERROR: The parameter '");
+ fl_color_print(f_standard_error, data->context.notable, data->context.reset, "--%s", status_code_long_is_error);
+ fl_color_print(f_standard_error, data->context.error, data->context.reset, "' cannot be used with the parameter ");
+ fl_color_print(f_standard_error, data->context.notable, data->context.reset, "--%s", status_code_long_is_fine);
+ fl_color_print_line(f_standard_error, data->context.error, data->context.reset, ".");
+
+ status_code_delete_data(data);
+ return f_status_set_error(status);
}
}
- else if (data->parameters[status_code_parameter_is_warning].result == f_console_result_found) {
- if (data->remaining.used > 0) {
- f_array_length counter = 0;
-
- f_status code = f_none;
- unsigned short is_true = 0;
-
- for (; counter < data->remaining.used; counter++) {
- // only numbers are valid status codes.
- if (f_conversion_character_is_decimal(arguments.argv[data->remaining.array[counter]][0]) == f_false) {
- status = f_false;
- continue;
- }
-
- long long number = atoll(arguments.argv[data->remaining.array[counter]]);
- if (number >= 0x10000 || number < 0) {
- status = f_false;
- continue;
- }
-
- code = (f_status) number;
- is_true = f_status_is_warning(code) && !f_status_is_error(code);
+ else if (data->parameters[status_code_parameter_is_warning].result == f_console_result_found && data->parameters[status_code_parameter_is_fine].result == f_console_result_found) {
+ fl_color_print(f_standard_error, data->context.error, data->context.reset, "ERROR: The parameter '");
+ fl_color_print(f_standard_error, data->context.notable, data->context.reset, "--%s", status_code_long_is_warning);
+ fl_color_print(f_standard_error, data->context.error, data->context.reset, "' cannot be used with the parameter ");
+ fl_color_print(f_standard_error, data->context.notable, data->context.reset, "--%s", status_code_long_is_fine);
+ fl_color_print_line(f_standard_error, data->context.error, data->context.reset, ".");
- if (status == f_none) {
- status = f_true;
- }
-
- if (is_true) {
- printf("%s\n", fl_status_string_true);
- }
- else {
- printf("%s\n", fl_status_string_false);
- }
- } // for
- }
- else {
- status = f_false;
- }
+ status_code_delete_data(data);
+ return f_status_set_error(status);
}
- else if (data->parameters[status_code_parameter_is_fine].result == f_console_result_found) {
- if (data->remaining.used > 0) {
- f_array_length counter = 0;
- f_status code = f_none;
- unsigned short is_true = 0;
-
- for (; counter < data->remaining.used; counter++) {
- // only numbers are valid status codes.
- if (f_conversion_character_is_decimal(arguments.argv[data->remaining.array[counter]][0]) == f_false) {
- status = f_false;
- continue;
- }
+ if (data->remaining.used == 0 && !data->process_pipe) {
+ fl_color_print_line(f_standard_error, data->context.error, data->context.reset, "ERROR: you failed to specify an error code.");
- long long number = atoll(arguments.argv[data->remaining.array[counter]]);
- if (number >= 0x10000 || number < 0) {
- status = f_false;
- continue;
- }
+ status_code_delete_data(data);
+ return f_status_set_error(f_invalid_parameter);
+ }
- code = (f_status) number;
- is_true = f_status_is_fine(code);
+ if (data->parameters[status_code_parameter_is_error].result == f_console_result_found || data->parameters[status_code_parameter_is_warning].result == f_console_result_found || data->parameters[status_code_parameter_is_fine].result == f_console_result_found) {
+ if (data->process_pipe) {
+ // @todo: call status_code_process_check() here for all data from pipe that is space separated.
+ }
- if (status == f_none) {
- status = f_true;
- }
+ if (data->remaining.used > 0) {
+ for (f_array_length i = 0; i < data->remaining.used; i++) {
+ status2 = status_code_process_check(*data, arguments.argv[data->remaining.array[i]]);
- if (is_true) {
- printf("%s\n", fl_status_string_true);
- }
- else {
- printf("%s\n", fl_status_string_false);
+ if (f_status_is_error(status2) && status == f_none) {
+ status = status2;
}
} // for
}
- else {
- status = f_false;
- }
}
else if (data->parameters[status_code_parameter_number].result == f_console_result_found) {
+ if (data->process_pipe) {
+ // @todo: call status_code_process_number() here for all data from pipe that is space separated.
+ }
+
if (data->remaining.used > 0) {
- f_array_length counter = 0;
- f_status code = f_none;
- f_status status2 = f_none;
-
- for (; counter < data->remaining.used; counter++) {
- // Numbers are not valid status code strings.
- if (f_conversion_character_is_decimal(arguments.argv[data->remaining.array[counter]][0]) == f_true) {
- status = f_false;
- continue;
- }
+ for (f_array_length i = 0; i < data->remaining.used; i++) {
+ status2 = status_code_process_number(*data, arguments.argv[data->remaining.array[i]]);
- status2 = fll_status_from_string(arguments.argv[data->remaining.array[counter]], &code);
- if (f_status_is_error(status2)) {
+ if (f_status_is_error(status2) && status == f_none) {
status = status2;
- break;
- }
- else if (status2 == f_invalid_data) {
- status = f_false;
- continue;
}
- else if (status == f_none) {
- status = f_true;
- }
-
- printf("%u\n", code);
} // for
}
- else {
- status = f_false;
- }
}
- else if (data->remaining.used > 0 || data->process_pipe) {
- f_array_length counter = 0;
-
+ else {
if (data->process_pipe) {
- // TODO: how should this be done?
+ // @todo: call status_code_process_normal() here for all data from pipe that is space separated.
}
if (data->remaining.used > 0) {
- for (; counter < data->remaining.used; counter++) {
- // only numbers are valid status code.
- if (f_conversion_character_is_decimal(arguments.argv[data->remaining.array[counter]][0]) == f_false) {
- status = f_false;
- continue;
- }
-
- long long number = atoll(arguments.argv[data->remaining.array[counter]]);
- if (number >= 0x10000 || number < 0) {
- status = f_false;
- continue;
- }
- else if (status == f_none) {
- status = f_true;
- }
-
- f_status code = (f_status) number;
- f_string string = 0;
+ for (f_array_length i = 0; i < data->remaining.used; i++) {
+ status2 = status_code_process_normal(*data, arguments.argv[data->remaining.array[i]]);
- if (fl_status_to_string(code, &string) == f_none) {
- printf("%s\n", string);
- }
- else {
- status = f_false;
+ if (f_status_is_error(status2) && status == f_none) {
+ status = status2;
}
} // for
}
- else {
- status = f_false;
- }
- }
- else {
- fl_color_print_line(f_standard_error, data->context.error, data->context.reset, "ERROR: you failed to specify an error code.");
- status = f_status_set_error(f_invalid_parameter);
}
status_code_delete_data(data);
* Project: Status Code
* API Version: 0.5
* Licenses: lgplv2.1
+ *
+ * This program provides status code to/from string translation.
*/
#ifndef _status_code_h
#include <string.h>
// fll-0 includes
-#include <level_0/console.h>
#include <level_0/conversion.h>
+#include <level_0/console.h>
#include <level_0/pipe.h>
#include <level_0/print.h>
+#include <level_0/status.h>
#include <level_0/string.h>
#include <level_0/type.h>
#include <level_1/string.h>
// fll-2 includes
-#include <level_2/status.h>
#include <level_2/program.h>
+#include <level_2/status.h>
#ifdef __cplusplus
extern "C" {
#endif // _di_status_code_version_
#ifndef _di_status_code_name_
- #define status_code_name "status_code"
- #define status_code_name_long "Status Code"
+ #define status_code_name "status_code"
+ #define status_code_name_long "FSS Status Code"
#endif // _di_status_code_name_
#ifndef _di_status_code_defines_
build_libraries_fll -lfll_status -lfll_program -lfl_utf -lfl_string -lfl_status -lfl_file -lfl_console -lfl_color -lf_utf -lf_print -lf_pipe -lf_file -lf_conversion -lf_console -lf_memory
#build_libraries_fll-level -lfll_2 -lfll_1 -lfll_0
#build_libraries_fll-monolithic -lfll
-build_sources_library status_code.c
+build_sources_library status_code.c private-status_code.c
build_sources_program main.c
build_sources_headers status_code.h
build_sources_bash