]> Kevux Git Server - fll/commitdiff
Update: add together snatch functions, update comments
authorKevin Day <thekevinday@gmail.com>
Wed, 6 May 2020 04:12:25 +0000 (23:12 -0500)
committerKevin Day <thekevinday@gmail.com>
Wed, 6 May 2020 04:12:25 +0000 (23:12 -0500)
level_2/fll_fss/c/fss.c
level_2/fll_fss/c/fss.h

index c33595e11da4bc42a28d41a51683d187267d1adf..55004704ffd6c69694ee7a622e064d6d8113178e 100644 (file)
@@ -45,6 +45,45 @@ extern "C" {
   }
 #endif // _di_fll_fss_snatch_
 
+#ifndef _di_fll_fss_snatch_together_
+  f_return_status fll_fss_snatch_together(const f_string_dynamic buffer, const f_fss_objects objects, const f_fss_contents contents, const f_string names[], const f_string_length lengths[], f_string_dynamic *values[], const f_string_length size) {
+    #ifndef _di_level_2_parameter_checking_
+      if (size == 0) return f_status_set_error(f_invalid_parameter);
+    #endif // _di_level_2_parameter_checking_
+
+    if (buffer.used == 0) return f_no_data;
+    if (objects.used == 0) return f_no_data;
+    if (contents.used == 0) return f_no_data;
+
+    f_status status = f_none;
+    f_string_length length_object = 0;
+
+    f_array_length i = 0;
+    f_array_length j = 0;
+    f_array_length k = 0;
+
+    for (; i < objects.used; i++) {
+      length_object = (objects.array[i].stop - objects.array[i].start) + 1;
+
+      for (j = 0; j < size; j++) {
+        if (fl_string_compare_trim(buffer.string + objects.array[i].start, names[j], length_object, lengths[j]) == f_equal_to) {
+          for (k = 0; k < contents.array[i].used; k++) {
+            status = fl_string_dynamic_partial_append_nulless(buffer, contents.array[i].array[k], values[j]);
+
+            if (f_status_is_error(status)) break;
+          } // for
+
+          if (f_status_is_error(status)) break;
+        }
+      } // for
+
+      if (f_status_is_error(status)) break;
+    } // for
+
+    return status;
+  }
+#endif // _di_fll_fss_snatch_together_
+
 #ifndef _di_fll_fss_snatch_mash_
   f_return_status fll_fss_snatch_mash(const f_string_dynamic buffer, const f_fss_objects objects, const f_fss_contents contents, const f_string names[], const f_string_length lengths[], f_string_dynamic *values[], const f_string_length size, const f_string glue, const f_string_length glue_length) {
     #ifndef _di_level_2_parameter_checking_
@@ -67,6 +106,47 @@ extern "C" {
 
       for (j = 0; j < size; j++) {
         if (fl_string_compare_trim(buffer.string + objects.array[i].start, names[j], length_object, lengths[j]) == f_equal_to) {
+          if (values[j]->used == 0) {
+            for (k = 0; k < contents.array[i].used; k++) {
+              status = fl_string_dynamic_partial_mash_nulless(glue, glue_length, buffer, contents.array[i].array[k], values[j]);
+
+              if (f_status_is_error(status)) break;
+            } // for
+
+            if (f_status_is_error(status)) break;
+          }
+        }
+      } // for
+
+      if (f_status_is_error(status)) break;
+    } // for
+
+    return status;
+  }
+#endif // _di_fll_fss_snatch_mash_
+
+#ifndef _di_fll_fss_snatch_mash_together_
+  f_return_status fll_fss_snatch_mash_together(const f_string_dynamic buffer, const f_fss_objects objects, const f_fss_contents contents, const f_string names[], const f_string_length lengths[], f_string_dynamic *values[], const f_string_length size, const f_string glue, const f_string_length glue_length) {
+    #ifndef _di_level_2_parameter_checking_
+      if (size == 0) return f_status_set_error(f_invalid_parameter);
+    #endif // _di_level_2_parameter_checking_
+
+    if (buffer.used == 0) return f_no_data;
+    if (objects.used == 0) return f_no_data;
+    if (contents.used == 0) return f_no_data;
+
+    f_status status = f_none;
+    f_string_length length_object = 0;
+
+    f_array_length i = 0;
+    f_array_length j = 0;
+    f_array_length k = 0;
+
+    for (; i < objects.used; i++) {
+      length_object = (objects.array[i].stop - objects.array[i].start) + 1;
+
+      for (j = 0; j < size; j++) {
+        if (fl_string_compare_trim(buffer.string + objects.array[i].start, names[j], length_object, lengths[j]) == f_equal_to) {
           for (k = 0; k < contents.array[i].used; k++) {
             status = fl_string_dynamic_partial_mash_nulless(glue, glue_length, buffer, contents.array[i].array[k], values[j]);
 
@@ -82,7 +162,7 @@ extern "C" {
 
     return status;
   }
-#endif // _di_fll_fss_snatch_mash_
+#endif // _di_fll_fss_snatch_mash_together_
 
 #ifdef __cplusplus
 } // extern "C"
index 4a906198c2d8f563377be3faea09ecc8f8e97fb0..3f9dc7c01c50924a7f2b027b4d2aee34493bb24f 100644 (file)
@@ -33,13 +33,16 @@ extern "C" {
 /**
  * Perform simple search through all objects against the given set, saving all values when matched.
  *
- * Only the first match for each name is snatched, all others are ignored.
+ * Multiple contents for a single object are appended.
+ * Only content for the first of each identical object is snatched, all others are ignored.
  *
  * This will trim the object names when comparing (removing leading/trailing whitespace).
  * This will strip NULL charactes when copying.
  *
  * This performs only a simple search algorithm that should be acceptable for small sets where performance is generally not a concern.
  *
+ * This assumes values[].used is 0 at start to determine if value is already snatched.
+ *
  * @param buffer
  *   The buffer to read from.
  * @param objects
@@ -52,7 +55,6 @@ extern "C" {
  *   An array of lengths for each names string.
  * @param values
  *   An array of values where "snatched" content is stored.
- *   Each of these must be of type f_string_dynamic.
  * @param size
  *   The total size of the names, lengths, and values arrays.
  *
@@ -69,7 +71,10 @@ extern "C" {
 /**
  * Perform simple search through all objects against the given set, saving all values when matched.
  *
- * This will append all duplicates using the provided glue.
+ * All matches for each name is snatched.
+ * Multiple contents for a single object are appended.
+ * Content for multiple identical objects are appended.
+ *
  * This will trim the object names when comparing (removing leading/trailing whitespace).
  * This will strip NULL charactes when copying.
  *
@@ -83,13 +88,48 @@ extern "C" {
  *   This content mappings to process.
  * @param names
  *   An array of strings to "snatch" from the buffer.
- *   Each of these must be of type f_string.
  * @param lengths
  *   An array of lengths for each names string.
- *   Each of these must be of type f_string_length.
  * @param values
  *   An array of values where "snatched" content is stored.
- *   Each of these must be of type f_string_dynamic.
+ * @param size
+ *   The total size of the names, lengths, and values arrays.
+ *
+ * @return
+ *   f_none on success.
+ *   f_no_data when there is no buffer, objects or contents to process.
+ *   f_error_reallocation (with error bit) on reallocation error.
+ *   f_invalid_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fll_fss_snatch_together_
+  extern f_return_status fll_fss_snatch_together(const f_string_dynamic buffer, const f_fss_objects objects, const f_fss_contents contents, const f_string names[], const f_string_length lengths[], f_string_dynamic *values[], const f_string_length size);
+#endif // _di_fll_fss_snatch_together_
+
+/**
+ * Perform simple search through all objects against the given set, saving all values when matched.
+ *
+ * Multiple contents for a single object are appended using the provided glue.
+ * Only content for the first of each identical object is snatched, all others are ignored.
+ *
+ * This will trim the object names when comparing (removing leading/trailing whitespace).
+ * This will strip NULL charactes when copying.
+ *
+ * This performs only a simple search algorithm that should be acceptable for small sets where performance is generally not a concern.
+ *
+ * This assumes values[].used is 0 at start to determine if value is already snatched.
+ *
+ * @param buffer
+ *   The buffer to read from.
+ * @param objects
+ *   This object mappings to process.
+ * @param contents
+ *   This content mappings to process.
+ * @param names
+ *   An array of strings to "snatch" from the buffer.
+ * @param lengths
+ *   An array of lengths for each names string.
+ * @param values
+ *   An array of values where "snatched" content is stored.
  * @param size
  *   The total size of the names, lengths, and values arrays.
  * @param glue
@@ -107,6 +147,47 @@ extern "C" {
   extern f_return_status fll_fss_snatch_mash(const f_string_dynamic buffer, const f_fss_objects objects, const f_fss_contents contents, const f_string names[], const f_string_length lengths[], f_string_dynamic *values[], const f_string_length size, const f_string glue, const f_string_length glue_length);
 #endif // _di_fll_fss_snatch_mash_
 
+/**
+ * Perform simple search through all objects against the given set, saving all values when matched.
+ *
+ * All matches for each name is snatched.
+ * Multiple contents for a single object are appended using the provided glue.
+ * Content for multiple identical objects are appended using the provided glue.
+ *
+ * This will trim the object names when comparing (removing leading/trailing whitespace).
+ * This will strip NULL charactes when copying.
+ *
+ * This performs only a simple search algorithm that should be acceptable for small sets where performance is generally not a concern.
+ *
+ * @param buffer
+ *   The buffer to read from.
+ * @param objects
+ *   This object mappings to process.
+ * @param contents
+ *   This content mappings to process.
+ * @param names
+ *   An array of strings to "snatch" from the buffer.
+ * @param lengths
+ *   An array of lengths for each names string.
+ * @param values
+ *   An array of values where "snatched" content is stored.
+ * @param size
+ *   The total size of the names, lengths, and values arrays.
+ * @param glue
+ *   A string to append between each duplicate name found when "snatching".
+ * @param glue_length
+ *   The length of the glue string.
+ *
+ * @return
+ *   f_none on success.
+ *   f_no_data when there is no buffer, objects or contents to process.
+ *   f_error_reallocation (with error bit) on reallocation error.
+ *   f_invalid_parameter (with error bit) if a parameter is invalid.
+ */
+#ifndef _di_fll_fss_snatch_mash_together_
+  extern f_return_status fll_fss_snatch_mash_together(const f_string_dynamic buffer, const f_fss_objects objects, const f_fss_contents contents, const f_string names[], const f_string_length lengths[], f_string_dynamic *values[], const f_string_length size, const f_string glue, const f_string_length glue_length);
+#endif // _di_fll_fss_snatch_mash_together_
+
 #ifdef __cplusplus
 } // extern "C"
 #endif