summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian2011-02-03 15:46:31 +0000
committerBruce Momjian2011-02-03 15:47:06 +0000
commit35b0a6b205c25d592b966aa17d3c6f9e5a88eb62 (patch)
tree68d79a598bc84d77ad6de078d784ea2fe2b16e1f
parent76129e7f14b4605db0a046e13abef0e255ffe007 (diff)
Simplify code used in is_absolute_path() macro; also add comment about
'E:abc' Win32 path handling.
-rw-r--r--src/include/port.h18
-rw-r--r--src/port/path.c6
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
@@ -35,12 +35,6 @@
#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) == ';')