aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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],[
149 ]) 149 ])
150 _GRECS_IF_OPTION_SET([git2chg],[GRECS_BUILD_AUX="$GRECS_BUILD_AUX build-aux/git2chg.awk"]) 150 _GRECS_IF_OPTION_SET([git2chg],[GRECS_BUILD_AUX="$GRECS_BUILD_AUX build-aux/git2chg.awk"])
151 151
152 # Make sure package versioning is compatible with vercmp.at: 152 # Make sure package versioning is compatible with version.at:
153 s=`echo $PACKAGE_VERSION | sed 's/[0-9][0-9]*\.[0-9][0-9]*\(\.[0-9][0-9]\)\?\([^a-zA-Z_0-9].*\)\?//'` 153 s=`echo $PACKAGE_VERSION | [sed 's/[0-9][0-9]*\.[0-9][0-9]*\(\.[0-9][0-9]\)\?\([^a-zA-Z_0-9].*\)\?//'`]
154 if test -z "$s"; then 154 if test -z "$s"; then
155 GRECS_VERCMP_AT=vercmp.at 155 GRECS_VEROK_AT=verok.at
156 fi 156 fi
157 157
158 AC_SUBST([GRECS_SRCDIR],$1) 158 AC_SUBST([GRECS_SRCDIR],$1)
159 AC_SUBST([GRECS_VERCMP_AT]) 159 AC_SUBST([GRECS_VEROK_AT])
160 AC_SUBST([GRECS_BUILD_AUX]) 160 AC_SUBST([GRECS_BUILD_AUX])
161 AC_SUBST([GRECS_INCLUDES]) 161 AC_SUBST([GRECS_INCLUDES])
162 AC_SUBST([GRECS_TESTDIR]) 162 AC_SUBST([GRECS_TESTDIR])
163 AC_SUBST([GRECS_LDADD]) 163 AC_SUBST([GRECS_LDADD])
164 AC_SUBST([GRECS_DOCDIR]) 164 AC_SUBST([GRECS_DOCDIR])
165 AC_SUBST([GRECS_CHANGELOG]) 165 AC_SUBST([GRECS_CHANGELOG])
166 AC_SUBST([GRECS_DISTCK_AT])
166 AC_SUBST([GRECS_INCLUDES],['-I$(top_srcdir)/]grecsdir[src]') 167 AC_SUBST([GRECS_INCLUDES],['-I$(top_srcdir)/]grecsdir[src]')
167 _GRECS_OPTION_SWITCH([install],[ 168 _GRECS_OPTION_SWITCH([install],[
168 LT_INIT 169 LT_INIT
169 GRECS_LDADD=['$(top_builddir)/]grecsdir[src/libgrecs.la'] 170 GRECS_LDADD=['$(top_builddir)/]grecsdir[src/libgrecs.la']
170 GRECS_DOCDIR='doc' 171 GRECS_DOCDIR='doc'
171 GRECS_CHANGELOG= 172 GRECS_CHANGELOG=
173 GRECS_DISTCK_AT=distck.at
172 AC_CONFIG_FILES(grecsdir[src/Makefile]:grecsdir[src/Make-inst.in] 174 AC_CONFIG_FILES(grecsdir[src/Makefile]:grecsdir[src/Make-inst.in]
173 grecsdir[doc/Makefile]) 175 grecsdir[doc/Makefile])
174 ],[shared],[ 176 ],[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 @@
37# define N_(s) s 37# define N_(s) s
38#endif 38#endif
39 39
40#define GRECS_VERSION_MAJOR 1
41#define GRECS_VERSION_MINOR 0
42
40struct grecs_version_info { 43struct grecs_version_info {
41 const char *package; 44 const char *package;
42 const char *version; 45 const char *version;
@@ -44,6 +47,7 @@ struct grecs_version_info {
44 int minor; 47 int minor;
45 int patch; 48 int patch;
46 char *suffix; 49 char *suffix;
50 char *buffer;
47}; 51};
48 52
49typedef struct { 53typedef struct {
@@ -163,8 +167,14 @@ struct grecs_sockaddr {
163 struct sockaddr *sa; 167 struct sockaddr *sa;
164}; 168};
165 169
166void grecs_version(struct grecs_version_info *pv); 170struct grecs_version_info *grecs_version(void);
167int grecs_version_cmp(const char *vstr); 171int grecs_version_cmp(const char *vstr1, const char *vstr2, int *pres);
172int grecs_version_ok(const char *vstr);
173void grecs_version_info_free(struct grecs_version_info *pv);
174struct grecs_version_info *grecs_version_split(const char *vstr);
175int grecs_version_info_cmp(struct grecs_version_info *vx,
176 struct grecs_version_info *vy,
177 int *pres);
168 178
169extern void *(*grecs_malloc_fun)(size_t size); 179extern void *(*grecs_malloc_fun)(size_t size);
170extern void *(*grecs_realloc_fun)(void *ptr, size_t size); 180extern 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],[
27 AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <stdlib.h> 27 AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <stdlib.h>
28 #include <grecs.h> 28 #include <grecs.h>
29 ]], 29 ]],
30 [exit(grecs_version_cmp("[libgrecs ]$1"));])], 30 [exit(grecs_version_ok("[libgrecs ]$1"));])],
31 [], 31 [],
32 [cv_libgrecs=no])]) 32 [cv_libgrecs=no])])
33 if test "$cv_libgrecs" = "yes"; then 33 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 @@
21#include <string.h> 21#include <string.h>
22#include <ctype.h> 22#include <ctype.h>
23 23
24void 24const char *grecs_version_string;
25grecs_version(struct grecs_version_info *pv) 25
26struct grecs_version_info *
27grecs_version_split(const char *vstr)
26{ 28{
27 char *p; 29 char *p;
28 memset(pv, 0, sizeof(*pv)); 30 size_t len;
29 pv->package = PACKAGE_NAME; 31 struct grecs_version_info *pv = grecs_zalloc(sizeof(*pv));
30 pv->version = PACKAGE_VERSION; 32
33 pv->buffer = grecs_strdup(vstr);
34 len = strcspn(pv->buffer, " \t");
35 if (pv->buffer[len]) {
36 pv->package = pv->buffer;
37 pv->buffer[len++] = 0;
38 for (; pv->buffer[len] && isspace(pv->buffer[len]); len++)
39 ;
40 } else {
41 pv->package = NULL;
42 len = 0;
43 }
44 if (!pv->buffer[len]) {
45 free(pv->buffer);
46 free(pv);
47 return NULL;
48 }
49 pv->version = pv->buffer + len;
31 pv->major = strtoul(pv->version, &p, 10); 50 pv->major = strtoul(pv->version, &p, 10);
32 if (*p && *p == '.') { 51 if (*p && *p == '.') {
33 pv->minor = strtoul(p + 1, &p, 10); 52 pv->minor = strtoul(p + 1, &p, 10);
@@ -42,45 +61,126 @@ grecs_version(struct grecs_version_info *pv)
42 } 61 }
43 } 62 }
44 pv->suffix = p; 63 pv->suffix = p;
64 return pv;
65}
66
67void
68grecs_version_info_free(struct grecs_version_info *pv)
69{
70 if (pv) {
71 if (pv->buffer)
72 grecs_free(pv->buffer);
73 free(pv);
74 }
75}
76
77struct grecs_version_info *
78grecs_version(void)
79{
80 struct grecs_version_info *pv = grecs_zalloc(sizeof(*pv));
81 size_t size = 0;
82
83 pv->package = PACKAGE_NAME;
84#ifdef GRECS_VERSION_PATCHLEVEL
85# ifdef GRECS_VERSION_SUFFIX
86 grecs_asprintf(&pv->buffer, &size,
87 "%d.%d.%d%s",
88 GRECS_VERSION_MAJOR, GRECS_VERSION_MINOR,
89 GRECS_VERSION_PATCHLEVEL, GRECS_VERSION_SUFFIX);
90# else
91 grecs_asprintf(&pv->buffer, &size,
92 "%d.%d.%d",
93 GRECS_VERSION_MAJOR, GRECS_VERSION_MINOR,
94 GRECS_VERSION_PATCHLEVEL);
95# endif
96#else
97# ifdef GRECS_VERSION_SUFFIX
98 grecs_asprintf(&pv->buffer, &size,
99 "%d.%d%s",
100 GRECS_VERSION_MAJOR, GRECS_VERSION_MINOR,
101 GRECS_VERSION_SUFFIX);
102# else
103 grecs_asprintf(&pv->buffer, &size,
104 "%d.%d",
105 GRECS_VERSION_MAJOR, GRECS_VERSION_MINOR);
106# endif
107#endif
108 pv->version = pv->buffer;
109 pv->major = GRECS_VERSION_MAJOR;
110 pv->minor = GRECS_VERSION_MINOR;
111#ifdef GRECS_VERSION_PATCHLEVEL
112 pv->patch = GRECS_VERSION_PATCHLEVEL;
113#endif
114#ifdef GRECS_VERSION_SUFFIX
115 pv->suffix = GRECS_VERSION_SUFFIX;
116#endif
117 return pv;
45} 118}
46 119
47int 120int
48grecs_version_cmp(const char *vstr) 121grecs_version_info_cmp(struct grecs_version_info *vx,
122 struct grecs_version_info *vy,
123 int *pres)
49{ 124{
50 struct grecs_version_info v; 125 if (vx->package && vy->package && strcmp(vx->package, vy->package))
51 char *p; 126 return 1;
52 unsigned long n; 127 else if (vx->major > vy->major)
53 size_t len; 128 *pres = 1;
54 int check; 129 else if (vx->major < vy->major)
130 *pres = -1;
131 else if (vx->minor > vy->minor)
132 *pres = 1;
133 else if (vx->minor < vy->minor)
134 *pres = -1;
135 else if (vx->patch > vy->patch)
136 *pres = 1;
137 else if (vx->patch < vy->patch)
138 *pres = -1;
139 else if (vx->suffix && vy->suffix)
140 *pres = strcmp(vx->suffix, vy->suffix);
141 else
142