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