]> Kevux Git Server - fll/commitdiff
Update: dependencies changes, project level changes, and includes changes.
authorKevin Day <thekevinday@gmail.com>
Thu, 25 Jun 2020 04:00:41 +0000 (23:00 -0500)
committerKevin Day <thekevinday@gmail.com>
Thu, 25 Jun 2020 04:09:22 +0000 (23:09 -0500)
Review the current dependencies and fix them.
There are some cases where some dependencies are not necessary, such as f_utf.
There are some cases where some dependencies are missing (or newly added).

f_conversion split into f_conversion and fl_conversion.
Update dependencies accordingly.

For simplicity, include the core level_0 project headers, except in a small number of cases.

Add fss header comment in dependencies files.

Add comments in *_array.h headers for level_0 core projects.

Add missing header in f_string.

Replace _di_level_0_parameter_checking_ with _di_level_1_parameter_checking_ where incorrect.

The fl_fss identify functions should instead be in the fll_fss project.

Make sure the IKI projects are in the bootstrap example script.

Remove the fl_console_parameter_to_number_unsigned() and similar functions.
These are just wrappers to another call and is therefore a waste.
Instead, just call the fl_conversion_string_to_number_unsigned() and similar functions.

139 files changed:
build/level_0/settings
build/level_1/settings
build/level_2/settings
build/monolithic/settings
build/scripts/bootstrap-example.sh
level_0/f_color/c/color.h
level_0/f_color/data/build/dependencies
level_0/f_color/data/build/settings
level_0/f_console/c/console.h
level_0/f_console/data/build/dependencies
level_0/f_conversion/c/conversion.c
level_0/f_conversion/c/conversion.h
level_0/f_conversion/data/build/dependencies
level_0/f_directory/c/directory.h
level_0/f_directory/data/build/dependencies
level_0/f_environment/c/environment.h
level_0/f_environment/data/build/dependencies
level_0/f_file/c/file.h
level_0/f_file/data/build/dependencies
level_0/f_fss/data/build/dependencies
level_0/f_iki/c/iki.h
level_0/f_iki/data/build/dependencies
level_0/f_memory/c/memory.h
level_0/f_memory/data/build/dependencies
level_0/f_path/c/path.h
level_0/f_path/data/build/dependencies
level_0/f_path/data/build/settings
level_0/f_pipe/data/build/dependencies
level_0/f_print/c/print.h
level_0/f_print/data/build/dependencies
level_0/f_serialize/c/serialize.h
level_0/f_serialize/data/build/dependencies
level_0/f_socket/c/socket.h
level_0/f_socket/data/build/dependencies
level_0/f_status/c/status_array.h
level_0/f_status/data/build/dependencies
level_0/f_string/data/build/dependencies
level_0/f_string/data/build/settings
level_0/f_type/c/type_array.h
level_0/f_type/data/build/dependencies
level_0/f_utf/c/utf.h
level_0/f_utf/data/build/dependencies
level_1/fl_color/c/color.h
level_1/fl_color/data/build/dependencies
level_1/fl_console/c/console.c
level_1/fl_console/c/console.h
level_1/fl_console/data/build/dependencies
level_1/fl_conversion/c/conversion.c [new file with mode: 0644]
level_1/fl_conversion/c/conversion.h [new file with mode: 0644]
level_1/fl_conversion/data/build/defines [new file with mode: 0644]
level_1/fl_conversion/data/build/dependencies [new file with mode: 0644]
level_1/fl_conversion/data/build/settings [new file with mode: 0644]
level_1/fl_directory/c/directory.h
level_1/fl_directory/data/build/dependencies
level_1/fl_fss/c/fss.c
level_1/fl_fss/c/fss.h
level_1/fl_fss/c/private-fss.c
level_1/fl_fss/c/private-fss.h
level_1/fl_fss/data/build/dependencies
level_1/fl_fss/data/build/settings
level_1/fl_iki/c/iki.h
level_1/fl_iki/data/build/dependencies
level_1/fl_iki/data/build/settings
level_1/fl_print/c/print.h
level_1/fl_print/data/build/dependencies
level_1/fl_status/c/status.h
level_1/fl_status/data/build/dependencies
level_1/fl_string/c/string.h
level_1/fl_string/data/build/dependencies
level_1/fl_utf/c/utf.h
level_1/fl_utf/data/build/dependencies
level_1/fl_utf_file/c/utf_file.h
level_1/fl_utf_file/data/build/dependencies
level_2/fll_execute/c/execute.h
level_2/fll_execute/data/build/dependencies
level_2/fll_execute/data/build/settings
level_2/fll_file/c/file.h
level_2/fll_file/data/build/dependencies
level_2/fll_file/data/build/settings
level_2/fll_fss/c/fss.c
level_2/fll_fss/c/fss.h
level_2/fll_fss/c/private-fss.c [new file with mode: 0644]
level_2/fll_fss/c/private-fss.h [new file with mode: 0644]
level_2/fll_fss/data/build/dependencies
level_2/fll_fss/data/build/settings
level_2/fll_program/c/program.h
level_2/fll_program/data/build/dependencies
level_2/fll_status/c/status.h
level_2/fll_status/data/build/dependencies
level_3/byte_dump/c/byte_dump.c
level_3/byte_dump/c/byte_dump.h
level_3/byte_dump/data/build/dependencies
level_3/byte_dump/data/build/settings
level_3/fake/c/fake.h
level_3/fake/data/build/dependencies
level_3/fake/data/build/settings
level_3/firewall/c/firewall.h
level_3/firewall/data/build/dependencies
level_3/firewall/data/build/settings
level_3/fss_basic_list_read/c/fss_basic_list_read.h
level_3/fss_basic_list_read/c/private-fss_basic_list_read.c
level_3/fss_basic_list_read/data/build/dependencies
level_3/fss_basic_list_read/data/build/settings
level_3/fss_basic_list_write/c/fss_basic_list_write.h
level_3/fss_basic_list_write/data/build/dependencies
level_3/fss_basic_list_write/data/build/settings
level_3/fss_basic_read/c/fss_basic_read.h
level_3/fss_basic_read/c/private-fss_basic_read.c
level_3/fss_basic_read/data/build/dependencies
level_3/fss_basic_read/data/build/settings
level_3/fss_basic_write/c/fss_basic_write.h
level_3/fss_basic_write/data/build/dependencies
level_3/fss_basic_write/data/build/settings
level_3/fss_extended_list_read/c/fss_extended_list_read.h
level_3/fss_extended_list_read/c/private-fss_extended_list_read.c
level_3/fss_extended_list_read/data/build/dependencies
level_3/fss_extended_list_read/data/build/settings
level_3/fss_extended_read/c/fss_extended_read.h
level_3/fss_extended_read/c/private-fss_extended_read.c
level_3/fss_extended_read/data/build/dependencies
level_3/fss_extended_read/data/build/settings
level_3/fss_extended_write/c/fss_extended_write.h
level_3/fss_extended_write/data/build/dependencies
level_3/fss_extended_write/data/build/settings
level_3/fss_status_code/c/fss_status_code.h
level_3/fss_status_code/c/private-fss_status_code.c
level_3/fss_status_code/data/build/dependencies
level_3/fss_status_code/data/build/settings
level_3/iki_read/c/iki_read.c
level_3/iki_read/c/iki_read.h
level_3/iki_read/data/build/dependencies
level_3/iki_read/data/build/settings
level_3/init/c/init.h
level_3/init/data/build/dependencies
level_3/init/data/build/settings
level_3/status_code/c/private-status_code.c
level_3/status_code/c/status_code.h
level_3/status_code/data/build/dependencies
level_3/status_code/data/build/settings

index 0016f9e728bdfa0fa07dfab014084beaadd9adf4..3dd0c74fe48f8c28d72b550957f5609f87c0373e 100644 (file)
@@ -22,7 +22,7 @@ build_libraries -lc
 build_libraries-level
 build_sources_library console.c conversion.c directory.c private-directory.c environment.c private-environment.c file.c private-file.c fss.c iki.c memory.c path.c pipe.c print.c serialize.c private-serialize.c socket.c utf.c private-utf.c
 build_sources_program
-build_sources_headers color.h console.h conversion.h directory.h directory_type.h environment.h file.h fss.h fss-common.h fss-named.h fss-nest.h fss-set.h iki.h iki-common.h iki-common.h memory.h memory-structure.h path.h pipe.h print.h serialize.h socket.h status.h status_array.h string.h string-common.h string-dynamic.h string-map.h string-quantity.h string-range.h type.h type_array.h utf.h utf-common.h
+build_sources_headers color.h console.h conversion.h directory.h directory_type.h environment.h file.h fss.h fss-common.h fss-named.h fss-nest.h fss-set.h iki.h iki-common.h memory.h memory-structure.h path.h pipe.h print.h serialize.h socket.h status.h status_array.h string.h string-common.h string-dynamic.h string-map.h string-quantity.h string-range.h type.h type_array.h utf.h utf-common.h
 build_sources_script
 build_sources_setting
 build_script yes
index 82170e80728fc63736b5efecb33b1045b5855b6e..b996d140532f815aececd31c25343ecfff10e37e 100644 (file)
@@ -20,9 +20,9 @@ build_language c
 build_linker ar
 build_libraries -lc
 build_libraries-level -lfll_0
-build_sources_library color.c console.c directory.c private-directory.c fss.c private-fss.c fss_basic.c fss_basic_list.c fss_extended.c fss_extended_list.c iki.c print.c status.c string.c private-string.c utf.c private-utf.c utf_file.c private-utf_file.c
+build_sources_library color.c console.c conversion.c directory.c private-directory.c fss.c private-fss.c fss_basic.c fss_basic_list.c fss_extended.c fss_extended_list.c iki.c print.c status.c string.c private-string.c utf.c private-utf.c utf_file.c private-utf_file.c
 build_sources_program
-build_sources_headers color.h console.h directory.h fss.h fss_basic.h fss_basic_list.h fss_extended.h fss_extended_list.h fss_macro.h fss_status.h iki.h print.h status.h string.h utf.h utf_file.h
+build_sources_headers color.h console.h conversion.h directory.h fss.h fss_basic.h fss_basic_list.h fss_extended.h fss_extended_list.h fss_macro.h fss_status.h iki.h print.h status.h string.h utf.h utf_file.h
 build_sources_script
 build_sources_setting
 build_script yes
index af6cf01f05bd367506003b2861e947c34c2535c4..a77c00c08cc18cc546e8fbd47b59bc51d2f96954 100644 (file)
@@ -20,7 +20,7 @@ build_language c
 build_linker ar
 build_libraries -lc
 build_libraries-level -lfll_1 -lfll_0
-build_sources_library execute.c private-execute.c file.c fss.c fss_basic.c fss_basic_list.c fss_extended.c fss_extended_list.c fss_status.c program.c status.c
+build_sources_library execute.c private-execute.c file.c fss.c private-fss.c fss_basic.c fss_basic_list.c fss_extended.c fss_extended_list.c fss_status.c program.c status.c
 build_sources_program
 build_sources_headers execute.h file.h fss.h fss_basic.h fss_basic_list.h fss_extended.h fss_extended_list.h fss_status.h program.h status.h
 build_sources_script
index 8edfee6730b3aed1ef434512ead23c2b2edf78e8..541ec129b8fff79c9417d2458820644be29186b7 100644 (file)
@@ -20,9 +20,9 @@ build_language c
 build_linker ar
 build_libraries -lc
 build_libraries-monolithic
-build_sources_library level_0/console.c level_0/conversion.c level_0/directory.c level_0/private-directory.c level_0/environment.c level_0/private-environment.c level_0/file.c level_0/private-file.c level_0/fss.c level_0/iki.c level_0/memory.c level_0/path.c level_0/pipe.c level_0/print.c level_0/serialize.c level_0/private-serialize.c level_0/socket.c level_0/utf.c level_0/private-utf.c level_1/color.c level_1/console.c level_1/directory.c level_1/private-directory.c level_1/fss.c level_1/private-fss.c level_1/fss_basic.c level_1/fss_basic_list.c level_1/fss_extended.c level_1/fss_extended_list.c level_1/print.c level_1/iki.c level_1/status.c level_1/string.c level_1/private-string.c level_1/utf.c level_1/private-utf.c level_1/utf_file.c level_1/private-utf_file.c level_2/execute.c level_2/private-execute.c level_2/file.c level_2/fss.c level_2/fss_basic.c level_2/fss_basic_list.c level_2/fss_extended.c level_2/fss_extended_list.c level_2/fss_status.c level_2/program.c level_2/status.c
+build_sources_library level_0/console.c level_0/conversion.c level_0/directory.c level_0/private-directory.c level_0/environment.c level_0/private-environment.c level_0/file.c level_0/private-file.c level_0/fss.c level_0/iki.c level_0/memory.c level_0/path.c level_0/pipe.c level_0/print.c level_0/serialize.c level_0/private-serialize.c level_0/socket.c level_0/utf.c level_0/private-utf.c level_1/color.c level_1/console.c level_1/conversion.c level_1/directory.c level_1/private-directory.c level_1/fss.c level_1/private-fss.c level_1/fss_basic.c level_1/fss_basic_list.c level_1/fss_extended.c level_1/fss_extended_list.c level_1/iki.c level_1/print.c level_1/status.c level_1/string.c level_1/private-string.c level_1/utf.c level_1/private-utf.c level_1/utf_file.c level_1/private-utf_file.c level_2/execute.c level_2/private-execute.c level_2/file.c level_2/fss.c level_2/private-fss.c level_2/fss_basic.c level_2/fss_basic_list.c level_2/fss_extended.c level_2/fss_extended_list.c level_2/fss_status.c level_2/program.c level_2/status.c
 build_sources_program
-build_sources_headers level_0/color.h level_0/console.h level_0/conversion.h level_0/directory.h level_0/directory_type.h level_0/environment.h level_0/file.h level_0/fss.h level_0/fss-common.h level_0/fss-named.h level_0/fss-nest.h level_0/fss-set.h level_0/iki.h level_0/iki-common.h level_0/iki-common.h level_0/memory.h level_0/memory-structure.h level_0/path.h level_0/pipe.h level_0/print.h level_0/serialize.h level_0/socket.h level_0/status.h level_0/status_array.h level_0/string.h level_0/string-common.h level_0/string-dynamic.h level_0/string-map.h level_0/string-quantity.h level_0/string-range.h level_0/type.h level_0/type_array.h level_0/utf.h level_0/utf-common.h level_1/color.h level_1/console.h level_1/directory.h level_1/fss.h level_1/fss_basic.h level_1/fss_basic_list.h level_1/fss_extended.h level_1/fss_extended_list.h level_1/fss_macro.h level_1/fss_status.h level_1/print.h level_1/iki.h level_1/status.h level_1/string.h level_1/utf.h level_1/utf_file.h level_2/execute.h level_2/file.h level_2/fss.h level_2/fss_basic.h level_2/fss_basic_list.h level_2/fss_extended.h level_2/fss_extended_list.h level_2/fss_status.h level_2/program.h level_2/status.h
+build_sources_headers level_0/color.h level_0/console.h level_0/conversion.h level_0/directory.h level_0/directory_type.h level_0/environment.h level_0/file.h level_0/fss.h level_0/fss-common.h level_0/fss-named.h level_0/fss-nest.h level_0/fss-set.h level_0/iki.h level_0/iki-common.h level_0/memory.h level_0/memory-structure.h level_0/path.h level_0/pipe.h level_0/print.h level_0/serialize.h level_0/socket.h level_0/status.h level_0/status_array.h level_0/string.h level_0/string-common.h level_0/string-dynamic.h level_0/string-map.h level_0/string-quantity.h level_0/string-range.h level_0/type.h level_0/type_array.h level_0/utf.h level_0/utf-common.h level_1/color.h level_1/console.h level_1/conversion.h level_1/directory.h level_1/fss.h level_1/fss_basic.h level_1/fss_basic_list.h level_1/fss_extended.h level_1/fss_extended_list.h level_1/fss_macro.h level_1/fss_status.h level_1/iki.h level_1/print.h level_1/status.h level_1/string.h level_1/utf.h level_1/utf_file.h level_2/execute.h level_2/file.h level_2/fss.h level_2/fss_basic.h level_2/fss_basic_list.h level_2/fss_extended.h level_2/fss_extended_list.h level_2/fss_status.h level_2/program.h level_2/status.h
 build_sources_script
 build_sources_setting
 build_script yes
index 6e4ae0747a9994faf130b170821c5c67e47b1383..abd4f9633a82c5e19bf60344ae1b354b42088906 100644 (file)
@@ -23,7 +23,7 @@ if [[ $1 == "individual" ]] ; then
   bash build/scripts/package.sh build -i
 
   if [[ $? -eq 0 ]] ; then
-    for i in f_type f_status f_memory f_string f_utf f_color f_console f_conversion f_directory f_environment f_file f_fss f_path f_pipe f_print f_serialize f_socket fl_color fl_console fl_directory fl_fss fl_print fl_status fl_string fl_utf fl_utf_file fll_execute fll_file fll_fss fll_program fll_status ; do
+    for i in f_type f_status f_memory f_string f_utf f_color f_console f_conversion f_directory f_environment f_file f_fss f_iki f_path f_pipe f_print f_serialize f_socket fl_color fl_console fl_conversion fl_directory fl_fss fl_iki fl_print fl_status fl_string fl_utf fl_utf_file fll_execute fll_file fll_fss fll_program fll_status ; do
       echo && echo "Processing $i." &&
 
       cd package/individual/$i-$2/ &&
index 4d7e16463b249f41659416e73a2ce3f4a08598fb..c1da0638e6a8a2124db92167c0ca45c974cd0b02 100644 (file)
@@ -12,7 +12,6 @@
 #define _F_color_h
 
 // fll-0 includes
-#include <level_0/string.h>
 #include <level_0/type.h>
 
 #ifdef __cplusplus
index 9a8639aaad43367d7e78251ceb42362c7f24b364..1e9ec2ac719442faed18ae0ee0c8fe3422154d67 100644 (file)
@@ -1,3 +1,3 @@
+# fss-0000
+
 f_type
-f_memory
-f_string
index c9dbab053ac599a431fadad4c22a3d82258d0404..4d9de0bd2d2015f7b1a22eb01d0f7d9a29241b4c 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lf_memory
+build_libraries-individual
 build_sources_library
 build_sources_program
 build_sources_headers color.h
index 645118abb87459f0c487d301e5811413fd0a76a9..62129f79f74a2ff6ad983a89bb280f400998c631 100644 (file)
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
 
 #ifdef __cplusplus
index 13b45c70749e2d3516b47e95d38129f780366064..deb9037d103893780c780e414040072836998ee6 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index 7b9cf517fbe773ec4f19bead7e0439b9ccc2cde1..a36a3881e23e197f072f3de8eeaf594777c985a6 100644 (file)
@@ -204,860 +204,6 @@ extern "C" {
   }
 #endif // _di_f_conversion_character_to_octal_
 
