aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Christoph Steiner <eighthave@users.sourceforge.net>2008-05-27 15:22:01 +0000
committerHans-Christoph Steiner <eighthave@users.sourceforge.net>2008-05-27 15:22:01 +0000
commit41b3f2f68bd4d7f521c4e0090289bbb187184981 (patch)
tree5f864d28eced4e6d678f63769f8764868b1b559f
parentcbe13d72a30a27724bb3acb7612f6717d9f17c34 (diff)
fix the support for absolute paths with [declare], #X declare, and canvas_open()
svn path=/trunk/; revision=9928
-rw-r--r--packages/patches/fix_absolute_paths_for_declare-0.41.4.patch174
1 files changed, 174 insertions, 0 deletions
diff --git a/packages/patches/fix_absolute_paths_for_declare-0.41.4.patch b/packages/patches/fix_absolute_paths_for_declare-0.41.4.patch
new file mode 100644
index 00000000..fa9613bd
--- /dev/null
+++ b/packages/patches/fix_absolute_paths_for_declare-0.41.4.patch
@@ -0,0 +1,174 @@
+Index: m_pd.h
+===================================================================
+--- m_pd.h (revision 9862)
++++ m_pd.h (working copy)
+@@ -457,6 +457,7 @@
+
+ /* ------------ system interface routines ------------------- */
+ EXTERN int sys_isreadablefile(const char *name);
++EXTERN int sys_isabsolutepath(const char *dir);
+ EXTERN void sys_bashfilename(const char *from, char *to);
+ EXTERN void sys_unbashfilename(const char *from, char *to);
+ EXTERN int open_via_path(const char *name, const char *ext, const char *dir,
+Index: s_main.c
+===================================================================
+--- s_main.c (revision 9862)
++++ s_main.c (working copy)
+@@ -491,28 +491,29 @@
+ sys_libdir = gensym(sbuf2);
+ sys_guidir = &s_; /* in MSW the guipath just depends on the libdir */
+ #else
+- strncpy(sbuf, sbuf2, MAXPDSTRING-30);
++ realpath(sbuf2, sbuf);
++ strncpy(sbuf2, sbuf, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+- strcat(sbuf, "/lib/pd");
+- if (stat(sbuf, &statbuf) >= 0)
++ strcat(sbuf2, "/lib/pd");
++ if (stat(sbuf2, &statbuf) >= 0)
+ {
+ /* complicated layout: lib dir is the one we just stat-ed above */
+- sys_libdir = gensym(sbuf);
++ sys_libdir = gensym(sbuf2);
+ /* gui lives in .../lib/pd/bin */
+- strncpy(sbuf, sbuf2, MAXPDSTRING-30);
++ strncpy(sbuf2, sbuf, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+- strcat(sbuf, "/lib/pd/bin");
+- sys_guidir = gensym(sbuf);
++ strcat(sbuf2, "/lib/pd/bin");
++ sys_guidir = gensym(sbuf2);
+ }
+ else
+ {
+ /* simple layout: lib dir is the parent */
+- sys_libdir = gensym(sbuf2);
++ sys_libdir = gensym(sbuf);
+ /* gui lives in .../bin */
+- strncpy(sbuf, sbuf2, MAXPDSTRING-30);
++ strncpy(sbuf2, sbuf, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+- strcat(sbuf, "/bin");
+- sys_guidir = gensym(sbuf);
++ strcat(sbuf2, "/bin");
++ sys_guidir = gensym(sbuf2);
+ }
+ #endif
+ }
+Index: s_path.c
+===================================================================
+--- s_path.c (revision 9862)
++++ s_path.c (working copy)
+@@ -69,6 +69,24 @@
+ *to = 0;
+ }
+
++/* test if path is absolute or relative, based on leading /, env vars, ~, etc */
++int sys_isabsolutepath(const char *dir)
++{
++ if (dir[0] == '/' || dir[0] == '~'
++#ifdef MSW
++ || dir[0] == '%' || (dir[1] == ':' && dir[2] == '/')
++#endif
++ )
++ {
++ return 1;
++ }
++ else
++ {
++ return 0;
++ }
++}
++
++
+ /******************* Utility functions used below ******************/
+
+ /*!
+@@ -250,11 +268,7 @@
+ int sys_open_absolute(const char *name, const char* ext,
+ char *dirresult, char **nameresult, unsigned int size, int bin, int *fdp)
+ {
+- if (name[0] == '/'
+-#ifdef MSW
+- || (name[1] == ':' && name[2] == '/')
+-#endif
+- )
++ if (sys_isabsolutepath(name))
+ {
+ char dirbuf[MAXPDSTRING];
+ int dirlen = (strrchr(name, '/') - name);
+Index: g_canvas.c
+===================================================================
+--- g_canvas.c (revision 9862)
++++ g_canvas.c (working copy)
+@@ -1475,6 +1479,22 @@
+ }
+ }
+
++static void canvas_completepath(char *from, char *to)
++{
++ if (sys_isabsolutepath(from))
++ {
++ to[0] = '\0';
++ }
++ else
++ { // if not absolute path, append Pd lib dir
++ strncpy(to, sys_libdir->s_name, FILENAME_MAX-4);
++ to[FILENAME_MAX-3] = '\0';
++ strcat(to, "/");
++ }
++ strncat(to, from, FILENAME_MAX-strlen(to));
++ to[FILENAME_MAX-1] = '\0';
++}
++
+ static void canvas_declare(t_canvas *x, t_symbol *s, int argc, t_atom *argv)
+ {
+ int i;
+@@ -1496,12 +1516,7 @@
+ }
+ else if ((argc > i+1) && !strcmp(flag, "-stdpath"))
+ {
+- strncpy(strbuf, sys_libdir->s_name, MAXPDSTRING-3);
+- strbuf[MAXPDSTRING-4] = 0;
+- strcat(strbuf, "/");
+- strncpy(strbuf, atom_getsymbolarg(i+1, argc, argv)->s_name,
+- MAXPDSTRING-strlen(strbuf));
+- strbuf[MAXPDSTRING-1] = 0;
++ canvas_completepath(atom_getsymbolarg(i+1, argc, argv)->s_name, strbuf);
+ e->ce_path = namelist_append(e->ce_path, strbuf, 0);
+ i++;
+ }
+@@ -1512,12 +1527,7 @@
+ }
+ else if ((argc > i+1) && !strcmp(flag, "-stdlib"))
+ {
+- strncpy(strbuf, sys_libdir->s_name, MAXPDSTRING-3);
+- strbuf[MAXPDSTRING-4] = 0;
+- strcat(strbuf, "/");
+- strncpy(strbuf, atom_getsymbolarg(i+1, argc, argv)->s_name,
+- MAXPDSTRING-strlen(strbuf));
+- strbuf[MAXPDSTRING-1] = 0;
++ canvas_completepath(atom_getsymbolarg(i+1, argc, argv)->s_name, strbuf);
+ sys_load_lib(0, strbuf);
+ i++;
+ }
+@@ -1564,9 +1574,16 @@
+ for (nl = y->gl_env->ce_path; nl; nl = nl->nl_next)
+ {
+ char realname[MAXPDSTRING];
+- strncpy(realname, dir, MAXPDSTRING);
+- realname[MAXPDSTRING-3] = 0;
+- strcat(realname, "/");
++ if (sys_isabsolutepath(nl->nl_string))
++ {
++ realname[0] = '\0';
++ }
++ else
++ { /* if not absolute path, append Pd lib dir */
++ strncpy(realname, dir, MAXPDSTRING);
++ realname[MAXPDSTRING-3] = 0;
++ strcat(realname, "/");
++ }
+ strncat(realname, nl->nl_string, MAXPDSTRING-strlen(realname));
+ realname[MAXPDSTRING-1] = 0;
+ if ((fd = sys_trytoopenone(realname, name, ext,