I have applied the attached patch to cleanup coding of the is_absolute_path macro, and added documentation of how 'E:abc' is handled on Win32.
-- Bruce Momjian <br...@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + It's impossible for everything to be true. +
diff --git a/src/include/port.h b/src/include/port.h index 4f0c0c1..2020a26 100644 *** a/src/include/port.h --- b/src/include/port.h *************** extern void pgfnames_cleanup(char **file *** 68,84 **** * By making this a macro we avoid needing to include path.c in libpq. */ #ifndef WIN32 #define is_absolute_path(filename) \ ( \ ! ((filename)[0] == '/') \ ) #else #define is_absolute_path(filename) \ ( \ ! ((filename)[0] == '/') || \ ! (filename)[0] == '\\' || \ (isalpha((unsigned char) ((filename)[0])) && (filename)[1] == ':' && \ ! ((filename)[2] == '\\' || (filename)[2] == '/')) \ ) #endif --- 68,94 ---- * By making this a macro we avoid needing to include path.c in libpq. */ #ifndef WIN32 + #define IS_DIR_SEP(ch) ((ch) == '/') + #define is_absolute_path(filename) \ ( \ ! IS_DIR_SEP((filename)[0]) \ ) #else + #define IS_DIR_SEP(ch) ((ch) == '/' || (ch) == '\\') + + /* + * On Win32, a drive letter _not_ followed by a slash, e.g. 'E:abc', is + * relative to the cwd on that drive, or the drive's root directory + * if that drive has no cwd. Because the path itself cannot tell us + * which is the case, we have to assume the worst, i.e. that it is not + * absolute; this check is done by IS_DIR_SEP(filename[2]). + */ #define is_absolute_path(filename) \ ( \ ! IS_DIR_SEP((filename)[0]) || \ (isalpha((unsigned char) ((filename)[0])) && (filename)[1] == ':' && \ ! IS_DIR_SEP((filename)[2])) \ ) #endif diff --git a/src/port/path.c b/src/port/path.c index ccf801e..5b0056d 100644 *** a/src/port/path.c --- b/src/port/path.c *************** *** 35,46 **** #ifndef WIN32 - #define IS_DIR_SEP(ch) ((ch) == '/') - #else - #define IS_DIR_SEP(ch) ((ch) == '/' || (ch) == '\\') - #endif - - #ifndef WIN32 #define IS_PATH_VAR_SEP(ch) ((ch) == ':') #else #define IS_PATH_VAR_SEP(ch) ((ch) == ';') --- 35,40 ----
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers