[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41400] trunk/blender/source/blender: fix [#29098] File save dialog cannot handle extra periods in file name

Campbell Barton ideasman42 at gmail.com
Mon Oct 31 01:23:43 CET 2011


Revision: 41400
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41400
Author:   campbellbarton
Date:     2011-10-31 00:23:42 +0000 (Mon, 31 Oct 2011)
Log Message:
-----------
fix [#29098] File save dialog cannot handle extra periods in file name

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/blenlib/BLI_path_util.h
    trunk/blender/source/blender/blenlib/intern/path_util.c
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c	2011-10-31 00:10:51 UTC (rev 41399)
+++ trunk/blender/source/blender/blenkernel/intern/image.c	2011-10-31 00:23:42 UTC (rev 41400)
@@ -981,7 +981,7 @@
 				  || (G.have_quicktime && BLI_testextensie_array(string, imb_ext_image_qt))) {
 			return BLI_replace_extension(string, FILE_MAX, extension);
 		} else {
-			strcat(string, extension);
+			return BLI_ensure_extension(string, FILE_MAX, extension);
 			return TRUE;
 		}
 		

Modified: trunk/blender/source/blender/blenlib/BLI_path_util.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_path_util.h	2011-10-31 00:10:51 UTC (rev 41399)
+++ trunk/blender/source/blender/blenlib/BLI_path_util.h	2011-10-31 00:23:42 UTC (rev 41400)
@@ -102,6 +102,7 @@
 int BLI_testextensie_array(const char *str, const char **ext_array);
 int BLI_testextensie_glob(const char *str, const char *ext_fnmatch);
 int BLI_replace_extension(char *path, size_t maxlen, const char *ext);
+int BLI_ensure_extension(char *path, size_t maxlen, const char *ext);
 void BLI_uniquename(struct ListBase *list, void *vlink, const char defname[], char delim, short name_offs, short len);
 int BLI_uniquename_cb(int (*unique_check)(void *, const char *), void *arg, const char defname[], char delim, char *name, short name_len);
 void BLI_newname(char * name, int add);

Modified: trunk/blender/source/blender/blenlib/intern/path_util.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/path_util.c	2011-10-31 00:10:51 UTC (rev 41399)
+++ trunk/blender/source/blender/blenlib/intern/path_util.c	2011-10-31 00:23:42 UTC (rev 41400)
@@ -1397,25 +1397,54 @@
 
 int BLI_replace_extension(char *path, size_t maxlen, const char *ext)
 {
+	size_t path_len= strlen(path);
+	size_t ext_len= strlen(ext);
 	size_t a;
 
-	for(a=strlen(path); a>0; a--) {
-		if(path[a-1] == '.' || path[a-1] == '/' || path[a-1] == '\\') {
-			a--;
+	for(a= path_len - 1; a >= 0; a--) {
+		if (ELEM3(path[a], '.', '/', '\\')) {
 			break;
 		}
 	}
-	
-	if(path[a] != '.')
-		a= strlen(path);
 
-	if(a + strlen(ext) >= maxlen)
+	if(a + ext_len >= maxlen)
 		return 0;
 
-	strcpy(path+a, ext);
+	memcpy(path+a, ext, ext_len + 1);
 	return 1;
 }
 
+/* strip's trailing '.'s and adds the extension only when needed */
+int BLI_ensure_extension(char *path, size_t maxlen, const char *ext)
+{
+	size_t path_len= strlen(path);
+	size_t ext_len= strlen(ext);
+	size_t a;
+
+	/* first check the extension is alread there */
+	if (    (ext_len <= path_len) &&
+	        (strcmp(path + (path_len - ext_len), ext) == 0))
+	{
+		return 1;
+	}
+
+	for(a= path_len - 1; a >= 0; a--) {
+		if (path[a] == '.') {
+			path[a]= '\0';
+		}
+		else {
+			break;
+		}
+	}
+	a++;
+
+	if(a + ext_len >= maxlen)
+		return 0;
+
+	memcpy(path+a, ext, ext_len + 1);
+	return 1;
+}
+
 /* Converts "/foo/bar.txt" to "/foo/" and "bar.txt"
  * - wont change 'string'
  * - wont create any directories

Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2011-10-31 00:10:51 UTC (rev 41399)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2011-10-31 00:23:42 UTC (rev 41400)
@@ -1949,7 +1949,10 @@
 {
 	char filepath[FILE_MAX];
 	RNA_string_get(op->ptr, "filepath", filepath);
-	if(BLI_replace_extension(filepath, sizeof(filepath), ".blend")) {
+	if(!BLO_has_bfile_extension(filepath)) {
+		/* some users would prefer BLI_replace_extension(),
+		 * we keep getting knit-picking bug reports about this - campbell */
+		BLI_ensure_extension(filepath, FILE_MAX, ".blend");
 		RNA_string_set(op->ptr, "filepath", filepath);
 		return TRUE;
 	}




More information about the Bf-blender-cvs mailing list