diff --git a/sc2/src/port.h b/sc2/src/port.h index b38454230..89eef171c 100644 --- a/sc2/src/port.h +++ b/sc2/src/port.h @@ -503,5 +503,19 @@ typedef unsigned int wint_t; # define UNBUFFERED_LOGFILE #endif +#if defined(WIN32) || defined(__SYMBIAN32__) + // HAVE_DRIVE_LETTERS is defined to signify that DOS/Windows style drive + // letters are to be recognised on this platform. +# define HAVE_DRIVE_LETTERS + // HAVE_UNC_PATHS is defined to signify that Universal Naming Convention + // style paths are to be recognised on this platform. +# define HAVE_UNC_PATHS + // BACKSLASH_IS_PATH_SEPARATOR is defined to signify that the backslash + // character is to be recognised as a path separator on this platform. + // This does not affect the acceptance of forward slashes as path + // separators. +# define BACKSLASH_IS_PATH_SEPARATOR +#endif + #endif /* _PORT_H */ diff --git a/sc2/src/sc2code/libs/file.h b/sc2/src/sc2code/libs/file.h index 1120b7be8..83c06dbf4 100644 --- a/sc2/src/sc2code/libs/file.h +++ b/sc2/src/sc2code/libs/file.h @@ -72,16 +72,16 @@ int copyFile (uio_DirHandle *srcDir, const char *srcName, uio_DirHandle *dstDir, const char *newName); bool fileExists (const char *name); bool fileExists2(uio_DirHandle *dir, const char *fileName); -#ifdef WIN32 +#ifdef HAVE_UNC_PATHS size_t skipUNCServerShare(const char *inPath); -#endif +#endif /* HAVE_UNC_PATHS */ -#ifdef WIN32 +#ifdef HAVE_DRIVE_LETTERS static inline int isDriveLetter(int c) { return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); } -#endif +#endif /* HAVE_DRIVE_LETTERS */ #endif /* _FILE_H */ diff --git a/sc2/src/sc2code/libs/file/dirs.c b/sc2/src/sc2code/libs/file/dirs.c index aece071d4..1e9b27102 100644 --- a/sc2/src/sc2code/libs/file/dirs.c +++ b/sc2/src/sc2code/libs/file/dirs.c @@ -29,11 +29,16 @@ #include "misc.h" #include "libs/log.h" +#ifdef HAVE_DRIVE_LETTERS +# include + // For tolower() +#endif /* HAVE_DRIVE_LETTERS */ #ifdef WIN32 # include -# include + // For _getdcwd() #else # include + // For getpwuid() #endif /* Try to find a suitable value for %APPDATA% if it isn't defined on @@ -72,7 +77,7 @@ mkdirhier (const char *path) ptr = buf; pathstart = path; -#ifdef WIN32 +#ifdef HAVE_DRIVE_LETTERS if (isDriveLetter(pathstart[0]) && pathstart[1] == ':') { // Driveletter + semicolon on Windows. @@ -87,8 +92,13 @@ mkdirhier (const char *path) log_add (log_Error, "Can't stat \"%s\": %s", buf, strerror (errno)); goto err; } - } else if (pathstart[0] == '\\' && pathstart[1] == '\\') { - // Windows UNC path. (\\server\share\...) + } + else +#endif /* HAVE_DRIVE_LETTERS */ +#ifdef HAVE_UNC_PATHS + if (pathstart[0] == '\\' && pathstart[1] == '\\') + { + // Universal Naming Convention path. (\\server\share\...) // Copy the server part as is; don't try to create directories for // it, or stat it. Don't create a dir for the share either. *(ptr++) = *(pathstart++); @@ -119,7 +129,12 @@ mkdirhier (const char *path) goto err; } } -#endif +#else + { + // Making sure that there is an 'else' case if HAVE_DRIVE_LETTERS is + // defined. + } +#endif /* HAVE_UNC_PATHS */ if (*pathstart == '/') *(ptr++) = *(pathstart++); @@ -487,9 +502,9 @@ expandPath (char *dest, size_t len, const char *src, int what) { /* Replacing backslashes in path by slashes. */ destptr = dest; -#ifdef WIN32 +#ifdef HAVE_UNC_PATHS { - // A Windows UNC path should always start with two backslashes + // A UNC path should always start with two backslashes // and have a backslash in between the server and share part. size_t skip = skipUNCServerShare (destptr); if (skip != 0) @@ -500,7 +515,7 @@ expandPath (char *dest, size_t len, const char *src, int what) destptr += skip; } } -#endif +#endif /* HAVE_UNC_PATHS */ while (*destptr != '\0') { if (*destptr == '\\') @@ -521,17 +536,24 @@ expandPath (char *dest, size_t len, const char *src, int what) char *endPart; pathStart = dest; -#ifdef WIN32 +#ifdef HAVE_DRIVE_LETTERS if (isDriveLetter(pathStart[0]) && (pathStart[1] == ':')) { pathStart += 2; } else +#endif /* HAVE_DRIVE_LETTERS */ +#ifdef HAVE_UNC_PATHS { - // Test for a UNC path. + // Test for a Universal Naming Convention path. pathStart += skipUNCServerShare(pathStart); } -#endif +#else + { + // Making sure that there is an 'else' case if HAVE_DRIVE_LETTERS is + // defined. + } +#endif /* HAVE_UNC_PATHS */ if (pathStart[0] == '/') pathStart++; @@ -619,7 +641,7 @@ err: return -1; } -#ifdef WIN32 +#ifdef HAVE_DRIVE_LETTERS // letter is 0 based: 0 = A, 1 = B, ... bool driveLetterExists(int letter) @@ -630,7 +652,7 @@ driveLetterExists(int letter) return ((drives >> letter) & 1) != 0; } -#endif +#endif /* HAVE_DRIVE_LETTERS */ // helper for expandPath, expanding an absolute path // returns a pointer to the end of the filled in part of dest. @@ -648,7 +670,7 @@ expandPathAbsolute (char *dest, size_t destLen, const char *src, } orgSrc = src; -#ifdef WIN32 +#ifdef HAVE_DRIVE_LETTERS if (isDriveLetter(src[0]) && (src[1] == ':')) { int letter; @@ -686,7 +708,7 @@ expandPathAbsolute (char *dest, size_t destLen, const char *src, src += 2; } else -#endif +#endif /* HAVE_DRIVE_LETTERS */ { // Relative dir if (getcwd (dest, destLen) == NULL) @@ -709,9 +731,9 @@ expandPathAbsolute (char *dest, size_t destLen, const char *src, destLen -= tempLen; } if (dest[-1] != '/' -#ifdef WIN32 +#ifdef BACKSLASH_IS_PATH_SEPARATOR && dest[-1] != '\\' -#endif +#endif /* BACKSLASH_IS_PATH_SEPARATOR */ ) { // Need to add a slash. @@ -738,7 +760,7 @@ strrchr2(const char *start, int c, const char *end) { } } -#ifdef WIN32 +#ifdef HAVE_UNC_PATHS // returns 0 if the path is not a valid UNC path. // Does not skip trailing slashes. size_t @@ -766,6 +788,6 @@ skipUNCServerShare(const char *inPath) { return (size_t) (path - inPath); } -#endif +#endif /* HAVE_UNC_PATHS */