Commit: 6bad063298bf276e4177991e9065091148bb6f0c
Author: Campbell Barton
Date:   Sun Feb 9 17:31:02 2014 +1100
https://developer.blender.org/rB6bad063298bf276e4177991e9065091148bb6f0c

RNA: add RNA_enum_from_identifier, RNA_enum_from_value search functions

also fix leak in RNA_enum_is_equal

===================================================================

M       source/blender/makesrna/RNA_access.h
M       source/blender/makesrna/intern/rna_access.c

===================================================================

diff --git a/source/blender/makesrna/RNA_access.h 
b/source/blender/makesrna/RNA_access.h
index 4d21f2e..07c7d3e 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -783,6 +783,8 @@ bool RNA_enum_identifier(EnumPropertyItem *item, const int 
value, const char **i
 int  RNA_enum_bitflag_identifiers(EnumPropertyItem *item, const int value, 
const char **identifier);
 bool RNA_enum_name(EnumPropertyItem *item, const int value, const char 
**r_name);
 bool RNA_enum_description(EnumPropertyItem *item, const int value, const char 
**description);
+int  RNA_enum_from_value(EnumPropertyItem *item, const int value);
+int  RNA_enum_from_identifier(EnumPropertyItem *item, const char *identifier);
 
 void RNA_property_enum_items(struct bContext *C, PointerRNA *ptr, PropertyRNA 
*prop, EnumPropertyItem **item,
                              int *r_totitem, bool *r_free);
diff --git a/source/blender/makesrna/intern/rna_access.c 
b/source/blender/makesrna/intern/rna_access.c
index 2c21634..7946d24 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -1296,24 +1296,24 @@ void RNA_property_enum_items_gettexted(bContext *C, 
PointerRNA *ptr, PropertyRNA
 
 bool RNA_property_enum_value(bContext *C, PointerRNA *ptr, PropertyRNA *prop, 
const char *identifier, int *r_value)
 {
-       EnumPropertyItem *item, *item_array;
+       EnumPropertyItem *item;
        bool free;
        bool found;
 
-       RNA_property_enum_items(C, ptr, prop, &item_array, NULL, &free);
+       RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
 
-       if (item_array) {
-               for (item = item_array; item->identifier; item++) {
-                       if (item->identifier[0] && strcmp(item->identifier, 
identifier) == 0) {
-                               *r_value = item->value;
-                               break;
-                       }
+       if (item) {
+               const int i = RNA_enum_from_identifier(item, identifier);
+               if (i != -1) {
+                       *r_value = item[i].value;
+                       found = true;
+               }
+               else {
+                       found = false;
                }
-
-               found = (item->identifier != NULL); /* could be alloc'd, assign 
before free */
 
                if (free) {
-                       MEM_freeN(item_array);
+                       MEM_freeN(item);
                }
        }
        else {
@@ -1322,15 +1322,16 @@ bool RNA_property_enum_value(bContext *C, PointerRNA 
*ptr, PropertyRNA *prop, co
        return found;
 }
 
-bool RNA_enum_identifier(EnumPropertyItem *item, const int value, const char 
**identifier)
+bool RNA_enum_identifier(EnumPropertyItem *item, const int value, const char 
**r_identifier)
 {
-       for (; item->identifier; item++) {
-               if (item->identifier[0] && item->value == value) {
-                       *identifier = item->identifier;
-                       return true;
-               }
+       const int i = RNA_enum_from_value(item, value);
+       if (i != -1) {
+               *r_identifier = item[i].identifier;
+               return true;
+       }
+       else {
+               return false;
        }
-       return false;
 }
 
 int RNA_enum_bitflag_identifiers(EnumPropertyItem *item, const int value, 
const char **r_identifier)
@@ -1347,24 +1348,48 @@ int RNA_enum_bitflag_identifiers(EnumPropertyItem 
*item, const int value, const
 
 bool RNA_enum_name(EnumPropertyItem *item, const int value, const char 
**r_name)
 {
-       for (; item->identifier; item++) {
-               if (item->identifier[0] && item->value == value) {
-                       *r_name = item->name;
-                       return true;
-               }
+       const int i = RNA_enum_from_value(item, value);
+       if (i != -1) {
+               *r_name = item[i].name;
+               return true;
+       }
+       else {
+               return false;
        }
-       return false;
 }
 
 bool RNA_enum_description(EnumPropertyItem *item, const int value, const char 
**r_description)
 {
-       for (; item->identifier; item++) {
+       const int i = RNA_enum_from_value(item, value);
+       if (i != -1) {
+               *r_description = item[i].description;
+               return true;
+       }
+       else {
+               return false;
+       }
+}
+
+int RNA_enum_from_identifier(EnumPropertyItem *item, const char *identifier)
+{
+       int i = 0;
+       for (; item->identifier; item++, i++) {
+               if (item->identifier[0] && STREQ(item->identifier, identifier)) 
{
+                       return i;
+               }
+       }
+       return -1;
+}
+
+int RNA_enum_from_value(EnumPropertyItem *item, const int value)
+{
+       int i = 0;
+       for (; item->identifier; item++, i++) {
                if (item->identifier[0] && item->value == value) {
-                       *r_description = item->description;
-                       return true;
+                       return i;
                }
        }
-       return false;
+       return -1;
 }
 
 bool RNA_property_enum_identifier(bContext *C, PointerRNA *ptr, PropertyRNA 
*prop, const int value,
@@ -4701,14 +4726,22 @@ bool RNA_enum_is_equal(bContext *C, PointerRNA *ptr, 
const char *name, const cha
        bool free;
 
        if (prop) {
-               RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
+               int i;
+               bool cmp;
 
-               for (; item->identifier; item++)
-                       if (strcmp(item->identifier, enumname) == 0)
-                               return (item->value == 
RNA_property_enum_get(ptr, prop));
+               RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
+               i = RNA_enum_from_identifier(item, enumname);
+               if (i != -1) {
+                       cmp = (item[i].value == RNA_property_enum_get(ptr, 
prop));
+               }
 
-               if (free)
+               if (free) {
                        MEM_freeN(item);
+               }
+
+               if (i != -1) {
+                       return cmp;
+               }
 
                printf("%s: %s.%s item %s not found.\n", __func__, 
ptr->type->identifier, name, enumname);
                return false;
@@ -4721,50 +4754,50 @@ bool RNA_enum_is_equal(bContext *C, PointerRNA *ptr, 
const char *name, const cha
 
 bool RNA_enum_value_from_id(EnumPropertyItem *item, const char *identifier, 
int *r_value)
 {
-       for (; item->identifier; item++) {
-               if (strcmp(item->identifier, identifier) == 0) {
-                       *r_value = item->value;
-                       return true;
-               }
+       const int i = RNA_enum_from_identifier(item, identifier);
+       if (i != -1) {
+               *r_value = item[i].value;
+               return true;
+       }
+       else {
+               return false;
        }
-       
-       return false;
 }
 
 bool RNA_enum_id_from_value(EnumPropertyItem *item, int value, const char 
**r_identifier)
 {
-       for (; item->identifier; item++) {
-               if (item->value == value) {
-                       *r_identifier = item->identifier;
-                       return true;
-               }
+       const int i = RNA_enum_from_value(item, value);
+       if (i != -1) {
+               *r_identifier = item[i].identifier;
+               return true;
+       }
+       else {
+               return false;
        }
-
-       return false;
 }
 
 bool RNA_enum_icon_from_value(EnumPropertyItem *item, int value, int *r_icon)
 {
-       for (; item->identifier; item++) {
-               if (item->value == value) {
-                       *r_icon = item->icon;
-                       return true;
-               }
+       const int i = RNA_enum_from_value(item, value);
+       if (i != -1) {
+               *r_icon = item[i].icon;
+               return true;
+       }
+       else {
+               return false;
        }
-       
-       return false;
 }
 
 bool RNA_enum_name_from_value(EnumPropertyItem *item, int value, const char 
**r_name)
 {
-       for (; item->identifier; item++) {
-               if (item->value == value) {
-                       *r_name = item->name;
-                       return true;
-               }
+       const int i = RNA_enum_from_value(item, value);
+       if (i != -1) {
+               *r_name = item[i].name;
+               return true;
+       }
+       else {
+               return false;
        }
-       
-       return false;
 }
 
 void RNA_string_get(PointerRNA *ptr, const char *name, char *value)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to