-#ifndef _di_f_conversion_string_to_binary_signed_
-  f_return_status f_conversion_string_to_binary_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative) {
-    #ifndef _di_level_0_parameter_checking_
-      if (string == 0) return F_status_set_error(F_parameter);
-      if (number == 0) return F_status_set_error(F_parameter);
-      if (range.start < 0) return F_status_set_error(F_parameter);
-      if (range.stop < range.start) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_
-
-    if (string[0] == 0) {
-      return F_data_not;
-    }
-
-    uint8_t scale = 0;
-    f_number_unsigned digit = 0;
-    f_number_unsigned converted = 0;
-
-    for (f_string_length i = range.start; i <= range.stop; i++) {
-      if (f_conversion_character_to_binary(string[i], &digit) == F_none) {
-        if (scale) {
-          scale++;
-
-          if (negative) {
-            if (scale > f_conversion_scale_binary_signed) {
-              return F_status_set_error(F_number_underflow);
-            }
-
-            converted <<= 1;
-            converted -= digit;
-          }
-          else {
-            if (scale > f_conversion_scale_binary_signed) {
-              return F_status_set_error(F_number_overflow);
-            }
-
-            converted <<= 1;
-            converted += digit;
-          }
-        }
-        else if (digit != 0) {
-          scale = 1;
-
-          if (negative) {
-            converted = 0 - digit;
-          }
-          else {
-            converted = digit;
-          }
-        }
-      }
-      else if (string[i] != 0) {
-        return F_status_set_error(F_number);
-      }
-    } // for
-
-    *number = converted;
-    return F_none;
-  }
-#endif // _di_f_conversion_string_to_binary_signed_
-
-#ifndef _di_f_conversion_string_to_binary_unsigned_
-  f_return_status f_conversion_string_to_binary_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range) {
-    #ifndef _di_level_0_parameter_checking_
-      if (string == 0) return F_status_set_error(F_parameter);
-      if (number == 0) return F_status_set_error(F_parameter);
-      if (range.start < 0) return F_status_set_error(F_parameter);
-      if (range.stop < range.start) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_
-
-    if (string[0] == 0) {
-      return F_data_not;
-    }
-
-    uint8_t scale = 0;
-    f_number_unsigned digit = 0;
-    f_number_unsigned converted = 0;
-
-    for (f_string_length i = range.start; i <= range.stop; i++) {
-      if (f_conversion_character_to_binary(string[i], &digit) == F_none) {
-        if (scale) {
-          scale++;
-
-          if (scale > f_conversion_scale_binary_unsigned) {
-            return F_status_set_error(F_number_overflow);
-          }
-
-          converted <<= 1;
-          converted += digit;
-        }
-        else if (digit != 0) {
-          scale = 1;
-          converted = digit;
-        }
-      }
-      else if (string[i] != 0) {
-        return F_status_set_error(F_number);
-      }
-    } // for
-
-    *number = converted;
-    return F_none;
-  }
-#endif // _di_f_conversion_string_to_binary_unsigned_
-
-#ifndef _di_f_conversion_string_to_decimal_signed_
-  f_return_status f_conversion_string_to_decimal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative) {
-    #ifndef _di_level_0_parameter_checking_
-      if (string == 0) return F_status_set_error(F_parameter);
-      if (number == 0) return F_status_set_error(F_parameter);
-      if (range.start < 0) return F_status_set_error(F_parameter);
-      if (range.stop < range.start) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_
-
-    if (string[0] == 0) {
-      return F_data_not;
-    }
-
-    uint8_t scale = 0;
-    f_number_unsigned digit = 0;
-    f_number_unsigned converted = 0;
-
-    for (f_string_length i = range.start; i <= range.stop; i++) {
-      if (f_conversion_character_to_decimal(string[i], &digit) == F_none) {
-
-        if (scale) {
-          scale++;
-
-          if (negative) {
-            if (scale > f_conversion_scale_decimal_signed) {
-              if ((converted * 10) - digit < f_type_number_size_negative || (converted * 10) - digit > converted) {
-                return F_status_set_error(F_number_underflow);
-              }
-            }
-
-            converted *= 10;
-            converted -= digit;
-          }
-          else {
-            if (scale > f_conversion_scale_decimal_signed) {
-              if ((converted * 10) + digit > f_type_number_size_positive || (converted * 10) + digit < converted) {
-                return F_status_set_error(F_number_overflow);
-              }
-            }
-
-            converted *= 10;
-            converted += digit;
-          }
-        }
-        else if (digit != 0) {
-          scale = 1;
-
-          if (negative) {
-            converted = 0 - digit;
-          }
-          else {
-            converted = digit;
-          }
-        }
-      }
-      else if (string[i] != 0) {
-        return F_status_set_error(F_number);
-      }
-    } // for
-
-    *number = converted;
-    return F_none;
-  }
-#endif // _di_f_conversion_string_to_decimal_signed_
-
-#ifndef _di_f_conversion_string_to_decimal_unsigned_
-  f_return_status f_conversion_string_to_decimal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range) {
-    #ifndef _di_level_0_parameter_checking_
-      if (string == 0) return F_status_set_error(F_parameter);
-      if (number == 0) return F_status_set_error(F_parameter);
-      if (range.start < 0) return F_status_set_error(F_parameter);
-      if (range.stop < range.start) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_
-
-    if (string[0] == 0) {
-      return F_data_not;
-    }
-
-    uint8_t scale = 0;
-    f_number_unsigned digit = 0;
-    f_number_unsigned converted = 0;
-
-    for (f_string_length i = range.start; i <= range.stop; i++) {
-      if (f_conversion_character_to_decimal(string[i], &digit) == F_none) {
-
-        if (scale) {
-          scale++;
-
-          if (scale > f_conversion_scale_decimal_unsigned) {
-            if ((converted * 10) + digit > f_type_number_size_unsigned || (converted * 10) + digit < converted) {
-              return F_status_set_error(F_number_overflow);
-            }
-          }
-
-          converted *= 10;
-          converted += digit;
-        }
-        else if (digit != 0) {
-          scale = 1;
-          converted = digit;
-        }
-      }
-      else if (string[i] != 0) {
-        return F_status_set_error(F_number);
-      }
-    } // for
-
-    *number = converted;
-    return F_none;
-  }
-#endif // _di_f_conversion_string_to_decimal_unsigned_
-
-#ifndef _di_f_conversion_string_to_duodecimal_signed_
-  f_return_status f_conversion_string_to_duodecimal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative) {
-    #ifndef _di_level_0_parameter_checking_
-      if (string == 0) return F_status_set_error(F_parameter);
-      if (number == 0) return F_status_set_error(F_parameter);
-      if (range.start < 0) return F_status_set_error(F_parameter);
-      if (range.stop < range.start) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_
-
-    if (string[0] == 0) {
-      return F_data_not;
-    }
-
-    uint8_t scale = 0;
-    f_number_unsigned digit = 0;
-    f_number_unsigned converted = 0;
-
-    for (f_string_length i = range.start; i <= range.stop; i++) {
-      if (f_conversion_character_to_duodecimal(string[i], &digit) == F_none) {
-
-        if (scale) {
-          scale++;
-
-          if (negative) {
-            if (scale > f_conversion_scale_duodecimal_signed) {
-              if ((converted * 12) - digit < f_type_number_size_negative || (converted * 12) - digit > converted) {
-                return F_status_set_error(F_number_underflow);
-              }
-            }
-
-            converted *= 12;
-            converted -= digit;
-          }
-          else {
-            if (scale > f_conversion_scale_duodecimal_signed) {
-              if ((converted * 12) + digit > f_type_number_size_positive || (converted * 12) + digit < converted) {
-                return F_status_set_error(F_number_overflow);
-              }
-            }
-
-            converted *= 12;
-            converted += digit;
-          }
-        }
-        else if (digit != 0) {
-          scale = 1;
-
-          if (negative) {
-            converted = 0 - digit;
-          }
-          else {
-            converted = digit;
-          }
-        }
-      }
-      else if (string[i] != 0) {
-        return F_status_set_error(F_number);
-      }
-    } // for
-
-    *number = converted;
-    return F_none;
-  }
-#endif // _di_f_conversion_string_to_duodecimal_signed_
-
-#ifndef _di_f_conversion_string_to_duodecimal_unsigned_
-  f_return_status f_conversion_string_to_duodecimal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range) {
-    #ifndef _di_level_0_parameter_checking_
-      if (string == 0) return F_status_set_error(F_parameter);
-      if (number == 0) return F_status_set_error(F_parameter);
-      if (range.start < 0) return F_status_set_error(F_parameter);
-      if (range.stop < range.start) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_
-
-    if (string[0] == 0) {
-      return F_data_not;
-    }
-
-    uint8_t scale = 0;
-    f_number_unsigned digit = 0;
-    f_number_unsigned converted = 0;
-
-    for (f_string_length i = range.start; i <= range.stop; i++) {
-      if (f_conversion_character_to_duodecimal(string[i], &digit) == F_none) {
-
-        if (scale) {
-          scale++;
-
-          if (scale > f_conversion_scale_duodecimal_unsigned) {
-            if ((converted * 12) + digit > f_type_number_size_unsigned || (converted * 12) + digit < converted) {
-              return F_status_set_error(F_number_overflow);
-            }
-          }
-
-          converted *= 12;
-          converted += digit;
-        }
-        else if (digit != 0) {
-          scale = 1;
-          converted = digit;
-        }
-      }
-      else if (string[i] != 0) {
-        return F_status_set_error(F_number);
-      }
-    } // for
-
-    *number = converted;
-    return F_none;
-  }
-#endif // _di_f_conversion_string_to_duodecimal_unsigned_
-
-#ifndef _di_f_conversion_string_to_hexidecimal_signed_
-  f_return_status f_conversion_string_to_hexidecimal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative) {
-    #ifndef _di_level_0_parameter_checking_
-      if (string == 0) return F_status_set_error(F_parameter);
-      if (number == 0) return F_status_set_error(F_parameter);
-      if (range.start < 0) return F_status_set_error(F_parameter);
-      if (range.stop < range.start) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_
-
-    if (string[0] == 0) {
-      return F_data_not;
-    }
-
-    uint8_t scale = 0;
-    f_number_unsigned digit = 0;
-    f_number_unsigned converted = 0;
-
-    for (f_string_length i = range.start; i <= range.stop; i++) {
-      if (f_conversion_character_to_hexidecimal(string[i], &digit) == F_none) {
-
-        if (scale) {
-          scale++;
-
-          if (negative) {
-            if (scale > f_conversion_scale_hexidecimal_signed) {
-              if ((converted << 4) - digit < f_type_number_size_negative || (converted << 4) - digit > converted) {
-                return F_status_set_error(F_number_underflow);
-              }
-            }
-
-            converted <<= 4;
-            converted -= digit;
-          }
-          else {
-            if (scale > f_conversion_scale_hexidecimal_signed) {
-              if ((converted << 4) + digit > f_type_number_size_positive || (converted << 4) + digit < converted) {
-                return F_status_set_error(F_number_overflow);
-              }
-            }
-
-            converted <<= 4;
-            converted += digit;
-          }
-        }
-        else if (digit != 0) {
-          scale = 1;
-
-          if (negative) {
-            converted = 0 - digit;
-          }
-          else {
-            converted = digit;
-          }
-        }
-      }
-      else if (string[i] != 0) {
-        return F_status_set_error(F_number);
-      }
-    } // for
-
-    *number = converted;
-    return F_none;
-  }
-#endif // _di_f_conversion_string_to_hexidecimal_signed_
-
-#ifndef _di_f_conversion_string_to_hexidecimal_unsigned_
-  f_return_status f_conversion_string_to_hexidecimal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range) {
-    #ifndef _di_level_0_parameter_checking_
-      if (string == 0) return F_status_set_error(F_parameter);
-      if (number == 0) return F_status_set_error(F_parameter);
-      if (range.start < 0) return F_status_set_error(F_parameter);
-      if (range.stop < range.start) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_
-
-    if (string[0] == 0) {
-      return F_data_not;
-    }
-
-    uint8_t scale = 0;
-    f_number_unsigned digit = 0;
-    f_number_unsigned converted = 0;
-
-    for (f_string_length i = range.start; i <= range.stop; i++) {
-      if (f_conversion_character_to_hexidecimal(string[i], &digit) == F_none) {
-
-        if (scale) {
-          scale++;
-
-          if (scale > f_conversion_scale_hexidecimal_unsigned) {
-            if ((converted << 4) + digit > f_type_number_size_unsigned || (converted << 4) + digit < converted) {
-              return F_status_set_error(F_number_overflow);
-            }
-          }
-
-          converted <<= 4;
-          converted += digit;
-        }
-        else if (digit != 0) {
-          scale = 1;
-          converted = digit;
-        }
-      }
-      else if (string[i] != 0) {
-        return F_status_set_error(F_number);
-      }
-    } // for
-
-    *number = converted;
-    return F_none;
-  }
-#endif // _di_f_conversion_string_to_hexidecimal_unsigned_
-
-#ifndef _di_f_conversion_string_to_octal_signed_
-  f_return_status f_conversion_string_to_octal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative) {
-    #ifndef _di_level_0_parameter_checking_
-      if (string == 0) return F_status_set_error(F_parameter);
-      if (number == 0) return F_status_set_error(F_parameter);
-      if (range.start < 0) return F_status_set_error(F_parameter);
-      if (range.stop < range.start) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_
-
-    if (string[0] == 0) {
-      return F_data_not;
-    }
-
-    uint8_t scale = 0;
-    f_number_unsigned digit = 0;
-    f_number_unsigned converted = 0;
-
-    for (f_string_length i = range.start; i <= range.stop; i++) {
-      if (f_conversion_character_to_octal(string[i], &digit) == F_none) {
-
-        if (scale) {
-          scale++;
-
-          if (negative) {
-            if (scale > f_conversion_scale_octal_signed) {
-              if ((converted << 3) - digit < f_type_number_size_negative || (converted << 3) - digit > converted) {
-                return F_status_set_error(F_number_underflow);
-              }
-            }
-
-            converted <<= 3;
-            converted -= digit;
-          }
-          else {
-            if (scale > f_conversion_scale_octal_signed) {
-              if ((converted << 3) + digit > f_type_number_size_positive || (converted << 3) + digit < converted) {
-                return F_status_set_error(F_number_overflow);
-              }
-            }
-
-            converted <<= 3;
-            converted += digit;
-          }
-        }
-        else if (digit != 0) {
-          scale = 1;
-
-          if (negative) {
-            converted = 0 - digit;
-          }
-          else {
-            converted = digit;
-          }
-        }
-      }
-      else if (string[i] != 0) {
-        return F_status_set_error(F_number);
-      }
-    } // for
-
-    *number = converted;
-    return F_none;
-  }
-#endif // _di_f_conversion_string_to_octal_signed_
-
-#ifndef _di_f_conversion_string_to_octal_unsigned_
-  f_return_status f_conversion_string_to_octal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range) {
-    #ifndef _di_level_0_parameter_checking_
-      if (string == 0) return F_status_set_error(F_parameter);
-      if (number == 0) return F_status_set_error(F_parameter);
-      if (range.start < 0) return F_status_set_error(F_parameter);
-      if (range.stop < range.start) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_
-
-    if (string[0] == 0) {
-      return F_data_not;
-    }
-
-    uint8_t scale = 0;
-    f_number_unsigned digit = 0;
-    f_number_unsigned converted = 0;
-
-    for (f_string_length i = range.start; i <= range.stop; i++) {
-      if (f_conversion_character_to_octal(string[i], &digit) == F_none) {
-
-        if (scale) {
-          scale++;
-
-          if (scale > f_conversion_scale_octal_unsigned) {
-            if ((converted << 3) + digit > f_type_number_size_unsigned || (converted << 3) + digit < converted) {
-              return F_status_set_error(F_number_overflow);
-            }
-          }
-
-          converted <<= 3;
-          converted += digit;
-        }
-        else if (digit != 0) {
-          scale = 1;
-          converted = digit;
-        }
-      }
-      else if (string[i] != 0) {
-        return F_status_set_error(F_number);
-      }
-    } // for
-
-    *number = converted;
-    return F_none;
-  }
-#endif // _di_f_conversion_string_to_octal_unsigned_
-
-#ifndef _di_f_conversion_string_to_number_signed_
-  f_return_status f_conversion_string_to_number_signed(const f_string string, f_number_signed *number, const f_string_range range) {
-    #ifndef _di_level_0_parameter_checking_
-      if (string == 0) return F_status_set_error(F_parameter);
-      if (number == 0) return F_status_set_error(F_parameter);
-      if (range.start < 0) return F_status_set_error(F_parameter);
-      if (range.stop < range.start) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_
-
-    if (string[0] == 0) {
-      return F_data_not;
-    }
-
-    uint8_t width = 0;
-    uint8_t width_max = 0;
-    uint8_t mode = 0;
-    int8_t vector = 0; // 0 for assumed positive, 1 for explicit positive, -1 for negative.
-    f_string_length j = 0;
-    f_string_length offset = 0;
-    f_status status = F_none;
-
-    for (f_string_length i = range.start; i <= range.stop; i++) {
-      width = f_macro_utf_byte_width_is(string[i]);
-
-      if (width == 0) {
-        if (isspace(string[i])) {
-          if (mode == 0 && vector == 0) {
-            offset++;
-            continue;
-          }
-
-          return F_status_set_error(F_number);
-        }
-      }
-      else {
-        if (mode == 0 && vector == 0) {
-          width_max = (range.stop - i) + 1;
-
-          status = f_utf_is_whitespace(string + i, width_max);
-
-          if (status == F_true) {
-            offset = i + 1;
-            continue;
-          }
-
-          if (F_status_is_error(status)) {
-            if (status == F_status_set_error(F_maybe)) {
-              status = F_status_set_error(F_incomplete_utf);
-            }
-
-            return status;
-          }
-        }
-
-        return F_status_set_error(F_number);
-      }
-
-      if (string[i] == 0x30) {
-        j = i + 1;
-
-        // Immediate next value must be either a number, 'x', 'X', 'd', 'D', 'o', 'O', 'b', or 'B'.
-        if (j > range.stop) {
-          *number = 0;
-          return F_none;
-        }
-        else if (string[j] > 0x29 && string[j] < 0x3a) {
-          mode = 10;
-        }
-        else if (string[j] == 0x78 || string[j] == 0x58) {
-          mode = 16;
-          offset += 2;
-        }
-        else if (string[j] == 0x44 || string[j] == 0x64) {
-          mode = 12;
-          offset += 2;
-        }
-        else if (string[j] == 0x6f || string[j] == 0x4f) {
-          mode = 8;
-          offset += 2;
-        }
-        else if (string[j] == 0x62 || string[j] == 0x42) {
-          mode = 2;
-          offset += 2;
-        }
-        else {
-          return F_status_set_error(F_number);
-        }
-
-        break;
-      }
-
-      // plus sign is only allowed as the first non-whitespace character.
-      if (string[i] == 0x2b) {
-        if (mode == 0 && vector == 0) {
-          vector = 1;
-          offset++;
-        }
-        else {
-          return F_status_set_error(F_number);
-        }
-      }
-
-      // negative sign is not allowed.
-      if (string[i] == 0x2d) {
-        if (mode == 0 && vector == 0) {
-          vector = -1;
-          offset++;
-        }
-        else {
-          return F_status_set_error(F_number);
-        }
-      }
-
-      if (f_conversion_character_is_decimal(string[i]) == F_true) {
-        mode = 10;
-        break;
-      }
-
-      return F_status_set_error(F_number);
-    } // for
-
-    if (mode == 0) {
-      return F_status_set_error(F_number);
-    }
-
-    f_string_range location_offset = f_string_range_initialize;
-    location_offset.start = range.start + offset;
-    location_offset.stop = range.stop;
-
-    if (mode == 10) {
-      return f_conversion_string_to_decimal_signed(string, number, location_offset, vector == -1);
-    }
-
-    if (mode == 16) {
-      return f_conversion_string_to_hexidecimal_signed(string, number, location_offset, vector == -1);
-    }
-
-    if (mode == 12) {
-      return f_conversion_string_to_duodecimal_signed(string, number, location_offset, vector == -1);
-    }
-
-    if (mode == 8) {
-      return f_conversion_string_to_octal_signed(string, number, location_offset, vector == -1);
-    }
-
-    return f_conversion_string_to_binary_signed(string, number, location_offset, vector == -1);
-  }
-#endif // _di_f_conversion_string_to_number_signed_
-
-#ifndef _di_f_conversion_string_to_number_unsigned_
-  f_return_status f_conversion_string_to_number_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range) {
-    #ifndef _di_level_0_parameter_checking_
-      if (string == 0) return F_status_set_error(F_parameter);
-      if (number == 0) return F_status_set_error(F_parameter);
-      if (range.start > range.stop) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_
-
-    if (string[0] == 0) {
-      return F_data_not;
-    }
-
-    uint8_t width = 0;
-    uint8_t width_max = 0;
-    uint8_t mode = 0;
-    f_string_length j = 0;
-    f_string_length offset = 0;
-    f_status status = F_none;
-    int8_t sign_found = 0;
-
-    for (f_string_length i = range.start; i <= range.stop; i++) {
-      width = f_macro_utf_byte_width_is(string[i]);
-
-      if (width == 0) {
-        if (isspace(string[i])) {
-          if (mode == 0) {
-            offset++;
-            continue;
-          }
-
-          return F_status_set_error(F_number);
-        }
-      }
-      else {
-        if (mode == 0) {
-          width_max = (range.stop - i) + 1;
-
-          status = f_utf_is_whitespace(string + i, width_max);
-
-          if (status == F_true) {
-            offset = i + 1;
-            continue;
-          }
-
-          if (F_status_is_error(status)) {
-            if (status == F_status_set_error(F_maybe)) {
-              status = F_status_set_error(F_incomplete_utf);
-            }
-
-            return status;
-          }
-        }
-
-        return F_status_set_error(F_number);
-      }
-
-      if (string[i] == 0x30) {
-        j = i + 1;
-
-        // Immediate next value must be either a number, 'x', 'X', 'd', 'D', 'o', 'O', 'b', or 'B'.
-        if (j > range.stop) {
-          *number = 0;
-          return F_none;
-        }
-        else if (string[j] > 0x29 && string[j] < 0x3a) {
-          mode = 10;
-        }
-        else if (string[j] == 0x78 || string[j] == 0x58) {
-          mode = 16;
-          offset += 2;
-        }
-        else if (string[j] == 0x44 || string[j] == 0x64) {
-          mode = 12;
-          offset += 2;
-        }
-        else if (string[j] == 0x6f || string[j] == 0x4f) {
-          mode = 8;
-          offset += 2;
-        }
-        else if (string[j] == 0x62 || string[j] == 0x42) {
-          mode = 2;
-          offset += 2;
-        }
-        else {
-          return F_status_set_error(F_number);
-        }
-
-        break;
-      }
-
-      if (string[i] == 0x2b) {
-        offset++;
-        sign_found = 1;
-      }
-
-      if (string[i] == 0x2d) {
-        offset++;
-        sign_found = -1;
-      }
-
-      if (f_conversion_character_is_decimal(string[i]) == F_true) {
-        mode = 10;
-        break;
-      }
-
-      return F_status_set_error(F_number);
-    } // for
-
-    if (mode == 0) {
-      return F_status_set_error(F_number);
-    }
-
-    f_string_range location_offset = f_string_range_initialize;
-    location_offset.start = range.start + offset;
-    location_offset.stop = range.stop;
-
-    if (range.start + offset > range.stop) {
-      return F_status_set_error(F_number);
-    }
-
-    if (mode == 10) {
-      status = f_conversion_string_to_decimal_unsigned(string, number, location_offset);
-    }
-    else if (mode == 16) {
-      status = f_conversion_string_to_hexidecimal_unsigned(string, number, location_offset);
-    }
-    else if (mode == 12) {
-      status = f_conversion_string_to_duodecimal_unsigned(string, number, location_offset);
-    }
-    else if (mode == 8) {
-      status = f_conversion_string_to_octal_unsigned(string, number, location_offset);
-    }
-    else {
-      status = f_conversion_string_to_binary_unsigned(string, number, location_offset);
-    }
-
-    // +/- 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);
-      }
-
-      return F_status_set_error(F_number);
-    }
-
-    return status;
-  }
-#endif // _di_f_conversion_string_to_number_unsigned_
-
 #ifdef __cplusplus
 } // extern "C"
 #endif
index d77a3903da2a3a11dc00a7d6f134c195719dc6c7..2688361c9ae74e2a14c7f58e8a6eb95f4a3620b6 100644 (file)
 #include <stdlib.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
 
 #ifdef __cplusplus
