]> Kevux Git Server - fll/commitdiff
Update: improve status code handling, remove unnecessary code, and update status...
authorKevin Day <thekevinday@gmail.com>
Sat, 31 Aug 2019 23:07:16 +0000 (18:07 -0500)
committerKevin Day <thekevinday@gmail.com>
Sat, 31 Aug 2019 23:12:05 +0000 (18:12 -0500)
The fl_status_is_fine(), fl_status_is_warning(), and fl_status_is_error() functions are no longer needed or valid with the current design around using error and warning bits.

The status conversion code should be more aware of digits.

Get rid of the "context" parameter in the status programs.
Redesign logic in the status programs to work with changes and function correctly (and consistently).
The status programs will eventually need to perform more extensive tests on parameters when digits or non-digits are required.
The current design only provides a very basic test on the first character of a given parameter.

18 files changed:
level_0/f_conversion/c/conversion.c
level_1/fl_status/c/status.c
level_1/fl_status/c/status.h
level_2/fll_fss/c/fss_status.c
level_2/fll_fss/c/fss_status.h
level_2/fll_fss/data/build/dependencies
level_2/fll_fss/data/build/settings
level_2/fll_status/c/status.c
level_2/fll_status/c/status.h
level_2/fll_status/data/build/dependencies
level_2/fll_status/data/build/settings
level_3/fss_status_code/c/fss_status_code.c
level_3/fss_status_code/c/fss_status_code.h
level_3/fss_status_code/c/main.c
level_3/status_code/c/main.c
level_3/status_code/c/status_code.c
level_3/status_code/c/status_code.h
level_3/status_code/data/build/dependencies

index ccbadbe09540f321eea90ae63f164e80f6c8da9a..cd098dca56b51cc2f773471d8144b7a32f93b2bb 100644 (file)
@@ -19,12 +19,12 @@ extern "C" {
       case '7':
       case '8':
       case '9':
-        return f_true;
+        break;
       default:
         return f_false;
     }
 
-    return f_unknown;
+    return f_true;
   }
 #endif // _di_f_is_digit_
 
@@ -54,10 +54,12 @@ extern "C" {
       case 'd':
       case 'e':
       case 'f':
-        return f_true;
+        break;
       default:
         return f_false;
     }
+
+    return f_true;
   }
 #endif // _di_f_is_hexdigit_
 
