[Bf-blender-cvs] [e660793] asset-experiments: Add BLI helpers for fnmatch head/tail wildcards handling.

Bastien Montagne noreply at git.blender.org
Thu Jan 1 16:58:48 CET 2015


Commit: e660793896a7b91243306935b30c563270bbb6a5
Author: Bastien Montagne
Date:   Thu Jan 1 15:23:16 2015 +0100
Branches: asset-experiments
https://developer.blender.org/rBe660793896a7b91243306935b30c563270bbb6a5

Add BLI helpers for fnmatch head/tail wildcards handling.

`BLI_fnmatch_strncpy_add_endswildcards()` will copy and add '*' wildcards on both ends of given string, if needed.

`BLI_fnmatch_strcmp_ignore_endswildcards()` is same as strcmp, but ignores any '*' wildcards on both ends of given strings.

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

M	source/blender/blenlib/BLI_fnmatch.h
M	source/blender/blenlib/intern/fnmatch.c

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

diff --git a/source/blender/blenlib/BLI_fnmatch.h b/source/blender/blenlib/BLI_fnmatch.h
index f69f5b3..d7d463e 100644
--- a/source/blender/blenlib/BLI_fnmatch.h
+++ b/source/blender/blenlib/BLI_fnmatch.h
@@ -78,4 +78,10 @@ extern int fnmatch __P((const char *__pattern, const char *__string,
 }
 #endif
 
+/* Helpers. */
+#include "BLI_sys_types.h"
+
+void BLI_fnmatch_strncpy_add_endswildcards(char *dst, const char *src, size_t len);
+int BLI_fnmatch_strcmp_ignore_endswildcards(const char *str1, const char *str2);
+
 #endif /* __BLI_FNMATCH_H__ */
diff --git a/source/blender/blenlib/intern/fnmatch.c b/source/blender/blenlib/intern/fnmatch.c
index 60e898a..90cbfe0 100644
--- a/source/blender/blenlib/intern/fnmatch.c
+++ b/source/blender/blenlib/intern/fnmatch.c
@@ -17,6 +17,8 @@
   along with this program; if not, write to the Free Software Foundation,
   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
+#include "BLI_fnmatch.h"
+
 #ifdef WIN32
 
 /* Enable GNU extensions in fnmatch.h.  */
@@ -26,7 +28,6 @@
 
 #include <errno.h>
 #include <ctype.h>
-#include "BLI_fnmatch.h"
 
 
 /* Comment out all this code if we are using the GNU C Library, and are not
@@ -243,4 +244,88 @@ fnmatch (const char *pattern, const char *string, int flags)
 
 #endif /* WIN32 */
 
+/* Helpers. */
+
+#include <string.h>
+
+#include "BLI_utildefines.h"
+#include "BLI_string.h"
+
+/**
+ * Copy src into dst, adding heading/trailing fnmatch wildcards ('*') if needed.
+ *
+ * \param len the size of dst.
+ */
+void BLI_fnmatch_strncpy_add_endswildcards(char *dst, const char *src, size_t len)
+{
+	if (src[0] == '\0') {
+		dst[0] = '\0';
+	}
+	else {
+		/* Add heading/trailing wildcards if needed. */
+		int idx = 0;
+		size_t src_len;
+
+		if (src[idx] != '*') {
+			dst[idx++] = '*';
+			len--;
+		}
+		len--;  /* trailing '\0' */
+
+		src_len = BLI_strnlen(src, len);
+		if ((src[src_len - 1] != '*') && (src_len == len)) {
+			src_len--;
+		}
+
+		memcpy(&dst[idx], src, src_len);
+		idx += src_len;
+
+		if (dst[idx - 1] != '*') {
+			dst[idx++] = '*';
+		}
+		dst[idx] = '\0';
+	}
+}
 
+/**
+ * Like strcmp, but ignore heading/trailing fnmatch wildcards ('*').
+ */
+int BLI_fnmatch_strcmp_ignore_endswildcards(const char *str1, const char *str2)
+{
+	size_t str1_len, str2_len;
+
+	if (*str1 == '*') {
+		str1++;
+	}
+	if (*str2 == '*') {
+		str2++;
+	}
+
+	str1_len = strlen(str1);
+	str2_len = strlen(str2);
+
+	if (str1_len && (str1[str1_len - 1] == '*')) {
+		str1_len--;
+	}
+	if (str2_len && (str2[str2_len - 1] == '*')) {
+		str2_len--;
+	}
+
+	if (str1_len == str2_len) {
+		return strncmp(str1, str2, str2_len);
+	}
+	else if (str1_len > str2_len) {
+		int ret = strncmp(str1, str2, str2_len);
+		if (ret == 0) {
+			ret = 1;
+		}
+		return ret;
+	}
+	else {
+		int ret = strncmp(str1, str2, str1_len);
+		if (ret == 0) {
+			ret = -1;
+		}
+		return ret;
+	}
+}




More information about the Bf-blender-cvs mailing list