replace BLI_strtok_r from r41337 with lighter method that doesnt alloc for template_list

This commit is contained in:
Campbell Barton 2011-10-29 08:18:42 +00:00
parent ed77c356fc
commit 1e4be0a4bf
4 changed files with 17 additions and 68 deletions

View File

@ -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. Its 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);

View File

@ -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 {

View File

@ -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 */

View File

@ -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
* youll 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);
}
}
}