Fix for correct handling of relative filenames.
authorAndrea Weikert <elubie@gmx.net>
Mon, 24 Oct 2005 20:52:51 +0000 (20:52 +0000)
committerAndrea Weikert <elubie@gmx.net>
Mon, 24 Oct 2005 20:52:51 +0000 (20:52 +0000)
Now relative filenames that are not below the .blend file
in the directory hierarchy can be used.

CAUTION:
  The relative filenames are not updated if the blend file
  is moved to another dir or saved into another dir (save as)
  We will rely on the smartness of the users for this.

my first official commit - thanks Ton!

source/blender/blenlib/BLI_blenlib.h
source/blender/blenlib/intern/util.c
source/blender/src/editseq.c
source/blender/src/filesel.c

index 0759a2f8865e988a73fc98d1021cc6839833fb29..a66285182acab2cc49c009e27665c41141b1cacd 100644 (file)
@@ -125,7 +125,7 @@ void BLI_splitdirstring(char *di,char *fi);
         */
 int BLI_convertstringcode(char *path, char *basepath, int framenum);
 
-void BLI_makestringcode(char *fromfile, char *str);
+void BLI_makestringcode(const char *relfile, char *file);
 
        /**
         * Change every @a from in @a string into @a to. The
index 2095b537d79698c1b5bf16bc82e741efe3c6fb65..e95428f52499d7b4062c6dc71b78db108ef1fe9c 100644 (file)
@@ -431,31 +431,68 @@ int BLI_strcaseeq(char *a, char *b) {
        return (BLI_strcasecmp(a, b)==0);
 }
 
-void BLI_makestringcode(char *fromfile, char *str)
+void BLI_makestringcode(const char *relfile, char *file)
 {
-       char *slash, len, temp[512];
+       char * p;
+       char * q;
+       char * lslash;
+       int len=0;
 
-       strcpy(temp, fromfile);
-       
-       BLI_char_switch(temp, '\\', '/');
-       BLI_char_switch(str, '\\', '/');
-
-       /* Find the last slash */
-       slash = strrchr(temp, '/');
-       if(slash) {
-               *(slash+1)= 0;
-               len= strlen(temp);
-               if(len) {
-                       if(strncmp(str, temp, len)==0) {
-                               temp[0]= '/';
-                               temp[1]= '/';
-                               strcpy(temp+2, str+len);
-#ifdef                 WIN32
-                               BLI_char_switch(temp+2, '/', '\\');
+       char temp[FILE_MAXDIR+FILE_MAXFILE];
+       char res[FILE_MAXDIR+FILE_MAXFILE];
+       strcpy(temp, relfile);
+
+#ifdef WIN32
+       if (strlen(file) > 2) {
+               if ( temp[1] == ':' && file[1] == ':' && temp[0] != file[0] )
+                       return;
+       }
 #endif
-                               strcpy(str, temp);
-                       }
+
+       BLI_char_switch(temp, '\\', '/');
+       BLI_char_switch(file, '\\', '/');
+
+       /* the last slash in the file indicates where the path part ends */
+       lslash = BLI_last_slash(temp);
+
+       if (lslash) 
+       {       
+               /* find the prefix of the filename that is equal for both filenames.
+                  This is replaced by the two slashes at the beginning */
+               p = temp;
+               q = file;
+               while (*p == *q) {
+                       ++p; ++q;
+               }
+               /* we might have passed the slash when the beginning of a dir matches 
+                  so we rewind. Only check on the actual filename
+               */
+               if (*q != '/') {
+                       while ( (q >= file) && (*q != '/') ) { --q; --p; }
+               } 
+               else if (*p != '/') {
+                       while ( (p >= temp) && (*p != '/') ) { --p; --q; }
+               }
+               
+               strcpy(res,     "//");
+
+               /* p now points to the slash that is at the beginning of the part
+                  where the path is different from the relative path. 
+                  We count the number of directories we need to go up in the
+                  hierarchy to arrive at the common 'prefix' of the path
+               */                      
+               while (p && p < lslash) {
+                       if (*p == '/') 
+                               strcat(res,     "../");
+                       ++p;
                }
+
+               strcat(res, q+1); /* don't copy the slash at the beginning */
+
+#ifdef WIN32
+               BLI_char_switch(res+2, '/', '\\');
+#endif
+               strcpy(file, res);
        }
 }
 
index a4ccf3ea1bc7f2840afc2273d5b5ceb7a515cff4..c6ee3bc76a93b939e20baf471a9b3c4d17fda761 100644 (file)
 #include "mydevice.h"
 
 Sequence *last_seq=0;
+
+#ifdef WIN32
+char last_imagename[FILE_MAXDIR+FILE_MAXFILE]= "c:\\";
+#else
 char last_imagename[FILE_MAXDIR+FILE_MAXFILE]= "/";
+#endif
+
 char last_sounddir[FILE_MAXDIR+FILE_MAXFILE]= "";
 
 #define SEQ_DESEL      ~(SELECT+SEQ_LEFTSEL+SEQ_RIGHTSEL)
index 35bede646cf21c62aaf0b2b875f013f86b8f5ffb..84f89da48b4d9af08103d4dfbbc7b91de19912ec 100644 (file)
@@ -1344,7 +1344,8 @@ void activate_fileselect(int type, char *title, char *file, void (*func)(char *)
        }
        else {  /* FILE_BLENDER */
                split_sfile(sfile, name);       /* test filelist too */
-               
+               checkdir(sfile->dir);
+
                /* free: filelist and libfiledata became incorrect */
                if(sfile->libfiledata) BLO_blendhandle_close(sfile->libfiledata);
                sfile->libfiledata= 0;
@@ -1377,6 +1378,7 @@ void activate_imageselect(int type, char *title, char *file, void (*func)(char *
        else simasel->mode &= ~IMS_STRINGCODE;
        
        BLI_split_dirfile(name, dir, simasel->file);
+       checkdir(simasel->dir);
        if(strcmp(dir, simasel->dir)!=0) simasel->fase= 0;
        strcpy(simasel->dir, dir);