@@ -242,366 +243,6 @@ extern "C" {
   extern f_return_status f_conversion_character_to_octal(const int8_t character, f_number_unsigned *number);
 #endif // _di_f_conversion_character_to_octal_
 
-/**
- * Convert a series of positive or negative binary number characters into a f_number_signed.
- *
- * This will stop at one of the following: location.stop or a non-digit.
- * This will ignore NULL values.
- * This will not process signed statuses (+/-).
- *
- * @param string
- *   The string to convert.
- * @param number
- *   This will store the value of the converted string.
- *   This value is only changed on success.
- * @param location
- *   The start/stop range to convert.
- * @param negative
- *   Set to 0 to treat string as a positive number, 1 for as a negative number.
- *
- * @return
- *   F_none if the binary string was converted to an signed long.
- *   F_data_not if string starts with a null (length is 0).
- *   F_number (with error bit) if no conversion was made due to non-binary values being found.
- *   F_number_overflow (with error bit) on integer overflow.
- *   F_number_underflow (with error bit) on integer underflow.
- *   F_parameter (with error bit) if a parameter is invalid.
- */
-#ifndef _di_f_conversion_string_to_binary_signed_
-  extern f_return_status f_conversion_string_to_binary_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative);
-#endif // _di_f_conversion_string_to_binary_signed_
-
-/**
- * Convert a series of positive binary number characters into a f_number_unsigned.
- *
- * This will stop at one of the following: range.stop or a non-digit.
- * This will ignore NULL values.
- * This will not process signed statuses (+/-).
- *
- * @param string
- *   The string to convert.
- * @param number
- *   This will store the value of the converted string.
- *   This value is only changed on success.
- * @param range
- *   The start/stop range to convert.
- *
- * @return
- *   F_none if the binary string was converted to an unsigned long.
- *   F_data_not if string starts with a null (length is 0).
- *   F_number (with error bit) if no conversion was made due to non-binary values being found.
- *   F_number_overflow (with error bit) on integer overflow.
- *   F_parameter (with error bit) if a parameter is invalid.
- */
-#ifndef _di_f_conversion_string_to_binary_unsigned_
-  extern f_return_status f_conversion_string_to_binary_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range);
-#endif // _di_f_conversion_string_to_binary_unsigned_
-
-/**
- * Convert a series of positive or negative decimal number characters into an f_number_signed.
- *
- * This will stop at one of the following: range.stop or a non-digit.
- * This will ignore NULL values.
- * This will not process signed statuses (+/-).
- *
- * @param string
- *   The string to convert.
- * @param number
- *   This will store the value of the converted string.
- *   This value is only changed on success.
- * @param range
- *   The start/stop range to convert.
- * @param negative
- *   Set to 0 to treat string as a positive number, 1 for as a negative number.
- *
- * @return
- *   F_none if the decimal string was converted to an signed long.
- *   F_data_not if string starts with a null (length is 0).
- *   F_number (with error bit) if no conversion was made due to non-decimal values being found.
- *   F_number_overflow (with error bit) on integer overflow.
- *   F_number_underflow (with error bit) on integer underflow.
- *   F_parameter (with error bit) if a parameter is invalid.
- */
-#ifndef _di_f_conversion_string_to_decimal_signed_
-  extern f_return_status f_conversion_string_to_decimal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative);
-#endif // _di_f_conversion_string_to_decimal_signed_
-
-/**
- * Convert a series of positive decimal number characters into an f_number_unsigned.
- *
- * This will stop at one of the following: range.stop or a non-digit.
- * This will ignore NULL values.
- * This will not process signed statuses (+/-).
- *
- * @param string
- *   The string to convert.
- * @param number
- *   This will store the value of the converted string.
- *   This value is only changed on success.
- * @param range
- *   The start/stop range to convert.
- *
- * @return
- *   F_none if the decimal string was converted to an unsigned long.
- *   F_data_not if string starts with a null (length is 0).
- *   F_number (with error bit) if no conversion was made due to non-decimal values being found.
- *   F_number_overflow (with error bit) on integer overflow.
- *   F_parameter (with error bit) if a parameter is invalid.
- */
-#ifndef _di_f_conversion_string_to_decimal_unsigned_
-  extern f_return_status f_conversion_string_to_decimal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range);
-#endif // _di_f_conversion_string_to_decimal_unsigned_
-
-/**
- * Convert a series of positive or negative duodecimal number characters into an f_number_signed.
- *
- * This will stop at one of the following: range.stop or a non-digit.
- * This will ignore NULL values.
- * This will not process signed statuses (+/-).
- *
- * @param string
- *   The string to convert.
- * @param number
- *   This will store the value of the converted string.
- *   This value is only changed on success.
- * @param range
- *   The start/stop range to convert.
- * @param negative
- *   Set to 0 to treat string as a positive number, 1 for as a negative number.
- *
- * @return
- *   F_none if the duodecimal string was converted to an signed long.
- *   F_data_not if string starts with a null (length is 0).
- *   F_number (with error bit) if no conversion was made due to non-duodecimal values being found.
- *   F_number_overflow (with error bit) on integer overflow.
- *   F_number_underflow (with error bit) on integer underflow.
- *   F_parameter (with error bit) if a parameter is invalid.
- */
-#ifndef _di_f_conversion_string_to_duodecimal_signed_
-  extern f_return_status f_conversion_string_to_duodecimal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative);
-#endif // _di_f_conversion_string_to_duodecimal_signed_
-
-/**
- * Convert a series of positive duodecimal number characters into an f_number_unsigned.
- *
- * This will stop at one of the following: range.stop or a non-digit.
- * This will ignore NULL values.
- * This will not process signed statuses (+/-).
- *
- * @param string
- *   The string to convert.
- * @param number
- *   This will store the value of the converted string.
- *   This value is only changed on success.
- * @param range
- *   The start/stop range to convert.
- *
- * @return
- *   F_none if the duodecimal string was converted to an unsigned long.
- *   F_data_not if string starts with a null (length is 0).
- *   F_number (with error bit) if no conversion was made due to non-duodecimal values being found.
- *   F_number_overflow (with error bit) on integer overflow.
- *   F_parameter (with error bit) if a parameter is invalid.
- */
-#ifndef _di_f_conversion_string_to_duodecimal_unsigned_
-  extern f_return_status f_conversion_string_to_duodecimal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range);
-#endif // _di_f_conversion_string_to_duodecimal_unsigned_
-
-/**
- * Convert a series of positive or negative hexidecimal number characters into an f_number_signed.
- *
- * This will stop at one of the following: range.stop or a non-digit.
- * This will ignore NULL values.
- * This will not process signed statuses (+/-).
- *
- * @param string
- *   The string to convert.
- * @param number
- *   This will store the value of the converted string.
- *   This value is only changed on success.
- * @param range
- *   The start/stop range to convert.
- * @param negative
- *   Set to 0 to treat string as a positive number, 1 for as a negative number.
- *
- * @return
- *   F_none if the hexidecimal string was converted to an signed long.
- *   F_data_not if string starts with a null (length is 0).
- *   F_number (with error bit) if no conversion was made due to non-hexidecimal values being found.
- *   F_number_overflow (with error bit) on integer overflow.
- *   F_number_underflow (with error bit) on integer underflow.
- *   F_parameter (with error bit) if a parameter is invalid.
- */
-#ifndef _di_f_conversion_string_to_hexidecimal_signed_
-  extern f_return_status f_conversion_string_to_hexidecimal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative);
-#endif // _di_f_conversion_string_to_hexidecimal_signed_
-
-/**
- * Convert a series of positive hexidecimal number characters into an f_number_unsigned.
- *
- * This will stop at one of the following: range.stop or a non-digit.
- * This will ignore NULL values.
- * This will not process signed statuses (+/-).
- *
- * @param string
- *   The string to convert.
- * @param number
- *   This will store the value of the converted string.
- *   This value is only changed on success.
- * @param range
- *   The start/stop range to convert.
- *
- * @return
- *   F_none if the hexidecimal string was converted to an unsigned long.
- *   F_data_not if string starts with a null (length is 0).
- *   F_number (with error bit) if no conversion was made due to non-hexidecimal values being found.
- *   F_number_overflow (with error bit) on integer overflow.
- *   F_parameter (with error bit) if a parameter is invalid.
- */
-#ifndef _di_f_conversion_string_to_hexidecimal_unsigned_
-  extern f_return_status f_conversion_string_to_hexidecimal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range);
-#endif // _di_f_conversion_string_to_hexidecimal_unsigned_
-
-/**
- * Convert a series of positive or negative octal number characters into an f_number_signed.
- *
- * This will stop at one of the following: range.stop or a non-digit.
- * This will ignore NULL values.
- * This will not process signed statuses (+/-).
- *
- * @param string
- *   The string to convert.
- * @param number
- *   This will store the value of the converted string.
- *   This value is only changed on success.
- * @param range
- *   The start/stop range to convert.
- * @param negative
- *   Set to 0 to treat string as a positive number, 1 for as a negative number.
- *
- * @return
- *   F_none if the octal string was converted to an signed long.
- *   F_data_not if string starts with a null (length is 0).
- *   F_number (with error bit) if no conversion was made due to non-octal values being found.
- *   F_number_overflow (with error bit) on integer overflow.
- *   F_parameter (with error bit) if a parameter is invalid.
- */
-#ifndef _di_f_conversion_string_to_octal_signed_
-  extern f_return_status f_conversion_string_to_octal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative);
-#endif // _di_f_conversion_string_to_octal_signed_
-
-/**
- * Convert a series of positive octal number characters into an f_number_unsigned.
- *
- * This will stop at one of the following: range.stop or a non-digit.
- * This will ignore NULL values.
- * This will not process signed statuses (+/-).
- *
- * @param string
- *   The string to convert.
- * @param number
- *   This will store the value of the converted string.
- *   This value is only changed on success.
- * @param range
- *   The start/stop range to convert.
- *
- * @return
- *   F_none if the octal string was converted to an unsigned long.
- *   F_data_not if string starts with a null (length is 0).
- *   F_number (with error bit) if no conversion was made due to non-octal values being found.
- *   F_number_overflow (with error bit) on integer overflow.
- *   F_parameter (with error bit) if a parameter is invalid.
- */
-#ifndef _di_f_conversion_string_to_octal_unsigned_
-  extern f_return_status f_conversion_string_to_octal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range);
-#endif // _di_f_conversion_string_to_octal_unsigned_
-
-/**
- * Convert a series of positive or negative number characters into an f_number_signed.
- *
- * This will stop at one of the following: range.stop or a non-digit.
- * This will ignore NULL values.
- * This will process signed statuses (+/-).
- * This will detect based types as follows:
- * - hexidecimals begin with either '0x' or '0X'.
- * - duodecimals begin with either '0d' or '0D'.
- * - octals begin with either '0o' or '0O'.
- * - binaries begin with either '0b' or '0B'.
- * - decimal is used for all other cases.
- *
- * Leading 0's and whitespace are ignored.
- * Whitespace after the first digit is considered invalid.
- *
- * This function is similar to strtoll(), but the behavior of error handling and special bases are different.
- * In particular, octals are specified here with '0b' prefix or '0B' prefix instead of the ridiculous '0' prefix.
- *
- * @param string
- *   The string to convert.
- * @param number
- *   This will store the value of the converted string.
- *   This value is only changed on success.
- * @param range
- *   The start/stop range to convert.
- *
- * @return
- *   F_none on success.
- *   F_data_not if string starts with a null (length is 0).
- *   F_incomplete_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_overflow (with error bit) on integer overflow.
- *   F_number_underflow (with error bit) on integer underflow.
- *   F_parameter (with error bit) if a parameter is invalid.
- *
- * @see strtoll()
- */
-#ifndef _di_f_conversion_string_to_number_signed_
-  extern f_return_status f_conversion_string_to_number_signed(const f_string string, f_number_signed *number, const f_string_range range);
-#endif // _di_f_conversion_string_to_number_signed_
-
-/**
- * Convert a series of positive number characters into an f_number_unsigned.
- *
- * This will stop at one of the following: range.stop or a non-digit.
- * This will ignore NULL values.
- * This will not process signed statuses (+/-).
- * This will detect based types as follows:
- * - hexidecimals begin with either '0x' or '0X'.
- * - duodecimals begin with either '0d' or '0D'.
- * - octals begin with either '0o' or '0O'.
- * - binaries begin with either '0b' or '0B'.
- * - decimal is used for all other cases.
- *
- * Leading 0's and whitespace are ignored.
- * Whitespace after the first digit is considered invalid.
- *
- * This function is similar to strtoull(), but the behavior of error handling and special bases are different.
- * In particular, octals are specified here with '0b' prefix or '0B' prefix instead of the ridiculous '0' prefix.
- * Negative values are reported as such instead of being converted into the unsigned equivalent.
- *
- * @param string
- *   The string to convert.
- * @param number
- *   This will store the value of the converted string.
- *   This value is only changed on success.
- * @param range
- *   The start/stop range to convert.
- *
- * @return
- *   F_none on success.
- *   F_data_not if string starts with a null (length is 0).
- *   F_incomplete_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_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.
- *
- * @see strtoull()
- */
-#ifndef _di_f_conversion_string_to_number_unsigned_
-  extern f_return_status f_conversion_string_to_number_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range);
-#endif // _di_f_conversion_string_to_number_unsigned_
-
 #ifdef __cplusplus
 } // extern "C"
 #endif
index 13b45c70749e2d3516b47e95d38129f780366064..deb9037d103893780c780e414040072836998ee6 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index fe556682d791195092d87e5c7a7d27d895cf6358..493300fee283378cfbd10d74174165e76848e80a 100644 (file)
 #endif // __USE_XOPEN_EXTENDED
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
 #include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/directory_type.h>
 
 #ifdef __cplusplus
index d8175f560a573638a52fec738c6bd984a86a5620..d7982451c2bbeffe333ccd4738a6e98f3c11da92 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index eda396c0b5292f4a27dead712bf09c05be7b316b..be12382b9eecd1b07137daf3e1710b1d1cf59315 100644 (file)
 #include <sys/stat.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
 #include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 
 #ifdef __cplusplus
 extern "C" {
index d8175f560a573638a52fec738c6bd984a86a5620..d7982451c2bbeffe333ccd4738a6e98f3c11da92 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index ecb8cb6d73de118a9ecd5d4db79fa45a5f6f0914..c8f0bb5d45cbe57585c5ccd8045c4bd76e69c911 100644 (file)
 #include <sys/sysmacros.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 
 #ifdef __cplusplus
 extern "C" {
index d8175f560a573638a52fec738c6bd984a86a5620..d7982451c2bbeffe333ccd4738a6e98f3c11da92 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index 13b45c70749e2d3516b47e95d38129f780366064..deb9037d103893780c780e414040072836998ee6 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index fa6c7b54ab1c806cefdc69356377d65d59263317..0fb55d9cd4143bbfb45240a1c08361f27cf3d71c 100644 (file)
 #include <sys/stat.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
 #include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
 
 // fll-0 iki includes
index 13b45c70749e2d3516b47e95d38129f780366064..deb9037d103893780c780e414040072836998ee6 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index df8f4d7564f47695d3b240d4ef12c799db1e208e..dbfec8fd33a700f59b970d9239c1bfd8af3ba692 100644 (file)
@@ -20,8 +20,8 @@
 #include <string.h>
 
 // fll-0 includes
-#include <level_0/status.h>
 #include <level_0/type.h>
+#include <level_0/status.h>
 
 // fll-0 memory includes
 #include <level_0/memory-structure.h>
index 2060b72401b280b2d1b5b9b4f33f7b49e690a52f..d9c4b77c5eed2c34cf0396d33ba2f075e8c42ca6 100644 (file)
@@ -1,2 +1,4 @@
+# fss-0000
+
 f_type
 f_status
index b6a70a3c5514e0b2b94559a322c888f1e1d76f76..488990bb0b73beff92b26304dedcdeb12fcad3cf 100644 (file)
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
 #include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
-#include <level_0/utf.h>
 
 #ifdef __cplusplus
 extern "C" {
index 13b45c70749e2d3516b47e95d38129f780366064..d7982451c2bbeffe333ccd4738a6e98f3c11da92 100644 (file)
@@ -1,5 +1,6 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
-f_utf
index a63b54020bf60d7f49d16484acc1316fffbc4023..af77606656668b4a31ef0ba2d213c678c81c95a1 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lf_utf -lf_memory
+build_libraries-individual -lf_memory
 build_sources_library path.c
 build_sources_program
 build_sources_headers path.h
index 2060b72401b280b2d1b5b9b4f33f7b49e690a52f..d9c4b77c5eed2c34cf0396d33ba2f075e8c42ca6 100644 (file)
@@ -1,2 +1,4 @@
+# fss-0000
+
 f_type
 f_status
index 9ba88f7d34f155123e130e43e171bc95fb126a9a..47da1223b3a6676a0528014642a950f7585d65ec 100644 (file)
 #include <sys/stat.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 
 #ifdef __cplusplus
 extern "C" {
index d8175f560a573638a52fec738c6bd984a86a5620..d7982451c2bbeffe333ccd4738a6e98f3c11da92 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index 5d081da15f4a9cbbd023b230de4c69f835173218..959f64918f35e0823034b3e0f7a21abff16d9be4 100644 (file)
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
-#include <level_0/serialize.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
 
 #ifdef __cplusplus
index e783f2d3599f25763ca1145ea53c96875923cec8..deb9037d103893780c780e414040072836998ee6 100644 (file)
@@ -1,5 +1,7 @@
-f_memory
+# fss-0000
+
+f_type
 f_status
+f_memory
 f_string
-f_type
 f_utf
index bee68d37751b2304a77753a07e1f7d283e46c2e8..22d4efc2d3d080a302a94885cdeb1f6c073d36ac 100644 (file)
@@ -23,6 +23,7 @@
 // fll-0 includes
 #include <level_0/type.h>
 #include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
 
 #ifdef __cplusplus
index 300ca78e2a7c1efc72c69102e0927ba94d849f05..d7982451c2bbeffe333ccd4738a6e98f3c11da92 100644 (file)
@@ -1,4 +1,6 @@
-f_memory
+# fss-0000
+
+f_type
 f_status
+f_memory
 f_string
-f_type
index 5cb939b5d9f5adc23915dc2a051f5c0e940328f5..47e87d409bb6abe0085fedc402fb1a57d4326922 100644 (file)
@@ -6,6 +6,8 @@
  * Licenses: lgplv2.1
  *
  * Provides status arrays that require memory operations.
+ *
+ * Because memory requires status.h, this is moved to a separate file to reduce potential circular dependency issues.
  */
 #ifndef _F_status_array_h
 #define _F_status_array_h
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c6653172ef1e71eb1aff738b1cbad4300feeacd6 100644 (file)
@@ -0,0 +1,2 @@
+# fss-0000
+
index f8f708ce352c42fd0d14c89844eedf55ab0f0116..66dca29d99f6f4c25ac02e2ed3d10dc1bd11144f 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index 21d990db936afe344585bfc15eb9ab6e7f2fceff..7d7368d01c4afb0cdbb9662d1b0d3ee80e25785d 100644 (file)
@@ -22,7 +22,7 @@ build_libraries -lc
 build_libraries-individual -lf_memory
 build_sources_library
 build_sources_program
-build_sources_headers string.h string-common.h string-dynamic.h string-quantity.h string-range.h
+build_sources_headers string.h string-common.h string-dynamic.h string-map.h string-quantity.h string-range.h
 build_sources_script
 build_sources_setting
 build_script yes
index 55ea309151b2d1f3cb9894e9b4b3c1f5e27d25dc..1a1a9ae5988e92d9ad271f1d895f552c01d6605a 100644 (file)
@@ -6,13 +6,15 @@
  * Licenses: lgplv2.1
  *
  * Provides datatypes that require memory operations.
+ *
+ * Because memory requires status.h, this is moved to a separate file to reduce potential circular dependency issues.
  */
 #ifndef _F_type_array_h
 #define _F_type_array_h
 
 // fll-0 includes
-#include <level_0/memory.h>
 #include <level_0/type.h>
+#include <level_0/memory.h>
 
 #ifdef __cplusplus
 extern "C" {
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c6653172ef1e71eb1aff738b1cbad4300feeacd6 100644 (file)
@@ -0,0 +1,2 @@
+# fss-0000
+
index 0c071d55df2c0c73def6ac2120eae64bbbdf81f0..4f2817991b41d2e0ea263627eed46c9d939aa08e 100644 (file)
@@ -39,8 +39,9 @@
 #include <string.h>
 
 // fll-0 includes
-#include <level_0/status.h>
 #include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
 
 // fll-0 utf includes
index d8175f560a573638a52fec738c6bd984a86a5620..d7982451c2bbeffe333ccd4738a6e98f3c11da92 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index 5ab2fb3a3c50c63fd31bfdde0c4c66adf7386256..21f63a6986e1f1e83065cf85428657720a1d82a7 100644 (file)
 #include <string.h>
 
 // fll-0 includes
-#include <level_0/color.h>
+#include <level_0/type.h>
 #include <level_0/status.h>
-#include <level_0/file.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
+#include <level_0/color.h>
+#include <level_0/file.h>
 #include <level_0/print.h>
 
 #ifdef __cplusplus
index f86139a9cd8b50ccd0cd11ebcc20713cf17a6b36..5f3a165c946e448946f291246d35ad08443faed3 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index 33ca8986cec82752df6286c3026503fd2c7b57e3..6234a435acacbc4db8d44a10dc1a6d87ad388fdf 100644 (file)
@@ -6,9 +6,9 @@ extern "C" {
 
 #ifndef _fl_console_parameter_to_string_dynamic_directory_
   f_return_status fl_console_parameter_to_string_dynamic_directory(const f_string argument, f_string_dynamic *directory) {
-    #ifndef _di_level_0_parameter_checking_
+    #ifndef _di_level_1_parameter_checking_
       if (argument == 0) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_f
+    #endif // _di_level_1_parameter_checking_
 
     f_status status = F_none;
     f_string_length length = strlen(argument);
@@ -159,42 +159,6 @@ extern "C" {
   }
 #endif // _fl_console_parameter_to_string_dynamic_directory_
 
-#ifndef _fl_console_parameter_to_number_signed_
-  f_return_status fl_console_parameter_to_number_signed(const f_string argument, f_number_signed *number) {
-    #ifndef _di_level_0_parameter_checking_
-      if (argument == 0) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_f
-
-    if (argument[0] == 0) {
-      return F_data_not;
-    }
-
-    f_string_range range = f_string_range_initialize;
-    range.start = 0;
-    range.stop = strlen(argument) - 1;
-
-    return f_conversion_string_to_number_signed(argument, number, range);
-  }
-#endif // _fl_console_parameter_to_number_signed_
-
-#ifndef _fl_console_parameter_to_number_unsigned_
-  f_return_status fl_console_parameter_to_number_unsigned(const f_string argument, f_number_unsigned *number) {
-    #ifndef _di_level_0_parameter_checking_
-      if (argument == 0) return F_status_set_error(F_parameter);
-    #endif // _di_level_0_parameter_checking_f
-
-    if (argument[0] == 0) {
-      return F_data_not;
-    }
-
-    f_string_range range = f_string_range_initialize;
-    range.start = 0;
-    range.stop = strlen(argument) - 1;
-
-    return f_conversion_string_to_number_unsigned(argument, number, range);
-  }
-#endif // _fl_console_parameter_to_number_unsigned_
-
 #ifdef __cplusplus
 } // extern "C"
 #endif
index 5d5e956aa9eed905a27c2b0eca26410f5925e2d6..5992d84693293e5edf2b015a421722dc5e102daf 100644 (file)
 #include <sys/stat.h>
 
 // fll-0 includes
-#include <level_0/console.h>
-#include <level_0/conversion.h>
+#include <level_0/type.h>
 #include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
+#include <level_0/console.h>
+#include <level_0/conversion.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -58,72 +59,6 @@ extern "C" {
   extern f_return_status fl_console_parameter_to_string_dynamic_directory(const f_string argument, f_string_dynamic *directory);
 #endif // _fl_console_parameter_to_string_dynamic_directory_
 
-/**
- * Convert a console parameter additional argument to a signed integer.
- *
- * This will detect based types as follows:
- * - hexidecimals begin with either '0x' or '0X'.
- * - duodecimals begin with either '0d' or '0D'.
- * - octals begin with either '0o' or '0O'.
- * - binaries begin with either '0b' or '0B'.
- * - decimal is used for all other cases.
- *
- * Leading 0's and whitespace are ignored.
- * Whitespace after the first digit is considered invalid.
- *
- * @param argv
- *   The argument string expected to be a number.
- *   This is generally passed from the argv[].
- * @param number
- *   The converted number is stored here.
- *   This only gets modified on success.
- *
- * @return
- *   F_none on success.
- *   F_data_not if string starts wth a null (length is 0).
- *   F_parameter (with error bit) if a parameter is invalid.
- *
- *   Errors from (with error bit): f_conversion_string_to_number_signed().
- *
- * @see f_conversion_string_to_number_signed()
- */
-#ifndef _fl_console_parameter_to_number_signed_
-  extern f_return_status fl_console_parameter_to_number_signed(const f_string argument, f_number_signed *number);
-#endif // _fl_console_parameter_to_number_signed_
-
-/**
- * Convert a console parameter additional argument to an unsigned integer.
- *
- * This will detect based types as follows:
- * - hexidecimals begin with either '0x' or '0X'.
- * - duodecimals begin with either '0d' or '0D'.
- * - octals begin with either '0o' or '0O'.
- * - binaries begin with either '0b' or '0B'.
- * - decimal is used for all other cases.
- *
- * Leading 0's and whitespace are ignored.
- * Whitespace after the first digit is considered invalid.
- *
- * @param argv
- *   The argument string expected to be a number.
- *   This is generally passed from the argv[].
- * @param number
- *   The converted number is stored here.
- *   This only gets modified on success.
- *
- * @return
- *   F_none on success.
- *   F_data_not if string starts wth a null (length is 0).
- *   F_parameter (with error bit) if a parameter is invalid.
- *
- *   Errors from (with error bit): f_conversion_string_to_number_unsigned().
- *
- * @see f_conversion_string_to_number_unsigned()
- */
-#ifndef _fl_console_parameter_to_number_unsigned_
-  extern f_return_status fl_console_parameter_to_number_unsigned(const f_string argument, f_number_unsigned *number);
-#endif // _fl_console_parameter_to_number_unsigned_
-
 #ifdef __cplusplus
 } // extern "C"
 #endif
index a7982aa77a4a89baccdb92da0d84d090b724c3f0..71a6d9defe1fd324a4e2dd645d60f78280d2f66f 100644 (file)
@@ -1,7 +1,9 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_console
 f_conversion
-f_utf
diff --git a/level_1/fl_conversion/c/conversion.c b/level_1/fl_conversion/c/conversion.c
new file mode 100644 (file)
index 0000000..a7d1251
--- /dev/null
@@ -0,0 +1,856 @@
+#include <level_1/conversion.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _di_fl_conversion_string_to_binary_signed_
+  f_return_status fl_conversion_string_to_binary_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative) {
+    #ifndef _di_level_1_parameter_checking_
+      if (string == 0) return F_status_set_error(F_parameter);
+      if (number == 0) return F_status_set_error(F_parameter);
+      if (range.start > range.stop) return F_status_set_error(F_parameter);
+    #endif // _di_level_1_parameter_checking_
+
+    if (string[0] == 0) {
+      return F_data_not;
+    }
+
+    uint8_t scale = 0;
+    f_number_unsigned digit = 0;
+    f_number_unsigned converted = 0;
+
+    for (f_string_length i = range.start; i <= range.stop; i++) {
+      if (f_conversion_character_to_binary(string[i], &digit) == F_none) {
+        if (scale) {
+          scale++;
+
+          if (negative) {
+            if (scale > f_conversion_scale_binary_signed) {
+              return F_status_set_error(F_number_underflow);
+            }
+
+            converted <<= 1;
+            converted -= digit;
+          }
+          else {
+            if (scale > f_conversion_scale_binary_signed) {
+              return F_status_set_error(F_number_overflow);
+            }
+
+            converted <<= 1;
+            converted += digit;
+          }
+        }
+        else if (digit != 0) {
+          scale = 1;
+
+          if (negative) {
+            converted = 0 - digit;
+          }
+          else {
+            converted = digit;
+          }
+        }
+      }
+      else if (string[i] != 0) {
+        return F_status_set_error(F_number);
+      }
+    } // for
+
+    *number = converted;
+    return F_none;
+  }
+#endif // _di_fl_conversion_string_to_binary_signed_
+
+#ifndef _di_fl_conversion_string_to_binary_unsigned_
+  f_return_status fl_conversion_string_to_binary_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range) {
+    #ifndef _di_level_1_parameter_checking_
+      if (string == 0) return F_status_set_error(F_parameter);
+      if (number == 0) return F_status_set_error(F_parameter);
+      if (range.start > range.stop) return F_status_set_error(F_parameter);
+    #endif // _di_level_1_parameter_checking_
+
+    if (string[0] == 0) {
+      return F_data_not;
+    }
+
+    uint8_t scale = 0;
+    f_number_unsigned digit = 0;
+    f_number_unsigned converted = 0;
+
+    for (f_string_length i = range.start; i <= range.stop; i++) {
+      if (f_conversion_character_to_binary(string[i], &digit) == F_none) {
+        if (scale) {
+          scale++;
+
+          if (scale > f_conversion_scale_binary_unsigned) {
+            return F_status_set_error(F_number_overflow);
+          }
+
+          converted <<= 1;
+          converted += digit;
+        }
+        else if (digit != 0) {
+          scale = 1;
+          converted = digit;
+        }
+      }
+      else if (string[i] != 0) {
+        return F_status_set_error(F_number);
+      }
+    } // for
+
+    *number = converted;
+    return F_none;
+  }
+#endif // _di_fl_conversion_string_to_binary_unsigned_
+
+#ifndef _di_fl_conversion_string_to_decimal_signed_
+  f_return_status fl_conversion_string_to_decimal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative) {
+    #ifndef _di_level_1_parameter_checking_
+      if (string == 0) return F_status_set_error(F_parameter);
+      if (number == 0) return F_status_set_error(F_parameter);
+      if (range.start > range.stop) return F_status_set_error(F_parameter);
+    #endif // _di_level_1_parameter_checking_
+
+    if (string[0] == 0) {
+      return F_data_not;
+    }
+
+    uint8_t scale = 0;
+    f_number_unsigned digit = 0;
+    f_number_unsigned converted = 0;
+
+    for (f_string_length i = range.start; i <= range.stop; i++) {
+      if (f_conversion_character_to_decimal(string[i], &digit) == F_none) {
+
+        if (scale) {
+          scale++;
+
+          if (negative) {
+            if (scale > f_conversion_scale_decimal_signed) {
+              if ((converted * 10) - digit < f_type_number_size_negative || (converted * 10) - digit > converted) {
+                return F_status_set_error(F_number_underflow);
+              }
+            }
+
+            converted *= 10;
+            converted -= digit;
+          }
+          else {
+            if (scale > f_conversion_scale_decimal_signed) {
+              if ((converted * 10) + digit > f_type_number_size_positive || (converted * 10) + digit < converted) {
+                return F_status_set_error(F_number_overflow);
+              }
+            }
+
+            converted *= 10;
+            converted += digit;
+          }
+        }
+        else if (digit != 0) {
+          scale = 1;
+
+          if (negative) {
+            converted = 0 - digit;
+          }
+          else {
+            converted = digit;
+          }
+        }
+      }
+      else if (string[i] != 0) {
+        return F_status_set_error(F_number);
+      }
+    } // for
+
+    *number = converted;
+    return F_none;
+  }
+#endif // _di_fl_conversion_string_to_decimal_signed_
+
+#ifndef _di_fl_conversion_string_to_decimal_unsigned_
+  f_return_status fl_conversion_string_to_decimal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range) {
+    #ifndef _di_level_1_parameter_checking_
+      if (string == 0) return F_status_set_error(F_parameter);
+      if (number == 0) return F_status_set_error(F_parameter);
+      if (range.start > range.stop) return F_status_set_error(F_parameter);
+    #endif // _di_level_1_parameter_checking_
+
+    if (string[0] == 0) {
+      return F_data_not;
+    }
+
+    uint8_t scale = 0;
+    f_number_unsigned digit = 0;
+    f_number_unsigned converted = 0;
+
+    for (f_string_length i = range.start; i <= range.stop; i++) {
+      if (f_conversion_character_to_decimal(string[i], &digit) == F_none) {
+
+        if (scale) {
+          scale++;
+
+          if (scale > f_conversion_scale_decimal_unsigned) {
+            if ((converted * 10) + digit > f_type_number_size_unsigned || (converted * 10) + digit < converted) {
+              return F_status_set_error(F_number_overflow);
+            }
+          }
+
+          converted *= 10;
+          converted += digit;
+        }
+        else if (digit != 0) {
+          scale = 1;
+          converted = digit;
+        }
+      }
+      else if (string[i] != 0) {
+        return F_status_set_error(F_number);
+      }
+    } // for
+
+    *number = converted;
+    return F_none;
+  }
+#endif // _di_fl_conversion_string_to_decimal_unsigned_
+
+#ifndef _di_fl_conversion_string_to_duodecimal_signed_
+  f_return_status fl_conversion_string_to_duodecimal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative) {
+    #ifndef _di_level_1_parameter_checking_
+      if (string == 0) return F_status_set_error(F_parameter);
+      if (number == 0) return F_status_set_error(F_parameter);
+      if (range.start > range.stop) return F_status_set_error(F_parameter);
+    #endif // _di_level_1_parameter_checking_
+
+    if (string[0] == 0) {
+      return F_data_not;
+    }
+
+    uint8_t scale = 0;
+    f_number_unsigned digit = 0;
+    f_number_unsigned converted = 0;
+
+    for (f_string_length i = range.start; i <= range.stop; i++) {
+      if (f_conversion_character_to_duodecimal(string[i], &digit) == F_none) {
+
+        if (scale) {
+          scale++;
+
+          if (negative) {
+            if (scale > f_conversion_scale_duodecimal_signed) {
+              if ((converted * 12) - digit < f_type_number_size_negative || (converted * 12) - digit > converted) {
+                return F_status_set_error(F_number_underflow);
+              }
+            }
+
+            converted *= 12;
+            converted -= digit;
+          }
+          else {
+            if (scale > f_conversion_scale_duodecimal_signed) {
+              if ((converted * 12) + digit > f_type_number_size_positive || (converted * 12) + digit < converted) {
+                return F_status_set_error(F_number_overflow);
+              }
+            }
+
+            converted *= 12;
+            converted += digit;
+          }
+        }
+        else if (digit != 0) {
+          scale = 1;
+
+          if (negative) {
+            converted = 0 - digit;
+          }
+          else {
+            converted = digit;
+          }
+        }
+      }
+      else if (string[i] != 0) {
+        return F_status_set_error(F_number);
+      }
+    } // for
+
+    *number = converted;
+    return F_none;
+  }
+#endif // _di_fl_conversion_string_to_duodecimal_signed_
+
+#ifndef _di_fl_conversion_string_to_duodecimal_unsigned_
+  f_return_status fl_conversion_string_to_duodecimal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range) {
+    #ifndef _di_level_1_parameter_checking_
+      if (string == 0) return F_status_set_error(F_parameter);
+      if (number == 0) return F_status_set_error(F_parameter);
+      if (range.start > range.stop) return F_status_set_error(F_parameter);
+    #endif // _di_level_1_parameter_checking_
+
+    if (string[0] == 0) {
+      return F_data_not;
+    }
+
+    uint8_t scale = 0;
+    f_number_unsigned digit = 0;
+    f_number_unsigned converted = 0;
+
+    for (f_string_length i = range.start; i <= range.stop; i++) {
+      if (f_conversion_character_to_duodecimal(string[i], &digit) == F_none) {
+
+        if (scale) {
+          scale++;
+
+          if (scale > f_conversion_scale_duodecimal_unsigned) {
+            if ((converted * 12) + digit > f_type_number_size_unsigned || (converted * 12) + digit < converted) {
+              return F_status_set_error(F_number_overflow);
+            }
+          }
+
+          converted *= 12;
+          converted += digit;
+        }
+        else if (digit != 0) {
+          scale = 1;
+          converted = digit;
+        }
+      }
+      else if (string[i] != 0) {
+        return F_status_set_error(F_number);
+      }
+    } // for
+
+    *number = converted;
+    return F_none;
+  }
+#endif // _di_fl_conversion_string_to_duodecimal_unsigned_
+
+#ifndef _di_fl_conversion_string_to_hexidecimal_signed_
+  f_return_status fl_conversion_string_to_hexidecimal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative) {
+    #ifndef _di_level_1_parameter_checking_
+      if (string == 0) return F_status_set_error(F_parameter);
+      if (number == 0) return F_status_set_error(F_parameter);
+      if (range.start > range.stop) return F_status_set_error(F_parameter);
+    #endif // _di_level_1_parameter_checking_
+
+    if (string[0] == 0) {
+      return F_data_not;
+    }
+
+    uint8_t scale = 0;
+    f_number_unsigned digit = 0;
+    f_number_unsigned converted = 0;
+
+    for (f_string_length i = range.start; i <= range.stop; i++) {
+      if (f_conversion_character_to_hexidecimal(string[i], &digit) == F_none) {
+
+        if (scale) {
+          scale++;
+
+          if (negative) {
+            if (scale > f_conversion_scale_hexidecimal_signed) {
+              if ((converted << 4) - digit < f_type_number_size_negative || (converted << 4) - digit > converted) {
+                return F_status_set_error(F_number_underflow);
+              }
+            }
+
+            converted <<= 4;
+            converted -= digit;
+          }
+          else {
+            if (scale > f_conversion_scale_hexidecimal_signed) {
+              if ((converted << 4) + digit > f_type_number_size_positive || (converted << 4) + digit < converted) {
+                return F_status_set_error(F_number_overflow);
+              }
+            }
+
+            converted <<= 4;
+            converted += digit;
+          }
+        }
+        else if (digit != 0) {
+          scale = 1;
+
+          if (negative) {
+            converted = 0 - digit;
+          }
+          else {
+            converted = digit;
+          }
+        }
+      }
+      else if (string[i] != 0) {
+        return F_status_set_error(F_number);
+      }
+    } // for
+
+    *number = converted;
+    return F_none;
+  }
+#endif // _di_fl_conversion_string_to_hexidecimal_signed_
+
+#ifndef _di_fl_conversion_string_to_hexidecimal_unsigned_
+  f_return_status fl_conversion_string_to_hexidecimal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range) {
+    #ifndef _di_level_1_parameter_checking_
+      if (string == 0) return F_status_set_error(F_parameter);
+      if (number == 0) return F_status_set_error(F_parameter);
+      if (range.start > range.stop) return F_status_set_error(F_parameter);
+    #endif // _di_level_1_parameter_checking_
+
+    if (string[0] == 0) {
+      return F_data_not;
+    }
+
+    uint8_t scale = 0;
+    f_number_unsigned digit = 0;
+    f_number_unsigned converted = 0;
+
+    for (f_string_length i = range.start; i <= range.stop; i++) {
+      if (f_conversion_character_to_hexidecimal(string[i], &digit) == F_none) {
+
+        if (scale) {
+          scale++;
+
+          if (scale > f_conversion_scale_hexidecimal_unsigned) {
+            if ((converted << 4) + digit > f_type_number_size_unsigned || (converted << 4) + digit < converted) {
+              return F_status_set_error(F_number_overflow);
+            }
+          }
+
+          converted <<= 4;
+          converted += digit;
+        }
+        else if (digit != 0) {
+          scale = 1;
+          converted = digit;
+        }
+      }
+      else if (string[i] != 0) {
+        return F_status_set_error(F_number);
+      }
+    } // for
+
+    *number = converted;
+    return F_none;
+  }
+#endif // _di_fl_conversion_string_to_hexidecimal_unsigned_
+
+#ifndef _di_fl_conversion_string_to_octal_signed_
+  f_return_status fl_conversion_string_to_octal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative) {
+    #ifndef _di_level_1_parameter_checking_
+      if (string == 0) return F_status_set_error(F_parameter);
+      if (number == 0) return F_status_set_error(F_parameter);
+      if (range.start > range.stop) return F_status_set_error(F_parameter);
+    #endif // _di_level_1_parameter_checking_
+
+    if (string[0] == 0) {
+      return F_data_not;
+    }
+
+    uint8_t scale = 0;
+    f_number_unsigned digit = 0;
+    f_number_unsigned converted = 0;
+
+    for (f_string_length i = range.start; i <= range.stop; i++) {
+      if (f_conversion_character_to_octal(string[i], &digit) == F_none) {
+
+        if (scale) {
+          scale++;
+
+          if (negative) {
+            if (scale > f_conversion_scale_octal_signed) {
+              if ((converted << 3) - digit < f_type_number_size_negative || (converted << 3) - digit > converted) {
+                return F_status_set_error(F_number_underflow);
+              }
+            }
+
+            converted <<= 3;
+            converted -= digit;
+          }
+          else {
+            if (scale > f_conversion_scale_octal_signed) {
+              if ((converted << 3) + digit > f_type_number_size_positive || (converted << 3) + digit < converted) {
+                return F_status_set_error(F_number_overflow);
+              }
+            }
+
+            converted <<= 3;
+            converted += digit;
+          }
+        }
+        else if (digit != 0) {
+          scale = 1;
+
+          if (negative) {
+            converted = 0 - digit;
+          }
+          else {
+            converted = digit;
+          }
+        }
+      }
+      else if (string[i] != 0) {
+        return F_status_set_error(F_number);
+      }
+    } // for
+
+    *number = converted;
+    return F_none;
+  }
+#endif // _di_fl_conversion_string_to_octal_signed_
+
+#ifndef _di_fl_conversion_string_to_octal_unsigned_
+  f_return_status fl_conversion_string_to_octal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range) {
+    #ifndef _di_level_1_parameter_checking_
+      if (string == 0) return F_status_set_error(F_parameter);
+      if (number == 0) return F_status_set_error(F_parameter);
+      if (range.start > range.stop) return F_status_set_error(F_parameter);
+    #endif // _di_level_1_parameter_checking_
+
+    if (string[0] == 0) {
+      return F_data_not;
+    }
+
+    uint8_t scale = 0;
+    f_number_unsigned digit = 0;
+    f_number_unsigned converted = 0;
+
+    for (f_string_length i = range.start; i <= range.stop; i++) {
+      if (f_conversion_character_to_octal(string[i], &digit) == F_none) {
+
+        if (scale) {
+          scale++;
+
+          if (scale > f_conversion_scale_octal_unsigned) {
+            if ((converted << 3) + digit > f_type_number_size_unsigned || (converted << 3) + digit < converted) {
+              return F_status_set_error(F_number_overflow);
+            }
+          }
+
+          converted <<= 3;
+          converted += digit;
+        }
+        else if (digit != 0) {
+          scale = 1;
+          converted = digit;
+        }
+      }
+      else if (string[i] != 0) {
+        return F_status_set_error(F_number);
+      }
+    } // for
+
+    *number = converted;
+    return F_none;
+  }
+#endif // _di_fl_conversion_string_to_octal_unsigned_
+
+#ifndef _di_fl_conversion_string_to_number_signed_
+  f_return_status fl_conversion_string_to_number_signed(const f_string string, f_number_signed *number, const f_string_range range) {
+    #ifndef _di_level_1_parameter_checking_
+      if (string == 0) return F_status_set_error(F_parameter);
+      if (number == 0) return F_status_set_error(F_parameter);
+      if (range.start > range.stop) return F_status_set_error(F_parameter);
+    #endif // _di_level_1_parameter_checking_
+
+    if (string[0] == 0) {
+      return F_data_not;
+    }
+
+    uint8_t width = 0;
+    uint8_t width_max = 0;
+    uint8_t mode = 0;
+    int8_t vector = 0; // 0 for assumed positive, 1 for explicit positive, -1 for negative.
+    f_string_length j = 0;
+    f_string_length offset = 0;
+    f_status status = F_none;
+
+    for (f_string_length i = range.start; i <= range.stop; i++) {
+      width = f_macro_utf_byte_width_is(string[i]);
+
+      if (width == 0) {
+        if (isspace(string[i])) {
+          if (mode == 0 && vector == 0) {
+            offset++;
+            continue;
+          }
+
+          return F_status_set_error(F_number);
+        }
+      }
+      else {
+        if (mode == 0 && vector == 0) {
+          width_max = (range.stop - i) + 1;
+
+          status = f_utf_is_whitespace(string + i, width_max);
+
+          if (status == F_true) {
+            offset = i + 1;
+            continue;
+          }
+
+          if (F_status_is_error(status)) {
+            if (status == F_status_set_error(F_maybe)) {
+              status = F_status_set_error(F_incomplete_utf);
+            }
+
+            return status;
+          }
+        }
+
+        return F_status_set_error(F_number);
+      }
+
+      if (string[i] == 0x30) {
+        j = i + 1;
+
+        // Immediate next value must be either a number, 'x', 'X', 'd', 'D', 'o', 'O', 'b', or 'B'.
+        if (j > range.stop) {
+          *number = 0;
+          return F_none;
+        }
+        else if (string[j] > 0x29 && string[j] < 0x3a) {
+          mode = 10;
+        }
+        else if (string[j] == 0x78 || string[j] == 0x58) {
+          mode = 16;
+          offset += 2;
+        }
+        else if (string[j] == 0x44 || string[j] == 0x64) {
+          mode = 12;
+          offset += 2;
+        }
+        else if (string[j] == 0x6f || string[j] == 0x4f) {
+          mode = 8;
+          offset += 2;
+        }
+        else if (string[j] == 0x62 || string[j] == 0x42) {
+          mode = 2;
+          offset += 2;
+        }
+        else {
+          return F_status_set_error(F_number);
+        }
+
+        break;
+      }
+
+      // plus sign is only allowed as the first non-whitespace character.
+      if (string[i] == 0x2b) {
+        if (mode == 0 && vector == 0) {
+          vector = 1;
+          offset++;
+        }
+        else {
+          return F_status_set_error(F_number);
+        }
+      }
+
+      // negative sign is not allowed.
+      if (string[i] == 0x2d) {
+        if (mode == 0 && vector == 0) {
+          vector = -1;
+          offset++;
+        }
+        else {
+          return F_status_set_error(F_number);
+        }
+      }
+
+      if (f_conversion_character_is_decimal(string[i]) == F_true) {
+        mode = 10;
+        break;
+      }
+
+      return F_status_set_error(F_number);
+    } // for
+
+    if (mode == 0) {
+      return F_status_set_error(F_number);
+    }
+
+    f_string_range location_offset = f_string_range_initialize;
+    location_offset.start = range.start + offset;
+    location_offset.stop = range.stop;
+
+    if (range.start + offset > range.stop) {
+      return F_status_set_error(F_number);
+    }
+
+    if (mode == 10) {
+      return fl_conversion_string_to_decimal_signed(string, number, location_offset, vector == -1);
+    }
+
+    if (mode == 16) {
+      return fl_conversion_string_to_hexidecimal_signed(string, number, location_offset, vector == -1);
+    }
+
+    if (mode == 12) {
+      return fl_conversion_string_to_duodecimal_signed(string, number, location_offset, vector == -1);
+    }
+
+    if (mode == 8) {
+      return fl_conversion_string_to_octal_signed(string, number, location_offset, vector == -1);
+    }
+
+    return fl_conversion_string_to_binary_signed(string, number, location_offset, vector == -1);
+  }
+#endif // _di_fl_conversion_string_to_number_signed_
+
+#ifndef _di_fl_conversion_string_to_number_unsigned_
+  f_return_status fl_conversion_string_to_number_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range) {
+    #ifndef _di_level_1_parameter_checking_
+      if (string == 0) return F_status_set_error(F_parameter);
+      if (number == 0) return F_status_set_error(F_parameter);
+      if (range.start > range.stop) return F_status_set_error(F_parameter);
+    #endif // _di_level_1_parameter_checking_
+
+    if (string[0] == 0) {
+      return F_data_not;
+    }
+
+    uint8_t width = 0;
+    uint8_t width_max = 0;
+    uint8_t mode = 0;
+    f_string_length j = 0;
+    f_string_length offset = 0;
+    f_status status = F_none;
+    int8_t sign_found = 0;
+
+    for (f_string_length i = range.start; i <= range.stop; i++) {
+      width = f_macro_utf_byte_width_is(string[i]);
+
+      if (width == 0) {
+        if (isspace(string[i])) {
+          if (mode == 0) {
+            offset++;
+            continue;
+          }
+
+          return F_status_set_error(F_number);
+        }
+      }
+      else {
+        if (mode == 0) {
+          width_max = (range.stop - i) + 1;
+
+          status = f_utf_is_whitespace(string + i, width_max);
+
+          if (status == F_true) {
+            offset = i + 1;
+            continue;
+          }
+
+          if (F_status_is_error(status)) {
+            if (status == F_status_set_error(F_maybe)) {
+              status = F_status_set_error(F_incomplete_utf);
+            }
+
+            return status;
+          }
+        }
+
+        return F_status_set_error(F_number);
+      }
+
+      if (string[i] == 0x30) {
+        j = i + 1;
+
+        // Immediate next value must be either a number, 'x', 'X', 'd', 'D', 'o', 'O', 'b', or 'B'.
+        if (j > range.stop) {
+          *number = 0;
+          return F_none;
+        }
+        else if (string[j] > 0x29 && string[j] < 0x3a) {
+          mode = 10;
+        }
+        else if (string[j] == 0x78 || string[j] == 0x58) {
+          mode = 16;
+          offset += 2;
+        }
+        else if (string[j] == 0x44 || string[j] == 0x64) {
+          mode = 12;
+          offset += 2;
+        }
+        else if (string[j] == 0x6f || string[j] == 0x4f) {
+          mode = 8;
+          offset += 2;
+        }
+        else if (string[j] == 0x62 || string[j] == 0x42) {
+          mode = 2;
+          offset += 2;
+        }
+        else {
+          return F_status_set_error(F_number);
+        }
+
+        break;
+      }
+
+      if (string[i] == 0x2b) {
+        offset++;
+        sign_found = 1;
+      }
+
+      if (string[i] == 0x2d) {
+        offset++;
+        sign_found = -1;
+      }
+
+      if (f_conversion_character_is_decimal(string[i]) == F_true) {
+        mode = 10;
+        break;
+      }
+
+      return F_status_set_error(F_number);
+    } // for
+
+    if (mode == 0) {
+      return F_status_set_error(F_number);
+    }
+
+    f_string_range location_offset = f_string_range_initialize;
+    location_offset.start = range.start + offset;
+    location_offset.stop = range.stop;
+
+    if (range.start + offset > range.stop) {
+      return F_status_set_error(F_number);
+    }
+
+    if (mode == 10) {
+      status = fl_conversion_string_to_decimal_unsigned(string, number, location_offset);
+    }
+    else if (mode == 16) {
+      status = fl_conversion_string_to_hexidecimal_unsigned(string, number, location_offset);
+    }
+    else if (mode == 12) {
+      status = fl_conversion_string_to_duodecimal_unsigned(string, number, location_offset);
+    }
+    else if (mode == 8) {
+      status = fl_conversion_string_to_octal_unsigned(string, number, location_offset);
+    }
+    else {
+      status = fl_conversion_string_to_binary_unsigned(string, number, location_offset);
+    }
+
+    // +/- 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);
+      }
+
+      return F_status_set_error(F_number);
+    }
+
+    return status;
+  }
+#endif // _di_fl_conversion_string_to_number_unsigned_
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_1/fl_conversion/c/conversion.h b/level_1/fl_conversion/c/conversion.h
new file mode 100644 (file)
index 0000000..a218e3e
--- /dev/null
@@ -0,0 +1,393 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: Conversion
+ * API Version: 0.5
+ * Licenses: lgplv2.1
+ *
+ * Provide means to convert one data type to another, such as a string to an integer.
+ */
+#ifndef _FL_conversion_h
+#define _FL_conversion_h
+
+// libc includes
+#include <ctype.h>
+#include <stdlib.h>
+
+// fll-0 includes
+#include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
+#include <level_0/string.h>
+#include <level_0/utf.h>
+#include <level_0/conversion.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Convert a series of positive or negative binary number characters into a f_number_signed.
+ *
+ * This will stop at one of the following: location.stop or a non-digit.
+ * This will ignore NULL values.
+ * This will not process signed statuses (+/-).
+ *
+ * @param string
+ *   The string to convert.
+ * @param number
+ *   This will store the value of the converted string.
+ *   This value is only changed on success.
+ * @param location
+ *   The start/stop range to convert.
+ * @param negative
+ *   Set to 0 to treat string as a positive number, 1 for as a negative number.
+ *
+ * @return
+ *   F_none if the binary string was converted to an signed long.
+ *   F_data_not if string starts with a null (length is 0).
+ *   F_number (with error bit) if no conversion was made due to non-binary values being found.
+ *   F_number_overflow (with error bit) on integer overflow.
+ *   F_number_underflow (with error bit) on integer underflow.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fl_conversion_string_to_binary_signed_
+  extern f_return_status fl_conversion_string_to_binary_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative);
+#endif // _di_fl_conversion_string_to_binary_signed_
+
+/**
+ * Convert a series of positive binary number characters into a f_number_unsigned.
+ *
+ * This will stop at one of the following: range.stop or a non-digit.
+ * This will ignore NULL values.
+ * This will not process signed statuses (+/-).
+ *
+ * @param string
+ *   The string to convert.
+ * @param number
+ *   This will store the value of the converted string.
+ *   This value is only changed on success.
+ * @param range
+ *   The start/stop range to convert.
+ *
+ * @return
+ *   F_none if the binary string was converted to an unsigned long.
+ *   F_data_not if string starts with a null (length is 0).
+ *   F_number (with error bit) if no conversion was made due to non-binary values being found.
+ *   F_number_overflow (with error bit) on integer overflow.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fl_conversion_string_to_binary_unsigned_
+  extern f_return_status fl_conversion_string_to_binary_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range);
+#endif // _di_fl_conversion_string_to_binary_unsigned_
+
+/**
+ * Convert a series of positive or negative decimal number characters into an f_number_signed.
+ *
+ * This will stop at one of the following: range.stop or a non-digit.
+ * This will ignore NULL values.
+ * This will not process signed statuses (+/-).
+ *
+ * @param string
+ *   The string to convert.
+ * @param number
+ *   This will store the value of the converted string.
+ *   This value is only changed on success.
+ * @param range
+ *   The start/stop range to convert.
+ * @param negative
+ *   Set to 0 to treat string as a positive number, 1 for as a negative number.
+ *
+ * @return
+ *   F_none if the decimal string was converted to an signed long.
+ *   F_data_not if string starts with a null (length is 0).
+ *   F_number (with error bit) if no conversion was made due to non-decimal values being found.
+ *   F_number_overflow (with error bit) on integer overflow.
+ *   F_number_underflow (with error bit) on integer underflow.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fl_conversion_string_to_decimal_signed_
+  extern f_return_status fl_conversion_string_to_decimal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative);
+#endif // _di_fl_conversion_string_to_decimal_signed_
+
+/**
+ * Convert a series of positive decimal number characters into an f_number_unsigned.
+ *
+ * This will stop at one of the following: range.stop or a non-digit.
+ * This will ignore NULL values.
+ * This will not process signed statuses (+/-).
+ *
+ * @param string
+ *   The string to convert.
+ * @param number
+ *   This will store the value of the converted string.
+ *   This value is only changed on success.
+ * @param range
+ *   The start/stop range to convert.
+ *
+ * @return
+ *   F_none if the decimal string was converted to an unsigned long.
+ *   F_data_not if string starts with a null (length is 0).
+ *   F_number (with error bit) if no conversion was made due to non-decimal values being found.
+ *   F_number_overflow (with error bit) on integer overflow.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fl_conversion_string_to_decimal_unsigned_
+  extern f_return_status fl_conversion_string_to_decimal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range);
+#endif // _di_fl_conversion_string_to_decimal_unsigned_
+
+/**
+ * Convert a series of positive or negative duodecimal number characters into an f_number_signed.
+ *
+ * This will stop at one of the following: range.stop or a non-digit.
+ * This will ignore NULL values.
+ * This will not process signed statuses (+/-).
+ *
+ * @param string
+ *   The string to convert.
+ * @param number
+ *   This will store the value of the converted string.
+ *   This value is only changed on success.
+ * @param range
+ *   The start/stop range to convert.
+ * @param negative
+ *   Set to 0 to treat string as a positive number, 1 for as a negative number.
+ *
+ * @return
+ *   F_none if the duodecimal string was converted to an signed long.
+ *   F_data_not if string starts with a null (length is 0).
+ *   F_number (with error bit) if no conversion was made due to non-duodecimal values being found.
+ *   F_number_overflow (with error bit) on integer overflow.
+ *   F_number_underflow (with error bit) on integer underflow.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fl_conversion_string_to_duodecimal_signed_
+  extern f_return_status fl_conversion_string_to_duodecimal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative);
+#endif // _di_fl_conversion_string_to_duodecimal_signed_
+
+/**
+ * Convert a series of positive duodecimal number characters into an f_number_unsigned.
+ *
+ * This will stop at one of the following: range.stop or a non-digit.
+ * This will ignore NULL values.
+ * This will not process signed statuses (+/-).
+ *
+ * @param string
+ *   The string to convert.
+ * @param number
+ *   This will store the value of the converted string.
+ *   This value is only changed on success.
+ * @param range
+ *   The start/stop range to convert.
+ *
+ * @return
+ *   F_none if the duodecimal string was converted to an unsigned long.
+ *   F_data_not if string starts with a null (length is 0).
+ *   F_number (with error bit) if no conversion was made due to non-duodecimal values being found.
+ *   F_number_overflow (with error bit) on integer overflow.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fl_conversion_string_to_duodecimal_unsigned_
+  extern f_return_status fl_conversion_string_to_duodecimal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range);
+#endif // _di_fl_conversion_string_to_duodecimal_unsigned_
+
+/**
+ * Convert a series of positive or negative hexidecimal number characters into an f_number_signed.
+ *
+ * This will stop at one of the following: range.stop or a non-digit.
+ * This will ignore NULL values.
+ * This will not process signed statuses (+/-).
+ *
+ * @param string
+ *   The string to convert.
+ * @param number
+ *   This will store the value of the converted string.
+ *   This value is only changed on success.
+ * @param range
+ *   The start/stop range to convert.
+ * @param negative
+ *   Set to 0 to treat string as a positive number, 1 for as a negative number.
+ *
+ * @return
+ *   F_none if the hexidecimal string was converted to an signed long.
+ *   F_data_not if string starts with a null (length is 0).
+ *   F_number (with error bit) if no conversion was made due to non-hexidecimal values being found.
+ *   F_number_overflow (with error bit) on integer overflow.
+ *   F_number_underflow (with error bit) on integer underflow.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fl_conversion_string_to_hexidecimal_signed_
+  extern f_return_status fl_conversion_string_to_hexidecimal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative);
+#endif // _di_fl_conversion_string_to_hexidecimal_signed_
+
+/**
+ * Convert a series of positive hexidecimal number characters into an f_number_unsigned.
+ *
+ * This will stop at one of the following: range.stop or a non-digit.
+ * This will ignore NULL values.
+ * This will not process signed statuses (+/-).
+ *
+ * @param string
+ *   The string to convert.
+ * @param number
+ *   This will store the value of the converted string.
+ *   This value is only changed on success.
+ * @param range
+ *   The start/stop range to convert.
+ *
+ * @return
+ *   F_none if the hexidecimal string was converted to an unsigned long.
+ *   F_data_not if string starts with a null (length is 0).
+ *   F_number (with error bit) if no conversion was made due to non-hexidecimal values being found.
+ *   F_number_overflow (with error bit) on integer overflow.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fl_conversion_string_to_hexidecimal_unsigned_
+  extern f_return_status fl_conversion_string_to_hexidecimal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range);
+#endif // _di_fl_conversion_string_to_hexidecimal_unsigned_
+
+/**
+ * Convert a series of positive or negative octal number characters into an f_number_signed.
+ *
+ * This will stop at one of the following: range.stop or a non-digit.
+ * This will ignore NULL values.
+ * This will not process signed statuses (+/-).
+ *
+ * @param string
+ *   The string to convert.
+ * @param number
+ *   This will store the value of the converted string.
+ *   This value is only changed on success.
+ * @param range
+ *   The start/stop range to convert.
+ * @param negative
+ *   Set to 0 to treat string as a positive number, 1 for as a negative number.
+ *
+ * @return
+ *   F_none if the octal string was converted to an signed long.
+ *   F_data_not if string starts with a null (length is 0).
+ *   F_number (with error bit) if no conversion was made due to non-octal values being found.
+ *   F_number_overflow (with error bit) on integer overflow.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fl_conversion_string_to_octal_signed_
+  extern f_return_status fl_conversion_string_to_octal_signed(const f_string string, f_number_signed *number, const f_string_range range, const bool negative);
+#endif // _di_fl_conversion_string_to_octal_signed_
+
+/**
+ * Convert a series of positive octal number characters into an f_number_unsigned.
+ *
+ * This will stop at one of the following: range.stop or a non-digit.
+ * This will ignore NULL values.
+ * This will not process signed statuses (+/-).
+ *
+ * @param string
+ *   The string to convert.
+ * @param number
+ *   This will store the value of the converted string.
+ *   This value is only changed on success.
+ * @param range
+ *   The start/stop range to convert.
+ *
+ * @return
+ *   F_none if the octal string was converted to an unsigned long.
+ *   F_data_not if string starts with a null (length is 0).
+ *   F_number (with error bit) if no conversion was made due to non-octal values being found.
+ *   F_number_overflow (with error bit) on integer overflow.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fl_conversion_string_to_octal_unsigned_
+  extern f_return_status fl_conversion_string_to_octal_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range);
+#endif // _di_fl_conversion_string_to_octal_unsigned_
+
+/**
+ * Convert a series of positive or negative number characters into an f_number_signed.
+ *
+ * This will stop at one of the following: range.stop or a non-digit.
+ * This will ignore NULL values.
+ * This will process signed statuses (+/-).
+ * This will detect based types as follows:
+ * - hexidecimals begin with either '0x' or '0X'.
+ * - duodecimals begin with either '0d' or '0D'.
+ * - octals begin with either '0o' or '0O'.
+ * - binaries begin with either '0b' or '0B'.
+ * - decimal is used for all other cases.
+ *
+ * Leading 0's and whitespace are ignored.
+ * Whitespace after the first digit is considered invalid.
+ *
+ * This function is similar to strtoll(), but the behavior of error handling and special bases are different.
+ * In particular, octals are specified here with '0b' prefix or '0B' prefix instead of the ridiculous '0' prefix.
+ *
+ * @param string
+ *   The string to convert.
+ * @param number
+ *   This will store the value of the converted string.
+ *   This value is only changed on success.
+ * @param range
+ *   The start/stop range to convert.
+ *
+ * @return
+ *   F_none on success.
+ *   F_data_not if string starts with a null (length is 0).
+ *   F_incomplete_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_overflow (with error bit) on integer overflow.
+ *   F_number_underflow (with error bit) on integer underflow.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ *
+ * @see strtoll()
+ */
+#ifndef _di_fl_conversion_string_to_number_signed_
+  extern f_return_status fl_conversion_string_to_number_signed(const f_string string, f_number_signed *number, const f_string_range range);
+#endif // _di_fl_conversion_string_to_number_signed_
+
+/**
+ * Convert a series of positive number characters into an f_number_unsigned.
+ *
+ * This will stop at one of the following: range.stop or a non-digit.
+ * This will ignore NULL values.
+ * This will not process signed statuses (+/-).
+ * This will detect based types as follows:
+ * - hexidecimals begin with either '0x' or '0X'.
+ * - duodecimals begin with either '0d' or '0D'.
+ * - octals begin with either '0o' or '0O'.
+ * - binaries begin with either '0b' or '0B'.
+ * - decimal is used for all other cases.
+ *
+ * Leading 0's and whitespace are ignored.
+ * Whitespace after the first digit is considered invalid.
+ *
+ * This function is similar to strtoull(), but the behavior of error handling and special bases are different.
+ * In particular, octals are specified here with '0b' prefix or '0B' prefix instead of the ridiculous '0' prefix.
+ * Negative values are reported as such instead of being converted into the unsigned equivalent.
+ *
+ * @param string
+ *   The string to convert.
+ * @param number
+ *   This will store the value of the converted string.
+ *   This value is only changed on success.
+ * @param range
+ *   The start/stop range to convert.
+ *
+ * @return
+ *   F_none on success.
+ *   F_data_not if string starts with a null (length is 0).
+ *   F_incomplete_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_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.
+ *
+ * @see strtoull()
+ */
+#ifndef _di_fl_conversion_string_to_number_unsigned_
+  extern f_return_status fl_conversion_string_to_number_unsigned(const f_string string, f_number_unsigned *number, const f_string_range range);
+#endif // _di_fl_conversion_string_to_number_unsigned_
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // _FL_conversion_h
diff --git a/level_1/fl_conversion/data/build/defines b/level_1/fl_conversion/data/build/defines
new file mode 100644 (file)
index 0000000..c665317
--- /dev/null
@@ -0,0 +1,2 @@
+# fss-0000
+
diff --git a/level_1/fl_conversion/data/build/dependencies b/level_1/fl_conversion/data/build/dependencies
new file mode 100644 (file)
index 0000000..d3b519a
--- /dev/null
@@ -0,0 +1,8 @@
+# fss-0000
+
+f_type
+f_status
+f_memory
+f_string
+f_utf
+f_conversion
diff --git a/level_1/fl_conversion/data/build/settings b/level_1/fl_conversion/data/build/settings
new file mode 100644 (file)
index 0000000..36f5aa9
--- /dev/null
@@ -0,0 +1,52 @@
+# fss-0001
+
+project_name fl_conversion
+
+version_major 0
+version_minor 5
+version_micro 0
+version_target major
+
+environment
+
+process_pre
+process_post
+
+modes individual
+modes_default individual
+
+build_compiler gcc
+build_language c
+build_linker ar
+build_libraries -lc
+build_libraries-individual -lf_conversion -lf_utf -lf_memory
+build_sources_library conversion.c
+build_sources_program
+build_sources_headers conversion.h
+build_sources_script
+build_sources_setting
+build_script yes
+build_shared yes
+build_static yes
+
+path_headers level_1
+path_library_script script
+path_library_shared shared
+path_library_static static
+path_program_script script
+path_program_shared shared
+path_program_static static
+
+search_exclusive yes
+search_shared yes
+search_static yes
+
+defines_all
+defines_static
+defines_shared
+
+flags_all -z now -g
+flags_shared
+flags_static
+flags_library -fPIC
+flags_program -fPIE
index a596b6b291d1ab06e6bd0749f991f29191cea2e3..83a744ecd1bf3a421f261345e617df1920b43a63 100644 (file)
 #endif // __USE_XOPEN_EXTENDED
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
 #include <level_0/status_array.h>
 #include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
 #include <level_0/directory.h>
 #include <level_0/file.h>
