utimensat: do not reference an out-of-scope buffer
[gnulib.git] / lib / filevercmp.c
index caa4891..f6ed248 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
    Copyright (C) 2001 Anthony Towns <aj@azure.humbug.org.au>
-   Copyright (C) 2008-2009 Free Software Foundation, Inc.
+   Copyright (C) 2008-2011 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -89,32 +89,32 @@ verrevcmp (const char *s1, size_t s1_len, const char *s2, size_t s2_len)
     {
       int first_diff = 0;
       while ((s1_pos < s1_len && !c_isdigit (s1[s1_pos]))
-            || (s2_pos < s2_len && !c_isdigit (s2[s2_pos])))
-       {
-         int s1_c = (s1_pos == s1_len) ? 0 : order (s1[s1_pos]);
-         int s2_c = (s2_pos == s2_len) ? 0 : order (s2[s2_pos]);
-         if (s1_c != s2_c)
-           return s1_c - s2_c;
-         s1_pos++;
-         s2_pos++;
-       }
+             || (s2_pos < s2_len && !c_isdigit (s2[s2_pos])))
+        {
+          int s1_c = (s1_pos == s1_len) ? 0 : order (s1[s1_pos]);
+          int s2_c = (s2_pos == s2_len) ? 0 : order (s2[s2_pos]);
+          if (s1_c != s2_c)
+            return s1_c - s2_c;
+          s1_pos++;
+          s2_pos++;
+        }
       while (s1[s1_pos] == '0')
-       s1_pos++;
+        s1_pos++;
       while (s2[s2_pos] == '0')
-       s2_pos++;
+        s2_pos++;
       while (c_isdigit (s1[s1_pos]) && c_isdigit (s2[s2_pos]))
-       {
-         if (!first_diff)
-           first_diff = s1[s1_pos] - s2[s2_pos];
-         s1_pos++;
-         s2_pos++;
-       }
+        {
+          if (!first_diff)
+            first_diff = s1[s1_pos] - s2[s2_pos];
+          s1_pos++;
+          s2_pos++;
+        }
       if (c_isdigit (s1[s1_pos]))
-       return 1;
+        return 1;
       if (c_isdigit (s2[s2_pos]))
-       return -1;
+        return -1;
       if (first_diff)
-       return first_diff;
+        return first_diff;
     }
   return 0;
 }
@@ -149,6 +149,17 @@ filevercmp (const char *s1, const char *s2)
   if (0 == strcmp ("..", s2))
     return 1;
 
+  /* special handle for other hidden files */
+  if (*s1 == '.' && *s2 != '.')
+    return -1;
+  if (*s1 != '.' && *s2 == '.')
+    return 1;
+  if (*s1 == '.' && *s2 == '.')
+    {
+      s1++;
+      s2++;
+    }
+
   /* "cut" file suffixes */
   s1_pos = s1;
   s2_pos = s2;