Index: s_path.c =================================================================== --- s_path.c (revision 9725) +++ s_path.c (working copy) @@ -22,6 +22,10 @@ #include #endif +#ifdef MSW +#include +#endif + #include #include "m_pd.h" #include "m_imp.h" @@ -69,6 +73,30 @@ *to = 0; } +/* expand env vars and ~ at the beginning of a path and make a copy to return */ +static void sys_expandpath(const char *from, char *to) +{ + if ((strlen(from) == 1 && from[0] == '~') || (strncmp(from,"~/", 2) == 0)) + { +#ifdef MSW + const char *home = getenv("USERPROFILE"); +#else + const char *home = getenv("HOME"); +#endif + if(home) + { + strncpy(to, home, FILENAME_MAX - 1); + strncat(to, from + 1, FILENAME_MAX - strlen(from) - 2); + } + } + else + strncpy(to, from, FILENAME_MAX - 1); +#ifdef MSW + char buf[FILENAME_MAX]; + ExpandEnvironmentStrings(to, buf, FILENAME_MAX - 2); + strncpy(to, buf, FILENAME_MAX - 1); +#endif +} /******************* Utility functions used below ******************/ /*! @@ -196,9 +224,11 @@ char *dirresult, char **nameresult, unsigned int size, int bin) { int fd; + char buf[FILENAME_MAX]; if (strlen(dir) + strlen(name) + strlen(ext) + 4 > size) return (-1); - strcpy(dirresult, dir); + sys_expandpath(dir, buf); + strcpy(dirresult, buf); if (*dirresult && dirresult[strlen(dirresult)-1] != '/') strcat(dirresult, "/"); strcat(dirresult, name); @@ -250,9 +280,9 @@ int sys_open_absolute(const char *name, const char* ext, char *dirresult, char **nameresult, unsigned int size, int bin, int *fdp) { - if (name[0] == '/' + if (name[0] == '/' || name[0] == '~' #ifdef MSW - || (name[1] == ':' && name[2] == '/') + || name[0] == '%' || (name[1] == ':' && name[2] == '/') #endif ) {