Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenlib/BLI_blenlib.h1
-rw-r--r--source/blender/blenlib/intern/util.c43
-rw-r--r--source/blender/python/BPY_extern.h2
-rw-r--r--source/blender/python/BPY_interface.c34
-rw-r--r--source/blender/src/header_text.c8
-rw-r--r--source/creator/creator.c36
6 files changed, 71 insertions, 53 deletions
diff --git a/source/blender/blenlib/BLI_blenlib.h b/source/blender/blenlib/BLI_blenlib.h
index c59cd2dab4e..a1db7adf33d 100644
--- a/source/blender/blenlib/BLI_blenlib.h
+++ b/source/blender/blenlib/BLI_blenlib.h
@@ -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);
diff --git a/source/blender/blenlib/intern/util.c b/source/blender/blenlib/intern/util.c
index a31121148e3..c27efcb7934 100644
--- a/source/blender/blenlib/intern/util.c
+++ b/source/blender/blenlib/intern/util.c
@@ -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)
{
diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index 3d9b45051fb..4b96ef3fdf0 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -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 );
diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c
index c91aabc4a02..041ba069928 100644
--- a/source/blender/python/BPY_interface.c
+++ b/source/blender/python/BPY_interface.c
@@ -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);
}
}
}
diff --git a/source/blender/src/header_text.c b/source/blender/src/header_text.c
index e7552434b19..eeea43ec57a 100644
--- a/source/blender/src/header_text.c
+++ b/source/blender/src/header_text.c
@@ -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)
diff --git a/source/creator/creator.c b/source/creator/creator.c
index ec87cdd8cf7..bdd16dc6bed 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -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);