diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp index ba197948f7d..eb25ca811f2 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp @@ -769,16 +769,19 @@ static const char *imb_exr_insert_view_name(const char *passname, const char *vi return passname; static char retstr[EXR_PASS_MAXNAME]; - const char *end = passname + strlen(passname); - const char *token; + const char delims[] = {'.', '\0'}; + char *sep; + char *token; + size_t len; - int len = IMB_exr_split_token(passname, end, &token); + len = BLI_str_rpartition(passname, delims, &sep, &token); - if (len == 0) + if (sep) { + BLI_snprintf(retstr, sizeof(retstr), "%.*s.%s.%s", (int)len, passname, viewname, token); + } + else { BLI_snprintf(retstr, sizeof(retstr), "%s.%s", passname, viewname); - else - BLI_snprintf(retstr, sizeof(retstr), "%.*s%s.%s", - (int)(end - passname) - len, passname, viewname, token); + } return retstr; } @@ -1413,16 +1416,18 @@ void IMB_exr_close(void *handle) /* ********* */ /* get a substring from the end of the name, separated by '.' */ -int IMB_exr_split_token(const char *str, const char *end, const char **token) +static int imb_exr_split_token(const char *str, const char *end, const char **token) { - ptrdiff_t maxlen = end - str; - int len = 0; - while (len < maxlen && *(end - len - 1) != '.') { - len++; + const char delims[] = {'.', '\0'}; + char *sep; + + BLI_str_partition_ex(str, end, delims, &sep, (char **)token, true); + + if (!sep) { + *token = str; } - *token = end - len; - return len; + return (int)(end - *token); } static int imb_exr_split_channel_name(ExrChannel *echan, char *layname, char *passname) @@ -1449,7 +1454,7 @@ static int imb_exr_split_channel_name(ExrChannel *echan, char *layname, char *pa } /* last token is single character channel identifier */ - len = IMB_exr_split_token(name, end, &token); + len = imb_exr_split_token(name, end, &token); if (len == 0) { printf("multilayer read: bad channel name: %s\n", name); return 0; @@ -1487,7 +1492,7 @@ static int imb_exr_split_channel_name(ExrChannel *echan, char *layname, char *pa end -= len + 1; /* +1 to skip '.' separator */ /* second token is pass name */ - len = IMB_exr_split_token(name, end, &token); + len = imb_exr_split_token(name, end, &token); if (len == 0) { printf("multilayer read: bad channel name: %s\n", name); return 0; diff --git a/source/blender/imbuf/intern/openexr/openexr_multi.h b/source/blender/imbuf/intern/openexr/openexr_multi.h index 97e8042caa6..70ba4978124 100644 --- a/source/blender/imbuf/intern/openexr/openexr_multi.h +++ b/source/blender/imbuf/intern/openexr/openexr_multi.h @@ -93,8 +93,6 @@ void IMB_exr_close(void *handle); void IMB_exr_add_view(void *handle, const char *name); -int IMB_exr_split_token(const char *str, const char *end, const char **token); - bool IMB_exr_has_multilayer(void *handle); bool IMB_exr_has_singlelayer_multiview(void *handle); diff --git a/source/blender/imbuf/intern/openexr/openexr_stub.cpp b/source/blender/imbuf/intern/openexr/openexr_stub.cpp index 3ad23456b9f..c198cac6357 100644 --- a/source/blender/imbuf/intern/openexr/openexr_stub.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_stub.cpp @@ -79,6 +79,5 @@ bool IMB_exr_multiview_save( void IMB_exr_close (void * /*handle*/) { } void IMB_exr_add_view(void * /*handle*/, const char * /*name*/) { } -int IMB_exr_split_token(const char * /*str*/, const char * /*end*/, const char ** /*token*/) { return 1; } bool IMB_exr_has_multilayer(void * /*handle*/) { return false; } bool IMB_exr_has_singlelayer_multiview(void * /*handle*/) { return false; }