@@ -68,16 +70,16 @@ extern "C" {
     #endif // _di_level_0_parameter_checking_
 
     switch (character) {
-      case '0': *digit = 0;  break;
-      case '1': *digit = 1;  break;
-      case '2': *digit = 2;  break;
-      case '3': *digit = 3;  break;
-      case '4': *digit = 4;  break;
-      case '5': *digit = 5;  break;
-      case '6': *digit = 6;  break;
-      case '7': *digit = 7;  break;
-      case '8': *digit = 8;  break;
-      case '9': *digit = 9;  break;
+      case '0': *digit = 0; break;
+      case '1': *digit = 1; break;
+      case '2': *digit = 2; break;
+      case '3': *digit = 3; break;
+      case '4': *digit = 4; break;
+      case '5': *digit = 5; break;
+      case '6': *digit = 6; break;
+      case '7': *digit = 7; break;
+      case '8': *digit = 8; break;
+      case '9': *digit = 9; break;
       default:
         return f_no_data;
     }
@@ -93,16 +95,16 @@ extern "C" {
     #endif // _di_level_0_parameter_checking_
 
     switch (character) {
-      case '0': *digit = 0;  break;
-      case '1': *digit = 1;  break;
-      case '2': *digit = 2;  break;
-      case '3': *digit = 3;  break;
-      case '4': *digit = 4;  break;
-      case '5': *digit = 5;  break;
-      case '6': *digit = 6;  break;
-      case '7': *digit = 7;  break;
-      case '8': *digit = 8;  break;
-      case '9': *digit = 9;  break;
+      case '0': *digit = 0; break;
+      case '1': *digit = 1; break;
+      case '2': *digit = 2; break;
+      case '3': *digit = 3; break;
+      case '4': *digit = 4; break;
+      case '5': *digit = 5; break;
+      case '6': *digit = 6; break;
+      case '7': *digit = 7; break;
+      case '8': *digit = 8; break;
+      case '9': *digit = 9; break;
       case 'A': *digit = 10; break;
       case 'B': *digit = 11; break;
       case 'C': *digit = 12; break;
index 3d715638bbe6b85d47e5326030b7d533724330d6..d7391fcca0f9cc0653069ee37b7c99f9969ff147 100644 (file)
@@ -681,84 +681,6 @@ extern "C" {
   }
 #endif // _di_fl_status_to_string_
 
-#ifndef _di_fl_status_is_error_
-  f_return_status fl_status_is_error(const f_status code) {
-    if (fl_status_is_fine(code) == f_true) {
-      return f_false;
-    }
-    else if (fl_status_is_warning(code) == f_true) {
-      return f_false;
-    }
-
-    return f_true;
-  }
-#endif // _di_fl_status_is_error_
-
-#ifndef _di_fl_status_is_warning_
-  f_return_status fl_status_is_warning(const f_status code) {
-    switch (code) {
-      #ifndef _di_fl_status_basic_
-        case f_no_data:
-          return f_true;
-      #endif // _di_fl_status_basic_
-
-      #ifndef _di_f_status_buffers_
-        case f_no_data_on_eof:
-          return f_true;
-        case f_no_data_on_eol:
-          return f_true;
-        case f_no_data_on_eos:
-          return f_true;
-        case f_no_data_on_stop:
-          return f_true;
-        case f_none_on_eof:
-          return f_true;
-        case f_none_on_eol:
-          return f_true;
-        case f_none_on_eos:
-          return f_true;
-        case f_none_on_stop:
-          return f_true;
-      #endif // _di_f_status_buffers_
-    }
-
-    return f_false;
-  }
-#endif // _di_fl_status_is_warning_
-
-#ifndef _di_fl_status_is_fine_
-  f_return_status fl_status_is_fine(const f_status code) {
-    switch (code) {
-      #ifndef _di_fl_status_booleans_
-        case f_false:
-          return f_true;
-        case f_true:
-          return f_true;
-      #endif // _di_fl_status_booleans_
-
-      #ifndef _di_fl_status_basic_
-        case f_none:
-          return f_true;
-        case f_dummy:
-          return f_true;
-      #endif // _di_fl_status_basic_
-
-      #ifndef _di_fl_status_non_
-        case f_less_than:
-          return f_true;
-        case f_equal_to:
-          return f_true;
-        case f_not_equal_to:
-          return f_true;
-        case f_greater_than:
-          return f_true;
-      #endif // _di_fl_status_non_
-    }
-
-    return f_false;
-  }
-#endif // _di_fl_status_is_fine_
-
 #ifdef __cplusplus
 } // extern "C"
 #endif
index 65894e166a2fe67beff92d6bacbb40d8b3ce01eb..1157554db8d6223cf9d4b84f9533b9035c8b24fc 100644 (file)
@@ -701,30 +701,6 @@ extern "C" {
   extern f_return_status fl_status_to_string(const f_status code, f_string *string);
 #endif // _di_fl_status_to_string_
 
-#ifndef _di_fl_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 status codes are context-specific and may be reported as an error here when it is in fact not an error.
-   */
-  extern f_return_status fl_status_is_error(const f_status code);
-#endif // _di_fl_status_is_error_
-
-#ifndef _di_fl_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 status codes are context-specific and may be reported as a warning here when it is in fact not a warning.
-   */
-  extern f_return_status fl_status_is_warning(const f_status code);
-#endif // _di_fl_status_is_warning_
-
-#ifndef _di_fl_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 status codes are context-specific and may be reported as an "fine" here when it is in fact not fine.
-   */
-  extern f_return_status fl_status_is_fine(const f_status code);
-#endif // _di_fl_status_is_fine_
-
 #ifdef __cplusplus
 } // extern "C"
 #endif
index ee6e5cc7c42089fbb4800b59945fdf7e58537e1c..f452f879c2b0f15cce3aacba7352a6e991ddbd00 100644 (file)
@@ -13,6 +13,19 @@ extern "C" {
     f_status status = f_none;
     f_string_length length = strlen(string);
 
+    if (length == 0) {
+      return f_no_data;
+    }
+
+    // numbers are not valid status code strings.
+    if ((status = f_is_digit(string[0])) == f_true) {
+      return f_invalid_data;
+    }
+
+    if (f_status_is_error(status)) {
+      return status;
+    }
+
     #ifndef _di_fll_fss_status_error_
       if (fl_compare_strings(string, fll_fss_status_string_invalid_format, length, fll_fss_status_string_invalid_format_length) == f_equal_to) {
         *error = fl_fss_invalid_format;
index 0a9afa9e0ab39345f58307ffc47525f0a4ebc89d..c0f9fa5cb693416eaef238823283956adc4a301d 100644 (file)
@@ -11,6 +11,7 @@
 #define _FLL_fss_status_h
 
 // fll-0 includes
+#include <level_0/conversion.h>
 #include <level_0/status.h>
 #include <level_0/fss.h>
 #include <level_0/memory.h>
@@ -87,6 +88,7 @@ extern "C" {
  *
  * @return
  *   f_none on success.
+ *   f_no_data if string is empty.
  *   f_invalid_data if not found.
  *   f_invalid_parameter (with error bit) if a parameter is invalid.
  *
index ae20d2e1185b2812de3c031a680487deefdb7f0c..3078a1e65352fb185b13433e8c0f0cfd141b812d 100644 (file)
@@ -2,6 +2,8 @@ f_types
 f_status
 f_strings
 f_memory
+f_conversion
+f_utf
 f_fss
 fl_fss
 fl_status
index ca2a9913e35d484b28dc612134527cd1b6c809b0..7710ded5942ea17e2144e9615daade794f4143b7 100644 (file)
@@ -10,7 +10,7 @@ version_micro 0
 build_compiler gcc
 build_linker ar
 build_libraries -lc
-build_libraries_fll -lfl_status -lfl_strings -lfl_fss -lf_conversion -lf_file -lf_memory -lf_utf
+build_libraries_fll -lfl_status -lfl_strings -lfl_fss -lf_conversion -lf_file -lf_memory -lf_conversion -lf_utf
 build_sources_library fss_basic.c fss_basic_list.c fss_extended.c fss_status.c
 build_sources_program
 build_sources_headers fss_basic.h fss_basic_list.h fss_extended.h fss_status.h
index d62e6dff23217909435ec964bb7bee99ec2d4a25..27d5db0c403ef4814e2fc594ed1ff1f3955e968e 100644 (file)
@@ -13,6 +13,19 @@ extern "C" {
     f_status status = f_none;
     f_string_length length = strlen(string);
 
+    if (length == 0) {
+      return f_no_data;
+    }
+
+    // numbers are not valid status code strings.
+    if ((status = f_is_digit(string[0])) == f_true) {
+      return f_invalid_data;
+    }
+
+    if (f_status_is_error(status)) {
+      return status;
+    }
+
     #ifndef _di_fll_status_booleans_
       if (fl_compare_strings(string, fl_status_string_false, length, fl_status_string_false_length) == f_equal_to) {
         *code = f_false;
index ec8c2cff7c7bc758ea70d43632a3bb2c74d293ba..da08e9867218755fd068749dd3d5431d7710d76c 100644 (file)
@@ -11,6 +11,7 @@
 #define _FLL_errors_h
 
 // fll-0 includes
+#include <level_0/conversion.h>
 #include <level_0/status.h>
 #include <level_0/strings.h>
 #include <level_0/types.h>
@@ -38,6 +39,7 @@ extern "C" {
  *
  * @return
  *   f_none on success.
+ *   f_no_data if string is empty.
  *   f_invalid_data if not found.
  *   f_invalid_parameter (with error bit) if a parameter is invalid.
  */
index f4f5594cf4426e983c8761846bb3e0d862e5532e..72e702ae54386e62cef3c192e30b22574cda3126 100644 (file)
@@ -1,6 +1,7 @@
 f_types
 f_status
 f_memory
+f_conversion
 f_strings
 f_utf
 fl_strings
index 72c5bc1769970bcbf087974cb67e13ce3ef3c919..3bd362b04dc57634eca2c56672df4186f85f8c47 100644 (file)
@@ -10,7 +10,7 @@ version_micro 0
 build_compiler gcc
 build_linker ar
 build_libraries -lc
-build_libraries_fll -lfl_status -lfl_strings -lf_memory -lf_utf
+build_libraries_fll -lfl_status -lfl_strings -lf_memory -lf_conversion -lf_utf
 build_sources_library status.c
 build_sources_program
 build_sources_headers status.h
index ff9740254916db40af4a5c712c892ea18ea7f918..a66a5eb72c9d128b6fa64fba9dba6e5960828a12 100644 (file)
@@ -68,13 +68,6 @@ extern "C" {
     printf("    Returns true if the error code is an error.");
 
     printf("\n  %s", f_console_symbol_short_enable);
-    fl_color_print(f_standard_output, data.context.standout, data.context.reset, fss_status_code_short_context);
-
-    printf(", %s", f_console_symbol_long_enable);
-    fl_color_print(f_standard_output, data.context.standout, data.context.reset, fss_status_code_long_context);
-    printf("     Guess error state from context of error (ignores masks).");
-
-    printf("\n  %s", f_console_symbol_short_enable);
     fl_color_print(f_standard_output, data.context.standout, data.context.reset, fss_status_code_short_number);
 
     printf(", %s", f_console_symbol_long_enable);
@@ -162,99 +155,143 @@ extern "C" {
         f_array_length counter = 0;
 
         f_status code = f_none;
+        f_u_int true = 0;
 
         for (; counter < data->remaining.used; counter++) {
-          code = (f_status) atoll(argv[data->remaining.array[counter]]);
+          // only numbers are valid status codes.
+          if (f_is_digit(argv[data->remaining.array[counter]][0]) == f_false) {
+            status = f_false;
+            continue;
+          }
+
+          long long number = atoll(argv[data->remaining.array[counter]]);
+          if (number >= 0x10000 || number < 0) {
+            status = f_false;
+            continue;
+          }
 
-          if (data->parameters[fss_status_code_parameter_context].result == f_console_result_found) {
-            if (fll_fss_status_is_error(code)) {
-              fss_status_code_delete_data(data);
-              return f_true;
-            }
+          code = (f_status) number;
+          true = f_status_is_error(code) && !f_status_is_warning(code);
+
+          if (status == f_none) {
+            status = f_true;
+          }
+
+          if (true) {
+            printf("%s\n", fl_status_string_true);
           }
           else {
-            if (f_status_is_error(code)) {
-              fss_status_code_delete_data(data);
-              return f_true;
-            }
+            printf("%s\n", fl_status_string_false);
           }
         } // for
       }
-
-      fss_status_code_delete_data(data);
-      return f_false;
+      else {
+        status = f_false;
+      }
     }
     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;
+        f_u_int true = 0;
 
         for (; counter < data->remaining.used; counter++) {
-          code = (f_status) atoll(argv[data->remaining.array[counter]]);
+          // only numbers are valid status codes.
+          if (f_is_digit(argv[data->remaining.array[counter]][0]) == f_false) {
+            status = f_false;
+            continue;
+          }
+
+          long long number = atoll(argv[data->remaining.array[counter]]);
+          if (number >= 0x10000 || number < 0) {
+            status = f_false;
+            continue;
+          }
+
+          code = (f_status) number;
+          true = f_status_is_warning(code) && !f_status_is_error(code);
+
+          if (status == f_none) {
+            status = f_true;
+          }
 
-          if (data->parameters[fss_status_code_parameter_context].result == f_console_result_found) {
-            if (fll_fss_status_is_warning(code)) {
-              fss_status_code_delete_data(data);
-              return f_true;
-            }
+          if (true) {
+            printf("%s\n", fl_status_string_true);
           }
           else {
-            if (f_status_is_warning(code)) {
-              fss_status_code_delete_data(data);
-              return f_true;
-            }
+            printf("%s\n", fl_status_string_false);
           }
         } // for
       }
-
-      fss_status_code_delete_data(data);
-      return f_false;
+      else {
+        status = f_false;
+      }
     }
     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;
+        f_u_int true = 0;
 
         for (; counter < data->remaining.used; counter++) {
-          code = (f_status) atoll(argv[data->remaining.array[counter]]);
+          // only numbers are valid status codes.
+          if (f_is_digit(argv[data->remaining.array[counter]][0]) == f_false) {
+            status = f_false;
+            continue;
+          }
 
-          if (data->parameters[fss_status_code_parameter_context].result == f_console_result_found) {
-            if (fll_fss_status_is_fine(code)) {
-              fss_status_code_delete_data(data);
-              return f_true;
-            }
+          long long number = atoll(argv[data->remaining.array[counter]]);
+          if (number >= 0x10000 || number < 0) {
+            status = f_false;
+            continue;
+          }
+
+          code = (f_status) number;
+          true = f_status_is_fine(code);
+
+          if (status == f_none) {
+            status = f_true;
+          }
+
+          if (true) {
+            printf("%s\n", fl_status_string_true);
           }
           else {
-            if (f_status_is_fine(code)) {
-              fss_status_code_delete_data(data);
-              return f_true;
-            }
+            printf("%s\n", fl_status_string_false);
           }
         } // for
       }
-
-      fss_status_code_delete_data(data);
-      return f_false;
+      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++) {
-          status = fll_status_from_string(argv[data->remaining.array[counter]], &code);
-
-          if (status == f_invalid_data) {
-            status = fll_fss_status_from_string(argv[data->remaining.array[counter]], &code);
+          // numbers are not valid status code strings.
+          if (f_is_digit(argv[data->remaining.array[counter]][0]) == f_true) {
+            status = f_false;
+            continue;
           }
 
-          if (f_status_is_error(status)) {
+          status2 = fll_status_from_string(argv[data->remaining.array[counter]], &code);
+
+          if (f_status_is_error(status2)) {
+            status = status2;
             break;
           }
-          else {
-            status = f_none;
+          else if (status2 == f_invalid_data) {
+            status = f_false;
+            continue;
+          }
+          else if (status == f_none) {
+            status = f_true;
           }
 
           printf("%u\n", code);
@@ -263,9 +300,6 @@ extern "C" {
       else {
         status = f_false;
       }
-
-      fss_status_code_delete_data(data);
-      return status;
     }
     else if (data->remaining.used > 0 || data->process_pipe) {
       f_array_length counter = 0;
@@ -276,14 +310,35 @@ extern "C" {
 
       if (data->remaining.used > 0) {
         for (; counter < data->remaining.used; counter++) {
-          f_status code = (f_status) atoll(argv[data->remaining.array[counter]]);
+          // only numbers are valid status code.
+          if (f_is_digit(argv[data->remaining.array[counter]][0]) == f_false) {
+            status = f_false;
+            continue;
+          }
+
+          long long number = atoll(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;
 
           if (fll_fss_status_to_string(code, &string) == f_none) {
             printf("%s\n", string);
           }
+          else {
+            status = f_false;
+          }
         } // 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.");
index d7f5cce48e8836b83a3429c02f6a4fb95cc6b798..66bd2938312a1edc019efa727554dc4d4f2be5ab 100644 (file)
@@ -15,6 +15,7 @@
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/conversion.h>
 #include <level_0/console.h>
 #include <level_0/pipe.h>
 #include <level_0/print.h>
@@ -53,13 +54,11 @@ extern "C" {
   #define fss_status_code_short_is_fine    "f"
   #define fss_status_code_short_is_warning "w"
   #define fss_status_code_short_is_error   "e"
-  #define fss_status_code_short_context    "c"
   #define fss_status_code_short_number     "n"
 
   #define fss_status_code_long_is_fine    "is_fine"
   #define fss_status_code_long_is_warning "is_warning"
   #define fss_status_code_long_is_error   "is_error"
-  #define fss_status_code_long_context    "context"
   #define fss_status_code_long_number     "number"
 
   enum {
@@ -71,7 +70,6 @@ extern "C" {
     fss_status_code_parameter_is_fine,
     fss_status_code_parameter_is_warning,
     fss_status_code_parameter_is_error,
-    fss_status_code_parameter_context,
     fss_status_code_parameter_number,
   };
 
@@ -84,7 +82,6 @@ extern "C" {
       f_console_parameter_initialize(fss_status_code_short_is_fine, fss_status_code_long_is_fine, 0, f_false, f_console_type_normal), \
       f_console_parameter_initialize(fss_status_code_short_is_warning, fss_status_code_long_is_warning, 0, f_false, f_console_type_normal), \
       f_console_parameter_initialize(fss_status_code_short_is_error, fss_status_code_long_is_error, 0, f_false, f_console_type_normal), \
-      f_console_parameter_initialize(fss_status_code_short_context, fss_status_code_long_context, 0, f_false, f_console_type_normal), \
       f_console_parameter_initialize(fss_status_code_short_number, fss_status_code_long_number, 0, f_false, f_console_type_normal), \
     }
 
index 4080bb3f1aeee39d38c04e5923c5180a7a822b65..4bc2b82fda00e90dfdc16aed549ba816aead4af7 100644 (file)
@@ -7,7 +7,9 @@ int main(const f_array_length argc, const f_string argv[]) {
     data.process_pipe = f_true;
   }
 
-  if (f_status_is_error(fss_status_code_main(argc, argv, &data))) {
+  f_status status = fss_status_code_main(argc, argv, &data);
+
+  if (f_status_is_error(status) || status == f_false) {
     return 1;
   }
 
index b48a13a555893d745fef4cb6bc4540755d6485c8..76f3aee60aa302a7d4f02b49f46c5a4a2f90b070 100644 (file)
@@ -7,7 +7,9 @@ int main(const f_array_length argc, const f_string argv[]) {
     data.process_pipe = f_true;
   }
 
-  if (f_status_is_error(status_code_main(argc, argv, &data))) {
+  f_status status = status_code_main(argc, argv, &data);
+
+  if (f_status_is_error(status) || status == f_false) {
     return 1;
   }
 
index f952165eac9ae7c0011a0f80f50c721d16e32f64..982162cb17d55429299e9c931d209416228e1e73 100644 (file)
@@ -68,13 +68,6 @@ extern "C" {
     printf("    Returns true if the error code is an error.");
 
     printf("\n  %s", f_console_symbol_short_enable);
-    fl_color_print(f_standard_output, data.context.standout, data.context.reset, status_code_short_context);
-
-    printf(", %s", f_console_symbol_long_enable);
-    fl_color_print(f_standard_output, data.context.standout, data.context.reset, status_code_long_context);
-    printf("     Guess error state from context of error (ignores masks).");
-
-    printf("\n  %s", f_console_symbol_short_enable);
     fl_color_print(f_standard_output, data.context.standout, data.context.reset, status_code_short_number);
 
     printf(", %s", f_console_symbol_long_enable);
@@ -160,92 +153,143 @@ extern "C" {
     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;
+        f_u_short true = 0;
 
         for (; counter < data->remaining.used; counter++) {
-          code = (f_status) atoll(argv[data->remaining.array[counter]]);
+          // only numbers are valid status codes.
+          if (f_is_digit(argv[data->remaining.array[counter]][0]) == f_false) {
+            status = f_false;
+            continue;
+          }
 
-          if (data->parameters[status_code_parameter_context].result == f_console_result_found) {
-            if (fl_status_is_error(code)) {
-              status_code_delete_data(data);
-              return f_true;
-            }
+          long long number = atoll(argv[data->remaining.array[counter]]);
+          if (number >= 0x10000 || number < 0) {
+            status = f_false;
+            continue;
+          }
+
+          code = (f_status) number;
+          true = f_status_is_error(code) && !f_status_is_warning(code);
+
+          if (status == f_none) {
+            status = f_true;
+          }
+
+          if (true) {
+            printf("%s\n", fl_status_string_true);
           }
           else {
-            if (f_status_is_error(code)) {
-              status_code_delete_data(data);
-              return f_true;
-            }
+            printf("%s\n", fl_status_string_false);
           }
         } // for
       }
-
-      status_code_delete_data(data);
-      return f_false;
+      else {
+        status = f_false;
+      }
     }
     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;
+        f_u_short true = 0;
 
         for (; counter < data->remaining.used; counter++) {
-          code = (f_status) atoll(argv[data->remaining.array[counter]]);
+          // only numbers are valid status codes.
+          if (f_is_digit(argv[data->remaining.array[counter]][0]) == f_false) {
+            status = f_false;
+            continue;
+          }
 
-          if (data->parameters[status_code_parameter_context].result == f_console_result_found) {
-            if (fl_status_is_warning(code)) {
-              status_code_delete_data(data);
-              return f_true;
-            }
+          long long number = atoll(argv[data->remaining.array[counter]]);
+          if (number >= 0x10000 || number < 0) {
+            status = f_false;
+            continue;
+          }
+
+          code = (f_status) number;
+          true = f_status_is_warning(code) && !f_status_is_error(code);
+
+          if (status == f_none) {
+            status = f_true;
+          }
+
+          if (true) {
+            printf("%s\n", fl_status_string_true);
           }
           else {
-            if (f_status_is_warning(code)) {
-              status_code_delete_data(data);
-              return f_true;
-            }
+            printf("%s\n", fl_status_string_false);
           }
         } // for
       }
-
-      status_code_delete_data(data);
-      return f_false;
+      else {
+        status = f_false;
+      }
     }
     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;
+        f_u_short true = 0;
 
         for (; counter < data->remaining.used; counter++) {
-          code = (f_status) atoll(argv[data->remaining.array[counter]]);
+          // only numbers are valid status codes.
+          if (f_is_digit(argv[data->remaining.array[counter]][0]) == f_false) {
+            status = f_false;
+            continue;
+          }
+
+          long long number = atoll(argv[data->remaining.array[counter]]);
+          if (number >= 0x10000 || number < 0) {
+            status = f_false;
+            continue;
+          }
+
+          code = (f_status) number;
+          true = f_status_is_fine(code);
+
+          if (status == f_none) {
+            status = f_true;
+          }
 
-          if (data->parameters[status_code_parameter_context].result == f_console_result_found) {
-            if (fl_status_is_fine(code)) {
-              status_code_delete_data(data);
-              return f_true;
-            }
+          if (true) {
+            printf("%s\n", fl_status_string_true);
           }
           else {
-            if (f_status_is_fine(code)) {
-              status_code_delete_data(data);
-              return f_true;
-            }
+            printf("%s\n", fl_status_string_false);
           }
         } // for
       }
-
-      status_code_delete_data(data);
-      return f_false;
+      else {
+        status = f_false;
+      }
     }
     else if (data->parameters[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++) {
-          status = fll_status_from_string(argv[data->remaining.array[counter]], &code);
-          if (f_status_is_error(status)) {
+          // numbers are not valid status code strings.
+          if (f_is_digit(argv[data->remaining.array[counter]][0]) == f_true) {
+            status = f_false;
+            continue;
+          }
+
+          status2 = fll_status_from_string(argv[data->remaining.array[counter]], &code);
+          if (f_status_is_error(status2)) {
+            status = status2;
             break;
           }
-          else {
+          else if (status2 == f_invalid_data) {
+            status = f_false;
+            continue;
+          }
+          else if (status == f_none) {
             status = f_true;
           }
 
@@ -255,9 +299,6 @@ extern "C" {
       else {
         status = f_false;
       }
-
-      status_code_delete_data(data);
-      return status;
     }
     else if (data->remaining.used > 0 || data->process_pipe) {
       f_array_length counter = 0;
@@ -268,14 +309,35 @@ extern "C" {
 
       if (data->remaining.used > 0) {
         for (; counter < data->remaining.used; counter++) {
-          f_status code = (f_status) atoll(argv[data->remaining.array[counter]]);
+          // only numbers are valid status code.
+          if (f_is_digit(argv[data->remaining.array[counter]][0]) == f_false) {
+            status = f_false;
+            continue;
+          }
+
+          long long number = atoll(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;
 
           if (fl_status_to_string(code, &string) == f_none) {
             printf("%s\n", string);
           }
+          else {
+            status = f_false;
+          }
         } // 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.");
index d89f948994bdb6915a3f76f908627f93a60523b4..0a485db7ecd6ea2ac865f6cba837b031ddd09246 100644 (file)
@@ -14,6 +14,7 @@
 
 // fll-0 includes
 #include <level_0/console.h>
+#include <level_0/conversion.h>
 #include <level_0/pipe.h>
 #include <level_0/print.h>
 #include <level_0/strings.h>
@@ -50,13 +51,11 @@ extern "C" {
   #define status_code_short_is_fine    "f"
   #define status_code_short_is_warning "w"
   #define status_code_short_is_error   "e"
-  #define status_code_short_context    "c"
   #define status_code_short_number     "n"
 
   #define status_code_long_is_fine    "is_fine"
   #define status_code_long_is_warning "is_warning"
   #define status_code_long_is_error   "is_error"
-  #define status_code_long_context    "context"
   #define status_code_long_number     "number"
 
   enum {
@@ -68,7 +67,6 @@ extern "C" {
     status_code_parameter_is_fine,
     status_code_parameter_is_warning,
     status_code_parameter_is_error,
-    status_code_parameter_context,
     status_code_parameter_number,
   };
 
@@ -81,7 +79,6 @@ extern "C" {
       f_console_parameter_initialize(status_code_short_is_fine, status_code_long_is_fine, 0, f_false, f_console_type_normal), \
       f_console_parameter_initialize(status_code_short_is_warning, status_code_long_is_warning, 0, f_false, f_console_type_normal), \
       f_console_parameter_initialize(status_code_short_is_error, status_code_long_is_error, 0, f_false, f_console_type_normal), \
-      f_console_parameter_initialize(status_code_short_context, status_code_long_context, 0, f_false, f_console_type_normal), \
       f_console_parameter_initialize(status_code_short_number, status_code_long_number, 0, f_false, f_console_type_normal), \
     }
 
index f494110ff1ae025c88b29cc3d92c7bdd5195a8c7..16a54b7b01b0b823c1f85b31075505de59bba3e9 100644 (file)
@@ -1,4 +1,5 @@
 f_console
+f_conversion
 f_status
 f_pipe
 f_print