[PD-cvs] SF.net SVN: pure-data: [9928] trunk/packages/patches/ fix_absolute_paths_for_declare-0.41.4.patch

eighthave at users.sourceforge.net eighthave at users.sourceforge.net
Tue May 27 17:22:01 CEST 2008


Revision: 9928
          http://pure-data.svn.sourceforge.net/pure-data/?rev=9928&view=rev
Author:   eighthave
Date:     2008-05-27 08:22:01 -0700 (Tue, 27 May 2008)

Log Message:
-----------
fix the support for absolute paths with [declare], #X declare, and canvas_open()

Added Paths:
-----------
    trunk/packages/patches/fix_absolute_paths_for_declare-0.41.4.patch

Added: trunk/packages/patches/fix_absolute_paths_for_declare-0.41.4.patch
===================================================================
--- trunk/packages/patches/fix_absolute_paths_for_declare-0.41.4.patch	                        (rev 0)
+++ trunk/packages/patches/fix_absolute_paths_for_declare-0.41.4.patch	2008-05-27 15:22:01 UTC (rev 9928)
@@ -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,


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Pd-cvs mailing list