aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-05-08 15:13:59 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-05-08 15:13:59 +0300
commit79f6b2c923d1c2366b68a431756bde6e4a04ae86 (patch)
tree75087c12a3b763634bd5ea9ae616e6dd447b3f9d
parentced98e1b1e040bd0f50b2ebd146a22e74f5913c0 (diff)
downloadgrecs-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.m410
-rw-r--r--src/grecs.h14
-rw-r--r--src/libgrecs.m42
-rw-r--r--src/version.c178
-rw-r--r--tests/.gitignore1
-rw-r--r--tests/Makefile.am9
-rw-r--r--tests/distck.at21
-rw-r--r--tests/distck.c18
-rw-r--r--tests/gcfver.c31
-rw-r--r--tests/testsuite.at5
-rw-r--r--tests/vercmp.at57
-rw-r--r--tests/verok.at63
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

Return to:

Send suggestions and report system problems to the System administrator.