1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
14 * The Original Code is Mozilla XPCOM.
16 * The Initial Developer of the Original Code is
17 * Benjamin Smedberg <benjamin@smedbergs.us>.
19 * Portions created by the Initial Developer are Copyright (C) 2005
20 * the Initial Developer. All Rights Reserved.
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
36 * ***** END LICENSE BLOCK ***** */
38 #include "nsVersionComparator.h"
46 const char *strB
; // NOT null-terminated, can be a null pointer
51 char *extraD
; // null-terminated
55 * Parse a version part into a number and "extra text".
57 * @returns A pointer to the next versionpart, or null if none.
60 ParseVP(char *part
, VersionPart
&result
)
68 result
.extraD
= nsnull
;
73 dot
= strchr(part
, '.');
77 if (part
[0] == '*' && part
[1] == '\0') {
78 result
.numA
= PR_INT32_MAX
;
82 result
.numA
= strtol(part
, const_cast<char**>(&result
.strB
), 10);
90 if (result
.strB
[0] == '+') {
91 static const char kPre
[] = "pre";
95 result
.strBlen
= sizeof(kPre
) - 1;
98 const char *numstart
= strpbrk(result
.strB
, "0123456789+-");
100 result
.strBlen
= strlen(result
.strB
);
103 result
.strBlen
= numstart
- result
.strB
;
105 result
.numC
= strtol(numstart
, &result
.extraD
, 10);
107 result
.extraD
= nsnull
;
122 // compare two null-terminated strings, which may be null pointers
124 ns_strcmp(const char *str1
, const char *str2
)
126 // any string is *before* no string
133 return strcmp(str1
, str2
);
136 // compare two length-specified string, which may be null pointers
138 ns_strnncmp(const char *str1
, PRUint32 len1
, const char *str2
, PRUint32 len2
)
140 // any string is *before* no string
147 for (; len1
&& len2
; --len1
, --len2
, ++str1
, ++str2
) {
156 return len2
== 0 ? 0 : -1;
161 // compare two PRInt32
163 ns_cmp(PRInt32 n1
, PRInt32 n2
)
172 * Compares two VersionParts
175 CompareVP(VersionPart
&v1
, VersionPart
&v2
)
177 PRInt32 r
= ns_cmp(v1
.numA
, v2
.numA
);
181 r
= ns_strnncmp(v1
.strB
, v1
.strBlen
, v2
.strB
, v2
.strBlen
);
185 r
= ns_cmp(v1
.numC
, v2
.numC
);
189 return ns_strcmp(v1
.extraD
, v2
.extraD
);
193 NS_CompareVersions(const char *A
, const char *B
)
195 char *A2
= strdup(A
);
199 char *B2
= strdup(B
);
206 char *a
= A2
, *b
= B2
;
214 result
= CompareVP(va
, vb
);