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