index c1d179c3ee90c4688a68d60c9c63f73eb3db7a98..b9aa0b47f84bcd2e54708bc07d2137faf84235b2 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index a213be87e9d08eee084d9858eee661821a8a3f55..24bb264fadaf1fd46d66d012e5d8ece5fed2e434 100644 (file)
@@ -5,46 +5,6 @@
 extern "C" {
 #endif
 
-#ifndef _di_fl_fss_identify_
-  f_return_status fl_fss_identify(const f_string_static buffer, f_fss_header *header) {
-    #ifndef _di_level_1_parameter_checking_
-      if (header == 0) return F_status_set_error(F_parameter);
-      if (buffer.used <= 0) return F_status_set_error(F_parameter);
-    #endif // _di_level_1_parameter_checking_
-
-    return private_fl_fss_identify(buffer, header);
-  }
-#endif // _di_fl_fss_identify_
-
-#ifndef _di_fl_fss_identify_file_
-  f_return_status fl_fss_identify_file(f_file *file, f_fss_header *header) {
-    #ifndef _di_level_1_parameter_checking_
-      if (file == 0) return F_status_set_error(F_parameter);
-      if (header == 0) return F_status_set_error(F_parameter);
-      if (file->id == 0) return F_status_set_error(F_file_closed);
-      if (file->id < 0) return F_status_set_error(F_file);
-    #endif // _di_level_1_parameter_checking_
-
-    {
-      f_string_length seeked = 0;
-      if (F_status_is_error(f_file_seek(file->id, SEEK_SET, 0, &seeked))) {
-        return F_status_set_error(F_file_seek);
-      }
-    }
-
-    f_status status = F_none;
-    f_string_dynamic buffer = f_string_dynamic_initialize;
-
-    f_macro_string_dynamic_resize(status, buffer, f_fss_max_header_length + 1);
-    if (F_status_is_error(status)) return status;
-
-    status = f_file_read_until(*file, &buffer, f_fss_max_header_length + 1);
-    if (F_status_is_error(status)) return status;
-
-    return private_fl_fss_identify(buffer, header);
-  }
-#endif // _di_fl_fss_identify_file_
-
 #ifdef __cplusplus
 } // extern "C"
 #endif
index 01d09ea3141627e24e8de1958353d9b99ee4123d..18a867c5729232f6cec66c6de04078da4b3f4c45 100644 (file)
 #include <string.h>
 
 // fll-0 includes
-#include <level_0/conversion.h>
+#include <level_0/type.h>
 #include <level_0/status.h>
-#include <level_0/file.h>
-#include <level_0/fss.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
+#include <level_0/file.h>
+#include <level_0/fss.h>
 
 // fll-1 includes
 #include <level_1/fss_status.h>
 extern "C" {
 #endif
 
-/**
- * Identify FSS type from a buffered string.
- *
- * @param buffer
- *   The string to process.
- * @param header
- *   The header data to populate with results of this function.
- *
- * @return
- *   F_none on success
- *   FL_fss_header_not if no header is found.
- *   FL_fss_accepted_invalid (with warning bit) if header is technically invalid but can be identified.
- *   FL_fss_header_not (with error bit) if the an error occurred prior to identifying a valid header.
- *
- *   Errors from (with error bit): f_conversion_string_to_hexidecimal_unsigned().
- */
-#ifndef _di_fl_fss_identify_
-  extern f_return_status fl_fss_identify(const f_string_static buffer, f_fss_header *header);
-#endif // _di_fl_fss_identify_
-
-/**
- * Identify FSS type from a file.
- *
- * @param file
- *   The file information.
- * @param header
- *   The header data to populate with results of this function.
- *
- * @return
- *   F_none on success.
- *   FL_fss_header_not if no header is found.
- *   FL_fss_accepted_invalid (with warning bit) if header is technically invalid but can be identified.
- *   F_memory_reallocation (with error bit) on memory reallocation error.
- *   F_parameter (with error bit) if a parameter is invalid.
- *   FL_fss_header_not (with error bit) if the an error occurred prior to identifying a valid header.
- *
- *   Errors from (with error bit): f_conversion_string_to_hexidecimal_unsigned().
- *   Errors from (with error bit): f_file_read_until().
- *   Errors from (with error bit): f_file_seek().
- *
- * @see f_file_read_until()
- * @see fl_fss_identify()
- */
-#ifndef _di_fl_fss_identify_file_
-  extern f_return_status fl_fss_identify_file(f_file *file, f_fss_header *header);
-#endif // _di_fl_fss_identify_file_
-
 #ifdef __cplusplus
 } // extern "C"
 #endif
