This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch feature/674-use-properties-type-in-filter
in repository https://gitbox.apache.org/repos/asf/celix.git

commit 5051e8f01631a9b1998f44ae971f9076c1949ee2
Author: Pepijn Noltes <[email protected]>
AuthorDate: Sat Nov 18 20:32:04 2023 +0100

    Refactor filter.c to use properties entry
---
 libs/utils/src/filter.c | 182 +++++++++++++++++++++++++-----------------------
 1 file changed, 94 insertions(+), 88 deletions(-)

diff --git a/libs/utils/src/filter.c b/libs/utils/src/filter.c
index d03db03f..a414ebfe 100644
--- a/libs/utils/src/filter.c
+++ b/libs/utils/src/filter.c
@@ -49,8 +49,6 @@ static char * filter_parseAttr(char* filterString, int* pos);
 static char * filter_parseValue(char* filterString, int* pos);
 static celix_array_list_t* filter_parseSubstring(char* filterString, int* pos);
 
-static celix_status_t filter_compare(const celix_filter_t* filter, const char 
*propertyValue, bool *result);
-
 static void filter_skipWhiteSpace(char * filterString, int * pos) {
     int length;
     for (length = strlen(filterString); (*pos < length) && 
isspace(filterString[*pos]);) {
@@ -471,7 +469,8 @@ celix_status_t filter_match(celix_filter_t * filter, 
celix_properties_t *propert
     return CELIX_SUCCESS;
 }
 
-static int celix_filter_compareAttributeValue(const celix_filter_t* filter, 
const char* propertyValue) {
+static int celix_filter_compareAttributeValue(const celix_filter_t* filter, 
const celix_properties_entry_t* entry) {
+    const char* propertyValue = entry->value;
     if (!filter->internal->convertedToLong && 
!filter->internal->convertedToDouble && !filter->internal->convertedToVersion) {
         return strcmp(propertyValue, filter->value);
     }
@@ -517,100 +516,99 @@ static int celix_filter_compareAttributeValue(const 
celix_filter_t* filter, cons
     return strcmp(propertyValue, filter->value);
 }
 
-static celix_status_t filter_compare(const celix_filter_t* filter, const char 
*propertyValue, bool *out) {
+static celix_status_t filter_compareSubString(const celix_filter_t* filter, 
const celix_properties_entry_t* entry, bool* out) {
+    const char* propertyValue = entry->value;
+    int pos = 0;
+    int size = celix_arrayList_size(filter->children);
+    for (int i = 0; i < size; i++) {
+        char * substr = (char *) celix_arrayList_get(filter->children, i);
+
+        if (i + 1 < size) {
+            if (substr == NULL) {
+                unsigned int index;
+                char * substr2 = (char *) 
celix_arrayList_get(filter->children, i + 1);
+                if (substr2 == NULL) {
+                        continue;
+                }
+                index = strcspn(propertyValue+pos, substr2);
+                if (index == strlen(propertyValue+pos)) {
+                        *out = false;
+                        return CELIX_SUCCESS;
+                }
+
+                pos = index + strlen(substr2);
+                if (i + 2 < size) {
+                        i++;
+                }
+            } else {
+                unsigned int len = strlen(substr);
+                char * region = (char *)calloc(1, len+1);
+                strncpy(region, propertyValue+pos, len);
+                region[len]    = '\0';
+                if (strcmp(region, substr) == 0) {
+                        pos += len;
+                } else {
+                        free(region);
+                        *out = false;
+                        return CELIX_SUCCESS;
+                }
+                free(region);
+            }
+        } else {
+            unsigned int len;
+            int begin;
+
+            if (substr == NULL) {
+                *out = true;
+                return CELIX_SUCCESS;
+            }
+            len = strlen(substr);
+            begin = strlen(propertyValue)-len;
+            *out = (strcmp(propertyValue+begin, substr) == 0);
+            return CELIX_SUCCESS;
+        }
+    }
+    *out = true;
+    return CELIX_SUCCESS;
+}
+
+static celix_status_t filter_matchPropertyEntry(const celix_filter_t* filter, 
const celix_properties_entry_t* entry, bool *out) {
     celix_status_t  status = CELIX_SUCCESS;
     bool result = false;
 
-    if (filter == NULL || propertyValue == NULL) {
+    if (filter == NULL || entry == NULL) {
         *out = false;
         return status;
     }
 
     switch (filter->operand) {
-        case CELIX_FILTER_OPERAND_SUBSTRING: {
-            int pos = 0;
-            int size = celix_arrayList_size(filter->children);
-            for (int i = 0; i < size; i++) {
-                char * substr = (char *) celix_arrayList_get(filter->children, 
i);
-
-                if (i + 1 < size) {
-                    if (substr == NULL) {
-                        unsigned int index;
-                        char * substr2 = (char *) 
celix_arrayList_get(filter->children, i + 1);
-                        if (substr2 == NULL) {
-                            continue;
-                        }
-                        index = strcspn(propertyValue+pos, substr2);
-                        if (index == strlen(propertyValue+pos)) {
-                            *out = false;
-                            return CELIX_SUCCESS;
-                        }
-
-                        pos = index + strlen(substr2);
-                        if (i + 2 < size) {
-                            i++;
-                        }
-                    } else {
-                        unsigned int len = strlen(substr);
-                        char * region = (char *)calloc(1, len+1);
-                        strncpy(region, propertyValue+pos, len);
-                        region[len]    = '\0';
-                        if (strcmp(region, substr) == 0) {
-                            pos += len;
-                        } else {
-                            free(region);
-                            *out = false;
-                            return CELIX_SUCCESS;
-                        }
-                        free(region);
-                    }
-                } else {
-                    unsigned int len;
-                    int begin;
-
-                    if (substr == NULL) {
-                        *out = true;
-                        return CELIX_SUCCESS;
-                    }
-                    len = strlen(substr);
-                    begin = strlen(propertyValue)-len;
-                    *out = (strcmp(propertyValue+begin, substr) == 0);
-                    return CELIX_SUCCESS;
-                }
-            }
-            *out = true;
+        case CELIX_FILTER_OPERAND_SUBSTRING:
+            return filter_compareSubString(filter, entry, out);
+        case CELIX_FILTER_OPERAND_APPROX:
+            *out = strcasecmp(entry->value, filter->value) == 0;
             return CELIX_SUCCESS;
-        }
-        case CELIX_FILTER_OPERAND_APPROX: {
-            *out = strcasecmp(propertyValue, filter->value) == 0;
+        case CELIX_FILTER_OPERAND_EQUAL:
+            *out = (celix_filter_compareAttributeValue(filter, entry) == 0);
             return CELIX_SUCCESS;
-        }
-        case CELIX_FILTER_OPERAND_EQUAL: {
-            *out = (celix_filter_compareAttributeValue(filter, propertyValue) 
== 0);
+        case CELIX_FILTER_OPERAND_GREATER:
+            *out = (celix_filter_compareAttributeValue(filter, entry) > 0);
             return CELIX_SUCCESS;
-        }
-        case CELIX_FILTER_OPERAND_GREATER: {
-            *out = (celix_filter_compareAttributeValue(filter, propertyValue) 
> 0);
+        case CELIX_FILTER_OPERAND_GREATEREQUAL:
+            *out = (celix_filter_compareAttributeValue(filter, entry) >= 0);
             return CELIX_SUCCESS;
-        }
-        case CELIX_FILTER_OPERAND_GREATEREQUAL: {
-            *out = (celix_filter_compareAttributeValue(filter, propertyValue) 
>= 0);
-            return CELIX_SUCCESS;
-        }
-        case CELIX_FILTER_OPERAND_LESS: {
-            *out = (celix_filter_compareAttributeValue(filter, propertyValue) 
< 0);
+        case CELIX_FILTER_OPERAND_LESS:
+            *out = (celix_filter_compareAttributeValue(filter, entry) < 0);
             return CELIX_SUCCESS;
-        }
-        case CELIX_FILTER_OPERAND_LESSEQUAL: {
-            *out = (celix_filter_compareAttributeValue(filter, propertyValue) 
<= 0);
+        case CELIX_FILTER_OPERAND_LESSEQUAL:
+            *out = (celix_filter_compareAttributeValue(filter, entry) <= 0);
             return CELIX_SUCCESS;
-        }
         case CELIX_FILTER_OPERAND_AND:
         case CELIX_FILTER_OPERAND_NOT:
         case CELIX_FILTER_OPERAND_OR:
-        case CELIX_FILTER_OPERAND_PRESENT: {
-        }
-            /* no break */
+        case CELIX_FILTER_OPERAND_PRESENT:
+        default:
+            ;
+            /* fall through */
     }
 
     if (out != NULL) {
@@ -712,7 +710,6 @@ bool celix_filter_match(const celix_filter_t *filter, const 
celix_properties_t*
     if (filter == NULL) {
         return true; //matching on null(empty) filter is always true
     }
-    bool result = false;
     switch (filter->operand) {
         case CELIX_FILTER_OPERAND_AND: {
             celix_array_list_t* children = filter->children;
@@ -741,6 +738,10 @@ bool celix_filter_match(const celix_filter_t *filter, 
const celix_properties_t*
             bool mresult = celix_filter_match(sfilter, properties);
             return !mresult;
         }
+        case CELIX_FILTER_OPERAND_PRESENT: {
+            char * value = (properties == NULL) ? NULL: 
(char*)celix_properties_get(properties, filter->attribute, NULL);
+            return value != NULL;
+        }
         case CELIX_FILTER_OPERAND_SUBSTRING :
         case CELIX_FILTER_OPERAND_EQUAL :
         case CELIX_FILTER_OPERAND_GREATER :
@@ -748,16 +749,21 @@ bool celix_filter_match(const celix_filter_t *filter, 
const celix_properties_t*
         case CELIX_FILTER_OPERAND_LESS :
         case CELIX_FILTER_OPERAND_LESSEQUAL :
         case CELIX_FILTER_OPERAND_APPROX : {
-            char * value = (properties == NULL) ? NULL: 
(char*)celix_properties_get(properties, filter->attribute, NULL);
-            filter_compare(filter, value, &result);
+            celix_properties_entry_t *entry = 
celix_properties_getEntry(properties, filter->attribute);
+            bool result;
+            celix_status_t status = filter_matchPropertyEntry(filter, entry, 
&result);
+            if (status != CELIX_SUCCESS) {
+                //TODO handle error
+                return false;
+            }
             return result;
         }
-        case CELIX_FILTER_OPERAND_PRESENT: {
-            char * value = (properties == NULL) ? NULL: 
(char*)celix_properties_get(properties, filter->attribute, NULL);
-            return value != NULL;
-        }
     }
-    return result;
+
+    //LCOV_EXCL_START
+    assert(false); //should never happen
+    return false;
+    //LCOV_EXCL_STOP
 }
 
 bool celix_filter_matchFilter(const celix_filter_t *filter1, const 
celix_filter_t *filter2) {

Reply via email to