Add remove duplicate slashes to canonicalize_path() - Mailing list pgsql-patches

From Bruce Momjian
Subject Add remove duplicate slashes to canonicalize_path()
Date
Msg-id 200411070211.iA72BfT12921@candle.pha.pa.us
Whole thread Raw
Responses Re: Add remove duplicate slashes to canonicalize_path()  (Andrew Dunstan <andrew@dunslane.net>)
Re: Add remove duplicate slashes to canonicalize_path()  (Reini Urban <rurban@x-ray.at>)
List pgsql-patches
The following applied patch removes duplicate slashes from the path in
canonicalize_path().  It preserve double leading slashes on Win32.

e.g.    ////a////b => /a/b

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/port/path.c
===================================================================
RCS file: /cvsroot/pgsql/src/port/path.c,v
retrieving revision 1.44
diff -c -c -r1.44 path.c
*** src/port/path.c    6 Nov 2004 21:39:45 -0000    1.44
--- src/port/path.c    7 Nov 2004 01:53:58 -0000
***************
*** 203,223 ****
   *        o  make Win32 path use Unix slashes
   *        o  remove trailing quote on Win32
   *        o  remove trailing slash
   *        o  remove trailing '.'
   *        o  process trailing '..' ourselves
   */
  void
  canonicalize_path(char *path)
  {
! #ifdef WIN32

      /*
       * The Windows command processor will accept suitably quoted paths
       * with forward slashes, but barfs badly with mixed forward and back
       * slashes.
       */
-     char       *p;
-
      for (p = path; *p; p++)
      {
          if (*p == '\\')
--- 203,224 ----
   *        o  make Win32 path use Unix slashes
   *        o  remove trailing quote on Win32
   *        o  remove trailing slash
+  *        o  remove duplicate adjacent separators
   *        o  remove trailing '.'
   *        o  process trailing '..' ourselves
   */
  void
  canonicalize_path(char *path)
  {
!     char       *p, *to_p;
!     bool        was_sep = false;

+ #ifdef WIN32
      /*
       * The Windows command processor will accept suitably quoted paths
       * with forward slashes, but barfs badly with mixed forward and back
       * slashes.
       */
      for (p = path; *p; p++)
      {
          if (*p == '\\')
***************
*** 226,232 ****

      /*
       * In Win32, if you do: prog.exe "a b" "\c\d\" the system will pass
!      * \c\d" as argv[2].
       */
      if (p > path && *(p - 1) == '"')
          *(p - 1) = '/';
--- 227,233 ----

      /*
       * In Win32, if you do: prog.exe "a b" "\c\d\" the system will pass
!      * \c\d" as argv[2], so trim off trailing quote.
       */
      if (p > path && *(p - 1) == '"')
          *(p - 1) = '/';
***************
*** 240,245 ****
--- 241,267 ----
      trim_trailing_separator(path);

      /*
+      *    Remove duplicate adjacent separators
+      */
+     p = path;
+ #ifdef WIN32
+     /* Don't remove leading double-slash on Win32 */
+     if (*p)
+         p++;
+ #endif
+     to_p = p;
+     for (; *p; p++, to_p++)
+     {
+         /* Handle many adjacent slashes, like "/a///b" */
+         while (*p == '/' && was_sep)
+             p++;
+         if (to_p != p)
+             *to_p = *p;
+         was_sep = (*p == '/');
+     }
+     *to_p = '\0';
+
+     /*
       * Remove any trailing uses of "." and process ".." ourselves
       */
      for (;;)
***************
*** 247,255 ****
          int            len = strlen(path);

          if (len > 2 && strcmp(path + len - 2, "/.") == 0)
-         {
              trim_directory(path);
-         }
          else if (len > 3 && strcmp(path + len - 3, "/..") == 0)
          {
              trim_directory(path);
--- 269,275 ----

pgsql-patches by date:

Previous
From: Alvaro Herrera
Date:
Subject: src/include/Makefile: remove-old-headers
Next
From: Andrew Dunstan
Date:
Subject: Re: Add remove duplicate slashes to canonicalize_path()