Commit d275d005 authored by Jonathan Wilkes's avatar Jonathan Wilkes
Browse files

Merge branch 'aggraef/purr-data-fix-791'

parents 653fbd24 062904f4
...@@ -2412,7 +2412,9 @@ static int do_replace_subpatches(t_canvas *x, const char* label, t_binbuf *origi ...@@ -2412,7 +2412,9 @@ static int do_replace_subpatches(t_canvas *x, const char* label, t_binbuf *origi
static void abstracthandler_callback(t_abstracthandler *x, t_symbol *s) static void abstracthandler_callback(t_abstracthandler *x, t_symbol *s)
{ {
char fullpath[MAXPDSTRING], label[MAXPDSTRING], *dir, *filename; char fullpath[MAXPDSTRING], label[MAXPDSTRING], *dir, *filename;
char basename[MAXPDSTRING], buf[MAXPDSTRING];
memset(fullpath, '\0', MAXPDSTRING); memset(fullpath, '\0', MAXPDSTRING);
memset(basename, '\0', MAXPDSTRING);
memset(label, '\0', MAXPDSTRING); memset(label, '\0', MAXPDSTRING);
sys_unbashfilename(s->s_name, fullpath); sys_unbashfilename(s->s_name, fullpath);
if (strlen(fullpath) < 3 || strcmp(fullpath+strlen(fullpath)-3, ".pd")) if (strlen(fullpath) < 3 || strcmp(fullpath+strlen(fullpath)-3, ".pd"))
...@@ -2420,16 +2422,19 @@ static void abstracthandler_callback(t_abstracthandler *x, t_symbol *s) ...@@ -2420,16 +2422,19 @@ static void abstracthandler_callback(t_abstracthandler *x, t_symbol *s)
filename = strrchr(fullpath, '/') + 1; filename = strrchr(fullpath, '/') + 1;
fullpath[filename - fullpath - 1] = '\0'; fullpath[filename - fullpath - 1] = '\0';
dir = fullpath; dir = fullpath;
strncpy(basename, filename, strlen(filename) - 3);
int flag, prefix = 0; int flag, prefix = 0;
strncpy(buf,
canvas_getdir(canvas_getrootfor(x->tarjet))->s_name,
MAXPDSTRING);
buf[MAXPDSTRING-1] = 0;
if (flag = if (flag =
sys_relativizepath(canvas_getdir(canvas_getrootfor(x->tarjet))->s_name, sys_relativizepath(buf, dir, label))
dir, label))
{ {
int len = strlen(label), creator, fd = -1; int len = strlen(label), creator, fd = -1;
if (len && label[len-1] != '/') if (len && label[len-1] != '/')
label[len] = '/'; label[len] = '/';
strncat(label, filename, MAXPDSTRING - 4); strncat(label, basename, MAXPDSTRING - strlen(label) - 1);
/* check if there is a creator with the same name or if it's one of /* check if there is a creator with the same name or if it's one of
the built-in methods */ the built-in methods */
t_symbol *sym = gensym(label); t_symbol *sym = gensym(label);
...@@ -2465,7 +2470,7 @@ static void abstracthandler_callback(t_abstracthandler *x, t_symbol *s) ...@@ -2465,7 +2470,7 @@ static void abstracthandler_callback(t_abstracthandler *x, t_symbol *s)
if (flag && prefix) if (flag && prefix)
{ {
strcpy(label, "./"); strcpy(label, "./");
strncat(label, filename, MAXPDSTRING - 4); strncat(label, basename, MAXPDSTRING - strlen(label) - 1);
} }
else if (!flag) else if (!flag)
error("warning: couldn't use relative path, there is a coincidence " error("warning: couldn't use relative path, there is a coincidence "
...@@ -2476,7 +2481,7 @@ static void abstracthandler_callback(t_abstracthandler *x, t_symbol *s) ...@@ -2476,7 +2481,7 @@ static void abstracthandler_callback(t_abstracthandler *x, t_symbol *s)
memset(label, '\0', MAXPDSTRING); memset(label, '\0', MAXPDSTRING);
strcpy(label, dir); strcpy(label, dir);
strcat(label, "/"); strcat(label, "/");
strncat(label, filename, strlen(label) - 3); strncat(label, basename, MAXPDSTRING - strlen(label) - 1);
/* should check if 'filename' is one of the built-in special methods /* should check if 'filename' is one of the built-in special methods
in order to inform the user about the nameclash problem */ in order to inform the user about the nameclash problem */
} }
......
...@@ -196,11 +196,17 @@ int sys_isabsolutepath(const char *dir) ...@@ -196,11 +196,17 @@ int sys_isabsolutepath(const char *dir)
} }
int sys_relativizepath(const char *from, const char *to, char *result) int sys_relativizepath(const char *from, const char *to, char *result)
// precond: from and to fit into char[MAXPDSTRING]
// postcond: result will fit into char[MAXPDSTRING]
{ {
char fromext[FILENAME_MAX]; char fromext[MAXPDSTRING];
sys_unbashfilename(from, fromext); sys_unbashfilename(from, fromext);
char toext[FILENAME_MAX]; char toext[MAXPDSTRING];
sys_unbashfilename(to, toext); sys_unbashfilename(to, toext);
// this will be large enough to hold the result in any case (FLW)
char buf[4*MAXPDSTRING];
memset(buf, '\0', 4*MAXPDSTRING);
int i = 0, j; int i = 0, j;
while(fromext[i] && toext[i] && fromext[i] == toext[i]) i++; while(fromext[i] && toext[i] && fromext[i] == toext[i]) i++;
...@@ -221,12 +227,12 @@ int sys_relativizepath(const char *from, const char *to, char *result) ...@@ -221,12 +227,12 @@ int sys_relativizepath(const char *from, const char *to, char *result)
{ {
if(k == 0) if(k == 0)
{ {
strcpy(result+k, ".."); strcpy(buf+k, "..");
k += 2; k += 2;
} }
else else
{ {
strcpy(result+k, "/.."); strcpy(buf+k, "/..");
k += 3; k += 3;
} }
} }
...@@ -234,9 +240,11 @@ int sys_relativizepath(const char *from, const char *to, char *result) ...@@ -234,9 +240,11 @@ int sys_relativizepath(const char *from, const char *to, char *result)
} }
if(toext[j]) if(toext[j])
{ {
result[k] = '/'; buf[k] = '/';
strcpy(result+k+1, toext+j+1); strcpy(buf+k+1, toext+j+1);
} }
strncpy(result, buf, MAXPDSTRING);
result[MAXPDSTRING-1] = '\0';
} }
else if(!fromext[i] && toext[j]) else if(!fromext[i] && toext[j])
{ {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment