Greenbone Vulnerability Management Libraries 22.32.0
versionutils.h File Reference

Headers for version utils. More...

#include <glib.h>
#include <stdio.h>
Include dependency graph for versionutils.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int cmp_versions (const char *, const char *)
 Compare two version strings representing a software version to decide which version is newer.

Detailed Description

Headers for version utils.

Definition in file versionutils.h.

Function Documentation

◆ cmp_versions()

int cmp_versions ( const char * version1,
const char * version2 )

Compare two version strings representing a software version to decide which version is newer.

Parameters
[in]version1The first version string to compare.
[in]version2The second version string to compare.
Returns
Returns a value > 0 if version1 is newer than version2. Returns 0 if version1 is the same than version2. Returns a value between -1 and -4 if version2 is newer than version1. Returns -5 if the result is undefined.

Definition at line 57 of file versionutils.c.

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
65 ver1 = prepare_version_string (version1);
66 ver2 = prepare_version_string (version2);
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
81 release_state1 = get_release_state (ver1, index1);
82 if (release_state1)
83 index1++;
84 release_state2 = get_release_state (ver2, index2);
85 if (release_state2)
86 index2++;
87
88 part1 = get_part (ver1, index1);
89 part2 = get_part (ver2, index2);
90 while (part1 && part2)
91 {
92 if (strcmp (part1, part2) == 0)
93 {
94 index1++;
95 index2++;
96 g_free (part1);
97 g_free (part2);
98 part1 = get_part (ver1, index1);
99 part2 = get_part (ver2, index2);
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
113 if (is_text (part1) || is_text (part2))
114 {
115 g_free (ver1);
116 g_free (ver2);
117 g_free (part1);
118 g_free (part2);
119 return -5; // undefined
120 }
121
122 rs1 = get_release_state (ver1, index1);
123 rs2 = get_release_state (ver2, index2);
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; // undefined
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.

References get_part(), get_release_state(), is_text(), and prepare_version_string().

Referenced by Ensure(), Ensure(), Ensure(), Ensure(), Ensure(), Ensure(), Ensure(), Ensure(), Ensure(), Ensure(), Ensure(), Ensure(), Ensure(), and Ensure().

Here is the call graph for this function:
Here is the caller graph for this function: