X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ffilevercmp.c;h=20522d1c4c387ae9b505ad8156b75d2a92a206ed;hb=31d3154399f8c679ba23afb0f6bef03b73d4c741;hp=856f30ff0ccc6fa5349079fe083079d8f472eed9;hpb=9121662f1a3ac82621aac4e7f8e8f64722b0903b;p=gnulib.git diff --git a/lib/filevercmp.c b/lib/filevercmp.c index 856f30ff0..20522d1c4 100644 --- a/lib/filevercmp.c +++ b/lib/filevercmp.c @@ -1,7 +1,7 @@ /* Copyright (C) 1995 Ian Jackson Copyright (C) 2001 Anthony Towns - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008-2009 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 @@ -27,7 +27,7 @@ #include /* Match a file suffix defined by this regular expression: - /(\.[A-Za-z][A-Za-z0-9]*)*$/ + /(\.[A-Za-z~][A-Za-z0-9~]*)*$/ Scan the string *STR and return a pointer to the matching suffix, or NULL if not found. Upon return, *STR points to terminating NUL. */ static const char * @@ -40,7 +40,7 @@ match_suffix (const char **str) if (read_alpha) { read_alpha = false; - if (!c_isalpha (**str)) + if (!c_isalpha (**str) && '~' != **str) match = NULL; } else if ('.' == **str) @@ -49,7 +49,7 @@ match_suffix (const char **str) if (!match) match = *str; } - else if (!c_isalnum (**str)) + else if (!c_isalnum (**str) && '~' != **str) match = NULL; (*str)++; } @@ -124,8 +124,8 @@ verrevcmp (const char *s1, size_t s1_len, const char *s2, size_t s2_len) int filevercmp (const char *s1, const char *s2) { - const char *s1_pos = s1; - const char *s2_pos = s2; + const char *s1_pos; + const char *s2_pos; const char *s1_suffix, *s2_suffix; size_t s1_len, s2_len; int result; @@ -135,7 +135,34 @@ filevercmp (const char *s1, const char *s2) if (simple_cmp == 0) return 0; + /* special handle for "", "." and ".." */ + if (!*s1) + return -1; + if (!*s2) + return 1; + if (0 == strcmp (".", s1)) + return -1; + if (0 == strcmp (".", s2)) + return 1; + if (0 == strcmp ("..", s1)) + return -1; + 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; s1_suffix = match_suffix (&s1_pos); s2_suffix = match_suffix (&s2_pos); s1_len = (s1_suffix ? s1_suffix : s1_pos) - s1;