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;
        }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to