added BLI_convertstringcwd, used so command line blendfiles and python scripts can...
authorCampbell Barton <ideasman42@gmail.com>
Mon, 15 Sep 2008 01:32:53 +0000 (01:32 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 15 Sep 2008 01:32:53 +0000 (01:32 +0000)
- was alredy doing this for blendfiles, but better to have in its own function.

header_text.c - renamed PATH_MAX, was defined by system includes.

source/blender/blenlib/BLI_blenlib.h
source/blender/blenlib/intern/util.c
source/blender/python/BPY_extern.h
source/blender/python/BPY_interface.c
source/blender/src/header_text.c
source/creator/creator.c

index c59cd2dab4ee9cc71ab9229e98bda9b0f1a5fe83..a1db7adf33d98e75086b29a8702311e8d63e6eaa 100644 (file)
@@ -151,6 +151,7 @@ void BLI_cleanup_dir(const char *relabase, char *dir); /* same as above but adds
         */
 int BLI_convertstringcode(char *path, const char *basepath);
 int BLI_convertstringframe(char *path, int frame);
+int BLI_convertstringcwd(char *path);
 
 void BLI_makestringcode(const char *relfile, char *file);
 
index a31121148e3b5d473fb33d168c5627098c55f4f3..c27efcb7934f82d442c04ab85878cb4108f03c2d 100644 (file)
@@ -1211,6 +1211,49 @@ int BLI_convertstringcode(char *path, const char *basepath)
        return wasrelative;
 }
 
