]> cygwin.com Git - cygwin-apps/setup.git/commitdiff
* filemanip.cc (transform_chars): Drop function.
authorCorinna Vinschen <corinna@vinschen.de>
Mon, 15 Feb 2010 17:44:11 +0000 (17:44 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Mon, 15 Feb 2010 17:44:11 +0000 (17:44 +0000)
(mklongpath): Call mbrtowc in a loop rather than just mbstowcs.
Transform characters on the fly.  Fold multiple backslashes into one.
Drop trailing backslash.

ChangeLog
filemanip.cc

index cfec25e7204d405f254a1b87f0ab8f804d58f913..650d9f6b60dbaeba9798dcccdc552416b214a1d2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2010-02-15  Corinna Vinschen  <corinna@vinschen.de>
+
+       * filemanip.cc (transform_chars): Drop function.
+       (mklongpath): Call mbrtowc in a loop rather than just mbstowcs.
+       Transform characters on the fly.  Fold multiple backslashes into one.
+       Drop trailing backslash.
+
 2010-02-15  Dave Korn  <dave.korn.cygwin@gmail.com>
 
        * choose.cc (ChooserPage::PlaceDialog): Only skip resizing window
index fca010b346767bfd98ff71dc9b201d82c56d52e8..efc93dafdcf0b00861964416cce38c3581736635 100644 (file)
@@ -201,19 +201,13 @@ wchar_t tfx_chars[] = {
  'x', 'y', 'z', '{', 0xf000 | '|', '}', '~', 127
 };
 
-static inline void
-transform_chars (register wchar_t *path, register wchar_t *path_end)
-{
-  for (; path <= path_end; ++path)
-    if (*path < 128)
-      *path = tfx_chars[*path];
-}
-
 int
 mklongpath (wchar_t *tgt, const char *src, size_t len)
 {
-  wchar_t *tp;
-  size_t ret;
+  wchar_t *tp, *ts;
+  size_t ret, n;
+  mbstate_t mb;
+  bool bs = false;
 
   wcscpy (tgt, L"\\\\?\\");
   tp = tgt + 4;
@@ -223,20 +217,42 @@ mklongpath (wchar_t *tgt, const char *src, size_t len)
       wcscpy (tp, L"UNC");
       tp += 3;
       len -= 3;
-      ret = mbstowcs (tp, src + 1, len);
-      /* Malformed or not null terminated. */
-      if (ret == (size_t) -1 || ret == len)
-       return -1;
-      transform_chars (tp, tp + ret);
+      ts = tp;
+      ++src;           /* Skip one leading backslash. */
     }
   else
+    ts = tp + 2;       /* Skip colon in leading drive specifier. */
+  ret = tp - tgt;
+  memset (&mb, 0, sizeof mb);
+  while (len > 0)
     {
-      ret = mbstowcs (tp, src, len);
-      /* Malformed or not null terminated. */
-      if (ret == (size_t) -1 || ret == len)
-       return -1;
-      transform_chars (tp + 2, tp + ret - 2);
+      n = mbrtowc (tp, src, 6, &mb);
+      if (n == (size_t) -1 || n == (size_t) -2)
+       return -1;
+      if (n == 0)
+       break;
+      src += n;
+      /* Transform char according to Cygwin rules. */
+      if (tp >= ts && *tp < 128)
+       *tp = tfx_chars[*tp];
+      /* Skip multiple backslashes. */
+      if (*tp != L'\\')
+       bs = false;
+      else
+       {
+         if (bs)
+           continue;
+         bs = true;
+       }
+      ++ret;
+      ++tp;
+      --len;
     }
+  if (len == 0)
+    return -1;
+  /* Always remove trailing backslash. */
+  if (tgt[ret - 1] == L'\\')
+    tgt[--ret] = L'\0';
   return 0;
 }
 
This page took 0.041605 seconds and 5 git commands to generate.