Compare two version strings representing a software version to decide which version is newer.
58{
59 char *ver1, *ver2;
60 char *part1, *part2;
61 int index1 = 0, index2 = 0;
62 int release_state1 = 0, release_state2 = 0;
63 int rs1, rs2;
64
67
68 if (ver1 == NULL || ver2 == NULL)
69 {
70 g_free (ver1);
71 g_free (ver2);
72 return -5;
73 }
74 if (strcmp (ver1, ver2) == 0)
75 {
76 g_free (ver1);
77 g_free (ver2);
78 return 0;
79 }
80
82 if (release_state1)
83 index1++;
85 if (release_state2)
86 index2++;
87
90 while (part1 && part2)
91 {
92 if (strcmp (part1, part2) == 0)
93 {
94 index1++;
95 index2++;
96 g_free (part1);
97 g_free (part2);
100 continue;
101 }
102 else
103 break;
104 }
105
106 if (part1 == NULL && part2 == NULL)
107 {
108 g_free (ver1);
109 g_free (ver2);
110 return release_state2 - release_state1;
111 }
112
114 {
115 g_free (ver1);
116 g_free (ver2);
117 g_free (part1);
118 g_free (part2);
119 return -5;
120 }
121
124
125 g_free (ver1);
126 g_free (ver2);
127
128 if ((rs1 && release_state1) || (rs2 && release_state2))
129 {
130 g_free (part1);
131 g_free (part2);
132 return -5;
133 }
134
135 if (part1 == NULL)
136 {
137 g_free (part2);
138 if (rs2)
139 return rs2 - release_state1;
140 else
141 return -1;
142 }
143
144 if (part2 == NULL)
145 {
146 g_free (part1);
147 if (rs1)
148 return release_state2 - rs1;
149 else
150 return 1;
151 }
152
153 int ret = -5;
154
155 if (rs1 && rs2)
156 ret = rs2 - rs1;
157 else if (rs1)
158 ret = -1;
159 else if (rs2)
160 ret = 1;
161 else if (atoi (part1) < atoi (part2))
162 ret = -1;
163 else if (atoi (part1) == atoi (part2))
164 ret = 0;
165 else if (atoi (part1) > atoi (part2))
166 ret = 1;
167
168 g_free (part1);
169 g_free (part2);
170 return ret;
171}
static int get_release_state(const char *, int)
Gets the release state of a specified part of the version string if any.
static char * get_part(const char *, int)
Gets the part of the version string that is specified by index.
static gchar * prepare_version_string(const char *)
Prepare the version string for comparison.
static gboolean is_text(const char *)
Checks if a given part of the version string is plain text.