Coreutils recently got bitten by the fact that developers on GNU/Linux machines often don't realize that they needed #include "strverscmp.h". This fixes it, and adds a unit test. Jim, okay to apply?
Also available at 'git pull git://repo.or.cz/gnulib/ericb.git strverscmp' >From 98dc152be970fe2a64d17f17850cac4fc69ab00d Mon Sep 17 00:00:00 2001 From: Eric Blake <[EMAIL PROTECTED]> Date: Tue, 19 Aug 2008 09:23:40 -0600 Subject: [PATCH] strverscmp: migrate from "strverscmp.h" to <string.h> * modules/string (Makefile.am): Add new hooks. * modules/strverscmp (Files): Remove strverscmp.h. (Depends-on): Add string. (configure.ac): Add indicator. (Include): Mention new header. * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Provide new defaults. * m4/strverscmp.m4 (gl_FUNC_STRVERSCMP): Inform string module of results. * lib/strverscmp.h: Delete. * lib/string.in.h (strverscmp): Provide declaration, when needed. * NEWS: Document the change. Signed-off-by: Eric Blake <[EMAIL PROTECTED]> --- ChangeLog | 16 ++++++++++++++++ NEWS | 3 +++ lib/string.in.h | 12 ++++++++++++ lib/strverscmp.h | 24 ------------------------ m4/string_h.m4 | 4 +++- m4/strverscmp.m4 | 7 +++++-- modules/string | 2 ++ modules/strverscmp | 5 +++-- 8 files changed, 44 insertions(+), 29 deletions(-) delete mode 100644 lib/strverscmp.h diff --git a/ChangeLog b/ChangeLog index 5e303c7..461fa0d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2008-08-19 Eric Blake <[EMAIL PROTECTED]> + + strverscmp: migrate from "strverscmp.h" to <string.h> + * modules/string (Makefile.am): Add new hooks. + * modules/strverscmp (Files): Remove strverscmp.h. + (Depends-on): Add string. + (configure.ac): Add indicator. + (Include): Mention new header. + * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Provide new + defaults. + * m4/strverscmp.m4 (gl_FUNC_STRVERSCMP): Inform string module of + results. + * lib/strverscmp.h: Delete. + * lib/string.in.h (strverscmp): Provide declaration, when needed. + * NEWS: Document the change. + 2008-08-18 Ben Pfaff <[EMAIL PROTECTED]> gitlog-to-changelog: give better diagnostic for failed pipe-open diff --git a/NEWS b/NEWS index b5b08a6..7b918d3 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,9 @@ User visible incompatible changes Date Modules Changes +2008-08-19 strverscmp The include file is changed from "strverscmp.h" + to <string.h>. + 2008-08-14 lock The include file is changed from "lock.h" to "glthread/lock.h". tls The include file is changed from "tls.h" diff --git a/lib/string.in.h b/lib/string.in.h index 49ea1d8..e62b8dd 100644 --- a/lib/string.in.h +++ b/lib/string.in.h @@ -576,6 +576,18 @@ extern char *strsignal (int __sig); strsignal (a)) #endif +#if @GNULIB_STRVERSCMP@ +# if [EMAIL PROTECTED]@ +extern int strverscmp (const char *, const char *); +# endif +#elif defined GNULIB_POSIXCHECK +# undef strverscmp +# define strverscmp(a, b) \ + (GL_LINK_WARNING ("strverscmp is unportable - " \ + "use gnulib module strverscmp for portability"), \ + strverscmp (a, b)) +#endif + #ifdef __cplusplus } diff --git a/lib/strverscmp.h b/lib/strverscmp.h deleted file mode 100644 index 7edeac5..0000000 --- a/lib/strverscmp.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Compare strings while treating digits characters numerically. - - Copyright (C) 1997, 2003 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 - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - -#ifndef STRVERSCMP_H_ -# define STRVERSCMP_H_ - -int strverscmp (const char *, const char *); - -#endif /* not STRVERSCMP_H_ */ diff --git a/m4/string_h.m4 b/m4/string_h.m4 index 7143690..b37f843 100644 --- a/m4/string_h.m4 +++ b/m4/string_h.m4 @@ -5,7 +5,7 @@ # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# serial 5 # Written by Paul Eggert. @@ -63,6 +63,7 @@ AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS], GNULIB_MBSTOK_R=0; AC_SUBST([GNULIB_MBSTOK_R]) GNULIB_STRERROR=0; AC_SUBST([GNULIB_STRERROR]) GNULIB_STRSIGNAL=0; AC_SUBST([GNULIB_STRSIGNAL]) + GNULIB_STRVERSCMP=0; AC_SUBST([GNULIB_STRVERSCMP]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DECL_MEMMEM=1; AC_SUBST([HAVE_DECL_MEMMEM]) HAVE_MEMPCPY=1; AC_SUBST([HAVE_MEMPCPY]) @@ -81,6 +82,7 @@ AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS], HAVE_DECL_STRTOK_R=1; AC_SUBST([HAVE_DECL_STRTOK_R]) HAVE_DECL_STRERROR=1; AC_SUBST([HAVE_DECL_STRERROR]) HAVE_DECL_STRSIGNAL=1; AC_SUBST([HAVE_DECL_STRSIGNAL]) + HAVE_STRVERSCMP=1; AC_SUBST([HAVE_STRVERSCMP]) REPLACE_STRERROR=0; AC_SUBST([REPLACE_STRERROR]) REPLACE_STRSIGNAL=0; AC_SUBST([REPLACE_STRSIGNAL]) REPLACE_MEMMEM=0; AC_SUBST([REPLACE_MEMMEM]) diff --git a/m4/strverscmp.m4 b/m4/strverscmp.m4 index 5f01ba9..a3f9aff 100644 --- a/m4/strverscmp.m4 +++ b/m4/strverscmp.m4 @@ -1,5 +1,6 @@ -# strverscmp.m4 serial 5 -dnl Copyright (C) 2002, 2005, 2006, 2007 Free Software Foundation, Inc. +# strverscmp.m4 serial 6 +dnl Copyright (C) 2002, 2005, 2006, 2007, 2008 Free Software +dnl Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. @@ -9,9 +10,11 @@ AC_DEFUN([gl_FUNC_STRVERSCMP], dnl Persuade glibc <string.h> to declare strverscmp(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) AC_REPLACE_FUNCS(strverscmp) if test $ac_cv_func_strverscmp = no; then gl_PREREQ_STRVERSCMP + HAVE_STRVERSCMP=0 fi ]) diff --git a/modules/string b/modules/string index 6ca5c23..dc0063d 100644 --- a/modules/string +++ b/modules/string @@ -54,6 +54,7 @@ string.h: string.in.h -e 's|@''GNULIB_STRTOK_R''@|$(GNULIB_STRTOK_R)|g' \ -e 's|@''GNULIB_STRERROR''@|$(GNULIB_STRERROR)|g' \ -e 's|@''GNULIB_STRSIGNAL''@|$(GNULIB_STRSIGNAL)|g' \ + -e 's|@''GNULIB_STRVERSCMP''@|$(GNULIB_STRVERSCMP)|g' \ -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \ -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \ -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \ @@ -71,6 +72,7 @@ string.h: string.in.h -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \ -e 's|@''HAVE_DECL_STRERROR''@|$(HAVE_DECL_STRERROR)|g' \ -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \ + -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \ -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \ -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \ -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \ diff --git a/modules/strverscmp b/modules/strverscmp index ad18c1f..33822c7 100644 --- a/modules/strverscmp +++ b/modules/strverscmp @@ -2,20 +2,21 @@ Description: Compare strings holding version numbers. Files: -lib/strverscmp.h lib/strverscmp.c m4/strverscmp.m4 Depends-on: extensions +string configure.ac: gl_FUNC_STRVERSCMP +gl_STRING_MODULE_INDICATOR([strverscmp]) Makefile.am: Include: -"strverscmp.h" +<string.h> License: LGPLv2+ -- 1.5.6.4 >From f70f72b5d594dcfbe8451b53e76f07276042218a Mon Sep 17 00:00:00 2001 From: Eric Blake <[EMAIL PROTECTED]> Date: Tue, 19 Aug 2008 09:40:10 -0600 Subject: [PATCH] strverscmp: add unit test * modules/strverscmp-tests: New file. * tests/test-strverscmp.c: Likewise. Signed-off-by: Eric Blake <[EMAIL PROTECTED]> --- ChangeLog | 4 +++ modules/strverscmp-tests | 10 ++++++++ tests/test-strverscmp.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 0 deletions(-) create mode 100644 modules/strverscmp-tests create mode 100644 tests/test-strverscmp.c diff --git a/ChangeLog b/ChangeLog index 461fa0d..d4ad5e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2008-08-19 Eric Blake <[EMAIL PROTECTED]> + strverscmp: add unit test + * modules/strverscmp-tests: New file. + * tests/test-strverscmp.c: Likewise. + strverscmp: migrate from "strverscmp.h" to <string.h> * modules/string (Makefile.am): Add new hooks. * modules/strverscmp (Files): Remove strverscmp.h. diff --git a/modules/strverscmp-tests b/modules/strverscmp-tests new file mode 100644 index 0000000..343df25 --- /dev/null +++ b/modules/strverscmp-tests @@ -0,0 +1,10 @@ +Files: +tests/test-strverscmp.c + +Depends-on: + +configure.ac: + +Makefile.am: +TESTS += test-strverscmp +check_PROGRAMS += test-strverscmp diff --git a/tests/test-strverscmp.c b/tests/test-strverscmp.c new file mode 100644 index 0000000..04da20c --- /dev/null +++ b/tests/test-strverscmp.c @@ -0,0 +1,56 @@ +/* Test of strverscmp() function. + Copyright (C) 2008 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 + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Written by Eric Blake <[EMAIL PROTECTED]>, 2008. */ + +#include <config.h> + +#include <string.h> + +#include <stdio.h> +#include <stdlib.h> + +#define ASSERT(expr) \ + do \ + { \ + if (!(expr)) \ + { \ + fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ + fflush (stderr); \ + abort (); \ + } \ + } \ + while (0) + +int +main (int argc, char **argv) +{ + ASSERT (strverscmp ("", "") == 0); + ASSERT (strverscmp ("a", "a") == 0); + ASSERT (strverscmp ("a", "b") < 0); + ASSERT (strverscmp ("b", "a") > 0); + ASSERT (strverscmp ("000", "00") < 0); + ASSERT (strverscmp ("00", "000") > 0); + ASSERT (strverscmp ("a0", "a") > 0); + ASSERT (strverscmp ("00", "01") < 0); + ASSERT (strverscmp ("01", "010") < 0); + ASSERT (strverscmp ("010", "09") < 0); + ASSERT (strverscmp ("09", "0") < 0); + ASSERT (strverscmp ("9", "10") < 0); + ASSERT (strverscmp ("0a", "0") > 0); + return 0; +} -- 1.5.6.4