Orange: more relative path code cleanup. Introduced a new call in the
authorTon Roosendaal <ton@blender.org>
Wed, 14 Dec 2005 13:21:32 +0000 (13:21 +0000)
committerTon Roosendaal <ton@blender.org>
Wed, 14 Dec 2005 13:21:32 +0000 (13:21 +0000)
blenlib to correctly convert a relative path to a clean new path:

BLI_cleanup_dir(const char *relabase, char *name);

Only works for directories now.

source/blender/blenlib/BLI_blenlib.h
source/blender/blenlib/intern/util.c
source/blender/blenloader/intern/readfile.c
source/blender/include/BSE_filesel.h
source/blender/src/drawimasel.c
source/blender/src/editimasel.c
source/blender/src/filesel.c

index 15ab7825cf637901f9bddfb1acd1f04332391238..7a5e162a4b8fa1377bcd7d457c96aa980470b12a 100644 (file)
@@ -111,6 +111,13 @@ int BLI_countlist(struct ListBase *listbase);
 void BLI_freelinkN(ListBase *listbase, void *vlink);
 void BLI_splitdirstring(char *di,char *fi);
 
+       /**
+        * dir can be any input, like from buttons, and this function
+        * converts it to a regular full path.
+        * Also removes garbage from directory paths, like /../ or double slashes etc 
+        */
+void BLI_cleanup_dir(const char *relabase, char *dir);
+
        /**
         * Blender's path code replacement function.
         * Bases @a path strings leading with "//" by the
@@ -123,7 +130,7 @@ void BLI_splitdirstring(char *di,char *fi);
         * @a framenum The framenumber to replace the frame code with.
         * @retval Returns true if the path was relative (started with "//").
         */
-int BLI_convertstringcode(char *path, char *basepath, int framenum);
+int BLI_convertstringcode(char *path, const char *basepath, int framenum);
 
 void BLI_makestringcode(const char *relfile, char *file);
 
index 74e8e575fdab39245e3ac79628a74f787ec90ec5..45ff6e83f1b740eca87c63070fe18f003b45a058 100644 (file)
@@ -431,6 +431,96 @@ int BLI_strcaseeq(char *a, char *b) {
        return (BLI_strcasecmp(a, b)==0);
 }
 
+/* ******************** string encoding ***************** */
+
+/* This is quite an ugly function... its purpose is to
+ * take the dir name, make it absolute, and clean it up, replacing
+ * excess file entry stuff (like /tmp/../tmp/../)
+ * note that dir isn't protected for max string names... 
+ */
+
+void BLI_cleanup_dir(const char *relabase, char *dir)
+{
+       short a;
+       char *start, *eind;
+       
+       BLI_convertstringcode(dir, relabase, 0);
+       
+#ifdef WIN32
+       if(dir[0]=='.') {       /* happens for example in FILE_MAIN */
+          dir[0]= '\\';
+          dir[1]= 0;
+          return;
+       }       
+
+       while ( (start = strstr(dir, "\\..\\")) ) {
+               eind = start + strlen("\\..\\") - 1;
+               a = start-dir-1;
+               while (a>0) {
+                       if (dir[a] == '\\') break;
+                       a--;
+               }
+               strcpy(dir+a,eind);
+       }
+
+       while ( (start = strstr(dir,"\\.\\")) ){
+               eind = start + strlen("\\.\\") - 1;
+               strcpy(start,eind);
+       }
+
+       while ( (start = strstr(dir,"\\\\" )) ){
+               eind = start + strlen("\\\\") - 1;
+               strcpy(start,eind);
+       }
+
+       if((a = strlen(dir))){                          /* remove the '\\' at the end */
+               while(a>0 && dir[a-1] == '\\'){
+                       a--;
+                       dir[a] = 0;
+               }
+       }
+
+       strcat(dir, "\\");
+#else  
+       if(dir[0]=='.') {       /* happens, for example in FILE_MAIN */
+          dir[0]= '/';
+          dir[1]= 0;
+          return;
+       }       
+
+       while ( (start = strstr(dir, "/../")) ) {
+               eind = start + strlen("/../") - 1;
+               a = start-dir-1;
+               while (a>0) {
+                       if (dir[a] == '/') break;
+                       a--;
+               }
+               strcpy(dir+a,eind);
+       }
+
+       while ( (start = strstr(dir,"/./")) ){
+               eind = start + strlen("/./") - 1;
+               strcpy(start,eind);
+       }
+
+       while ( (start = strstr(dir,"//" )) ){
+               eind = start + strlen("//") - 1;
+               strcpy(start,eind);
+       }
+
+       if( (a = strlen(dir)) ){                                /* remove all '/' at the end */
+               while(dir[a-1] == '/'){
+                       a--;
+                       dir[a] = 0;
+                       if (a<=0) break;
+               }
+       }
+
+       strcat(dir, "/");
+#endif
+}
+
+
 void BLI_makestringcode(const char *relfile, char *file)
 {
        char * p;
@@ -491,7 +581,7 @@ void BLI_makestringcode(const char *relfile, char *file)
                }
 
                strcat(res, q+1); /* don't copy the slash at the beginning */
