b2a98e1304d8ef6ae3c36727619f7978387191cc
[platform/upstream/libsolv.git] / src / evr.c
1 /*
2  * Copyright (c) 2007, Novell Inc.
3  *
4  * This program is licensed under the BSD license, read LICENSE.BSD
5  * for further information
6  */
7
8 /*
9  * evr.c
10  *
11  * version compare
12  */
13
14 #include <stdio.h>
15 #include <string.h>
16 #include "evr.h"
17 #include "pool.h"
18 #include "sat_debug.h"
19
20 int
21 vercmp(const char *s1, const char *q1, const char *s2, const char *q2)
22 {
23   int r = 0;
24   const char *e1, *e2;
25
26   while (s1 < q1 && s2 < q2)
27     {
28       while (s1 < q1 && !(*s1 >= '0' && *s1 <= '9') &&
29           !(*s1 >= 'a' && *s1 <= 'z') && !(*s1 >= 'A' && *s1 <= 'Z'))
30         s1++;
31       while (s2 < q2 && !(*s2 >= '0' && *s2 <= '9') &&
32           !(*s2 >= 'a' && *s2 <= 'z') && !(*s2 >= 'A' && *s2 <= 'Z'))
33         s2++;
34       if ((*s1 >= '0' && *s1 <= '9') || (*s2 >= '0' && *s2 <= '9'))
35         {
36           while (*s1 == '0' && s1[1] >= '0' && s1[1] <= '9')
37             s1++;
38           while (*s2 == '0' && s2[1] >= '0' && s2[1] <= '9')
39             s2++;
40           for (e1 = s1; *e1 >= '0' && *e1 <= '9'; )
41             e1++;
42           for (e2 = s2; *e2 >= '0' && *e2 <= '9'; )
43             e2++;
44           r = e1 - s1 - (e2 - s2);
45           if (!r)
46             r = strncmp(s1, s2, e1 - s1);
47           if (r)
48             return r > 0 ? 1 : -1;
49         }
50       else
51         {
52           for (e1 = s1; (*e1 >= 'a' && *e1 <= 'z') || (*e1 >= 'A' && *e1 <= 'Z'); )
53             e1++;
54           for (e2 = s2; (*e2 >= 'a' && *e2 <= 'z') || (*e2 >= 'A' && *e2 <= 'Z'); )
55             e2++;
56           r = e1 - s1 - (e2 - s2);
57           if (r > 0)
58             {
59               r = strncmp(s1, s2, e2 - s2);
60               return r >= 0 ? 1 : -1;
61             }
62           if (r < 0)
63             {
64               r = strncmp(s1, s2, e1 - s1);
65               return r <= 0 ? -1 : 1;
66             }
67           r = strncmp(s1, s2, e1 - s1);
68           if (r)
69             return r > 0 ? 1 : -1;
70         }
71       s1 = e1;
72       s2 = e2;
73     }
74   return s1 < q1 ? 1 : s2 < q2 ? -1 : 0;
75 }
76
77
78 // edition (e:v-r) compare
79 int
80 evrcmp(Pool *pool, Id evr1id, Id evr2id)
81 {
82   int r;
83   const char *evr1, *evr2;
84   const char *s1, *s2;
85   const char *r1, *r2;
86
87   if (evr1id == evr2id)
88     return 0;
89   evr1 = id2str(pool, evr1id);
90   evr2 = id2str(pool, evr2id);
91
92 #if 0
93   sat_debug (DEBUG_5,"evrcmp %s %s\n", evr1, evr2);
94 #endif
95   for (s1 = evr1; *s1 >= '0' && *s1 <= '9'; s1++)
96     ;
97   for (s2 = evr2; *s2 >= '0' && *s2 <= '9'; s2++)
98     ;
99   if (s1 == evr1 || *s1 != ':')
100     s1 = 0;
101   if (s2 == evr2 || *s2 != ':')
102     s2 = 0;
103   if (s1 && s2)
104     {
105       r = vercmp(evr1, s1, evr2, s2);
106       if (r)
107         return r;
108       evr1 = s1 + 1;
109       evr2 = s2 + 1;
110     }
111   else if (s1)
112     {
113       if (!pool->promoteepoch)
114         {
115           while (*evr1 == '0')
116             evr1++;
117           if (*evr1 != ':')
118             return 1;
119         }
120       evr1 = s1 + 1;
121     }
122   else if (s2)
123     {
124       while (*evr2 == '0')
125         evr2++;
126       if (*evr2 != ':')
127         return -1;
128       evr2 = s2 + 1;
129     }
130   for (s1 = evr1, r1 = 0; *s1; s1++)
131     if (*s1 == '-')
132       r1 = s1;
133   for (s2 = evr2, r2 = 0; *s2; s2++)
134     if (*s2 == '-')
135       r2 = s2;
136   r = vercmp(evr1, r1 ? r1 : s1, evr2, r2 ? r2 : s2);
137   if (r)
138     return r;
139   if (r1 && r2)
140     {
141       if (s1 != ++r1 && s2 != ++r2)
142         r = vercmp(r1, s1, r2, s2);
143     }
144   return r;
145 }
146
147 // EOF