From 595a83946c9846730c246321e043f03ec0653c15 Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Fri, 27 Feb 2009 14:56:19 +0100
Subject: [PATCH] filevercmp: fix regular expression of file suffix
* lib/filevercmp.c (match suffix): Change regular expression.
* lib/filevercmp.h: Update comment.
* tests/test-filevercmp.c: Enhance test.
---
ChangeLog | 7 +++++++
lib/filevercmp.c | 8 ++++++--
lib/filevercmp.h | 6 +++---
tests/test-filevercmp.c | 10 ++++++++++
4 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 9946a0c..c3468cb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-02-27 Kamil Dudka
+
+ filevercmp: fix regular expression of file suffix
+ * lib/filevercmp.c (match suffix): Change regular expression.
+ * lib/filevercmp.h: Update comment.
+ * tests/test-filevercmp.c: Enhance test.
+
2009-02-27 Eric Blake
doc: mention more functions added in cygwin 1.7.0
diff --git a/lib/filevercmp.c b/lib/filevercmp.c
index 856f30f..513d8f2 100644
--- a/lib/filevercmp.c
+++ b/lib/filevercmp.c
@@ -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 *
@@ -35,6 +35,7 @@ match_suffix (const char **str)
{
const char *match = NULL;
bool read_alpha = false;
+ bool read_dot = false;
while (**str)
{
if (read_alpha)
@@ -42,8 +43,11 @@ match_suffix (const char **str)
read_alpha = false;
if (!c_isalpha (**str))
match = NULL;
+ continue;
}
- else if ('.' == **str)
+ if ('.' != **str)
+ read_dot = true;
+ else if (read_dot)
{
read_alpha = true;
if (!match)
diff --git a/lib/filevercmp.h b/lib/filevercmp.h
index 569b4d0..bf244b1 100644
--- a/lib/filevercmp.h
+++ b/lib/filevercmp.h
@@ -32,9 +32,9 @@
It returns number >0 for S1 > S2, 0 for S1 == S2 and number <0 for S1 < S2.
This function compares strings, in a way that if VER1 and VER2 are version
- numbers and PREFIX and SUFFIX (SUFFIX defined as (\.[A-Za-z][A-Za-z0-9]*)*)
- are strings then VER1 < VER2 implies filevercmp (PREFIX VER1 SUFFIX,
- PREFIX VER2 SUFFIX) < 0.
+ numbers and PREFIX and SUFFIX (SUFFIX defined as
+ [^.](\.[A-Za-z][A-Za-z0-9]*)*) are strings then VER1 < VER2 implies
+ filevercmp (PREFIX VER1 SUFFIX, PREFIX VER2 SUFFIX) < 0.
This function is intended to be a replacement for strverscmp. */
int filevercmp (const char *s1, const char *s2);
diff --git a/tests/test-filevercmp.c b/tests/test-filevercmp.c
index 4efd108..7477db7 100644
--- a/tests/test-filevercmp.c
+++ b/tests/test-filevercmp.c
@@ -37,6 +37,10 @@
/* set of well sorted examples */
static const char *const examples[] =
{
+ "a~",
+ "a",
+ "b~",
+ "b",
"gcc-c++-10.fc9.tar.gz",
"gcc-c++-10.8.12-0.7rc2.fc9.tar.bz2",
"glibc-2-0.1.beta1.fc10.rpm",
@@ -56,6 +60,12 @@ static const char *const examples[] =
"nss_ldap-1.0-0.1a.tar.gz",
"nss_ldap-10beta1.fc8.tar.gz",
"nss_ldap-10.11.8.6.20040204cvs.fc10.ebuild",
+ ".",
+ ".a~",
+ ".a",
+ ".b~",
+ ".b",
+ "..",
NULL
};
--
1.6.1.2