-
+               
 #ifdef WIN32
                BLI_char_switch(res+2, '/', '\\');
 #endif
@@ -499,7 +589,7 @@ void BLI_makestringcode(const char *relfile, char *file)
        }
 }
 
-int BLI_convertstringcode(char *path, char *basepath, int framenum)
+int BLI_convertstringcode(char *path, const char *basepath, int framenum)
 {
        int len, wasrelative;
        char tmp[FILE_MAXDIR+FILE_MAXFILE];
index 276c177f562cff9336f876e9df4e37917e2fabc6..e2528e349f04693a4362322b284398af315994ba 100644 (file)
@@ -469,6 +469,15 @@ void blo_split_main(ListBase *mainlist)
                split_libdata(lbarray[i], mainl->next);
 }
 
+static void cleanup_path(const char *relabase, char *name)
+{
+       char filename[FILE_MAXFILE];
+       
+       BLI_splitdirstring(name, filename);
+       BLI_cleanup_dir(relabase, name);
+       strcat(name, filename);
+}
+
 static Main *blo_find_main(ListBase *mainlist, char *name)
 {
        Main *m;
@@ -477,24 +486,25 @@ static Main *blo_find_main(ListBase *mainlist, char *name)
        char libname1[FILE_MAXDIR+FILE_MAXFILE];
        
 //     printf("G.sce %s\n", G.sce);
-
-       /* name in stringcode too */
+       /* everything in absolute paths now */
+       
        strcpy(name1, name);
-       BLI_makestringcode(G.sce, name1);
-//     printf("original %s\n", name);
-//     printf("converted %s\n", name1);
-
+       cleanup_path(G.sce, name1);
+//     printf("original in  %s\n", name);
+//     printf("converted in %s\n", name1);
 
        for (m= mainlist->first; m; m= m->next) {
                char *libname= (m->curlib)?m->curlib->name:m->name;
                
 //             printf("libname %s\n", libname);
                strcpy(libname1, libname);
-               BLI_makestringcode(G.sce, libname1);
+               cleanup_path(G.sce, libname1);
 //             printf("libname1 %s\n", libname1, name1);
                
-               if (BLI_streq(name1, libname1))
+               if (BLI_streq(name1, libname1)) {
+                       printf("found library %s\n", libname);
                        return m;
+               }
        }
 
        m= MEM_callocN(sizeof(Main), "find_main");
@@ -504,7 +514,7 @@ static Main *blo_find_main(ListBase *mainlist, char *name)
        strcpy(lib->name, name);
        m->curlib= lib;
        
-//     printf("added new lib %s\n", name);
+       printf("added new lib %s\n", name);
        return m;
 }
 
