From 1e4be0a4bf9b16aa74ced29fcac8aef56195bbe8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 29 Oct 2011 08:18:42 +0000 Subject: [PATCH] replace BLI_strtok_r from r41337 with lighter method that doesnt alloc for template_list --- source/blender/blenlib/BLI_string.h | 23 -------------- source/blender/blenlib/intern/bpath.c | 3 +- source/blender/blenlib/intern/string.c | 29 ------------------ .../editors/interface/interface_templates.c | 30 ++++++++++--------- 4 files changed, 17 insertions(+), 68 deletions(-) diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h index 9a7fa521af1..46389a9259e 100644 --- a/source/blender/blenlib/BLI_string.h +++ b/source/blender/blenlib/BLI_string.h @@ -132,29 +132,6 @@ int BLI_strcasecmp(const char *s1, const char *s2); int BLI_strncasecmp(const char *s1, const char *s2, size_t len); int BLI_natstrcmp(const char *s1, const char *s2); size_t BLI_strnlen(const char *str, size_t maxlen); - - /** - * Split str on the first occurence of delimiter, returns the first - * part as a mallocN'd string, and stores the second part into - * ctx (also mallocN'd). - * If str is NULL, split on ctx instead. - * This allows to iterate over this "generator" function: - * - * char *ctx = NULL; - * char *res = NULL; - * for(res = BLI_strtok_r("a;dummy;csv;line", ";", &ctx); res; res = BLI_strtok_r(NULL, ";", &ctx)) { - * printf(res); - * MEM_freeN(res); - * } - * - * @param str The string to be split. - * @param delimiter The char used to split str apart. - * @param ctx The "context" string. It’s a pointer inside the org passed @str, - * so it has no specific mem management. - * @retval Returns the mallocN'd first element from split str (or ctx). - */ -char *BLI_strtok_r(char *str, const char *delimiter, char **ctx); - void BLI_timestr(double _time, char *str); /* time var is global */ void BLI_ascii_strtolower(char *str, int len); diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c index e42e02fb24f..b7fe7ef5efd 100644 --- a/source/blender/blenlib/intern/bpath.c +++ b/source/blender/blenlib/intern/bpath.c @@ -325,8 +325,7 @@ static int rewrite_path_fixed_dirfile(char path_dir[FILE_MAXDIR], char path_file } if (visit_cb(userdata, path_dst, (const char *)path_src)) { - BLI_split_dirfile(path_dst, path_dir, path_file, - sizeof(path_dir), sizeof(path_file)); + BLI_split_dirfile(path_dst, path_dir, path_file, FILE_MAXDIR, FILE_MAXFILE); return TRUE; } else { diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index 3ec84e0b593..3a66425a5de 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -375,35 +375,6 @@ int BLI_natstrcmp(const char *s1, const char *s2) return 0; } -/* As unfortunately strtok_r is not available everywhere... */ -char *BLI_strtok_r(char *str, const char *delimiter, char **ctx) -{ - char *cut = NULL, *ret = NULL; - char *split = str ? str : *ctx; - - if(!split) { - return ret; - } - - cut = strchr(split, *delimiter); - if(cut) { - size_t len_ret = cut - split; - size_t len_ctx = strlen(split) - len_ret - 1; - ret = BLI_strdupn(split, len_ret); - if(len_ctx > 0) { - *ctx = split+len_ret+1; - } - else { - *ctx = NULL; - } - } - else { - ret = BLI_strdup(split); - *ctx = NULL; - } - return ret; -} - void BLI_timestr(double _time, char *str) { /* format 00:00:00.00 (hr:min:sec) string has to be 12 long */ diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index e714d0bbc17..19d22a432dc 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -2059,7 +2059,7 @@ static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon, int return rnaicon; } -static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, PointerRNA *itemptr, int i, int rnaicon, PointerRNA *activeptr, PropertyRNA *activeprop, const char *prop_list) +static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, PointerRNA *itemptr, int i, int rnaicon, PointerRNA *activeptr, PropertyRNA *activeprop, const char *prop_list_id) { uiBlock *block= uiLayoutGetBlock(layout); uiBut *but; @@ -2184,8 +2184,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe * … you’ll get a numfield for the integer prop, a check box for the bool prop, and a textfield * for the string prop, after the name of each item of the collection. */ - else if (prop_list) { - PropertyRNA *prop_ctrls; + else if (prop_list_id) { row = uiLayoutRow(sub, 1); uiItemL(row, name, icon); @@ -2194,18 +2193,21 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe * which would obviously produce a sigsev… */ if (itemptr->type) { /* If the special property is set for the item, and it is a collection… */ - prop_ctrls = RNA_struct_find_property(itemptr, prop_list); - if(prop_ctrls) { - if(RNA_property_type(prop_ctrls) == PROP_STRING) { - char *prop_names = RNA_property_string_get_alloc(itemptr, prop_ctrls, NULL, 0, NULL); - char *id = NULL; - char *ctx = NULL; - for(id = BLI_strtok_r(prop_names, ":", &ctx); id; id = BLI_strtok_r(NULL, ":", &ctx)) { - uiItemR(row, itemptr, id, 0, NULL, 0); - MEM_freeN(id); - } - MEM_freeN(prop_names); + PropertyRNA *prop_list= RNA_struct_find_property(itemptr, prop_list_id); + + if(prop_list && RNA_property_type(prop_list) == PROP_STRING) { + int prop_names_len; + char *prop_names = RNA_property_string_get_alloc(itemptr, prop_list, NULL, 0, &prop_names_len); + char *prop_names_end= prop_names + prop_names_len; + char *id= prop_names; + char *id_next; + while (id < prop_names_end) { + if ((id_next= strchr(id, ':'))) *id_next++= '\0'; + else id_next= prop_names_end; + uiItemR(row, itemptr, id, 0, NULL, 0); + id= id_next; } + MEM_freeN(prop_names); } } }