From 35b0a6b205c25d592b966aa17d3c6f9e5a88eb62 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Thu, 3 Feb 2011 10:46:31 -0500 Subject: [PATCH] Simplify code used in is_absolute_path() macro; also add comment about 'E:abc' Win32 path handling. --- src/include/port.h | 18 ++++++++++++++---- src/port/path.c | 6 ------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/include/port.h b/src/include/port.h index 4f0c0c1b08..2020a26060 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -68,17 +68,27 @@ extern void pgfnames_cleanup(char **filenames); * 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) \ ( \ - ((filename)[0] == '/') \ + 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) \ ( \ - ((filename)[0] == '/') || \ - (filename)[0] == '\\' || \ + IS_DIR_SEP((filename)[0]) || \ (isalpha((unsigned char) ((filename)[0])) && (filename)[1] == ':' && \ - ((filename)[2] == '\\' || (filename)[2] == '/')) \ + IS_DIR_SEP((filename)[2])) \ ) #endif diff --git a/src/port/path.c b/src/port/path.c index ccf801ead6..5b0056dfe5 100644 --- a/src/port/path.c +++ b/src/port/path.c @@ -34,12 +34,6 @@ #include "pg_config_paths.h" -#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