diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-05-08 15:13:59 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-05-08 15:13:59 +0300 |
commit | 79f6b2c923d1c2366b68a431756bde6e4a04ae86 (patch) | |
tree | 75087c12a3b763634bd5ea9ae616e6dd447b3f9d | |
parent | ced98e1b1e040bd0f50b2ebd146a22e74f5913c0 (diff) | |
download | grecs-79f6b2c923d1c2366b68a431756bde6e4a04ae86.tar.gz grecs-79f6b2c923d1c2366b68a431756bde6e4a04ae86.tar.bz2 |
Redo versioning support.
* am/grecs.m4: Define GRECS_VEROK_AT if package version matches
the standard scheme.
Define GRECS_DISTCK_AT if install flag is set.
* src/grecs.h (GRECS_VERSION_MAJOR)
(GRECS_VERSION_MINOR): New defines.
(grecs_version_info)<buffer>: New member.
(grecs_version): Return allocated grecs_version_info structure.
(grecs_version_cmp): Change prototype.
(grecs_version_ok)
(grecs_version_info_cmp)
(grecs_version_split)
(grecs_version_info_free): New protos.
* src/version.c: Rewrite.
* src/libgrecs.m4 (AM_LIBGRECS): Use grecs_version_ok
* tests/.gitignore: Add distck.
* tests/Makefile.am: Add new tests.
* tests/testsuite.at: Add new tests.
* tests/gcfver.c: Update.
* tests/vercmp.at: Rewrite.
* tests/verok.at: New file (from old vercmp.at).
* tests/distck.at: New file.
* tests/distck.c: New file.
-rw-r--r-- | am/grecs.m4 | 10 | ||||
-rw-r--r-- | src/grecs.h | 14 | ||||
-rw-r--r-- | src/libgrecs.m4 | 2 | ||||
-rw-r--r-- | src/version.c | 178 | ||||
-rw-r--r-- | tests/.gitignore | 1 | ||||
-rw-r--r-- | tests/Makefile.am | 9 | ||||
-rw-r--r-- | tests/distck.at | 21 | ||||
-rw-r--r-- | tests/distck.c | 18 | ||||
-rw-r--r-- | tests/gcfver.c | 31 | ||||
-rw-r--r-- | tests/testsuite.at | 5 | ||||
-rw-r--r-- | tests/vercmp.at | 57 | ||||
-rw-r--r-- | tests/verok.at | 63 |
12 files changed, 304 insertions, 105 deletions
diff --git a/am/grecs.m4 b/am/grecs.m4 index 81a6ee5..e4f8671 100644 --- a/am/grecs.m4 +++ b/am/grecs.m4 @@ -149,26 +149,28 @@ AC_DEFUN([GRECS_SETUP],[ ]) _GRECS_IF_OPTION_SET([git2chg],[GRECS_BUILD_AUX="$GRECS_BUILD_AUX build-aux/git2chg.awk"]) - # Make sure package versioning is compatible with vercmp.at: - s=`echo $PACKAGE_VERSION | sed 's/[0-9][0-9]*\.[0-9][0-9]*\(\.[0-9][0-9]\)\?\([^a-zA-Z_0-9].*\)\?//'` + # Make sure package versioning is compatible with version.at: + s=`echo $PACKAGE_VERSION | [sed 's/[0-9][0-9]*\.[0-9][0-9]*\(\.[0-9][0-9]\)\?\([^a-zA-Z_0-9].*\)\?//'`] if test -z "$s"; then - GRECS_VERCMP_AT=vercmp.at + GRECS_VEROK_AT=verok.at fi AC_SUBST([GRECS_SRCDIR],$1) - AC_SUBST([GRECS_VERCMP_AT]) + AC_SUBST([GRECS_VEROK_AT]) AC_SUBST([GRECS_BUILD_AUX]) AC_SUBST([GRECS_INCLUDES]) AC_SUBST([GRECS_TESTDIR]) AC_SUBST([GRECS_LDADD]) AC_SUBST([GRECS_DOCDIR]) AC_SUBST([GRECS_CHANGELOG]) + AC_SUBST([GRECS_DISTCK_AT]) AC_SUBST([GRECS_INCLUDES],['-I$(top_srcdir)/]grecsdir[src]') _GRECS_OPTION_SWITCH([install],[ LT_INIT GRECS_LDADD=['$(top_builddir)/]grecsdir[src/libgrecs.la'] GRECS_DOCDIR='doc' GRECS_CHANGELOG= + GRECS_DISTCK_AT=distck.at AC_CONFIG_FILES(grecsdir[src/Makefile]:grecsdir[src/Make-inst.in] grecsdir[doc/Makefile]) ],[shared],[ diff --git a/src/grecs.h b/src/grecs.h index 25f068f..8f0ddc6 100644 --- a/src/grecs.h +++ b/src/grecs.h @@ -37,6 +37,9 @@ # define N_(s) s #endif +#define GRECS_VERSION_MAJOR 1 +#define GRECS_VERSION_MINOR 0 + struct grecs_version_info { const char *package; const char *version; @@ -44,6 +47,7 @@ struct grecs_version_info { int minor; int patch; char *suffix; + char *buffer; }; typedef struct { @@ -163,8 +167,14 @@ struct grecs_sockaddr { struct sockaddr *sa; }; -void grecs_version(struct grecs_version_info *pv); -int grecs_version_cmp(const char *vstr); +struct grecs_version_info *grecs_version(void); +int grecs_version_cmp(const char *vstr1, const char *vstr2, int *pres); +int grecs_version_ok(const char *vstr); +void grecs_version_info_free(struct grecs_version_info *pv); +struct grecs_version_info *grecs_version_split(const char *vstr); +int grecs_version_info_cmp(struct grecs_version_info *vx, + struct grecs_version_info *vy, + int *pres); extern void *(*grecs_malloc_fun)(size_t size); extern void *(*grecs_realloc_fun)(void *ptr, size_t size); diff --git a/src/libgrecs.m4 b/src/libgrecs.m4 index 88ce312..68abcef 100644 --- a/src/libgrecs.m4 +++ b/src/libgrecs.m4 @@ -27,7 +27,7 @@ AC_DEFUN([AM_LIBGRECS],[ AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <stdlib.h> #include <grecs.h> ]], - [exit(grecs_version_cmp("[libgrecs ]$1"));])], + [exit(grecs_version_ok("[libgrecs ]$1"));])], [], [cv_libgrecs=no])]) if test "$cv_libgrecs" = "yes"; then diff --git a/src/version.c b/src/version.c index d34b8b5..3e251d7 100644 --- a/src/version.c +++ b/src/version.c @@ -21,13 +21,32 @@ #include <string.h> #include <ctype.h> -void -grecs_version(struct grecs_version_info *pv) +const char *grecs_version_string; + +struct grecs_version_info * +grecs_version_split(const char *vstr) { char *p; - memset(pv, 0, sizeof(*pv)); - pv->package = PACKAGE_NAME; - pv->version = PACKAGE_VERSION; + size_t len; + struct grecs_version_info *pv = grecs_zalloc(sizeof(*pv)); + + pv->buffer = grecs_strdup(vstr); + len = strcspn(pv->buffer, " \t"); + if (pv->buffer[len]) { + pv->package = pv->buffer; + pv->buffer[len++] = 0; + for (; pv->buffer[len] && isspace(pv->buffer[len]); len++) + ; + } else { + pv->package = NULL; + len = 0; + } + if (!pv->buffer[len]) { + free(pv->buffer); + free(pv); + return NULL; + } + pv->version = pv->buffer + len; pv->major = strtoul(pv->version, &p, 10); if (*p && *p == '.') { pv->minor = strtoul(p + 1, &p, 10); @@ -42,45 +61,126 @@ grecs_version(struct grecs_version_info *pv) } } pv->suffix = p; + return pv; +} + +void +grecs_version_info_free(struct grecs_version_info *pv) +{ + if (pv) { + if (pv->buffer) + grecs_free(pv->buffer); + free(pv); + } +} + +struct grecs_version_info * +grecs_version(void) +{ + struct grecs_version_info *pv = grecs_zalloc(sizeof(*pv)); + size_t size = 0; + + pv->package = PACKAGE_NAME; +#ifdef GRECS_VERSION_PATCHLEVEL +# ifdef GRECS_VERSION_SUFFIX + grecs_asprintf(&pv->buffer, &size, + "%d.%d.%d%s", + GRECS_VERSION_MAJOR, GRECS_VERSION_MINOR, + GRECS_VERSION_PATCHLEVEL, GRECS_VERSION_SUFFIX); +# else + grecs_asprintf(&pv->buffer, &size, + "%d.%d.%d", + GRECS_VERSION_MAJOR, GRECS_VERSION_MINOR, + GRECS_VERSION_PATCHLEVEL); +# endif +#else +# ifdef GRECS_VERSION_SUFFIX + grecs_asprintf(&pv->buffer, &size, + "%d.%d%s", + GRECS_VERSION_MAJOR, GRECS_VERSION_MINOR, + GRECS_VERSION_SUFFIX); +# else + grecs_asprintf(&pv->buffer, &size, + "%d.%d", + GRECS_VERSION_MAJOR, GRECS_VERSION_MINOR); +# endif +#endif + pv->version = pv->buffer; + pv->major = GRECS_VERSION_MAJOR; + pv->minor = GRECS_VERSION_MINOR; +#ifdef GRECS_VERSION_PATCHLEVEL + pv->patch = GRECS_VERSION_PATCHLEVEL; +#endif +#ifdef GRECS_VERSION_SUFFIX + pv->suffix = GRECS_VERSION_SUFFIX; +#endif + return pv; } int -grecs_version_cmp(const char *vstr) +grecs_version_info_cmp(struct grecs_version_info *vx, + struct grecs_version_info *vy, + int *pres) { - struct grecs_version_info v; - char *p; - unsigned long n; - size_t len; - int check; + if (vx->package && vy->package && strcmp(vx->package, vy->package)) + return 1; + else if (vx->major > vy->major) + *pres = 1; + else if (vx->major < vy->major) + *pres = -1; + else if (vx->minor > vy->minor) + *pres = 1; + else if (vx->minor < vy->minor) + *pres = -1; + else if (vx->patch > vy->patch) + *pres = 1; + else if (vx->patch < vy->patch) + *pres = -1; + else if (vx->suffix && vy->suffix) + *pres = strcmp(vx->suffix, vy->suffix); + else + *pres = 0; + return 0; +} + +int +grecs_version_cmp(const char *vstr1, const char *vstr2, int *pres) +{ + struct grecs_version_info *v1, *v2; + int rc; - if (!vstr) + if (!vstr1 || !vstr2) + return -1; + v1 = grecs_version_split(vstr1); + if (!v1) + return -1; + v2 = grecs_version_split(vstr2); + if (!v2) { + grecs_version_info_free(v1); return -1; - grecs_version(&v); - len = strcspn(vstr, " \t"); - if (vstr[len]) { - if (len != strlen(v.package) || memcmp(v.package, vstr, len)) - return 1; - for (vstr += len; *vstr && isspace(*vstr); vstr++) - ; - } - if (!*vstr) - return 1; - n = strtoul(vstr, &p, 10); - if (n > v.major) - return 1; - check = n == v.major; - if (*p && *p == '.') { - n = strtoul(p + 1, &p, 10); - if (check && n > v.minor) - return 1; - check = n == v.minor; - if (*p && *p == '.') { - n = strtoul(p + 1, &p, 10); - if (check && n > v.patch) - return 1; - } } - if (*p && (!v.suffix || strcmp(p, v.suffix))) - return 1; - return 0; + rc = grecs_version_info_cmp(v1, v2, pres); + grecs_version_info_free(v1); + grecs_version_info_free(v2); + return rc; +} + +int +grecs_version_ok(const char *vstr) +{ + struct grecs_version_info *vmy, *vreq; + int rc, res; + + if (!vstr) + return -1; + vreq = grecs_version_split(vstr); + if (!vreq) + return -1; + vmy = grecs_version(); + if (vreq->suffix && !vmy->suffix) + vmy->suffix = ""; + rc = grecs_version_info_cmp(vmy, vreq, &res); + grecs_version_info_free(vmy); + grecs_version_info_free(vreq); + return rc == 0 && res >= 0; } diff --git a/tests/.gitignore b/tests/.gitignore index 0095883..af31c5e 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1,5 +1,6 @@ atconfig atlocal +distck gcffmt gcfpeek gcfset diff --git a/tests/Makefile.am b/tests/Makefile.am index 26fee59..a8bf8d2 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -23,7 +23,7 @@ MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE) ## package.m4. ## ## ------------ ## -$(srcdir)/package.m4: $(top_srcdir)/configure.ac +$(srcdir)/package.m4: $(top_srcdir)/configure.ac $(top_srcdir)/@GRECS_SUBDIR@/am/grecs.m4 $(AM_V_GEN){ \ echo '# Signature of the current package.'; \ echo 'm4_define([AT_PACKAGE_NAME], [@PACKAGE_NAME@])'; \ @@ -31,7 +31,8 @@ $(srcdir)/package.m4: $(top_srcdir)/configure.ac echo 'm4_define([AT_PACKAGE_VERSION], [@PACKAGE_VERSION@])'; \ echo 'm4_define([AT_PACKAGE_STRING], [@PACKAGE_STRING@])'; \ echo 'm4_define([AT_PACKAGE_BUGREPORT], [@PACKAGE_BUGREPORT@])'; \ - echo 'm4_define([GRECS_VERCMP_AT], [@GRECS_VERCMP_AT@])'; \ + echo 'm4_define([GRECS_VEROK_AT], [@GRECS_VEROK_AT@])'; \ + echo 'm4_define([GRECS_DISTCK_AT], [@GRECS_DISTCK_AT@])'; \ } >$(srcdir)/package.m4 # @@ -56,7 +57,8 @@ TESTSUITE_AT = \ reduce03.at\ set.at\ testsuite.at\ - @GRECS_VERCMP_AT@ + @GRECS_DISTCK_AT@\ + @GRECS_VEROK_AT@ TESTSUITE = $(srcdir)/testsuite M4=m4 @@ -80,6 +82,7 @@ check-local: atconfig atlocal $(TESTSUITE) # $(SHELL) $(TESTSUITE) AUTOTEST_PATH=$(exec_prefix)/bin noinst_PROGRAMS = \ + distck\ gcffmt\ gcfpeek\ gcfset\ diff --git a/tests/distck.at b/tests/distck.at new file mode 100644 index 0000000..6ecb49e --- /dev/null +++ b/tests/distck.at @@ -0,0 +1,21 @@ +# This file is part of grecs -*- Autotest -*- +# Copyright (C) 2007, 2009-2011 Sergey Poznyakoff +# +# Grecs 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. +# +# Grecs 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 Grecs. If not, see <http://www.gnu.org/licenses/>. + +AT_SETUP(Package version) + +AT_CHECK([distck]) + +AT_CLEANUP diff --git a/tests/distck.c b/tests/distck.c new file mode 100644 index 0000000..ee066f5 --- /dev/null +++ b/tests/distck.c @@ -0,0 +1,18 @@ +#include <config.h> +#include "grecs.h" + +int +main(int argc, char **argv) +{ + int res; + struct grecs_version_info *packver, *libver; + + packver = grecs_version_split(PACKAGE_STRING); + libver = grecs_version(); + if (!(grecs_version_info_cmp(packver, libver, &res) == 0 && + res == 0)) { + fprintf(stderr, "grecs.h does not match package number\n"); + return 1; + } + return 0; +} diff --git a/tests/gcfver.c b/tests/gcfver.c index 990d920..5a8d5ad 100644 --- a/tests/gcfver.c +++ b/tests/gcfver.c @@ -22,25 +22,30 @@ int main(int argc, char **argv) { - struct grecs_version_info vinfo; - - if (argc > 2) { - fprintf(stderr, "usage: %s [version]\n", argv[0]); + struct grecs_version_info *vinfo; + int res; + + if (argc > 3) { + fprintf(stderr, "usage: %s [version [version]]\n", argv[0]); exit(1); } if (argc == 2) - exit(grecs_version_cmp(argv[1]) ? 2 : 0); + exit(!grecs_version_ok(argv[1])); + if (argc == 3) + exit(grecs_version_cmp(argv[1], argv[2], &res) ? 1 : + res == 0 ? 0 : res < 0 ? 2 : 3); /* Default action: */ - grecs_version(&vinfo); - printf("package: %s\n", vinfo.package); - printf("version: %s\n", vinfo.version); - printf("major: %d\n", vinfo.major); - printf("minor: %d\n", vinfo.minor); - printf("patch: %d\n", vinfo.patch); + vinfo = grecs_version(); + printf("package: %s\n", vinfo->package); + printf("version: %s\n", vinfo->version); + printf("major: %d\n", vinfo->major); + printf("minor: %d\n", vinfo->minor); + printf("patch: %d\n", vinfo->patch); printf("suffix:"); - if (vinfo.suffix && vinfo.suffix[0]) - printf(" %s", vinfo.suffix); + if (vinfo->suffix && vinfo->suffix[0]) + printf(" %s", vinfo->suffix); putchar('\n'); + grecs_version_info_free(vinfo); exit(0); } diff --git a/tests/testsuite.at b/tests/testsuite.at index 4bbf608..221f536 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -45,6 +45,8 @@ AT_CHECK([$2 ./test.cf],m4_shift(m4_shift($@)))]) dnl # Begin tests AT_INIT +m4_if(GRECS_DISTCK_AT,,,[m4_include(GRECS_DISTCK_AT)]) + m4_include([format00.at]) m4_include([format01.at]) m4_include([format02.at]) @@ -64,6 +66,7 @@ m4_include([reduce03.at]) m4_include([join.at]) -m4_if(GRECS_VERCMP_AT,,,[m4_include(GRECS_VERCMP_AT)]) +m4_include([vercmp.at]) +m4_if(GRECS_VEROK_AT,,,[m4_include(GRECS_VEROK_AT)]) # End of testsuite.at diff --git a/tests/vercmp.at b/tests/vercmp.at index 9ef495a..cdc4d58 100644 --- a/tests/vercmp.at +++ b/tests/vercmp.at @@ -17,47 +17,20 @@ AT_SETUP(Version comparator) AT_KEYWORDS(vercmp) -dnl Split Package version into major, minor, patchlevel and suffix +AT_CHECK([gcfver 1.0 1.0], [0]) +AT_CHECK([gcfver 1.1 1.0], [3]) +AT_CHECK([gcfver 2.0 1.0], [3]) +AT_CHECK([gcfver 1.0 1.1], [2]) +AT_CHECK([gcfver 1.0 2.0], [2]) +AT_CHECK([gcfver 1.0a 1.0a], [0]) +AT_CHECK([gcfver 1.0b 1.0a], [3]) +AT_CHECK([gcfver 1.0a 1.0b], [2]) +AT_CHECK([gcfver 1.0.1 1.0], [3]) +AT_CHECK([gcfver 1.0.1 1.0.0], [3]) +AT_CHECK([gcfver 1.0.0 1.0.1], [2]) +AT_CHECK([gcfver 1.0.1a 1.0.0], [3]) +AT_CHECK([gcfver 1.0.1a 1.0.0a], [3]) +AT_CHECK([gcfver 1.0.1a 1.0.0b], [3]) +AT_CHECK([gcfver 1.0.1a 1.0.1b], [2]) -m4_define([V_MAJOR],[m4_bpatsubst(AT_PACKAGE_VERSION,[\..*])]) -m4_define([V_MINOR],[m4_bpatsubst(AT_PACKAGE_VERSION,[[0-9]+\.\([0-9]+\).*],\1)]) - -m4_define([V_PATCH_TMP],[m4_bpatsubst(AT_PACKAGE_VERSION,[[0-9]+\.[0-9]+\.\([0-9]+\).*],\1)]) -m4_define([V_PATCH],[m4_if(V_PATCH_TMP,AT_PACKAGE_VERSION,[0],V_PATCH_TMP)]) - -m4_pushdef([V_SUFFIX_TMP],[m4_bpatsubst(AT_PACKAGE_VERSION,[[0-9]+\.[0-9]+\(\.[0-9]+\)?])]) -m4_define([V_SUFFIX],[m4_if(V_SUFFIX_TMP,AT_PACKAGE_VERSION,,[ V_SUFFIX_TMP])]) - -dnl Join them back and see if the result matches version. -m4_define([V_OK], -[m4_if(V_MAJOR.V_MINOR[]m4_if(V_PATCH_TMP,AT_PACKAGE_VERSION,,V_PATCH_TMP)dnl -m4_if(V_SUFFIX_TMP,AT_PACKAGE_VERSION,,V_SUFFIX_TMP),AT_PACKAGE_VERSION, -[exit 0], -AT_SKIP_TEST)]) - -AT_CHECK([V_OK]) - -AT_CHECK([gcfver], -[0], -[package: AT_PACKAGE_NAME -version: AT_PACKAGE_VERSION -major: V_MAJOR -minor: V_MINOR -patch: V_PATCH -suffix:V_SUFFIX -]) - -AT_CHECK([gcfver AT_PACKAGE_VERSION], [0]) -AT_CHECK([gcfver "AT_PACKAGE_NAME AT_PACKAGE_VERSION"], [0]) -AT_CHECK([gcfver AT_PACKAGE_VERSION.[foo]], [2]) -AT_CHECK([gcfver "[foo] AT_PACKAGE_VERSION"], [2]) -AT_CHECK([gcfver V_MAJOR], [0]) -AT_CHECK([gcfver V_MAJOR.V_MINOR], [0]) -AT_CHECK([gcfver m4_eval(V_MAJOR+1)], [2]) -AT_CHECK([gcfver V_MAJOR.m4_eval(V_MINOR+1)], [2]) -m4_if(V_MAJOR,0,, - [AT_CHECK([gcfver m4_eval(V_MAJOR-1)],[0]) - AT_CHECK([gcfver m4_eval(V_MAJOR-1).m4_eval(V_MINOR+1)],[0]) - ]) - AT_CLEANUP diff --git a/tests/verok.at b/tests/verok.at new file mode 100644 index 0000000..d6064c7 --- /dev/null +++ b/tests/verok.at @@ -0,0 +1,63 @@ +# This file is part of grecs -*- Autotest -*- +# Copyright (C) 2007, 2009-2011 Sergey Poznyakoff +# +# Grecs 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. +# +# Grecs 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 Grecs. If not, see <http://www.gnu.org/licenses/>. + +AT_SETUP(grecs_version_ok) +AT_KEYWORDS(verok) + +dnl Split Package version into major, minor, patchlevel and suffix + +m4_define([V_MAJOR],[m4_bpatsubst(AT_PACKAGE_VERSION,[\..*])]) +m4_define([V_MINOR],[m4_bpatsubst(AT_PACKAGE_VERSION,[[0-9]+\.\([0-9]+\).*],\1)]) + +m4_define([V_PATCH_TMP],[m4_bpatsubst(AT_PACKAGE_VERSION,[[0-9]+\.[0-9]+\.\([0-9]+\).*],\1)]) +m4_define([V_PATCH],[m4_if(V_PATCH_TMP,AT_PACKAGE_VERSION,[0],V_PATCH_TMP)]) + +m4_pushdef([V_SUFFIX_TMP],[m4_bpatsubst(AT_PACKAGE_VERSION,[[0-9]+\.[0-9]+\(\.[0-9]+\)?])]) +m4_define([V_SUFFIX],[m4_if(V_SUFFIX_TMP,AT_PACKAGE_VERSION,,[ V_SUFFIX_TMP])]) + +dnl Join them back and see if the result matches version. +m4_define([V_OK], +[m4_if(V_MAJOR.V_MINOR[]m4_if(V_PATCH_TMP,AT_PACKAGE_VERSION,,V_PATCH_TMP)dnl +m4_if(V_SUFFIX_TMP,AT_PACKAGE_VERSION,,V_SUFFIX_TMP),AT_PACKAGE_VERSION, +[exit 0], +AT_SKIP_TEST)]) + +AT_CHECK([V_OK]) + +AT_CHECK([gcfver], +[0], +[package: AT_PACKAGE_NAME +version: AT_PACKAGE_VERSION +major: V_MAJOR +minor: V_MINOR +patch: V_PATCH +suffix:V_SUFFIX +]) + +AT_CHECK([gcfver AT_PACKAGE_VERSION], [0]) +AT_CHECK([gcfver "AT_PACKAGE_NAME AT_PACKAGE_VERSION"], [0]) +AT_CHECK([gcfver AT_PACKAGE_VERSION.[foo]], [1]) +AT_CHECK([gcfver "[foo] AT_PACKAGE_VERSION"], [1]) +AT_CHECK([gcfver V_MAJOR], [0]) +AT_CHECK([gcfver V_MAJOR.V_MINOR], [0]) +AT_CHECK([gcfver m4_eval(V_MAJOR+1)], [1]) +AT_CHECK([gcfver V_MAJOR.m4_eval(V_MINOR+1)], [1]) +m4_if(V_MAJOR,0,, + [AT_CHECK([gcfver m4_eval(V_MAJOR-1)],[0]) + AT_CHECK([gcfver m4_eval(V_MAJOR-1).m4_eval(V_MINOR+1)],[0]) + ]) + +AT_CLEANUP |