index 70a4e094476caa81439e502e4962ac2dddb0448d..3dab2ac6f64ccc60bf1aaa5ed9498f1b36af25fd 100644 (file)
@@ -5,132 +5,6 @@
 extern "C" {
 #endif
 
-#if !defined(_di_fl_fss_identify_) || !defined(_di_fl_fss_identify_file_)
-  f_return_status private_fl_fss_identify(const f_string_static buffer, f_fss_header *header) {
-    register f_string_length i = 0;
-
-    if (buffer.used < 10) {
-      // "# fss-0000" is always at least 10 characters.
-      return FL_fss_header_not;
-    }
-
-    // If this correctly follows the FSS specification, then this should be all that needs to be done (as well as atoh for ascii to hex).
-    // All characters used in the identifier are only in the ascii equivalents of the characters, any similarly looking character or number representing in UTF-8 is considered invalid.
-    if (buffer.string[i] == f_fss_type_header_open) {
-      i++;
-
-      if (buffer.string[i] == f_fss_type_header_part1) {
-        i++;
-
-        if (buffer.string[i] == f_fss_type_header_part2) {
-          i++;
-
-          if (buffer.string[i] == f_fss_type_header_part3) {
-            i++;
-
-            if (buffer.string[i] == f_fss_type_header_part4) {
-              i++;
-
-              if (buffer.string[i] == f_fss_type_header_part5) {
-                i++;
-
-                if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
-                  i++;
-
-                  if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
-                    i++;
-
-                    if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
-                      i++;
-
-                      if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
-                        i++;
-
-                        f_string_range range = f_string_range_initialize;
-
-                        range.start = i - 4;
-                        range.stop = i;
-
-                        // 1: A possibly valid header type was found, now convert it into its proper format and save the header type.
-                        const f_status status = f_conversion_string_to_hexidecimal_unsigned(buffer.string, &header->type, range);
-                        if (F_status_is_error(status)) return status;
-
-                        if (status == F_none) {
-                          // 2: At this point, we can still know the proper format for the file and still have a invalid header, handle accordingly.
-                          if (buffer.string[i] == f_fss_type_header_close) {
-                            header->length = i + 1;
-
-                            return F_none;
-                          }
-                          else {
-                            // if "# fss-0000" is there, regardless of whats next, we can guess this to be of fss-0000, even if its fss-00001 (this is a guess afterall).
-                            header->length = i + 1;
-
-                            return F_status_set_warning(FL_fss_accepted_invalid);
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-      // people can miss spaces, so lets accept in an attempt to interpret the file anyway, but return values at this point are to be flagged as invalid.
-      else if (buffer.string[i] == f_fss_type_header_part2) {
-        i++;
-
-        if (buffer.string[i] == f_fss_type_header_part3) {
-          i++;
-
-          if (buffer.string[i] == f_fss_type_header_part4) {
-            i++;
-
-            if (buffer.string[i] == f_fss_type_header_part5) {
-              i++;
-
-              if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
-                i++;
-
-                if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
-                  i++;
-
-                  if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
-                    i++;
-
-                    if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
-                      i++;
-
-                      f_string_range range = f_string_range_initialize;
-
-                      range.start = i - 4;
-                      range.stop = i;
-
-                      const f_status status = f_conversion_string_to_hexidecimal_unsigned(buffer.string, &header->type, range);
-                      if (F_status_is_error(status)) return status;
-
-                      header->length = i + 1;
-
-                      return F_status_set_warning(FL_fss_accepted_invalid);
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    // @todo At some point add checksum and compressions checks here, but the above statements will have to be adjusted accordingly.
-    // 3: eventually this will be processing the checksum and 4: will be processing the compression.
-
-    return FL_fss_header_not;
-  }
-#endif // !defined(_di_fl_fss_identify_) || !defined(_di_fl_fss_identify_file_)
-
 #if !defined(_di_fl_fss_basic_object_read_) || !defined(_di_fl_fss_extended_object_read_)
   f_return_status private_fl_fss_basic_object_read(const bool is_basic, f_string_dynamic *buffer, f_string_range *range, f_fss_object *found) {
     f_status status = F_none;
index 45bd919a003cbc27379f07a93f754a64c3a30ece..bb9bfdcaaf302a604ce18ec46f5621324e211242 100644 (file)
@@ -16,31 +16,6 @@ extern "C" {
 #endif
 
 /**
- * Private implementation of fl_fss_identify().
- *
- * Intended to be shared to each of the different implementation variations.
- *
- * @param buffer
- *   The string to process.
- * @param header
- *   The header data to populate with results of this function.
- *
- * @return
- *   F_none on success
- *   FL_fss_header_not if no header is found.
- *   FL_fss_accepted_invalid (with warning bit) if header is technically invalid but can be identified.
- *   FL_fss_header_not (with error bit) if the an error occurred prior to identifying a valid header.
- *
- *   Errors from (with error bit): f_conversion_string_to_hexidecimal_unsigned().
- *
- * @see fl_fss_identify()
- * @see fl_fss_identify_file()
- */
-#if !defined(_di_fl_fss_identify_) || !defined(_di_fl_fss_identify_file_)
-  extern f_return_status private_fl_fss_identify(const f_string_static buffer, f_fss_header *header) f_gcc_attribute_visibility_internal;
-#endif // !defined(_di_fl_fss_identify_) || !defined(_di_fl_fss_identify_file_)
-
-/**
  * Private implementation of fl_fss_basic_object_read().
  *
  * Intended to be shared to each of the different implementation variations.
index 30ef68e00bf18b99bfd03655889c95fbaa5c4e43..987705444b2b80a63c6b9a50d6421a1457964acc 100644 (file)
@@ -1,8 +1,9 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
 f_utf
-f_conversion
 f_file
 f_fss
index 8e3ab2155db38f0aaef8ad9c3cd1816438166f2c..8b2cc04a6dd3ae5227143247f7de22e3952280dc 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lf_fss -lf_file -lf_conversion -lf_utf -lf_memory
+build_libraries-individual -lf_fss -lf_file -lf_utf -lf_memory
 build_sources_library fss.c private-fss.c fss_basic.c fss_basic_list.c fss_extended.c fss_extended_list.c
 build_sources_program
 build_sources_headers fss.h fss_basic.h fss_basic_list.h fss_extended.h fss_extended_list.h fss_macro.h fss_status.h
index 6545c1a28bde7a6acf1fff0092b167b9e0ba95d9..470b93c6306feb50c5aa9bdfbddb6f24ececd51e 100644 (file)
 #include <sys/stat.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
 #include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
 #include <level_0/iki.h>
 
@@ -30,7 +30,7 @@ extern "C" {
 #endif
 
 /**
- * Read all iki Vocabulary and Content in the given range of the given buffer.
+ * Read all IKI Vocabulary and Content in the given range of the given buffer.
  *
  * This does not verify if any vocabulary name is known.
  * This only finds complete vocabulary names and their respective content.
index 7fa938f7a2b0ce3c1ffb4edd0e76559bff995de9..3e789103edd807c52a2624a145e3d5856ef09932 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index f9091384f6d8c9bb3fc0a77eda087f2b572e4eb9..ff67114997e3f63615bd08de66db28288e545796 100644 (file)
@@ -29,7 +29,7 @@ build_script yes
 build_shared yes
 build_static yes
 
-path_headers level_0
+path_headers level_1
 path_library_script script
 path_library_shared shared
 path_library_static static
index a4e93c8b7505906fb2f3660cd9efb7e1817761b6..c3981b84850e816b815529c2ca7a9a944aad70a2 100644 (file)
 #define _FL_print_h
 
 // fll-0 includes
-#include <level_0/conversion.h>
+#include <level_0/type.h>
 #include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
+#include <level_0/conversion.h>
 
 #ifdef __cplusplus
 extern "C" {
index bb1c052c793bd86ce6e4afcb2e58b377a4dd2610..756ff6041e0dc476cc4367e174bcc423822d71cb 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index 06cfde1a0fa7af5e448d463e80001787b7e85827..38f0dd7a931b74194254a0881da71e63b9fa9b6a 100644 (file)
 #define _FL_status_h
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
 
 #ifdef __cplusplus
index 2e85624b66f8c90ed1b8de9d72659d29abb6ec29..deb9037d103893780c780e414040072836998ee6 100644 (file)
@@ -1,4 +1,7 @@
+# fss-0000
+
 f_type
 f_status
+f_memory
 f_string
 f_utf
index de125fb92f7fc3045e63745ee4aeafea28452944..c6d3bb86b9d1406d612249f0919a6f80029e4d46 100644 (file)
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
 #include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
 
 #ifdef __cplusplus
index 13b45c70749e2d3516b47e95d38129f780366064..deb9037d103893780c780e414040072836998ee6 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index d5e8f3db11e1d989663237516802a60a08daf678..c22472ffeaa6ede5db8cd28efd0de144ea64020e 100644 (file)
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
 #include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
 
 #ifdef __cplusplus
index 13b45c70749e2d3516b47e95d38129f780366064..deb9037d103893780c780e414040072836998ee6 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index 9e47c69c22d48205ec3af6d5e5fdffa0cefd29c6..3c6d6b0a4008c79b7e5b8e15d288b2abcdf14556 100644 (file)
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
 #include <level_0/file.h>
 
index fed74d063d85665d7fb417a59a939bb63c40d99f..e4e94f3fa68c95c23cfc2afe2a9f31daace3bc49 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index 4a006fd2f8b1c761e40673fc289338d9a9839e95..dd97c372f09d997717f635e5f5ae9b9f1daf5515 100644 (file)
 #include <unistd.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
 #include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
+#include <level_0/utf.h>
 #include <level_0/environment.h>
 #include <level_0/file.h>
 #include <level_0/path.h>
index fad9ef57d04365fa31159b8d1ef11daa2c751017..f2299d5d790f338cc29f8ef2b5ccc2c74d7ad567 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
index d9b8057647314af2318928d91a7e22861a91a25b..70484c8e4f8df26a8bbf710f43ae983d552f2cd1 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfl_string -lf_path -lf_utf -lf_file -lf_environment -lf_memory
+build_libraries-individual -lfl_string -lf_utf -lf_path -lf_file -lf_environment -lf_memory
 build_sources_library execute.c private-execute.c
 build_sources_program
 build_sources_headers execute.h
index 5f7b664ea73a21f8d255a655caff18254104ead0..54d52233adf257e097abf5c590b89031576063a0 100644 (file)
 #include <stdio.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
 #include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
-#include <level_0/utf.h>
 
 // fll-1 includes
 #include <level_1/color.h>
index c73716f32ee0c1cfbb8fbc727218609f999684e1..0759aad5d08dcbd9fe840b7b48d5d9648052a908 100644 (file)
@@ -1,6 +1,7 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
-f_utf
 fl_color
index 2e41b0ba5e6b053143918d531fbc1aeae568229b..fa37f7ddca0dbdb812d391045ab8ce882c609bc2 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfl_color -lf_print -lf_file -lf_utf -lf_memory
+build_libraries-individual -lfl_color -lf_print -lf_file -lf_memory
 build_sources_library file.c
 build_sources_program
 build_sources_headers file.h
index 76d7c6f782783fa7450b864f56f8324f09eee8ee..029cafe9a984ece196dc5874f5743b6e800b2a82 100644 (file)
@@ -1,9 +1,50 @@
 #include <level_2/fss.h>
+#include "private-fss.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+#ifndef _di_fll_fss_identify_
+  f_return_status fll_fss_identify(const f_string_static buffer, f_fss_header *header) {
+    #ifndef _di_level_2_parameter_checking_
+      if (header == 0) return F_status_set_error(F_parameter);
+      if (buffer.used <= 0) return F_status_set_error(F_parameter);
+    #endif // _di_level_2_parameter_checking_
+
+    return private_fll_fss_identify(buffer, header);
+  }
+#endif // _di_fll_fss_identify_
+
+#ifndef _di_fll_fss_identify_file_
+  f_return_status fll_fss_identify_file(f_file *file, f_fss_header *header) {
+    #ifndef _di_level_2_parameter_checking_
+      if (file == 0) return F_status_set_error(F_parameter);
+      if (header == 0) return F_status_set_error(F_parameter);
+      if (file->id == 0) return F_status_set_error(F_file_closed);
+      if (file->id < 0) return F_status_set_error(F_file);
+    #endif // _di_level_2_parameter_checking_
+
+    {
+      f_string_length seeked = 0;
+      if (F_status_is_error(f_file_seek(file->id, SEEK_SET, 0, &seeked))) {
+        return F_status_set_error(F_file_seek);
+      }
+    }
+
+    f_status status = F_none;
+    f_string_dynamic buffer = f_string_dynamic_initialize;
+
+    f_macro_string_dynamic_resize(status, buffer, f_fss_max_header_length + 1);
+    if (F_status_is_error(status)) return status;
+
+    status = f_file_read_until(*file, &buffer, f_fss_max_header_length + 1);
+    if (F_status_is_error(status)) return status;
+
+    return private_fll_fss_identify(buffer, header);
+  }
+#endif // _di_fll_fss_identify_file_
+
 #ifndef _di_fll_fss_snatch_
   f_return_status fll_fss_snatch(const f_string_static buffer, const f_fss_objects objects, const f_fss_contents contents, const f_string names[], const f_string_length lengths[], const f_string_length size, f_string_dynamic *values[]) {
     #ifndef _di_level_2_parameter_checking_
index c3299e1e8bc9c6350981d9ad63c2f0fc2976b2d5..6ee9ce983987d31f4c59dd203495540bad2677b5 100644 (file)
 #define _FLL_fss_h
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
-#include <level_0/fss.h>
 #include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
+#include <level_0/fss.h>
 
 // fll-1 includes
+#include <level_1/conversion.h>
 #include <level_1/fss.h>
 #include <level_1/fss_macro.h>
 #include <level_1/fss_status.h>
@@ -31,6 +32,52 @@ extern "C" {
 #endif
 
 /**
+ * Identify FSS type from a buffered string.
+ *
+ * @param buffer
+ *   The string to process.
+ * @param header
+ *   The header data to populate with results of this function.
+ *
+ * @return
+ *   F_none on success
+ *   FL_fss_header_not if no header is found.
+ *   FL_fss_accepted_invalid (with warning bit) if header is technically invalid but can be identified.
+ *   FL_fss_header_not (with error bit) if the an error occurred prior to identifying a valid header.
+ *
+ *   Errors from (with error bit): fl_conversion_string_to_hexidecimal_unsigned().
+ */
+#ifndef _di_fll_fss_identify_
+  extern f_return_status fll_fss_identify(const f_string_static buffer, f_fss_header *header);
+#endif // _di_fll_fss_identify_
+
+/**
+ * Identify FSS type from a file.
+ *
+ * @param file
+ *   The file information.
+ * @param header
+ *   The header data to populate with results of this function.
+ *
+ * @return
+ *   F_none on success.
+ *   FL_fss_header_not if no header is found.
+ *   FL_fss_accepted_invalid (with warning bit) if header is technically invalid but can be identified.
+ *   F_memory_reallocation (with error bit) on memory reallocation error.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ *   FL_fss_header_not (with error bit) if the an error occurred prior to identifying a valid header.
+ *
+ *   Errors from (with error bit): fl_conversion_string_to_hexidecimal_unsigned().
+ *   Errors from (with error bit): f_file_read_until().
+ *   Errors from (with error bit): f_file_seek().
+ *
+ * @see f_file_read_until()
+ */
+#ifndef _di_fll_fss_identify_file_
+  extern f_return_status fll_fss_identify_file(f_file *file, f_fss_header *header);
+#endif // _di_fll_fss_identify_file_
+
+/**
  * Perform simple search through all objects against the given set, saving all values when matched.
  *
  * Only the first match for each distinct object is snatched.
diff --git a/level_2/fll_fss/c/private-fss.c b/level_2/fll_fss/c/private-fss.c
new file mode 100644 (file)
index 0000000..88185af
--- /dev/null
@@ -0,0 +1,138 @@
+#include <level_2/fss.h>
+#include "private-fss.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !defined(_di_fll_fss_identify_) || !defined(_di_fll_fss_identify_file_)
+  f_return_status private_fll_fss_identify(const f_string_static buffer, f_fss_header *header) {
+    register f_string_length i = 0;
+
+    if (buffer.used < 10) {
+      // "# fss-0000" is always at least 10 characters.
+      return FL_fss_header_not;
+    }
+
+    // If this correctly follows the FSS specification, then this should be all that needs to be done (as well as atoh for ascii to hex).
+    // All characters used in the identifier are only in the ascii equivalents of the characters, any similarly looking character or number representing in UTF-8 is considered invalid.
+    if (buffer.string[i] == f_fss_type_header_open) {
+      i++;
+
+      if (buffer.string[i] == f_fss_type_header_part1) {
+        i++;
+
+        if (buffer.string[i] == f_fss_type_header_part2) {
+          i++;
+
+          if (buffer.string[i] == f_fss_type_header_part3) {
+            i++;
+
+            if (buffer.string[i] == f_fss_type_header_part4) {
+              i++;
+
+              if (buffer.string[i] == f_fss_type_header_part5) {
+                i++;
+
+                if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
+                  i++;
+
+                  if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
+                    i++;
+
+                    if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
+                      i++;
+
+                      if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
+                        i++;
+
+                        f_string_range range = f_string_range_initialize;
+
+                        range.start = i - 4;
+                        range.stop = i;
+
+                        // 1: A possibly valid header type was found, now convert it into its proper format and save the header type.
+                        const f_status status = fl_conversion_string_to_hexidecimal_unsigned(buffer.string, &header->type, range);
+                        if (F_status_is_error(status)) return status;
+
+                        if (status == F_none) {
+                          // 2: At this point, we can still know the proper format for the file and still have a invalid header, handle accordingly.
+                          if (buffer.string[i] == f_fss_type_header_close) {
+                            header->length = i + 1;
+
+                            return F_none;
+                          }
+                          else {
+                            // @todo this needs to be changed to support sub-headers (maybe something like FL_fss_accepted_additional).
+                            // if "# fss-0000" is there, regardless of whats next, we can guess this to be of fss-0000, even if its fss-00001 (this is a guess afterall).
+                            header->length = i + 1;
+
+                            return F_status_set_warning(FL_fss_accepted_invalid);
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      // people can miss spaces, so lets accept in an attempt to interpret the file anyway, but return values at this point are to be flagged as invalid.
+      else if (buffer.string[i] == f_fss_type_header_part2) {
+        i++;
+
+        if (buffer.string[i] == f_fss_type_header_part3) {
+          i++;
+
+          if (buffer.string[i] == f_fss_type_header_part4) {
+            i++;
+
+            if (buffer.string[i] == f_fss_type_header_part5) {
+              i++;
+
+              if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
+                i++;
+
+                if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
+                  i++;
+
+                  if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
+                    i++;
+
+                    if (f_conversion_character_is_hexidecimal(buffer.string[i]) == F_true) {
+                      // @todo this needs to be changed to support sub-headers (maybe something like FL_fss_accepted_additional).
+                      i++;
+
+                      f_string_range range = f_string_range_initialize;
+
+                      range.start = i - 4;
+                      range.stop = i;
+
+                      const f_status status = fl_conversion_string_to_hexidecimal_unsigned(buffer.string, &header->type, range);
+                      if (F_status_is_error(status)) return status;
+
+                      header->length = i + 1;
+
+                      return F_status_set_warning(FL_fss_accepted_invalid);
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+
+    // @todo At some point add checksum and compressions checks here, but the above statements will have to be adjusted accordingly.
+    // 3: eventually this will be processing the checksum and 4: will be processing the compression.
+
+    return FL_fss_header_not;
+  }
+#endif // !defined(_di_fll_fss_identify_) || !defined(_di_fll_fss_identify_file_)
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_2/fll_fss/c/private-fss.h b/level_2/fll_fss/c/private-fss.h
new file mode 100644 (file)
index 0000000..ff09249
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * FLL - Level 2
+ *
+ * Project: FSS
+ * API Version: 0.5
+ * Licenses: lgplv2.1
+ *
+ * These are provided for internal reduction in redundant code.
+ * These should not be exposed/used outside of this project.
+ */
+#ifndef _PRIVATE_FLL_fss_h
+#define _PRIVATE_FLL_fss_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Private implementation of fll_fss_identify().
+ *
+ * Intended to be shared to each of the different implementation variations.
+ *
+ * @param buffer
+ *   The string to process.
+ * @param header
+ *   The header data to populate with results of this function.
+ *
+ * @return
+ *   F_none on success
+ *   FL_fss_header_not if no header is found.
+ *   FL_fss_accepted_invalid (with warning bit) if header is technically invalid but can be identified.
+ *   FL_fss_header_not (with error bit) if the an error occurred prior to identifying a valid header.
+ *
+ *   Errors from (with error bit): fl_conversion_string_to_hexidecimal_unsigned().
+ *
+ * @see fll_fss_identify()
+ * @see fll_fss_identify_file()
+ */
+#if !defined(_di_fll_fss_identify_) || !defined(_di_fll_fss_identify_file_)
+  extern f_return_status private_fll_fss_identify(const f_string_static buffer, f_fss_header *header) f_gcc_attribute_visibility_internal;
+#endif // !defined(_di_fll_fss_identify_) || !defined(_di_fll_fss_identify_file_)
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // _PRIVATE_FLL_fss_h
index f8f5567c0c10e028c5bb308f09bba7612f283c26..d36fb05456cfc6215f06de42ec16b6a52f118c2b 100644 (file)
@@ -1,10 +1,13 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_conversion
 f_fss
-f_utf
+fl_conversion
 fl_fss
 fl_status
 fl_string
index a8cfaf5e3136ab1f8d6f3cd925fa903750d142db..a8a4ebf5191bd540c12aa0ee98ec189bbc8941be 100644 (file)
@@ -19,8 +19,8 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfl_string -lfl_status -lfl_fss -lf_file -lf_fss -lf_conversion -lf_utf -lf_memory
-build_sources_library fss.c fss_basic.c fss_basic_list.c fss_extended.c fss_extended_list.c fss_status.c
+build_libraries-individual -lfl_string -lfl_status -lfl_fss -lf_file -lfl_conversion -lf_fss -lf_conversion -lf_utf -lf_memory
+build_sources_library fss.c private-fss.c fss_basic.c fss_basic_list.c fss_extended.c fss_extended_list.c fss_status.c
 build_sources_program
 build_sources_headers fss.h fss_basic.h fss_basic_list.h fss_extended.h fss_extended_list.h fss_status.h
 build_sources_script
index 876b31d9c90ec864bd81e9ee335f1d30a10fc66d..226f129f1dc3ccdf13b5ad55d2feb9a221422fba 100644 (file)
 #include <stdio.h>
 
 // fll-0 includes
-#include <level_0/console.h>
+#include <level_0/type.h>
 #include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
+#include <level_0/utf.h>
+#include <level_0/console.h>
 
 // fll-1 includes
 #include <level_1/color.h>
index 7a2bf683d350445e2a4a0a94987b38c64c3984c3..65187021ef0082a22c4c19bf19c4ab61895d9001 100644 (file)
@@ -1,7 +1,10 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_console
 fl_color
 fl_string
index a729eb78d1054cc71d31c246eb32c3c60aa7eaa5..f379574d60d9f8c44c3f67084ca56e24527dd61a 100644 (file)
 #define _FLL_status_h
 
 // fll-0 includes
-#include <level_0/conversion.h>
+#include <level_0/type.h>
 #include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
 #include <level_0/utf.h>
+#include <level_0/conversion.h>
 
 // fll-1 includes
 #include <level_1/string.h>
index 1e5b4b2e5a16d026a3438939d23d27a26e6ee4c9..2910b2195003f06699fdbf28979bc18089a5c850 100644 (file)
@@ -1,8 +1,10 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
-f_conversion
 f_utf
+f_conversion
 fl_status
 fl_string
index 36f652501f173b6204be446d916d893deef7ac14..0ef751e39788dc46c25d2f5edba006b94f5a3503 100644 (file)
@@ -170,9 +170,12 @@ extern "C" {
         return F_status_set_error(status);
       }
       else if (data->parameters[byte_dump_parameter_width].result == f_console_result_additional) {
+        const f_string_length index = data->parameters[byte_dump_parameter_width].additional.array[data->parameters[byte_dump_parameter_width].additional.used - 1];
+        const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[index]));
+
         f_number_unsigned number = 0;
-        status = fl_console_parameter_to_number_unsigned(arguments.argv[data->parameters[byte_dump_parameter_width].additional.array[data->parameters[byte_dump_parameter_width].additional.used - 1]], &number);
 
+        status = fl_conversion_string_to_number_unsigned(arguments.argv[index], &number, range);
         if (F_status_is_error(status) || number < 1 || number >= 0xfb) {
           fl_color_print(f_type_error, data->context.error, data->context.reset, "ERROR: The parameter '");
           fl_color_print(f_type_error, data->context.notable, data->context.reset, "%s%s", f_console_symbol_long_enable, byte_dump_long_width);
@@ -198,9 +201,12 @@ extern "C" {
         return F_status_set_error(status);
       }
       else if (data->parameters[byte_dump_parameter_first].result == f_console_result_additional) {
+        const f_string_length index = data->parameters[byte_dump_parameter_first].additional.array[data->parameters[byte_dump_parameter_first].additional.used - 1];
+        const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[index]));
+
         f_number_unsigned number = 0;
-        status = fl_console_parameter_to_number_unsigned(arguments.argv[data->parameters[byte_dump_parameter_first].additional.array[data->parameters[byte_dump_parameter_first].additional.used - 1]], &number);
 
+        status = fl_conversion_string_to_number_unsigned(arguments.argv[index], &number, range);
         if (F_status_is_error(status) || number > f_type_number_size_unsigned) {
           fl_color_print(f_type_error, data->context.error, data->context.reset, "ERROR: The parameter '");
           fl_color_print(f_type_error, data->context.notable, data->context.reset, "%s%s", f_console_symbol_long_enable, byte_dump_long_first);
@@ -226,9 +232,12 @@ extern "C" {
         return F_status_set_error(status);
       }
       else if (data->parameters[byte_dump_parameter_last].result == f_console_result_additional) {
+        const f_string_length index = data->parameters[byte_dump_parameter_last].additional.array[data->parameters[byte_dump_parameter_last].additional.used - 1];
+        const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[index]));
+
         f_number_unsigned number = 0;
-        status = fl_console_parameter_to_number_unsigned(arguments.argv[data->parameters[byte_dump_parameter_last].additional.array[data->parameters[byte_dump_parameter_last].additional.used - 1]], &number);
 
+        status = fl_conversion_string_to_number_unsigned(arguments.argv[index], &number, range);
         if (F_status_is_error(status) || number < 0 || number > f_type_number_size_unsigned) {
           fl_color_print(f_type_error, data->context.error, data->context.reset, "ERROR: The parameter '");
           fl_color_print(f_type_error, data->context.notable, data->context.reset, "%s%s", f_console_symbol_long_enable, byte_dump_long_last);
index 9868836aaaa8426a382a514e306ffeaa47ecb2a9..b294b66b8786d6120144a5b8c76fe8c305ffb611 100644 (file)
 #include <unistd.h>
 
 // fll-0 includes
+#include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
+#include <level_0/string.h>
+#include <level_0/utf.h>
 #include <level_0/console.h>
 #include <level_0/conversion.h>
 #include <level_0/file.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_0/utf.h>
 
 // fll-1 includes
 #include <level_1/color.h>
 #include <level_1/console.h>
+#include <level_1/conversion.h>
 #include <level_1/string.h>
 #include <level_1/utf.h>
 
index 62f64d09501e8a1f2a70ef7d329c404eb38d3597..1144d6a95a4499a570711a899ca82d4d4944df57 100644 (file)
@@ -1,16 +1,19 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_color
 f_console
 f_conversion
 f_file
 f_pipe
 f_print
-f_utf
 fl_color
 fl_console
+fl_conversion
 fl_string
 fl_utf
 fll_program
index f0f53be9d5f21cd29ef201baabce6cd0a27bd6e7..963be4c1a3934304437683f77d883cbd4ca3022a 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_program -lfl_utf -lfl_string -lfl_console -lfl_color -lf_print -lf_pipe -lf_file -lf_conversion -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_program -lfl_utf -lfl_string -lfl_conversion -lfl_console -lfl_color -lf_print -lf_pipe -lf_file -lf_conversion -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library byte_dump.c private-byte_dump.c
index 20390aa2093ba3025c8748b4049798c87486334a..3ee81921e80b05b74786b419891d78d4caf3804b 100644 (file)
 #include <unistd.h>
 
 // fll-0 includes
+#include <level_0/type.h>
 #include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
-#include <level_0/type.h>
+#include <level_0/utf.h>
 #include <level_0/console.h>
 #include <level_0/directory.h>
 #include <level_0/file.h>
index a473180e89339dc235977ae1be35eba5af418273..e114de724aece3e7da21cee8d6162e599555a7b5 100644 (file)
@@ -17,6 +17,7 @@ f_path
 f_print
 fl_color
 fl_console
+fl_conversion
 fl_directory
 fl_fss
 fl_iki
index 9b06103d48d59a9f9298d6118405a1064c234254..ba781b97e259e50daa6b9d6bef064802a89c7a4c 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_program -lfll_execute -lfll_fss -lfl_utf -lfl_string -lfl_status -lfl_iki -lfl_fss -lfl_directory -lfl_console -lfl_color -lf_print -lf_path -lf_iki -lf_file -lf_fss -lf_environment -lf_directory -lf_conversion -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_program -lfll_execute -lfll_fss -lfl_utf -lfl_string -lfl_status -lfl_iki -lfl_fss -lfl_directory -lfl_conversion -lfl_console -lfl_color -lf_print -lf_path -lf_iki -lf_file -lf_fss -lf_environment -lf_directory -lf_conversion -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library fake.c private-fake.c private-clean.c private-build.c private-make.c private-print.c private-skeleton.c
index d3887ff25c7769dc0cc1c3c217b4cb6e908394d5..90438392dd57dd71e746633fa3a32835abaa9654 100644 (file)
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/type.h>
+#include <level_0/type_array.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
+#include <level_0/string.h>
+#include <level_0/utf.h>
 #include <level_0/console.h>
 #include <level_0/directory.h>
 #include <level_0/file.h>
 #include <level_0/pipe.h>
 #include <level_0/print.h>
-#include <level_0/string.h>
-#include <level_0/type.h>
-#include <level_0/type_array.h>
 
 // fll-1 includes
 #include <level_1/color.h>
index c5ab0b248861d9b5abbedaf12729f33cbc2b8a2f..a44bb216b902ab148f2266370212d864f251c366 100644 (file)
@@ -1,7 +1,10 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_color
 f_console
 f_directory
@@ -11,9 +14,9 @@ f_fss
 f_path
 f_pipe
 f_print
-f_utf
 fl_color
 fl_console
+fl_conversion
 fl_fss
 fl_status
 fl_string
index 4fe73162b5fd4dfc755ec0e491636eab449f839d..5c50459b957cc25d50ee9cb124cf79a2fc96c814 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_path -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_program -lfll_fss -lfll_execute -lfl_string -lfl_status -lfl_fss -lfl_conversion -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_path -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library firewall.c private-firewall.c
index 9d3c7257a5a2109f990b99f159a28b79ece57a50..94cd9f45601014967fb063726d3e04487e0bd49c 100644 (file)
 
 // fll-0 includes
 #include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
+#include <level_0/utf.h>
 #include <level_0/console.h>
 #include <level_0/directory.h>
 #include <level_0/file.h>
@@ -31,6 +34,7 @@
 // fll-1 includes
 #include <level_1/color.h>
 #include <level_1/console.h>
+#include <level_1/conversion.h>
 #include <level_1/print.h>
 #include <level_1/string.h>
 
index 358d329984ad01f9eb9304d0836d1a8e748ea827..61488177781bb14c5cfd0ee4ccd3c1a849734575 100644 (file)
@@ -120,10 +120,11 @@ extern "C" {
       else {
         position_depth = data.parameters[fss_basic_list_read_parameter_depth].additional.array[i];
 
-        status = fl_console_parameter_to_number_unsigned(arguments.argv[position_depth], &depths->array[i].depth);
+        const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[position_depth]));
 
+        status = fl_conversion_string_to_number_unsigned(arguments.argv[position_depth], &depths->array[i].depth, range);
         if (F_status_is_error(status)) {
-          fss_basic_list_read_print_number_argument_error(data.context, "fl_console_parameter_to_number_unsigned", fss_basic_list_read_long_depth, arguments.argv[position_depth], F_status_set_fine(status));
+          fss_basic_list_read_print_number_argument_error(data.context, "fl_conversion_string_to_number_unsigned", fss_basic_list_read_long_depth, arguments.argv[position_depth], F_status_set_fine(status));
           return status;
         }
       }
@@ -140,10 +141,11 @@ extern "C" {
 
           depths->array[i].index_at = data.parameters[fss_basic_list_read_parameter_at].additional.array[position_at];
 
-          status = fl_console_parameter_to_number_unsigned(arguments.argv[depths->array[i].index_at], &depths->array[i].value_at);
+          const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[depths->array[i].index_at]));
 
+          status = fl_conversion_string_to_number_unsigned(arguments.argv[depths->array[i].index_at], &depths->array[i].value_at, range);
           if (F_status_is_error(status)) {
-            fss_basic_list_read_print_number_argument_error(data.context, "fl_console_parameter_to_number_unsigned", fss_basic_list_read_long_at, arguments.argv[depths->array[i].index_at], F_status_set_fine(status));
+            fss_basic_list_read_print_number_argument_error(data.context, "fl_conversion_string_to_number_unsigned", fss_basic_list_read_long_at, arguments.argv[depths->array[i].index_at], F_status_set_fine(status));
             return status;
           }
         } // for
@@ -297,10 +299,12 @@ extern "C" {
     f_string_length select = 0;
 
     if (data->parameters[fss_basic_list_read_parameter_select].result == f_console_result_additional) {
-      status = fl_console_parameter_to_number_unsigned(arguments.argv[data->parameters[fss_basic_list_read_parameter_select].additional.array[data->parameters[fss_basic_list_read_parameter_select].additional.used - 1]], &select);
+      const f_string_length index = data->parameters[fss_basic_list_read_parameter_select].additional.array[data->parameters[fss_basic_list_read_parameter_select].additional.used - 1];
+      const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[index]));
 
+      status = fl_conversion_string_to_number_unsigned(arguments.argv[index], &select, range);
       if (F_status_is_error(status)) {
-        fss_basic_list_read_print_number_argument_error(data->context, "fl_console_parameter_to_number_unsigned", fss_basic_list_read_long_select, arguments.argv[data->parameters[fss_basic_list_read_parameter_select].additional.array[0]], F_status_set_fine(status));
+        fss_basic_list_read_print_number_argument_error(data->context, "fl_conversion_string_to_number_unsigned", fss_basic_list_read_long_select, arguments.argv[index], F_status_set_fine(status));
         return status;
       }
 
@@ -313,10 +317,12 @@ extern "C" {
     f_string_length line = 0;
 
     if (data->parameters[fss_basic_list_read_parameter_line].result == f_console_result_additional) {
-      status = fl_console_parameter_to_number_unsigned(arguments.argv[data->parameters[fss_basic_list_read_parameter_line].additional.array[data->parameters[fss_basic_list_read_parameter_line].additional.used - 1]], &line);
+      const f_string_length index = data->parameters[fss_basic_list_read_parameter_line].additional.array[data->parameters[fss_basic_list_read_parameter_line].additional.used - 1];
+      const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[index]));
 
+      status = fl_conversion_string_to_number_unsigned(arguments.argv[index], &line, range);
       if (F_status_is_error(status)) {
-        fss_basic_list_read_print_number_argument_error(data->context, "fl_console_parameter_to_number_unsigned", fss_basic_list_read_long_line, arguments.argv[data->parameters[fss_basic_list_read_parameter_line].additional.array[0]], F_status_set_fine(status));
+        fss_basic_list_read_print_number_argument_error(data->context, "fl_conversion_string_to_number_unsigned", fss_basic_list_read_long_line, arguments.argv[index], F_status_set_fine(status));
         return status;
       }
     }
index 86c144ebeb47404211f1e21f8635ee92dc514a0e..c6ca3bc8fe4595cffddf711e2d8f50eee606141d 100644 (file)
@@ -1,7 +1,10 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_color
 f_console
 f_directory
@@ -12,6 +15,7 @@ f_pipe
 f_print
 fl_color
 fl_console
+fl_conversion
 fl_fss
 fl_print
 fl_status
index 18b8913ba0302bf2afdfff2374918740d4016c84..7647953bc06901883789ea3f0bc3d1072aa9788c 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_print -lfl_fss -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_print -lfl_fss -lfl_conversion -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library fss_basic_list_read.c private-fss_basic_list_read.c
index e86cb703f9ef5cf92dca01c9b0cf63649f7a3489..aad3bfe8cf0b6760a4ba553821443d94d33297d9 100644 (file)
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
+#include <level_0/string.h>
+#include <level_0/utf.h>
 #include <level_0/console.h>
 #include <level_0/file.h>
 #include <level_0/pipe.h>
 #include <level_0/print.h>
-#include <level_0/string.h>
-#include <level_0/type.h>
 
 // fll-1 includes
 #include <level_1/color.h>
index e4297e7f3424ecf9b664cea3fd7ca9af88edb8d1..f7149ed121c91d0fb0eda8253d2c96a210c230af 100644 (file)
@@ -1,7 +1,10 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_color
 f_console
 f_directory
@@ -12,6 +15,7 @@ f_pipe
 f_print
 fl_color
 fl_console
+fl_conversion
 fl_fss
 fl_status
 fl_string
index d1a54062914bfdfb2cb1d20d2f4cb31130ed4e8b..3395a5e1bacb377b2f09d53a4a3f22c5c602d4ce 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_fss -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_fss -lfl_conversion -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library fss_basic_list_write.c
index 3da47c5bec0156b37dd912cdfdb4c56dfdc6170d..01a52ff22069039ef75e441705171d38adb22b7c 100644 (file)
 
 // fll-0 includes
 #include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
+#include <level_0/utf.h>
 #include <level_0/console.h>
 #include <level_0/directory.h>
 #include <level_0/file.h>
@@ -31,6 +34,7 @@
 // fll-1 includes
 #include <level_1/color.h>
 #include <level_1/console.h>
+#include <level_1/conversion.h>
 #include <level_1/print.h>
 #include <level_1/string.h>
 
index 60c631265a7edec75c98db595e17d314c8d7f41f..88d17073a044ce236fe21df328075fbbbdabdfac 100644 (file)
@@ -120,10 +120,11 @@ extern "C" {
       else {
         position_depth = data.parameters[fss_basic_read_parameter_depth].additional.array[i];
 
-        status = fl_console_parameter_to_number_unsigned(arguments.argv[position_depth], &depths->array[i].depth);
+        const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[position_depth]));
 
+        status = fl_conversion_string_to_number_unsigned(arguments.argv[position_depth], &depths->array[i].depth, range);
         if (F_status_is_error(status)) {
-          fss_basic_read_print_number_argument_error(data.context, "fl_console_parameter_to_number_unsigned", fss_basic_read_long_depth, arguments.argv[position_depth], F_status_set_fine(status));
+          fss_basic_read_print_number_argument_error(data.context, "fl_conversion_string_to_number_unsigned", fss_basic_read_long_depth, arguments.argv[position_depth], F_status_set_fine(status));
           return status;
         }
       }
@@ -140,10 +141,11 @@ extern "C" {
 
           depths->array[i].index_at = data.parameters[fss_basic_read_parameter_at].additional.array[position_at];
 
-          status = fl_console_parameter_to_number_unsigned(arguments.argv[depths->array[i].index_at], &depths->array[i].value_at);
+          const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[depths->array[i].index_at]));
 
+          status = fl_conversion_string_to_number_unsigned(arguments.argv[depths->array[i].index_at], &depths->array[i].value_at, range);
           if (F_status_is_error(status)) {
-            fss_basic_read_print_number_argument_error(data.context, "fl_console_parameter_to_number_unsigned", fss_basic_read_long_at, arguments.argv[depths->array[i].index_at], F_status_set_fine(status));
+            fss_basic_read_print_number_argument_error(data.context, "fl_conversion_string_to_number_unsigned", fss_basic_read_long_at, arguments.argv[depths->array[i].index_at], F_status_set_fine(status));
             return status;
           }
         } // for
@@ -297,10 +299,12 @@ extern "C" {
     f_string_length select = 0;
 
     if (data->parameters[fss_basic_read_parameter_select].result == f_console_result_additional) {
-      status = fl_console_parameter_to_number_unsigned(arguments.argv[data->parameters[fss_basic_read_parameter_select].additional.array[data->parameters[fss_basic_read_parameter_select].additional.used - 1]], &select);
+      const f_string_length index = data->parameters[fss_basic_read_parameter_select].additional.array[data->parameters[fss_basic_read_parameter_select].additional.used - 1];
+      const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[index]));
 
+      status = fl_conversion_string_to_number_unsigned(arguments.argv[index], &select, range);
       if (F_status_is_error(status)) {
-        fss_basic_read_print_number_argument_error(data->context, "fl_console_parameter_to_number_unsigned", fss_basic_read_long_select, arguments.argv[data->parameters[fss_basic_read_parameter_select].additional.array[0]], F_status_set_fine(status));
+        fss_basic_read_print_number_argument_error(data->context, "fl_conversion_string_to_number_unsigned", fss_basic_read_long_select, arguments.argv[index], F_status_set_fine(status));
         return status;
       }
 
@@ -313,10 +317,12 @@ extern "C" {
     f_string_length line = 0;
 
     if (data->parameters[fss_basic_read_parameter_line].result == f_console_result_additional) {
-      status = fl_console_parameter_to_number_unsigned(arguments.argv[data->parameters[fss_basic_read_parameter_line].additional.array[data->parameters[fss_basic_read_parameter_line].additional.used - 1]], &line);
+      const f_string_length index = data->parameters[fss_basic_read_parameter_line].additional.array[data->parameters[fss_basic_read_parameter_line].additional.used - 1];
+      const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[index]));
 
+      status = fl_conversion_string_to_number_unsigned(arguments.argv[index], &line, range);
       if (F_status_is_error(status)) {
-        fss_basic_read_print_number_argument_error(data->context, "fl_console_parameter_to_number_unsigned", fss_basic_read_long_line, arguments.argv[data->parameters[fss_basic_read_parameter_line].additional.array[0]], F_status_set_fine(status));
+        fss_basic_read_print_number_argument_error(data->context, "fl_conversion_string_to_number_unsigned", fss_basic_read_long_line, arguments.argv[index], F_status_set_fine(status));
         return status;
       }
     }
index 86c144ebeb47404211f1e21f8635ee92dc514a0e..c6ca3bc8fe4595cffddf711e2d8f50eee606141d 100644 (file)
@@ -1,7 +1,10 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_color
 f_console
 f_directory
@@ -12,6 +15,7 @@ f_pipe
 f_print
 fl_color
 fl_console
+fl_conversion
 fl_fss
 fl_print
 fl_status
index 19061dfb029249960a408ada21753ad6462c6ac4..8ff4dc82a010f5839a3c2351b2ba88d770bb5079 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_print -lfl_fss -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_print -lfl_fss -lfl_conversion -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library fss_basic_read.c private-fss_basic_read.c
index a929e11f1712974c49531744ac6fd7fb949de1ae..85dbcc07b9d603bd23a8f1bb42d0400beb91b943 100644 (file)
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
+#include <level_0/string.h>
+#include <level_0/utf.h>
 #include <level_0/console.h>
 #include <level_0/file.h>
 #include <level_0/pipe.h>
 #include <level_0/print.h>
-#include <level_0/string.h>
-#include <level_0/type.h>
 
 // fll-1 includes
 #include <level_1/color.h>
index e4297e7f3424ecf9b664cea3fd7ca9af88edb8d1..f7149ed121c91d0fb0eda8253d2c96a210c230af 100644 (file)
@@ -1,7 +1,10 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_color
 f_console
 f_directory
@@ -12,6 +15,7 @@ f_pipe
 f_print
 fl_color
 fl_console
+fl_conversion
 fl_fss
 fl_status
 fl_string
index b64b0faf1c92ee2c8cb39cdea0e1230a14da2511..4f7aab33dbf67c4e985ed49ecdf17e687d7d05ad 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_fss -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_fss -lfl_conversion -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library fss_basic_write.c
index ab5db84b35a2f012ff544894de4ee1e9fb55af5e..ced955ee9c6e8b0e7064f07b0bf1768797cc0221 100644 (file)
 
 // fll-0 includes
 #include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
+#include <level_0/utf.h>
 #include <level_0/console.h>
 #include <level_0/directory.h>
 #include <level_0/file.h>
@@ -31,6 +34,7 @@
 // fll-1 includes
 #include <level_1/color.h>
 #include <level_1/console.h>
+#include <level_1/conversion.h>
 #include <level_1/print.h>
 #include <level_1/string.h>
 
index 08bdcabcccda3c6b1bc9abaa9da17a41ccddb1a7..80f091b3d0b5eedbab369d244e2cc301b00e3d9b 100644 (file)
@@ -120,10 +120,11 @@ extern "C" {
       else {
         position_depth = data.parameters[fss_extended_list_read_parameter_depth].additional.array[i];
 
-        status = fl_console_parameter_to_number_unsigned(arguments.argv[position_depth], &depths->array[i].depth);
+        const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[position_depth]));
 
+        status = fl_conversion_string_to_number_unsigned(arguments.argv[position_depth], &depths->array[i].depth, range);
         if (F_status_is_error(status)) {
-          fss_extended_list_read_print_number_argument_error(data.context, "fl_console_parameter_to_number_unsigned", fss_extended_list_read_long_depth, arguments.argv[position_depth], F_status_set_fine(status));
+          fss_extended_list_read_print_number_argument_error(data.context, "fl_conversion_string_to_number_unsigned", fss_extended_list_read_long_depth, arguments.argv[position_depth], F_status_set_fine(status));
           return status;
         }
       }
@@ -140,10 +141,11 @@ extern "C" {
 
           depths->array[i].index_at = data.parameters[fss_extended_list_read_parameter_at].additional.array[position_at];
 
-          status = fl_console_parameter_to_number_unsigned(arguments.argv[depths->array[i].index_at], &depths->array[i].value_at);
+          const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[depths->array[i].index_at]));
 
+          status = fl_conversion_string_to_number_unsigned(arguments.argv[depths->array[i].index_at], &depths->array[i].value_at, range);
           if (F_status_is_error(status)) {
-            fss_extended_list_read_print_number_argument_error(data.context, "fl_console_parameter_to_number_unsigned", fss_extended_list_read_long_at, arguments.argv[depths->array[i].index_at], F_status_set_fine(status));
+            fss_extended_list_read_print_number_argument_error(data.context, "fl_conversion_string_to_number_unsigned", fss_extended_list_read_long_at, arguments.argv[depths->array[i].index_at], F_status_set_fine(status));
             return status;
           }
         } // for
@@ -307,10 +309,12 @@ extern "C" {
       f_string_length select = 0;
 
       if (data->parameters[fss_extended_list_read_parameter_select].result == f_console_result_additional) {
-        status = fl_console_parameter_to_number_unsigned(arguments.argv[data->parameters[fss_extended_list_read_parameter_select].additional.array[data->parameters[fss_extended_list_read_parameter_select].additional.used - 1]], &select);
+        const f_string_length index = data->parameters[fss_extended_list_read_parameter_select].additional.array[data->parameters[fss_extended_list_read_parameter_select].additional.used - 1];
+        const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[index]));
 
+        status = fl_conversion_string_to_number_unsigned(arguments.argv[index], &select, range);
         if (F_status_is_error(status)) {
-          fss_extended_list_read_print_number_argument_error(data->context, "fl_console_parameter_to_number_unsigned", fss_extended_list_read_long_select, arguments.argv[data->parameters[fss_extended_list_read_parameter_select].additional.array[0]], F_status_set_fine(status));
+          fss_extended_list_read_print_number_argument_error(data->context, "fl_conversion_string_to_number_unsigned", fss_extended_list_read_long_select, arguments.argv[index], F_status_set_fine(status));
           return status;
         }
 
@@ -324,10 +328,14 @@ extern "C" {
     f_string_length line = 0;
 
     if (data->parameters[fss_extended_list_read_parameter_line].result == f_console_result_additional) {
-      status = fl_console_parameter_to_number_unsigned(arguments.argv[data->parameters[fss_extended_list_read_parameter_line].additional.array[data->parameters[fss_extended_list_read_parameter_line].additional.used - 1]], &line);
+      const f_string_length index = data->parameters[fss_extended_list_read_parameter_line].additional.array[data->parameters[fss_extended_list_read_parameter_line].additional.used - 1];
+      const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[index]));
 
+      f_number_unsigned number = 0;
+
+      status = fl_conversion_string_to_number_unsigned(arguments.argv[index], &number, range);
       if (F_status_is_error(status)) {
-        fss_extended_list_read_print_number_argument_error(data->context, "fl_console_parameter_to_number_unsigned", fss_extended_list_read_long_line, arguments.argv[data->parameters[fss_extended_list_read_parameter_line].additional.array[0]], F_status_set_fine(status));
+        fss_extended_list_read_print_number_argument_error(data->context, "fl_conversion_string_to_number_unsigned", fss_extended_list_read_long_line, arguments.argv[index], F_status_set_fine(status));
         return status;
       }
     }
index 86c144ebeb47404211f1e21f8635ee92dc514a0e..c6ca3bc8fe4595cffddf711e2d8f50eee606141d 100644 (file)
@@ -1,7 +1,10 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_color
 f_console
 f_directory
@@ -12,6 +15,7 @@ f_pipe
 f_print
 fl_color
 fl_console
+fl_conversion
 fl_fss
 fl_print
 fl_status
index a6a1003cd7bddb90de56052c63057d65bf822b8a..a2ceb63b731ff387240ecd8e1654dbd333697a82 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_print -lfl_fss -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_print -lfl_fss -lfl_conversion -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library fss_extended_list_read.c private-fss_extended_list_read.c
index 980211fbafd19072b11bc34aea4c48709b43c79b..15a99d3ba47c02e88faf59bec5bebbd2b051ae21 100644 (file)
 
 // fll-0 includes
 #include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
+#include <level_0/utf.h>
 #include <level_0/console.h>
 #include <level_0/directory.h>
 #include <level_0/file.h>
@@ -31,6 +34,7 @@
 // fll-1 includes
 #include <level_1/color.h>
 #include <level_1/console.h>
+#include <level_1/conversion.h>
 #include <level_1/print.h>
 #include <level_1/string.h>
 
index acb0a1fe446141ea4891285c6fe69f70ff497cce..2b73c1e4fc2859617466d5f240899c6ac117db2a 100644 (file)
@@ -120,10 +120,11 @@ extern "C" {
       else {
         position_depth = data.parameters[fss_extended_read_parameter_depth].additional.array[i];
 
-        status = fl_console_parameter_to_number_unsigned(arguments.argv[position_depth], &depths->array[i].depth);
+        const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[position_depth]));
 
+        status = fl_conversion_string_to_number_unsigned(arguments.argv[position_depth], &depths->array[i].depth, range);
         if (F_status_is_error(status)) {
-          fss_extended_read_print_number_argument_error(data.context, "fl_console_parameter_to_number_unsigned", fss_extended_read_long_depth, arguments.argv[position_depth], F_status_set_fine(status));
+          fss_extended_read_print_number_argument_error(data.context, "fl_conversion_string_to_number_unsigned", fss_extended_read_long_depth, arguments.argv[position_depth], F_status_set_fine(status));
           return status;
         }
       }
@@ -140,10 +141,11 @@ extern "C" {
 
           depths->array[i].index_at = data.parameters[fss_extended_read_parameter_at].additional.array[position_at];
 
-          status = fl_console_parameter_to_number_unsigned(arguments.argv[depths->array[i].index_at], &depths->array[i].value_at);
+          const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[depths->array[i].index_at]));
 
+          status = fl_conversion_string_to_number_unsigned(arguments.argv[depths->array[i].index_at], &depths->array[i].value_at, range);
           if (F_status_is_error(status)) {
-            fss_extended_read_print_number_argument_error(data.context, "fl_console_parameter_to_number_unsigned", fss_extended_read_long_at, arguments.argv[depths->array[i].index_at], F_status_set_fine(status));
+            fss_extended_read_print_number_argument_error(data.context, "fl_conversion_string_to_number_unsigned", fss_extended_read_long_at, arguments.argv[depths->array[i].index_at], F_status_set_fine(status));
             return status;
           }
         } // for
