summaryrefslogtreecommitdiff
path: root/noncore/settings/aqpkg/version.cpp
authorandyq <andyq>2002-10-25 18:58:30 (UTC)
committer andyq <andyq>2002-10-25 18:58:30 (UTC)
commit835fadbad01b725a46ffd68ca458fd39c7313ea0 (patch) (unidiff)
tree4fbc213e01292e4e850ad561c387f75098e2b059 /noncore/settings/aqpkg/version.cpp
parent1d3135677f1f49b9cc87ebf01f1c4eaab3c450f4 (diff)
downloadopie-835fadbad01b725a46ffd68ca458fd39c7313ea0.zip
opie-835fadbad01b725a46ffd68ca458fd39c7313ea0.tar.gz
opie-835fadbad01b725a46ffd68ca458fd39c7313ea0.tar.bz2
Added version handling
Diffstat (limited to 'noncore/settings/aqpkg/version.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/aqpkg/version.cpp214
1 files changed, 214 insertions, 0 deletions
diff --git a/noncore/settings/aqpkg/version.cpp b/noncore/settings/aqpkg/version.cpp
new file mode 100644
index 0000000..e836da1
--- a/dev/null
+++ b/noncore/settings/aqpkg/version.cpp
@@ -0,0 +1,214 @@
1/*
2 * libdpkg - Debian packaging suite library routines
3 * vercmp.c - comparison of version numbers
4 *
5 * Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
6 *
7 * This is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2,
10 * or (at your option) any later version.
11 *
12 * This is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public
18 * License along with dpkg; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21#include <stdio.h>
22#include <stdlib.h>
23#include <ctype.h>
24#include <string.h>
25
26# define _(Text) Text
27
28class versionrevision
29{
30public:
31 versionrevision()
32 {
33 version = 0;
34 }
35
36 ~versionrevision()
37 {
38 if ( version )
39 delete version;
40 }
41
42 void setVersion( const char *str )
43 {
44 version = new char[(strlen(str)+1)];
45 strcpy( version, str );
46 }
47
48 unsigned long epoch;
49 char *version;
50 const char *revision;
51 const char *familiar_revision;
52};
53
54static int verrevcmp(const char *val, const char *ref)
55{
56 int vc, rc;
57 long vl, rl;
58 const char *vp, *rp;
59
60 if (!val) val= "";
61 if (!ref) ref= "";
62 for (;;) {
63 vp= val; while (*vp && !isdigit(*vp)) vp++;
64 rp= ref; while (*rp && !isdigit(*rp)) rp++;
65 for (;;) {
66 vc= val == vp ? 0 : *val++;
67 rc= ref == rp ? 0 : *ref++;
68 if (!rc && !vc) break;
69 if (vc && !isalpha(vc)) vc += 256; /* assumes ASCII character set */
70 if (rc && !isalpha(rc)) rc += 256;
71 if (vc != rc) return vc - rc;
72 }
73 val= vp;
74 ref= rp;
75 vl=0; if (isdigit(*vp)) vl= strtol(val,(char**)&val,10);
76 rl=0; if (isdigit(*rp)) rl= strtol(ref,(char**)&ref,10);
77 if (vl != rl) return vl - rl;
78 if (!*val && !*ref) return 0;
79 if (!*val) return -1;
80 if (!*ref) return +1;
81 }
82}
83
84int versioncompare(const struct versionrevision *version,
85 const struct versionrevision *refversion)
86{
87 int r;
88
89 if (version->epoch > refversion->epoch) return 1;
90 if (version->epoch < refversion->epoch) return -1;
91 r= verrevcmp(version->version,refversion->version); if (r) return r;
92 r= verrevcmp(version->revision,refversion->revision); if (r) return r;
93 return verrevcmp(version->familiar_revision,refversion->familiar_revision);
94}
95
96int versionsatisfied3(const struct versionrevision *it,
97 const struct versionrevision *ref,
98 const char *op)
99{
100 int r;
101 r= versioncompare(it,ref);
102 if (strcmp(op, "<=") == 0 || strcmp(op, "<") == 0)
103 return r <= 0;
104 if (strcmp(op, ">=") == 0 || strcmp(op, ">") == 0)
105 return r >= 0;
106 if (strcmp(op, "<<") == 0)
107 return r < 0;
108 if (strcmp(op, ">>") == 0)
109 return r > 0;
110 if (strcmp(op, "=") == 0)
111 return r == 0;
112 fprintf(stderr, "unknown operator: %s", op);
113
114 exit(1);
115}
116
117const char *parseversion(struct versionrevision *rversion, const char *string)
118{
119 char *hyphen, *colon, *eepochcolon;
120 unsigned long epoch;
121
122 if (!*string) return _("version string is empty");
123
124 colon= strchr(string,':');
125 if (colon) {
126 epoch= strtoul(string,&eepochcolon,10);
127 if (colon != eepochcolon) return _("epoch in version is not number");
128 if (!*++colon) return _("nothing after colon in version number");
129 string= colon;
130 rversion->epoch= epoch;
131 } else {
132 rversion->epoch= 0;
133 }
134
135 rversion->revision = "";
136 rversion->familiar_revision = "";
137
138 rversion->setVersion( string );
139 hyphen= strrchr(rversion->version,'-');
140 if (hyphen) {
141 *hyphen++= 0;
142 if (strncmp("fam", hyphen, 3) == 0) {
143 rversion->familiar_revision=hyphen+3;
144 hyphen= strrchr(rversion->version,'-');
145 if (hyphen) {
146 *hyphen++= 0;
147 rversion->revision = hyphen;
148 }
149 } else {
150 rversion->revision = hyphen;
151 }
152 }
153/*
154 fprintf(stderr,"Parsed version: %lu, %s, %s, %s\n",
155 rversion->epoch,
156 rversion->version,
157 rversion->revision,
158 rversion->familiar_revision);
159*/
160 return 0;
161}
162
163int compareVersions( const char *v1, const char *v2 )
164{
165 const char *err;
166 versionrevision ver, ref;
167
168 err = parseversion(&ref, v1);
169 if (err) {
170 fprintf(stderr, "Invalid version `%s': %s\n", v2, err);
171 return -2;
172 }
173
174 err = parseversion(&ver, v2);
175 if (err) {
176 fprintf(stderr, "Invalid version `%s': %s\n", v1, err);
177 return -2;
178 }
179
180 if ( versionsatisfied3( &ver, &ref, "=" ) )
181 return 0;
182 else if ( versionsatisfied3( &ver, &ref, "<" ) )
183 return -1;
184 else
185 return 1;
186}
187
188/*
189int main(int argc, char *argv[])
190{
191 const char *err;
192 versionrevision ver, ref;
193
194 if (argc < 4) {
195 fprintf(stderr, "usage: %s: version op refversion\n", argv[0]);
196 return 2;
197 }
198
199 err = parseversion(&ver, argv[1]);
200 if (err) {
201 fprintf(stderr, "Invalid version `%s': %s\n", argv[1], err);
202 return 2;
203 }
204
205 err = parseversion(&ref, argv[3]);
206 if (err) {
207 fprintf(stderr, "Invalid version `%s': %s\n", argv[3], err);
208 return 2;
209 }
210
211 printf( "Result: %d\n", versionsatisfied3(&ver, &ref, argv[2]) );
212}
213
214*/