]> Kevux Git Server - fll/commitdiff
Update: Conversion should return F_number_positive and F_number_negative without...
authorKevin Day <kevin@kevux.org>
Fri, 14 Jul 2023 03:07:57 +0000 (22:07 -0500)
committerKevin Day <kevin@kevux.org>
Fri, 14 Jul 2023 03:37:33 +0000 (22:37 -0500)
Do not treat F_number_positive and F_number_negative as an error.
The "unsigned" concept should be internal to the function and not whether or not the user input has a sign.

If F_number_negative is returned, the value can still be of type f_number_unsigned_t.
This is because the return status designates the effective sign.
The caller can then decide whether or not this is an error.

level_0/f_conversion/c/conversion.c
level_1/fl_conversion/c/conversion.c
level_1/fl_conversion/c/conversion.h
level_1/fl_conversion/c/private-conversion.c
level_1/fl_conversion/c/private-conversion.h
level_3/byte_dump/c/byte_dump.c
level_3/fake/c/main/make.c
level_3/fss_identify/c/main/common.c
level_3/iki_read/c/main/common.c
level_3/utf8/c/main/codepoint.c

index 4623a682e47b57c6af7a331dfecaf448627a2596..0eeedebaf3277776237d70541153324398b7c5b9 100644 (file)
@@ -8,39 +8,23 @@ extern "C" {
 #ifndef _di_f_conversion_character_is_binary_
   f_status_t f_conversion_character_is_binary(const f_char_t character) {
 
-    if (character == 0x30 || character == 0x31) {
-      return F_true;
-    }
-
-    return F_false;
+    return (character == 0x30 || character == 0x31) ? F_true : F_false;
   }
 #endif // _di_f_conversion_character_is_binary_
 
 #ifndef _di_f_conversion_character_is_decimal_
   f_status_t f_conversion_character_is_decimal(const f_char_t character) {
 
-    if (character > 0x2f && character < 0x3a) {
-      return F_true;
-    }
-
-    return F_false;
+    return (character > 0x2f && character < 0x3a) ? F_true : F_false;
   }
 #endif // _di_f_conversion_character_is_decimal_
 
 #ifndef _di_f_conversion_character_is_duodecimal_
   f_status_t f_conversion_character_is_duodecimal(const f_char_t character) {
 
-    if (character > 0x2f && character < 0x3a) {
-      return F_true;
-    }
-
-    if (character == 0x41 || character == 0x42) {
-      return F_true;
-    }
-
-    if (character == 0x61 || character == 0x62) {
-      return F_true;
-    }
+    if (character > 0x2f && character < 0x3a) return F_true;
+    if (character == 0x41 || character == 0x42) return F_true;
+    if (character == 0x61 || character == 0x62) return F_true;
 
     return F_false;
   }
@@ -49,17 +33,9 @@ extern "C" {
 #ifndef _di_f_conversion_character_is_hexidecimal_
   f_status_t f_conversion_character_is_hexidecimal(const f_char_t character) {
 
-    if (character > 0x2f && character < 0x3a) {
-      return F_true;
-    }
-
-    if (character > 0x40 && character < 0x47) {
-      return F_true;
-    }
-
-    if (character > 0x60 && character < 0x67) {
-      return F_true;
-    }
+    if (character > 0x2f && character < 0x3a) return F_true;
+    if (character > 0x40 && character < 0x47) return F_true;
+    if (character > 0x60 && character < 0x67) return F_true;
 
     return F_false;
   }
@@ -68,11 +44,7 @@ extern "C" {
 #ifndef _di_f_conversion_character_is_octal_
   f_status_t f_conversion_character_is_octal(const f_char_t character) {
 
-    if (character > 0x2f && character < 0x38) {
-      return F_true;
-    }
-
-    return F_false;
+    return (character > 0x2f && character < 0x38) ? F_true : F_false;
   }
 #endif // _di_f_conversion_character_is_octal_
 
@@ -160,9 +132,7 @@ extern "C" {
       if (!number) return F_status_set_error(F_parameter);
     #endif // _di_level_0_parameter_checking_
 
-    if (character < 0x30 || character > 0x37) {
-      return F_status_set_error(F_number);
-    }
+    if (character < 0x30 || character > 0x37) return F_status_set_error(F_number);
 
     *number = 0xf & character;
 
index 391e08ad4c041a72a758e93362452f8a3096e4a6..ed133e6cb48dfa6d8d057cac1eda5bf15f5c9dc1 100644 (file)
@@ -11,14 +11,13 @@ extern "C" {
       if (!number) return F_status_set_error(F_parameter);
     #endif // _di_level_1_parameter_checking_
 
-    if (!buffer.used || range.start > range.stop) {
-      return F_data_not;
-    }
+    if (!buffer.used || range.start > range.stop) return F_data_not;
 
     if (data.base == 10 || data.base == 16 || data.base == 12 || data.base == 8) {
       return private_fl_conversion_dynamic_to_base_signed(data, buffer.string + range.start, (range.stop - range.start) + 1, number);
     }
-    else if (data.base == 2) {
+
+    if (data.base == 2) {
       return private_fl_conversion_dynamic_to_binary_signed(data.flag, buffer.string + range.start, (range.stop - range.start) + 1, number);
     }
 
@@ -32,14 +31,13 @@ extern "C" {
       if (!number) return F_status_set_error(F_parameter);
     #endif // _di_level_1_parameter_checking_
 
-    if (!buffer.used || range.start > range.stop) {
-      return F_data_not;
-    }
+    if (!buffer.used || range.start > range.stop) return F_data_not;
 
     if (data.base == 10 || data.base == 16 || data.base == 12 || data.base == 8) {
       return private_fl_conversion_dynamic_to_base_unsigned(data, buffer.string + range.start, (range.stop - range.start) + 1, number);
     }
-    else if (data.base == 2) {
+
+    if (data.base == 2) {
       return private_fl_conversion_dynamic_to_binary_unsigned(data.flag, buffer.string + range.start, (range.stop - range.start) + 1, number);
     }
 
@@ -53,9 +51,7 @@ extern "C" {
       if (!number) return F_status_set_error(F_parameter);
     #endif // _di_level_1_parameter_checking_
 
-    if (!buffer.used || range.start > range.stop) {
-      return F_data_not;
-    }
+    if (!buffer.used || range.start > range.stop) return F_data_not;
 
     return private_fl_conversion_dynamic_to_signed_detect(data.flag, buffer.string + range.start, (range.stop - range.start) + 1, number);
   }
@@ -67,9 +63,7 @@ extern "C" {
       if (!number) return F_status_set_error(F_parameter);
     #endif // _di_level_1_parameter_checking_
 
-    if (!buffer.used || range.start > range.stop) {
-      return F_data_not;
-    }
+    if (!buffer.used || range.start > range.stop) return F_data_not;
 
     return private_fl_conversion_dynamic_to_unsigned_detect(data.flag, buffer.string + range.start, (range.stop - range.start) + 1, number);
   }
@@ -81,14 +75,13 @@ extern "C" {
       if (!number) return F_status_set_error(F_parameter);
     #endif // _di_level_1_parameter_checking_
 
-    if (!buffer.used) {
-      return F_data_not;
-    }
+    if (!buffer.used) return F_data_not;
 
     if (data.base == 10 || data.base == 16 || data.base == 12 || data.base == 8) {
       return private_fl_conversion_dynamic_to_base_signed(data, buffer.string, buffer.used, number);
     }
-    else if (data.base == 2) {
+
+    if (data.base == 2) {
       return private_fl_conversion_dynamic_to_binary_signed(data.flag, buffer.string, buffer.used, number);
     }
 
@@ -102,14 +95,13 @@ extern "C" {
       if (!number) return F_status_set_error(F_parameter);
     #endif // _di_level_1_parameter_checking_
 
-    if (!buffer.used) {
-      return F_data_not;
-    }
+    if (!buffer.used) return F_data_not;
 
     if (data.base == 10 || data.base == 16 || data.base == 12 || data.base == 8) {
       return private_fl_conversion_dynamic_to_base_unsigned(data, buffer.string, buffer.used, number);
     }
-    else if (data.base == 2) {
+
+    if (data.base == 2) {
       return private_fl_conversion_dynamic_to_binary_unsigned(data.flag, buffer.string, buffer.used, number);
     }
 
@@ -123,9 +115,7 @@ extern "C" {
       if (!number) return F_status_set_error(F_parameter);
     #endif // _di_level_1_parameter_checking_
 
-    if (!buffer.used) {
-      return F_data_not;
-    }
+    if (!buffer.used) return F_data_not;
 
     return private_fl_conversion_dynamic_to_signed_detect(data.flag, buffer.string, buffer.used, number);
   }
@@ -137,9 +127,7 @@ extern "C" {
       if (!number) return F_status_set_error(F_parameter);
     #endif // _di_level_1_parameter_checking_
 
-    if (!buffer.used) {
-      return F_data_not;
-    }
+    if (!buffer.used) return F_data_not;
 
     return private_fl_conversion_dynamic_to_unsigned_detect(data.flag, buffer.string, buffer.used, number);
   }
index 0c3add7f10edfaa106341989812a41276a1efe78..3d96b4058f5912a1066fe11014ed6b73c3670766 100644 (file)
@@ -82,6 +82,7 @@ extern "C" {
  *
  * @param data
  *   Conversion data for specifying things such as treating this as a negative number.
+ *   This auto-detects the base and negative, ignoring the base number and negative flag.
  * @param buffer
  *   The string to convert.
  * @param range
@@ -173,13 +174,13 @@ extern "C" {
  * @return
  *   F_none on success.
  *   F_data_not if string starts with a null (length is 0).
+ *   F_number_negative on negative value (has a -, such as '-1').
+ *   F_number_positive on positive value (has a +, such as '+1').
  *
  *   F_base_not (with error bit) if no supported or valid base unit is provided.
  *   F_complete_not_utf (with error bit) if an incomplete UTF-8 fragment is found.
  *   F_number (with error bit) if parameter is not a number.
  *   F_number_decimal (with error bit) if number has a decimal digit.
- *   F_number_negative (with error bit) on negative value.
- *   F_number_positive (with error bit) on positive value (has a +, such as '+1', when only '1' is valid here).
  *   F_number_overflow (with error bit) on integer overflow.
  *   F_parameter (with error bit) if a parameter is invalid.
  *
@@ -326,13 +327,13 @@ extern "C" {
  * @return
  *   F_none on success.
  *   F_data_not if string starts with a null (length is 0).
+ *   F_number_negative on negative value (has a -, such as '-1').
+ *   F_number_positive on positive value (has a +, such as '+1').
  *
  *   F_base_not (with error bit) if no supported or valid base unit is provided.
  *   F_complete_not_utf (with error bit) if an incomplete UTF-8 fragment is found.
  *   F_number (with error bit) if parameter is not a number.
  *   F_number_decimal (with error bit) if number has a decimal digit.
- *   F_number_negative (with error bit) on negative value.
- *   F_number_positive (with error bit) on positive value (has a +, such as '+1', when only '1' is valid here).
  *   F_number_overflow (with error bit) on integer overflow.
  *   F_parameter (with error bit) if a parameter is invalid.
  *
index 500fd0efd74e4efe1c5c52fa0944bf6557b1f20d..203743233b1c8cdb85d41b31f7fa1634ae633323 100644 (file)
@@ -14,18 +14,14 @@ extern "C" {
 
     for (f_number_unsigned_t i = 0; i < length; ++i) {
 
-      if (string[i] == f_string_ascii_period_s.string[0]) {
-        return F_status_set_error(F_number_decimal);
-      }
+      if (string[i] == f_string_ascii_period_s.string[0]) return F_status_set_error(F_number_decimal);
 
       if (f_conversion_character_to_binary(string[i], &digit) == F_none) {
         if (digits) {
           ++digits;
 
           if (flag & fl_conversion_data_flag_negative_e) {
-            if (digits > F_conversion_digits_binary_signed_d) {
-              return F_status_set_error(F_number_underflow);
-            }
+            if (digits > F_conversion_digits_binary_signed_d) return F_status_set_error(F_number_underflow);
 
             if (flag & fl_conversion_data_flag_endian_big_e) {
               converted >>= 1;
@@ -44,9 +40,7 @@ extern "C" {
             converted -= digit;
           }
           else {
-            if (digits > F_conversion_digits_binary_signed_d) {
-              return F_status_set_error(F_number_overflow);
-            }
+            if (digits > F_conversion_digits_binary_signed_d) return F_status_set_error(F_number_overflow);
 
             if (flag & fl_conversion_data_flag_endian_big_e) {
               converted >>= 1;
@@ -96,17 +90,13 @@ extern "C" {
 
     for (f_number_unsigned_t i = 0; i < length; ++i) {
 
-      if (string[i] == f_string_ascii_period_s.string[0]) {
-        return F_status_set_error(F_number_decimal);
-      }
+      if (string[i] == f_string_ascii_period_s.string[0]) return F_status_set_error(F_number_decimal);
 
       if (f_conversion_character_to_binary(string[i], &digit) == F_none) {
         if (digits) {
           ++digits;
 
-          if (digits > F_conversion_digits_binary_unsigned_d) {
-            return F_status_set_error(F_number_overflow);
-          }
+          if (digits > F_conversion_digits_binary_unsigned_d) return F_status_set_error(F_number_overflow);
 
           if (flag & fl_conversion_data_flag_endian_big_e) {
             converted >>= 1;
@@ -164,9 +154,7 @@ extern "C" {
 
     for (f_number_unsigned_t i = 0; i < length; ++i) {
 
-      if (string[i] == f_string_ascii_period_s.string[0]) {
-        return F_status_set_error(F_number_decimal);
-      }
+      if (string[i] == f_string_ascii_period_s.string[0]) return F_status_set_error(F_number_decimal);
 
       if (character_to_digit(string[i], &digit) == F_none) {
         if (digits) {
@@ -260,9 +248,7 @@ extern "C" {
 
     for (f_number_unsigned_t i = 0; i < length; ++i) {
 
-      if (string[i] == f_string_ascii_period_s.string[0]) {
-        return F_status_set_error(F_number_decimal);
-      }
+      if (string[i] == f_string_ascii_period_s.string[0]) return F_status_set_error(F_number_decimal);
 
       if (character_to_digit(string[i], &digit) == F_none) {
         if (digits) {
@@ -442,13 +428,7 @@ extern "C" {
       return F_status_set_error(F_number);
     } // for
 
-    if (!mode) {
-      return F_status_set_error(F_number);
-    }
-
-    if (offset >= length) {
-      return F_status_set_error(F_number);
-    }
+    if (!mode || offset >= length) return F_status_set_error(F_number);
 
     fl_conversion_data_t data = macro_fl_conversion_data_t_initialize_1(mode, flag);
 
@@ -568,13 +548,21 @@ extern "C" {
       }
 
       if (string[i] == f_string_ascii_plus_s.string[0]) {
-        ++offset;
-        sign_found = 1;
+        if (!sign_found) {
+          ++offset;
+          sign_found = 1;
+
+          continue;
+        }
       }
 
       if (string[i] == f_string_ascii_minus_s.string[0]) {
-        ++offset;
-        sign_found = -1;
+        if (!sign_found) {
+          ++offset;
+          sign_found = -1;
+
+          continue;
+        }
       }
 
       if (f_conversion_character_is_decimal(string[i]) == F_true) {
@@ -586,13 +574,7 @@ extern "C" {
       return F_status_set_error(F_number);
     } // for
 
-    if (!mode) {
-      return F_status_set_error(F_number);
-    }
-
-    if (offset >= length) {
-      return F_status_set_error(F_number);
-    }
+    if (!mode || offset >= length) return F_status_set_error(F_number);
 
     fl_conversion_data_t data = macro_fl_conversion_data_t_initialize_1(mode, flag);
 
@@ -612,13 +594,7 @@ extern "C" {
 
     // The +/- signs are not allowed.
     if (sign_found) {
-      if (status == F_none) {
-        if (sign_found == -1) {
-          return F_status_set_error(F_number_negative);
-        }
-
-        return F_status_set_error(F_number_positive);
-      }
+      if (status == F_none) return (sign_found == -1) ? F_number_negative : F_number_positive;
 
       return F_status_set_error(F_number);
     }
index 30cff937fd14f61c31b9474e8639478838c52f86..93e6050a0ec3b347ba7a197db2595f61a2f98365 100644 (file)
@@ -198,12 +198,12 @@ extern "C" {
  * @return
  *   F_none on success.
  *   F_data_not if string starts with a null (length is 0).
+ *   F_number_negative on negative value (has a -, such as '-1').
+ *   F_number_positive on positive value (has a +, such as '+1').
  *
  *   F_complete_not_utf (with error bit) if an incomplete UTF-8 fragment is found.
  *   F_number (with error bit) if parameter is not a number.
  *   F_number_decimal (with error bit) if number has a decimal digit.
- *   F_number_negative (with error bit) on negative value.
- *   F_number_positive (with error bit) on positive value (has a +, such as '+1', when only '1' is valid here).
  *   F_number_overflow (with error bit) on integer overflow.
  *   F_parameter (with error bit) if a parameter is invalid.
  *
index 28ec16be1e8dd0a4c1491c031cc3844547ee4365..39844daef8d7d50133ff9f8ed3360b2fba7b104e 100644 (file)
@@ -189,6 +189,11 @@ extern "C" {
 
         status = fl_conversion_dynamic_to_unsigned_detect(fl_conversion_data_base_10_c, data.argv[index], &number);
 
+        // Negative numbers are not supported.
+        if (status == F_number_negative) {
+          status = F_status_set_error(F_number_negative);
+        }
+
         if (F_status_is_error(status) || number < 1 || number >= 0xfb) {
           f_file_stream_lock(main->error.to);
 
@@ -228,6 +233,11 @@ extern "C" {
 
         status = fl_conversion_dynamic_to_unsigned_detect(fl_conversion_data_base_10_c, data.argv[index], &number);
 
+        // Negative numbers are not supported.
+        if (status == F_number_negative) {
+          status = F_status_set_error(F_number_negative);
+        }
+
         if (F_status_is_error(status) || number > F_number_t_size_unsigned_d) {
           f_file_stream_lock(main->error.to);
 
@@ -267,6 +277,11 @@ extern "C" {
 
         status = fl_conversion_dynamic_to_unsigned_detect(fl_conversion_data_base_10_c, data.argv[index], &number);
 
+        // Negative numbers are not supported.
+        if (status == F_number_negative) {
+          status = F_status_set_error(F_number_negative);
+        }
+
         if (F_status_is_error(status) || number < 0 || number > F_number_t_size_unsigned_d) {
           f_file_stream_lock(main->error.to);
 
index 2056840a8a2905f3063f639672faa43b70d24eb5..48dd2d6a69017e32328dc4504347fc08d09649c1 100644 (file)
@@ -60,6 +60,11 @@ extern "C" {
 
     main->setting.state.status = fl_conversion_dynamic_to_unsigned_detect(fl_conversion_data_base_10_c, buffer, &number);
 
+    // Negative numbers are not supported.
+    if (main->setting.state.status == F_number_negative) {
+      main->setting.state.status = F_status_set_error(F_number_negative);
+    }
+
     if (F_status_is_error(main->setting.state.status)) {
 
       // When the buffer is not a number, then check to see if this is a group or owner name.
index aa8a5197f9ad2c4c4e16d35f2a7e0f01b984877c..543c93607518c0b3ce036754e93bef1017b679db 100644 (file)
@@ -112,6 +112,11 @@ extern "C" {
 
       main->setting.state.status = fl_conversion_dynamic_to_unsigned_detect(fl_conversion_data_base_10_c, main->program.parameters.arguments.array[index], &main->setting.line);
 
+      // Negative numbers are not supported.
+      if (main->setting.state.status == F_number_negative) {
+        main->setting.state.status = F_status_set_error(F_number_negative);
+      }
+
       if (F_status_is_error(main->setting.state.status)) {
         if ((main->setting.flag & fss_identify_main_flag_print_first_e) && main->program.message.verbosity > f_console_verbosity_error_e) {
           fll_print_dynamic_raw(f_string_eol_s, main->program.message.to);
index 29cbadea9364c91d05d8e874ac346c468726637b..e3c5f31be703150e61da369290d0a4c50a3264d3 100644 (file)
@@ -135,6 +135,11 @@ extern "C" {
 
       main->setting.state.status = fl_conversion_dynamic_to_unsigned_detect(fl_conversion_data_base_10_c, main->program.parameters.arguments.array[index], &main->setting.at);
 
+      // Negative numbers are not supported.
+      if (main->setting.state.status == F_number_negative) {
+        main->setting.state.status = F_status_set_error(F_number_negative);
+      }
+
       if (F_status_is_error(main->setting.state.status)) {
         main->setting.state.status = F_status_set_error(F_parameter);
 
@@ -168,6 +173,11 @@ extern "C" {
 
       main->setting.state.status = fl_conversion_dynamic_to_unsigned_detect(fl_conversion_data_base_10_c, main->program.parameters.arguments.array[index], &main->setting.line);
 
+      // Negative numbers are not supported.
+      if (main->setting.state.status == F_number_negative) {
+        main->setting.state.status = F_status_set_error(F_number_negative);
+      }
+
       if (F_status_is_error(main->setting.state.status)) {
         main->setting.state.status = F_status_set_error(F_parameter);
 
index 1b8d2ef4d3d83649fe2a13f08f7bccacc6f0bde1..9a0c3c07c791bdc224bbed31c0bbd74f6307f0f6 100644 (file)
@@ -126,6 +126,11 @@ extern "C" {
         main->setting.state.status = fl_conversion_dynamic_to_unsigned_detect(fl_conversion_data_base_10_c, main->setting.text, &number);
 
         raw = (f_utf_char_t) number;
+
+        // Negative numbers are not supported.
+        if (main->setting.state.status == F_number_negative) {
+          main->setting.state.status = F_status_set_error(F_number_negative);
+        }
       }
 
       if (F_status_is_error(main->setting.state.status)) {