@@ -297,10 +299,12 @@ extern "C" {
     f_string_length select = 0;
 
     if (data->parameters[fss_extended_read_parameter_select].result == f_console_result_additional) {
-      status = fl_console_parameter_to_number_unsigned(arguments.argv[data->parameters[fss_extended_read_parameter_select].additional.array[data->parameters[fss_extended_read_parameter_select].additional.used - 1]], &select);
+      const f_string_length index = data->parameters[fss_extended_read_parameter_select].additional.array[data->parameters[fss_extended_read_parameter_select].additional.used - 1];
+      const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[index]));
 
+      status = fl_conversion_string_to_number_unsigned(arguments.argv[index], &select, range);
       if (F_status_is_error(status)) {
-        fss_extended_read_print_number_argument_error(data->context, "fl_console_parameter_to_number_unsigned", fss_extended_read_long_select, arguments.argv[data->parameters[fss_extended_read_parameter_select].additional.array[0]], F_status_set_fine(status));
+        fss_extended_read_print_number_argument_error(data->context, "fl_conversion_string_to_number_unsigned", fss_extended_read_long_select, arguments.argv[index], F_status_set_fine(status));
         return status;
       }
     }
@@ -308,10 +312,12 @@ extern "C" {
     f_string_length line = 0;
 
     if (data->parameters[fss_extended_read_parameter_line].result == f_console_result_additional) {
-      status = fl_console_parameter_to_number_unsigned(arguments.argv[data->parameters[fss_extended_read_parameter_line].additional.array[data->parameters[fss_extended_read_parameter_line].additional.used - 1]], &line);
+      const f_string_length index = data->parameters[fss_extended_read_parameter_line].additional.array[data->parameters[fss_extended_read_parameter_line].additional.used - 1];
+      const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[index]));
 
+      status = fl_conversion_string_to_number_unsigned(arguments.argv[index], &line, range);
       if (F_status_is_error(status)) {
-        fss_extended_read_print_number_argument_error(data->context, "fl_console_parameter_to_number_unsigned", fss_extended_read_long_line, arguments.argv[data->parameters[fss_extended_read_parameter_line].additional.array[0]], F_status_set_fine(status));
+        fss_extended_read_print_number_argument_error(data->context, "fl_conversion_string_to_number_unsigned", fss_extended_read_long_line, arguments.argv[index], F_status_set_fine(status));
         return status;
       }
     }
index 86c144ebeb47404211f1e21f8635ee92dc514a0e..24804a4583417ec4fe0a698268d629b184a38a3b 100644 (file)
@@ -1,7 +1,10 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_color
 f_console
 f_directory
@@ -11,6 +14,7 @@ f_fss
 f_pipe
 f_print
 fl_color
+fl_conversion
 fl_console
 fl_fss
 fl_print
index 013981490ed9ccf01a50385d7a32a9b22a64204a..d186cba2d303617d6e0341f4709d3157dc71f478 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_print -lfl_fss -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_print -lfl_fss -lfl_console -lfl_conversion -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library fss_extended_read.c private-fss_extended_read.c
index d470f5cefdaa9592436506afac6122865672a67c..478b937bff12ee56d6442f790f2fb86be892dd76 100644 (file)
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
+#include <level_0/string.h>
+#include <level_0/utf.h>
 #include <level_0/console.h>
 #include <level_0/file.h>
 #include <level_0/pipe.h>
 #include <level_0/print.h>
-#include <level_0/string.h>
-#include <level_0/type.h>
 
 // fll-1 includes
 #include <level_1/color.h>
index 260ee14ef577dc71a42f9477ae6e2fa7aa35e65b..5c4b55fff2cff997f526ae8231e2f29155789aca 100644 (file)
@@ -1,7 +1,10 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_color
 f_console
 f_directory
@@ -11,6 +14,7 @@ f_fss
 f_pipe
 f_print
 fl_color
+fl_conversion
 fl_fss
 fl_status
 fl_string
index c30b05f7284938eff3ddc619224a4427dafc4b86..eeabed23a1e4711e6c98370ccb07d16f35d7ef4a 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_fss -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_string -lfl_status -lfl_fss -lfl_conversion -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library fss_extended_write.c
index 73b767f87c0e378809db6a8b5074369c8e1aa1ff..c31c0e2ea2250834b6edfc79ad3bd6822192dee5 100644 (file)
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
+#include <level_0/string.h>
+#include <level_0/utf.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>
 
 // fll-1 includes
 #include <level_1/color.h>
 #include <level_1/console.h>
+#include <level_1/conversion.h>
 #include <level_1/status.h>
 #include <level_1/string.h>
 
index 18745b727b9b0ff51b78c8672a0b3eac247f6b22..98ba214f038e52f48f7d5dfd2fedb4b9130a3d27 100644 (file)
@@ -48,9 +48,11 @@ extern "C" {
     f_status status = F_none;
 
     {
+      const f_string_range range = f_macro_string_range_initialize(strlen(value));
+
       f_number_unsigned number = 0;
 
-      status = fl_console_parameter_to_number_unsigned(value, &number);
+      status = fl_conversion_string_to_number_unsigned(value, &number, range);
 
       if (status == F_none) {
         fl_color_print_line(f_type_output, data.context.error, data.context.reset, "invalid name");
@@ -131,7 +133,9 @@ extern "C" {
 
 #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);
+    const f_string_range range = f_macro_string_range_initialize(strlen(value));
+
+    f_status status = fl_conversion_string_to_number_unsigned(value, number, range);
 
     if (*number > F_status_size_max_with_signal) {
       fl_color_print_line(f_type_output, data.context.error, data.context.reset, "out of range");
index c181f38b356c91a50e6946da1ce1182a254e6d86..528ffcd568a3a9057bb55ce2dcb5c0a2464ca190 100644 (file)
@@ -1,7 +1,10 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_color
 f_console
 f_conversion
@@ -11,9 +14,9 @@ f_file
 f_fss
 f_pipe
 f_print
-f_utf
 fl_color
 fl_console
+fl_conversion
 fl_fss
 fl_status
 fl_string
index ee1b6f4135b9e53205b954f87b5d2afdc5b88669..0b3049349b639a9cd30231d7b0824348f0ebfc0c 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_status -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_utf -lfl_string -lfl_status -lfl_fss -lfl_console -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_conversion -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_status -lfll_program -lfll_fss -lfll_file -lfll_execute -lf_path -lfl_utf -lfl_string -lfl_status -lfl_fss -lfl_conversion -lfl_console -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_conversion -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library fss_status_code.c private-fss_status_code.c
index 32c6ba99c2bef1c4565b05c78ed319d99dfe7b89..9ff64e0716fbe11e68ec9604978cec9cded573d2 100644 (file)
@@ -161,17 +161,22 @@ extern "C" {
       }
       else if (data->parameters[iki_read_parameter_line].result == f_console_result_additional) {
         const f_string_length index = data->parameters[iki_read_parameter_line].additional.array[data->parameters[iki_read_parameter_line].additional.used - 1];
+        const f_string_range range = f_macro_string_range_initialize(strlen(arguments.argv[index]));
 
-        status = fl_console_parameter_to_number_unsigned(arguments.argv[index], &data->line);
+        f_number_unsigned number = 0;
+
+        status = fl_conversion_string_to_number_unsigned(arguments.argv[index], &number, range);
         if (F_status_is_error(status)) {
-          iki_read_print_error_number_argument(data->context, data->verbosity, F_status_set_fine(status), "fl_console_parameter_to_number_unsigned", iki_read_long_line, arguments.argv[index]);
+          iki_read_print_error_number_argument(data->context, data->verbosity, F_status_set_fine(status), "fl_conversion_string_to_number_unsigned", iki_read_long_line, arguments.argv[index]);
           fprintf(f_type_error, "%c", f_string_eol[0]);
 
           iki_read_delete_data(data);
           return F_status_set_error(F_parameter);
         }
 
-        // additional
+        data->line = number;
+
+        // additional @todo
       }
 
       if (data->parameters[iki_read_parameter_name].result == f_console_result_found) {
index 2cc6434a7a20b01e6c90c9f4adf4ab59cdc9c2ba..526977a310cb6a390e3118cf1b7d4f1891be10c8 100644 (file)
 
 // fll-0 includes
 #include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
+#include <level_0/utf.h>
 #include <level_0/console.h>
 #include <level_0/conversion.h>
 #include <level_0/file.h>
@@ -32,6 +35,7 @@
 // fll-1 includes
 #include <level_1/color.h>
 #include <level_1/console.h>
+#include <level_1/conversion.h>
 #include <level_1/iki.h>
 #include <level_1/print.h>
 #include <level_1/string.h>
index 7de6d34ef160146f7d1ce5eb7c921a2f51a2e250..2a02015b561276896e6b8d0359b2da9147130cb4 100644 (file)
@@ -1,3 +1,5 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
@@ -12,6 +14,7 @@ f_pipe
 f_print
 fl_color
 fl_console
+fl_conversion
 fl_iki
 fl_string
 fl_utf
index 9599f41dfa30e3f2c22459c95e853013a96ee043..af608ee39809a171a8f27928aaa1ffa524d73d07 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_program -lfll_file -lfl_string -lfl_status -lfl_print -lfl_iki -lfl_fss -lfl_console -lfl_color -lf_print -lf_pipe -lf_path -lf_iki -lf_fss -lf_file -lf_environment -lf_conversion -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_program -lfll_file -lfl_utf -lfl_string -lfl_iki -lfl_conversion -lfl_console -lfl_color -lf_print -lf_pipe -lf_iki -lf_file -lf_conversion -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library iki_read.c private-iki_read.c
index a5ae4e269cd2008634a16fe3a5482f72e8f6efbb..e6211f69ea69934a61af9e0f3b2b61d58a6db63b 100644 (file)
 
 // fll-0 includes
 #include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
 #include <level_0/string.h>
+#include <level_0/utf.h>
 #include <level_0/console.h>
 #include <level_0/directory.h>
 #include <level_0/file.h>
index 1156585fa07f7be9b403472c5eadc2e5511a7309..2c1c9af3e5a2370c89baa26427056106b8244402 100644 (file)
@@ -1,7 +1,10 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_color
 f_console
 f_directory
@@ -10,7 +13,6 @@ f_file
 f_fss
 f_pipe
 f_print
-f_utf
 fl_color
 fl_console
 fl_fss
index aa92144ee4c249519e19c02e41acd4697942e1ed..cda5d8dcf74242a6e3a0367b09bd483c972c8501 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_program -lfll_fss -lfll_execute -lf_path -lfl_string -lfl_status -lfl_fss -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_program -lfll_fss -lfl_conversion -lfll_execute -lf_path -lfl_string -lfl_status -lfl_fss -lfl_console -lf_conversion -lfl_color -lf_print -lf_pipe -lf_fss -lf_file -lf_environment -lf_directory -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library init.c private-init.c
index 57d84debe0dfa90adb7899626703e336265a1925..93d5cdab0334fa8425618dcff7846ee1498abf6e 100644 (file)
@@ -48,9 +48,11 @@ extern "C" {
     f_status status = F_none;
 
     {
+      const f_string_range range = f_macro_string_range_initialize(strlen(value));
+
       f_number_unsigned number = 0;
 
-      status = fl_console_parameter_to_number_unsigned(value, &number);
+      status = fl_conversion_string_to_number_unsigned(value, &number, range);
 
       if (status == F_none) {
         fl_color_print_line(f_type_output, data.context.error, data.context.reset, "invalid name");
@@ -125,7 +127,9 @@ extern "C" {
 
 #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);
+    const f_string_range range = f_macro_string_range_initialize(strlen(value));
+
+    f_status status = fl_conversion_string_to_number_unsigned(value, number, range);
 
     if (*number > F_status_size_max_with_signal) {
       fl_color_print_line(f_type_output, data.context.error, data.context.reset, "out of range");
index 2e20d1863aaf8e5956e6dc6ffaf541b38f1f805f..353468394a1ae43538c54471acbcf161e957690a 100644 (file)
 #include <string.h>
 
 // fll-0 includes
+#include <level_0/type.h>
+#include <level_0/status.h>
+#include <level_0/memory.h>
+#include <level_0/string.h>
+#include <level_0/utf.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>
 
 // fll-1 includes
 #include <level_1/color.h>
 #include <level_1/console.h>
+#include <level_1/conversion.h>
 #include <level_1/status.h>
 #include <level_1/string.h>
 
index c085bd484d30189f3bb4e42d0ac262aa524055fd..2614524798cceaf37b0c16494959351b13431b8e 100644 (file)
@@ -1,16 +1,19 @@
+# fss-0000
+
 f_type
 f_status
 f_memory
 f_string
+f_utf
 f_color
 f_console
 f_conversion
 f_file
 f_pipe
 f_print
-f_utf
 fl_color
 fl_console
+fl_conversion
 fl_status
 fl_string
 fl_utf
index d6c84a74405e661799b71f6310d91e3ed78c414c..8d350941c7cc58c550fd9451a0fb05d74131a1a8 100644 (file)
@@ -19,7 +19,7 @@ build_compiler gcc
 build_language c
 build_linker ar
 build_libraries -lc
-build_libraries-individual -lfll_status -lfll_program -lfl_utf -lfl_string -lfl_status -lfl_console -lfl_color -lf_print -lf_pipe -lf_file -lf_conversion -lf_console -lf_utf -lf_memory
+build_libraries-individual -lfll_status -lfll_program -lfl_utf -lfl_string -lfl_status -lfl_conversion -lfl_console -lfl_color -lf_print -lf_pipe -lf_file -lf_conversion -lf_console -lf_utf -lf_memory
 build_libraries-level -lfll_2 -lfll_1 -lfll_0
 build_libraries-monolithic -lfll
 build_sources_library status_code.c private-status_code.c