diff options
-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],[ | |||
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 | |||
40 | struct grecs_version_info { | 43 | struct 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 | ||
49 | typedef struct { | 53 | typedef struct { |
@@ -163,8 +167,14 @@ struct grecs_sockaddr { | |||
163 | struct sockaddr *sa; | 167 | struct sockaddr *sa; |
164 | }; | 168 | }; |
165 | 169 | ||
166 | void grecs_version(struct grecs_version_info *pv); | 170 | struct grecs_version_info *grecs_version(void); |
167 | int grecs_version_cmp(const char *vstr); | 171 | int grecs_version_cmp(const char *vstr1, const char *vstr2, int *pres); |
172 | int grecs_version_ok(const char *vstr); | ||
173 | void grecs_version_info_free(struct grecs_version_info *pv); | ||
174 | struct grecs_version_info *grecs_version_split(const char *vstr); | ||
175 | int grecs_version_info_cmp(struct grecs_version_info *vx, | ||
176 | struct grecs_version_info *vy, | ||
177 | int *pres); | ||
168 | 178 | ||
169 | extern void *(*grecs_malloc_fun)(size_t size); | 179 | extern void *(*grecs_malloc_fun)(size_t size); |
170 | extern void *(*grecs_realloc_fun)(void *ptr, size_t size); | 180 | 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],[ | |||
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 | ||
24 | void | 24 | const char *grecs_version_string; |
25 | grecs_version(struct grecs_version_info *pv) | 25 | |
26 | struct grecs_version_info * | ||
27 | grecs_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 | |||
67 | void | ||
68 | grecs_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 | |||
77 | struct grecs_version_info * | ||
78 | grecs_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 | ||
47 | int | 120 | int |
48 | grecs_version_cmp(const char *vstr) | 121 | grecs_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 |