From 0333cf00baf4d5b796347334af1f15d5bb9a2df4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Wed, 20 Mar 2019 12:59:11 +0100 Subject: Fix BLI_path_frame_strip The `BLI_path_frame_strip` function was completely broken, unless the number of digits in the sequence number was the same as the length of the extension. In other words, it would work fine for `file.0001.abc` (4 digit `0001` and 4 char `.abc`), but other combinations would truncate to the shortest (`file.001.abc` would become `file.###.ab` and `file.00001.a` would become `file.##.a`). The dependency between the sequence number and the file extension is now removed. The behaviour has changed a little bit in the case where there are no numbers in the filename. Previously, `path="filename.abc"` would result in `path="filename.abc"` and `ext=""`, but now it results in `path="filename"` and `ext=".abc"`. This way `ext` always contains the extension, and the behaviour is consistent regardless of whether there were any numbers found. Furthermore, I've removed the `bool set_frame_char` parameter, because it was unclear, probably also buggy, and most importantly, never used. I've also added a unit test for the `BLI_path_frame_strip` function. --- source/blender/blenlib/BLI_path_util.h | 2 +- source/blender/blenlib/intern/path_util.c | 18 ++++++++---------- 2 files changed, 9 insertions(+), 11 deletions(-) (limited to 'source/blender/blenlib') diff --git a/source/blender/blenlib/BLI_path_util.h b/source/blender/blenlib/BLI_path_util.h index ac87fd21a92..ddb9828129c 100644 --- a/source/blender/blenlib/BLI_path_util.h +++ b/source/blender/blenlib/BLI_path_util.h @@ -92,7 +92,7 @@ bool BLI_path_abs(char *path, const char *basepath) ATTR_NONNULL(); bool BLI_path_frame(char *path, int frame, int digits) ATTR_NONNULL(); bool BLI_path_frame_range(char *path, int sta, int end, int digits) ATTR_NONNULL(); bool BLI_path_frame_get(char *path, int *r_frame, int *numdigits) ATTR_NONNULL(); -void BLI_path_frame_strip(char *path, bool set_frame_char, char *ext) ATTR_NONNULL(); +void BLI_path_frame_strip(char *path, char *ext) ATTR_NONNULL(); bool BLI_path_frame_check_chars(const char *path) ATTR_NONNULL(); bool BLI_path_cwd(char *path, const size_t maxlen) ATTR_NONNULL(); void BLI_path_rel(char *file, const char *relfile) ATTR_NONNULL(); diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index 77b137a9d6d..6d69f29a228 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -862,7 +862,7 @@ bool BLI_path_frame_get(char *path, int *r_frame, int *r_numdigits) return false; } -void BLI_path_frame_strip(char *path, bool set_frame_char, char *ext) +void BLI_path_frame_strip(char *path, char *r_ext) { if (*path) { char *file = (char *)BLI_last_slash(path); @@ -896,16 +896,14 @@ void BLI_path_frame_strip(char *path, bool set_frame_char, char *ext) c++; - if (numdigits) { - /* replace the number with the suffix and terminate the string */ - while (numdigits--) { - *ext++ = *suffix; - *c++ = set_frame_char ? '#' : *suffix; - suffix++; - } - *c = '\0'; - *ext = '\0'; + int suffix_length = len - (suffix - file); + BLI_strncpy(r_ext, suffix, suffix_length+1); + + /* replace the number with the suffix and terminate the string */ + while (numdigits--) { + *c++ = '#'; } + *c = '\0'; } } -- cgit v1.2.3