From 13da2aed060ff718d9ea0c7fffc05859ac701994 Mon Sep 17 00:00:00 2001 From: Xiaoqiang Wang Date: Mon, 16 Dec 2019 14:51:47 +0100 Subject: [PATCH] use '/' consistently even on Windows --- require.c | 87 ++++++++++++++++++++++++++++------------------------- runScript.c | 11 +++---- 2 files changed, 51 insertions(+), 47 deletions(-) diff --git a/require.c b/require.c index 2de067f..657e8b1 100644 --- a/require.c +++ b/require.c @@ -127,12 +127,12 @@ int requireDebug; size_t len = 0; if (!buf) buf = malloc(PATH_MAX+1); if (!buf) return NULL; - if (path[0] != OSI_PATH_SEPARATOR[0]) + if (path[0] != '/') { getcwd(buf, PATH_MAX); len = strlen(buf); - if (len && buf[len-1] != OSI_PATH_SEPARATOR[0]) - buf[len++] = OSI_PATH_SEPARATOR[0]; + if (len && buf[len-1] != '/') + buf[len++] = '/'; } strcpy(buf+len, path); return buf; @@ -209,6 +209,7 @@ int requireDebug; static char* realpath(const char* path, char* buffer) { int len = MAX_PATH; + char *p; if (buffer == NULL) { len = GetFullPathName(path, 0, NULL, NULL); @@ -217,6 +218,10 @@ int requireDebug; if (buffer == NULL) return NULL; } GetFullPathName(path, len, buffer, NULL); + /* convert '\' to '/' */ + p = buffer; + while ((p = strchr(p, '\\')) != NULL) *p = '/'; + return buffer; } @@ -256,8 +261,8 @@ int requireDebug; #endif -#define LIBDIR "lib" OSI_PATH_SEPARATOR -#define TEMPLATEDIR "db" OSI_PATH_SEPARATOR +#define LIBDIR "lib/" +#define TEMPLATEDIR "db/" #define TOSTR(s) TOSTR2(s) #define TOSTR2(s) #s @@ -611,9 +616,9 @@ void registerModule(const char* module, const char* version, const char* locatio if (!abslocation) abslocation = (char*)location; ll = strlen(abslocation) + 1; /* linux realpath removes trailing slash */ - if (abslocation[ll-1-strlen(OSI_PATH_SEPARATOR)] != OSI_PATH_SEPARATOR[0]) + if (abslocation[ll-2] != '/') { - addSlash = strlen(OSI_PATH_SEPARATOR); + addSlash = 1; } } m = (moduleitem*) malloc(sizeof(moduleitem) + lm + lv + ll + addSlash); @@ -626,7 +631,7 @@ void registerModule(const char* module, const char* version, const char* locatio strcpy (m->content, module); strcpy (m->content+lm, version); strcpy (m->content+lm+lv, abslocation ? abslocation : ""); - if (addSlash) strcpy (m->content+lm+lv+ll-1, OSI_PATH_SEPARATOR); + if (addSlash) strcpy (m->content+lm+lv+ll-1, "/"); if (abslocation != location) free(abslocation); for (pm = &loadedModules; *pm != NULL; pm = &(*pm)->next); *pm = m; @@ -649,7 +654,7 @@ void registerModule(const char* module, const char* version, const char* locatio /* create a record with the version string */ mylocation = getenv("require_DIR"); if (mylocation == NULL) return; - if (asprintf(&abslocation, "%s" OSI_PATH_SEPARATOR "db" OSI_PATH_SEPARATOR "moduleversion.template", mylocation) < 0) return; + if (asprintf(&abslocation, "%s/db/moduleversion.template", mylocation) < 0) return; if (asprintf(&argstring, "IOC=%.30s, MODULE=%.24s, VERSION=%.39s, MODULE_COUNT=%lu, BUFFER_SIZE=%lu", getenv("IOC"), module, version, moduleCount, moduleListBufferSize+maxModuleNameLength*moduleCount) < 0) return; @@ -1301,7 +1306,7 @@ static int require_priv(const char* module, const char* version, const char* arg dirname = getLibLocation(module); if (requireDebug && dirname[0]) printf("require: library found in %s\n", dirname); - snprintf(filename, sizeof(filename), "%s%n.." OSI_PATH_SEPARATOR ".." OSI_PATH_SEPARATOR "use_exact_version", + snprintf(filename, sizeof(filename), "%s%n../../use_exact_version", dirname, &releasediroffs); if (fileExists(filename)) { @@ -1309,7 +1314,7 @@ static int require_priv(const char* module, const char* version, const char* arg } else { - snprintf(filename+releasediroffs, sizeof(filename)-releasediroffs, ".." OSI_PATH_SEPARATOR ".." OSI_PATH_SEPARATOR "use_exact_minor_version"); + snprintf(filename+releasediroffs, sizeof(filename)-releasediroffs, "../../use_exact_minor_version"); if (fileExists(filename)) exactnessLevel = 1; } @@ -1352,7 +1357,7 @@ static int require_priv(const char* module, const char* version, const char* arg DIR_ENTRY direntry; end = strchr(dirname, OSI_PATH_LIST_SEPARATOR[0]); - if (end && end[1] == OSI_PATH_SEPARATOR[0] && end[2] == OSI_PATH_SEPARATOR[0]) /* "http://..." and friends */ + if (end && end[1] == '/' && end[2] == '/') /* "http://..." and friends */ end = strchr(end+2, OSI_PATH_LIST_SEPARATOR[0]); if (end) dirlen = (int)(end++ - dirname); else dirlen = (int)strlen(dirname); @@ -1360,13 +1365,13 @@ static int require_priv(const char* module, const char* version, const char* arg if (dirlen == 0) continue; /* ignore empty driverpath elements */ - if (!TRY_FILE(0, "%.*s" OSI_PATH_SEPARATOR, dirlen, dirname)) + if (!TRY_FILE(0, "%.*s/", dirlen, dirname)) continue; /* ignore non-existing driverpath elements */ - dirlen += strlen(OSI_PATH_SEPARATOR); + dirlen += 1; /* filename = "/[dirlen]" */ - snprintf(filename+dirlen, sizeof(filename)-dirlen, "%s" OSI_PATH_SEPARATOR "%n", module, &modulediroffs); + snprintf(filename+dirlen, sizeof(filename)-dirlen, "%s/%n", module, &modulediroffs); modulediroffs += dirlen; /* filename = "/[dirlen]/[modulediroffs]" */ @@ -1406,7 +1411,7 @@ static int require_priv(const char* module, const char* version, const char* arg /* Even if it has no library, at least it has a dep file in the lib dir */ /* filename = "/[dirlen]/[modulediroffs]" */ - if (!TRY_FILE(modulediroffs, "%s" OSI_PATH_SEPARATOR "R%s" OSI_PATH_SEPARATOR LIBDIR "%s" OSI_PATH_SEPARATOR, + if (!TRY_FILE(modulediroffs, "%s/R%s/" LIBDIR "%s/", currentFilename, epicsRelease, targetArch)) /* filename = "/[dirlen]/[modulediroffs]/R/lib//" */ { @@ -1520,12 +1525,12 @@ static int require_priv(const char* module, const char* version, const char* arg versionstr = ""; /* founddir = "/[dirlen]/" */ - printf ("Module %s version %s found in %s" OSI_PATH_SEPARATOR "\n", module, found, founddir); + printf ("Module %s version %s found in %s/\n", module, found, founddir); if (requireDebug) printf("require: looking for dependency file\n"); - if (!TRY_FILE(0, "%s" OSI_PATH_SEPARATOR "R%s" OSI_PATH_SEPARATOR "%n" LIBDIR "%s" OSI_PATH_SEPARATOR "%n%s.dep", + if (!TRY_FILE(0, "%s/R%s/%n" LIBDIR "%s/%n%s.dep", founddir, epicsRelease, &releasediroffs, targetArch, &libdiroffs, module)) /* filename = "/[dirlen]//R/[releasediroffs]/lib//[libdiroffs]/module.dep" */ { @@ -1582,11 +1587,11 @@ loadlib: } /* load dbd file */ - if (TRY_NONEMPTY_FILE(releasediroffs, "dbd" OSI_PATH_SEPARATOR "%s%s.dbd", module, versionstr) || + if (TRY_NONEMPTY_FILE(releasediroffs, "dbd/%s%s.dbd", module, versionstr) || TRY_NONEMPTY_FILE(releasediroffs, "%s%s.dbd", module, versionstr) || - TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "dbd" OSI_PATH_SEPARATOR "%s%s.dbd", module, versionstr) || - TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s%s.dbd", module, versionstr) || - TRY_NONEMPTY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR ".." OSI_PATH_SEPARATOR "dbd" OSI_PATH_SEPARATOR "%s.dbd", module)) /* org EPICSbase */ + TRY_NONEMPTY_FILE(releasediroffs, "../dbd/%s%s.dbd", module, versionstr) || + TRY_NONEMPTY_FILE(releasediroffs, "../%s%s.dbd", module, versionstr) || + TRY_NONEMPTY_FILE(releasediroffs, "../../dbd/%s.dbd", module)) /* org EPICSbase */ { printf("Loading dbd file %s\n", filename); if (dbLoadDatabase(filename, NULL, NULL) != 0) @@ -1632,7 +1637,7 @@ loadlib: printf("require: looking for template directory\n"); /* filename = "///R/[releasediroffs]..." */ if (!((TRY_FILE(releasediroffs, TEMPLATEDIR) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR TEMPLATEDIR)) && setupDbPath(module, filename) == 0)) + TRY_FILE(releasediroffs, "../" TEMPLATEDIR)) && setupDbPath(module, filename) == 0)) { /* if no template directory found, restore TEMPLATES to initial value */ char *t; @@ -1648,41 +1653,41 @@ loadlib: printf("require: looking for startup script\n"); /* filename = "///R/[releasediroffs]db" */ if (TRY_FILE(releasediroffs, "%s-%s.iocsh", targetArch, epicsRelease) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.iocsh", targetArch, epicsRelease) || + TRY_FILE(releasediroffs, "../" "%s-%s.iocsh", targetArch, epicsRelease) || TRY_FILE(releasediroffs, "%s-%s.cmd", targetArch, epicsRelease) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.cmd", targetArch, epicsRelease) || + TRY_FILE(releasediroffs, "../%s-%s.cmd", targetArch, epicsRelease) || TRY_FILE(releasediroffs, "%s-%s.iocsh", targetArch, epicsBasetype) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.iocsh", targetArch, epicsBasetype) || + TRY_FILE(releasediroffs, "../%s-%s.iocsh", targetArch, epicsBasetype) || TRY_FILE(releasediroffs, "%s-%s.cmd", targetArch, epicsBasetype) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.cmd", targetArch, epicsBasetype) || + TRY_FILE(releasediroffs, "../%s-%s.cmd", targetArch, epicsBasetype) || TRY_FILE(releasediroffs, "%s-%s.iocsh", osClass, epicsRelease) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.iocsh", osClass, epicsRelease) || + TRY_FILE(releasediroffs, "../%s-%s.iocsh", osClass, epicsRelease) || TRY_FILE(releasediroffs, "%s-%s.cmd", osClass, epicsRelease) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.cmd", osClass, epicsRelease) || + TRY_FILE(releasediroffs, "../%s-%s.cmd", osClass, epicsRelease) || TRY_FILE(releasediroffs, "%s-%s.iocsh", osClass, epicsBasetype) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.iocsh", osClass, epicsBasetype) || + TRY_FILE(releasediroffs, "../%s-%s.iocsh", osClass, epicsBasetype) || TRY_FILE(releasediroffs, "%s-%s.cmd", osClass, epicsBasetype) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s-%s.cmd", osClass, epicsBasetype) || + TRY_FILE(releasediroffs, "../%s-%s.cmd", osClass, epicsBasetype) || TRY_FILE(releasediroffs, "startup-%s.iocsh", epicsRelease) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "startup-%s.iocsh", epicsRelease) || + TRY_FILE(releasediroffs, "../startup-%s.iocsh", epicsRelease) || TRY_FILE(releasediroffs, "startup-%s.cmd", epicsRelease) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "startup-%s.cmd", epicsRelease) || + TRY_FILE(releasediroffs, "../startup-%s.cmd", epicsRelease) || TRY_FILE(releasediroffs, "startup-%s.iocsh", epicsBasetype) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "startup-%s.iocsh", epicsBasetype) || + TRY_FILE(releasediroffs, "../startup-%s.iocsh", epicsBasetype) || TRY_FILE(releasediroffs, "startup-%s.cmd", epicsBasetype) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "startup-%s.cmd", epicsBasetype) || + TRY_FILE(releasediroffs, "../startup-%s.cmd", epicsBasetype) || TRY_FILE(releasediroffs, "%s.iocsh", targetArch) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s.iocsh", targetArch) || + TRY_FILE(releasediroffs, "../%s.iocsh", targetArch) || TRY_FILE(releasediroffs, "%s.cmd", targetArch) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s.cmd", targetArch) || + TRY_FILE(releasediroffs, "../%s.cmd", targetArch) || TRY_FILE(releasediroffs, "%s.iocsh", osClass) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s.iocsh", osClass) || + TRY_FILE(releasediroffs, "../%s.iocsh", osClass) || TRY_FILE(releasediroffs, "%s.cmd", osClass) || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "%s.cmd", osClass) || + TRY_FILE(releasediroffs, "../%s.cmd", osClass) || TRY_FILE(releasediroffs, "startup.iocsh") || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "startup.iocsh") || + TRY_FILE(releasediroffs, "../startup.iocsh") || TRY_FILE(releasediroffs, "startup.cmd") || - TRY_FILE(releasediroffs, ".." OSI_PATH_SEPARATOR "startup.cmd") + TRY_FILE(releasediroffs, "../startup.cmd") ) { if (args) diff --git a/runScript.c b/runScript.c index 588ab00..3007829 100644 --- a/runScript.c +++ b/runScript.c @@ -34,7 +34,6 @@ #if (EPICSVER<31400) extern char** ppGlobalEnviron; -#define OSI_PATH_SEPARATOR "/" #define OSI_PATH_LIST_SEPARATOR ":" extern volatile int interruptAccept; @@ -61,13 +60,13 @@ int isAbsPath(const char* filename) return 1; /* driver letter, e.g. "C:\Temp" */ else if (strlen(filename) > 3 - && ((filename[0]>='a'&&filename[0]<='z') || (filename[0]>='A'&&filename[0]<='Z')) + && isalpha(filename[0]) && filename[1] == ':') return 1; else return 0; #else - return filename[0] == OSI_PATH_SEPARATOR[0] ? 1 : 0; + return filename[0] == '/' ? 1 : 0; #endif } @@ -165,13 +164,13 @@ int runScript(const char* filename, const char* args) for (dirname = path; dirname != NULL; dirname = end) { end = strchr(dirname, OSI_PATH_LIST_SEPARATOR[0]); - if (end && end[1] == OSI_PATH_SEPARATOR[0] && end[2] == OSI_PATH_SEPARATOR[0]) /* "http://..." and friends */ + if (end && end[1] == '/' && end[2] == '/') /* "http://..." and friends */ end = strchr(end+2, OSI_PATH_LIST_SEPARATOR[0]); if (end) dirlen = (int)(end++ - dirname); else dirlen = (int)strlen(dirname); if (dirlen == 0) continue; /* ignore empty path elements */ - if (dirname[dirlen-1] == OSI_PATH_SEPARATOR[0]) dirlen--; - asprintf(&fullname, "%.*s" OSI_PATH_SEPARATOR "%s", + if (dirname[dirlen-1] == '/') dirlen--; + asprintf(&fullname, "%.*s/%s", dirlen, dirname, filename); if (runScriptDebug) printf("runScript: trying %s\n", fullname);