@@ -5320,6 +5330,7 @@ static void expand_doit(FileData *fd, Main *mainvar, void *old)
                        if(bheadlib) {
                                // BHEAD+DATA dependancy
                                Library *lib= (Library *)(bheadlib+1);
+                               /* we read the lib->name directly from the bhead, potential danger (64 bits?) */
                                mainvar= blo_find_main(&fd->mainlist, lib->name);
 
                                id= is_yet_read(mainvar, bhead);
index f76f5e112589a8a9aa7af18e8219238482e122fb..29f9c52f79f8af837db3387cc60c2a5116bbdaed 100644 (file)
@@ -42,7 +42,6 @@ struct BWinEvent;
 
 void clear_global_filesel_vars(void);
 void filesel_statistics(struct SpaceFile *sfile, int *totfile, int *selfile, float *totlen, float *sellen);
-void checkdir(char *dir);
 void test_flags_file(struct SpaceFile *sfile);
 void sort_filelist(struct SpaceFile *sfile);
 void read_dir(struct SpaceFile *sfile);
index f8d358a905134bb9a37a06f4ba8220dcf8f5ea47..519f0927219444bd9a14c9253c7a20dfa3e019b7 100644 (file)
@@ -865,7 +865,7 @@ void drawimaselspace(ScrArea *sa, void *spacedata)
        myortho2(-0.375, (float)(curarea->winx)-0.375, -0.375, (float)(curarea->winy)-0.375);
        
        if (simasel->fase == 0){
-               checkdir(simasel->dir);
+               BLI_cleanup_dir(G.sce, simasel->dir);
                clear_ima_dir(simasel);
        }
 
index 6fb5d411b98c747c38d0b7376f9d3952b3e67d8d..3d2b3c8b715ea6aac3b6bb4b52ced03221370cdd 100644 (file)
@@ -179,7 +179,7 @@ void winqreadimaselspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                        queredraw = 1;
                        
                case 1: /* dir entry */
-                       checkdir(simasel->dir);
+                       BLI_cleanup_dir(G.sce, simasel->dir);
                        clear_ima_dir(simasel);
                        queredraw = 1;
                        break;
@@ -188,7 +188,7 @@ void winqreadimaselspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                        selname= fsmenu_get_entry(simasel->fileselmenuitem-1);
                        if (selname) {
                                strcpy(simasel->dir, selname);
-                               checkdir(simasel->dir);
+                               BLI_cleanup_dir(G.sce, simasel->dir);
                                clear_ima_dir(simasel);
                            queredraw = 1;
                        }
@@ -349,7 +349,7 @@ void winqreadimaselspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                }
                if (G.qual == 0){
                        imadir_parent(simasel);
-                       checkdir(simasel->dir);
+                       BLI_cleanup_dir(G.sce, simasel->dir);
                        clear_ima_dir(simasel);
                        queredraw = 1;
                }
index 6ce6597d8b41dee4cd01a41921c6d0d2d0b904bb..336040908b3588fa25ec787222c5da4e52e6b13b 100644 (file)
@@ -456,93 +456,6 @@ void filesel_statistics(SpaceFile *sfile, int *totfile, int *selfile, float *tot
 
 /* *************** HELP FUNCTIONS ******************* */
 
-/* This is a really ugly function... its purpose is to
- * take the space file name and clean it up, replacing
- * excess file entry stuff (like /tmp/../tmp/../)
- */
-
-void checkdir(char *dir)
-{
-       short a;
-       char *start, *eind;
-       char tmp[FILE_MAXDIR+FILE_MAXFILE];
-
-       BLI_make_file_string(G.sce, tmp, dir, "");
-       strcpy(dir, tmp);
-       
-#ifdef WIN32
-       if(dir[0]=='.') {       /* happens for example in FILE_MAIN */
-               dir[0]= '\\';
-               dir[1]= 0;
-               return;
-       }       
-
-       while ( (start = strstr(dir, "\\..\\")) ) {
-               eind = start + strlen("\\..\\") - 1;
-               a = start-dir-1;
-               while (a>0) {
-                       if (dir[a] == '\\') break;
-                       a--;
-               }
-               strcpy(dir+a,eind);
-       }
-
-       while ( (start = strstr(dir,"\\.\\")) ){
-               eind = start + strlen("\\.\\") - 1;
-               strcpy(start,eind);
-       }
-
-       while ( (start = strstr(dir,"\\\\" )) ){
-               eind = start + strlen("\\\\") - 1;
-               strcpy(start,eind);
-       }
-
-       if((a = strlen(dir))){                          /* remove the '\\' at the end */
-               while(a>0 && dir[a-1] == '\\'){
-                       a--;
-                       dir[a] = 0;
-               }
-       }
-
-       strcat(dir, "\\");
-#else  
-       if(dir[0]=='.') {       /* happens, for example in FILE_MAIN */
-               dir[0]= '/';
-               dir[1]= 0;
-               return;
-       }       
-       
-       while ( (start = strstr(dir, "/../")) ) {
-               eind = start + strlen("/../") - 1;
-               a = start-dir-1;
-               while (a>0) {
-                       if (dir[a] == '/') break;
-                       a--;
-               }
-               strcpy(dir+a,eind);
-       }
-
-       while ( (start = strstr(dir,"/./")) ){
-               eind = start + strlen("/./") - 1;
-               strcpy(start,eind);
-       }
-
-       while ( (start = strstr(dir,"//" )) ){
-               eind = start + strlen("//") - 1;
-               strcpy(start,eind);
-       }
-
-       if( (a = strlen(dir)) ){                                /* remove all '/' at the end */
-               while(dir[a-1] == '/'){
-                       a--;
-                       dir[a] = 0;
-                       if (a<=0) break;
-               }
-       }
-
-       strcat(dir, "/");
-#endif
-}
 
 /* not called when browsing .blend itself */
 void test_flags_file(SpaceFile *sfile)
@@ -1353,7 +1266,7 @@ 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);
+               BLI_cleanup_dir(G.sce, sfile->dir);
 
                /* free: filelist and libfiledata became incorrect */
                if(sfile->libfiledata) BLO_blendhandle_close(sfile->libfiledata);
@@ -1387,7 +1300,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);
+       BLI_cleanup_dir(G.sce, simasel->dir);
        if(strcmp(dir, simasel->dir)!=0) simasel->fase= 0;
        strcpy(simasel->dir, dir);
        
@@ -1616,7 +1529,7 @@ static void do_filesel_buttons(short event, SpaceFile *sfile)
        }
        else if(event== 2) {
                /* reuse the butname variable */
-               checkdir(sfile->dir);
+               BLI_cleanup_dir(G.sce, sfile->dir);
 
                BLI_make_file_string(G.sce, butname, sfile->dir, "");
                /* strip the trailing slash if its a real dir */
@@ -1642,7 +1555,7 @@ static void do_filesel_buttons(short event, SpaceFile *sfile)
                if (selected) {
                        strcpy(sfile->dir, selected);
                        BLI_make_exist(sfile->dir);
-                       checkdir(sfile->dir);
+                       BLI_cleanup_dir(G.sce, sfile->dir);
                        freefilelist(sfile);
                        sfile->ofs= 0;
                        scrarea_queue_winredraw(curarea);
@@ -1921,7 +1834,7 @@ void winqreadfilespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                                        if(S_ISDIR(sfile->filelist[act].type)) {
                                                strcat(sfile->dir, sfile->filelist[act].relname);
                                                strcat(sfile->dir,"/");
-                                               checkdir(sfile->dir);
+                                               BLI_cleanup_dir(G.sce, sfile->dir);
                                                freefilelist(sfile);
                                                sfile->ofs= 0;
                                                do_draw= 1;