+
+/*
+ * Should only be done with command line paths.
+ * this is NOT somthing blenders internal paths support like the // prefix
+ */
+int BLI_convertstringcwd(char *path)
+{
+       int wasrelative = 1;
+       int filelen = strlen(path);
+       
+#ifdef WIN32
+       if (filelen >= 3 && path[1] == ':' && (path[2] == '\\' || path[2] == '/'))
+               wasrelative = 0;
+#else
+       if (filelen >= 2 && path[0] == '/')
+               wasrelative = 0;
+#endif
+       
+       if (wasrelative==1) {
+               char cwd[FILE_MAXDIR + FILE_MAXFILE];
+               BLI_getwdN(cwd); /* incase the full path to the blend isnt used */
+               
+               if (cwd[0] == '\0') {
+                       printf( "Could not get the current working directory - $PWD for an unknown reason.");
+               } else {
+                       /* uses the blend path relative to cwd important for loading relative linked files.
+                       *
+                       * cwd should contain c:\ etc on win32 so the relbase can be NULL
+                       * relbase being NULL also prevents // being misunderstood as relative to the current
+                       * blend file which isnt a feature we want to use in this case since were dealing
+                       * with a path from the command line, rather then from inside Blender */
+                       
+                       char origpath[FILE_MAXDIR + FILE_MAXFILE];
+                       BLI_strncpy(origpath, path, FILE_MAXDIR + FILE_MAXFILE);
+                       
+                       BLI_make_file_string(NULL, path, cwd, origpath); 
+               }
+       }
+       
+       return wasrelative;
+}
+
+
 /* copy di to fi, filename only */
 void BLI_splitdirstring(char *di, char *fi)
 {
index 3d9b45051fb453807811342225435a90b7a8cd06..4b96ef3fdf0bca0849f44102b2d58a71598c4a39 100644 (file)
@@ -94,7 +94,7 @@ extern "C" {
        int BPY_menu_do_python( short menutype, int event );
        int BPY_menu_do_shortcut( short menutype, unsigned short key, unsigned short modifiers );
        int BPY_menu_invoke( struct BPyMenu *pym, short menutype );
-       void BPY_run_python_script( char *filename );
+       void BPY_run_python_script( const char *filename );
        int BPY_run_script(struct Script *script);
        void BPY_free_compiled_text( struct Text *text );
 
index c91aabc4a024ce63c2ebaa692f8d07d6b238cd08..041ba0699286358a8b650195e2d2bd1cef64a780 100644 (file)
@@ -720,13 +720,23 @@ int BPY_txt_do_python_Text( struct Text *text )
 * automatically. The script can be a file or a Blender Text in the current 
 * .blend.
 ****************************************************************************/
-void BPY_run_python_script( char *fn )
+void BPY_run_python_script( const char *fn )
 {
+       char filename[FILE_MAXDIR + FILE_MAXFILE];
        Text *text = NULL;
        int is_blender_text = 0;
-
-       if (!BLI_exists(fn)) {  /* if there's no such filename ... */
-               text = G.main->text.first;      /* try an already existing Blender Text */
+       
+       BLI_strncpy(filename, fn, FILE_MAXDIR + FILE_MAXFILE);
+       
+       if (!BLI_exists(filename))
+               BLI_convertstringcwd(filename);
+               
+       if (!BLI_exists(filename)) {    /* if there's no such filename ... */
+               /* try an already existing Blender Text.
+                * use 'fn' rather then filename for this since were looking for
+                * internal text
+                */
+               text = G.main->text.first;
 
                while (text) {
                        if (!strcmp(fn, text->id.name + 2)) break;
@@ -741,11 +751,14 @@ void BPY_run_python_script( char *fn )
        }
 
        else {
-               text = add_text(fn);
+               /* use filename here since we know it exists,
+                * 'fn' may have been a relative path
+                */
+               text = add_text(filename);
 
                if (text == NULL) {
                        printf("\nError in BPY_run_python_script:\n"
-                               "couldn't create Blender text from %s\n", fn);
+                               "couldn't create Blender text from \"%s\"\n", filename);
                /* Chris: On Windows if I continue I just get a segmentation
                 * violation.  To get a baseline file I exit here. */
                exit(2);
@@ -762,13 +775,8 @@ void BPY_run_python_script( char *fn )
                /* We can't simply free the text, since the script might have called
                 * Blender.Load() to load a new .blend, freeing previous data.
                 * So we check if the pointer is still valid. */
-               Text *txtptr = G.main->text.first;
-               while (txtptr) {
-                       if (txtptr == text) {
-                               free_libblock(&G.main->text, text);
-                               break;
-                       }
-                       txtptr = txtptr->id.next;
+               if (BLI_findindex(&G.main->text, text) != -1) {
+                       free_libblock(&G.main->text, text);
                }
        }
 }
index e7552434b19ca6ec8226c386e56193cb1dce10bb..eeea43ec57a6e36992b9c09b687d04577a70a45d 100644 (file)
@@ -862,14 +862,14 @@ static uiBlock *text_filemenu(void *arg_unused)
 }
 
 /* header */
-#define PATH_MAX       260
+#define HEADER_PATH_MAX        260
 void text_buttons(void)
 {
        uiBlock *block;
        SpaceText *st= curarea->spacedata.first;
        Text *text;
        short xco, xmax;
-       char naam[256], fname[PATH_MAX], headtxt[PATH_MAX+17];
+       char naam[256], fname[HEADER_PATH_MAX], headtxt[HEADER_PATH_MAX+17];
        int len;
        
        if (st==NULL || st->spacetype != SPACE_TEXT) return;
@@ -961,8 +961,8 @@ void text_buttons(void)
        if (text) {
                if (text->name) {
                        len = strlen(text->name);
-                       if (len > PATH_MAX-1)
-                               len = PATH_MAX-1;
+                       if (len > HEADER_PATH_MAX-1)
+                               len = HEADER_PATH_MAX-1;
                        strncpy(fname, text->name, len);
                        fname[len]='\0';
                        if (text->flags & TXT_ISDIRTY)
index ec87cdd8cf715283fb6c06d340fd041cf2069d3d..bdd16dc6bed4b43988d378afc6ef9c6e9faa36e8 100644 (file)
@@ -772,44 +772,10 @@ int main(int argc, char **argv)
                else {
                        
                        /* Make the path absolute because its needed for relative linked blends to be found */
-                       int abs = 0;
-                       int filelen;
-                       char cwd[FILE_MAXDIR + FILE_MAXFILE];
                        char filename[FILE_MAXDIR + FILE_MAXFILE];
-                       cwd[0] = filename[0] = '\0';
                        
                        BLI_strncpy(filename, argv[a], sizeof(filename));
-                       filelen = strlen(filename);
-                       
-                       /* relative path checks, could do more tests here... */
-#ifdef WIN32
-                       /* Account for X:/ and X:\ - should be enough */
-                       if (filelen >= 3 && filename[1] == ':' && (filename[2] == '\\' || filename[2] == '/'))
-                               abs = 1;
-#else
-                       if (filelen >= 2 && filename[0] == '/')
-                               abs = 1 ;
-#endif
-                       if (!abs) {
-                               BLI_getwdN(cwd); /* incase the full path to the blend isnt used */
-                               
-                               if (cwd[0] == '\0') {
-                                       printf(
-                                       "Could not get the current working directory - $PWD for an unknown reason.\n\t"
-                                       "Relative linked files will not load if the entire blend path is not used.\n\t"
-                                       "The 'Play' button may also fail.\n"
-                                       );
-                               } else {
-                                       /* uses the blend path relative to cwd important for loading relative linked files.
-                                       *
-                                       * cwd should contain c:\ etc on win32 so the relbase can be NULL
-                                       * relbase being NULL also prevents // being misunderstood as relative to the current
-                                       * blend file which isnt a feature we want to use in this case since were dealing
-                                       * with a path from the command line, rather then from inside Blender */
-                                       
-                                       BLI_make_file_string(NULL, filename, cwd, argv[a]); 
-                               }
-                       }
+                       BLI_convertstringcwd(filename);
                        
                        if (G.background) {
                                int retval = BKE_read_file(filename, NULL);