summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/path.h
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/path.h')
-rw-r--r--winsup/cygwin/path.h32
1 files changed, 30 insertions, 2 deletions
diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h
index 8d5e7c466..9dce9178e 100644
--- a/winsup/cygwin/path.h
+++ b/winsup/cygwin/path.h
@@ -16,6 +16,7 @@ details. */
#include <sys/ioctl.h>
#include <fcntl.h>
+#include <alloca.h>
inline bool
has_attribute (DWORD attributes, DWORD attribs_to_test)
@@ -294,11 +295,12 @@ class path_conv
cfree_and_null (normalized_path);
cfree_and_null (wide_path);
}
- path_conv &operator =(const path_conv& pc)
+ path_conv& eq_worker (const path_conv& pc, const char *in_path,
+ const char *in_normalized_path)
{
free_strings ();
memcpy (this, &pc, sizeof pc);
- path = cstrdup (pc.path);
+ path = cstrdup (in_path);
conv_handle.dup (pc.conv_handle);
normalized_path = cstrdup(pc.normalized_path);
if (pc.wide_path)
@@ -310,6 +312,32 @@ class path_conv
}
return *this;
}
+
+ path_conv &operator << (const path_conv& pc)
+ {
+ const char *save_path;
+ const char *save_normalized_path;
+ if (!path)
+ save_path = pc.path;
+ else
+ {
+ save_path = (char *) alloca (strlen (path) + 1);
+ strcpy ((char *) save_path, path);
+ }
+ if (!normalized_path)
+ save_normalized_path = pc.normalized_path;
+ else
+ {
+ save_normalized_path = (char *) alloca (strlen (normalized_path) + 1);
+ strcpy ((char *) save_normalized_path, path);
+ }
+ return eq_worker (pc, save_path, save_normalized_path);
+ }
+
+ path_conv &operator =(const path_conv& pc)
+ {
+ return eq_worker (pc, pc.path, pc.normalized_path);
+ }
DWORD get_devn () {return (DWORD) dev;}
short get_unitn () const {return dev.get_minor ();}
DWORD file_attributes () const {return fileattr;}