Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 : #include <ctype.h>
11 : #include <ctype.h>
12 : #include <string.h>
13 :
14 : #include <comphelper/string.hxx>
15 : #include <rtl/ustring.hxx>
16 :
17 : namespace comphelper { namespace string {
18 :
19 : namespace {
20 :
21 : // BSD licensed, from http://git.musl-libc.org/cgit/musl/plain/src/string/strverscmp.c
22 :
23 35 : int strverscmp(const char *l, const char *r)
24 : {
25 35 : int haszero=1;
26 142 : while (*l==*r) {
27 73 : if (!*l) return 0;
28 :
29 72 : if (*l=='0') {
30 4 : if (haszero==1) {
31 4 : haszero=0;
32 : }
33 68 : } else if (isdigit(*l)) {
34 32 : if (haszero==1) {
35 32 : haszero=2;
36 : }
37 : } else {
38 36 : haszero=1;
39 : }
40 72 : l++; r++;
41 : }
42 34 : if (haszero==1 && (*l=='0' || *r=='0')) {
43 10 : haszero=0;
44 : }
45 34 : if ((isdigit(*l) && isdigit(*r) ) && haszero) {
46 10 : size_t lenl=0, lenr=0;
47 10 : while (isdigit(l[lenl]) ) lenl++;
48 10 : while (isdigit(r[lenr]) ) lenr++;
49 10 : if (lenl==lenr) {
50 8 : return (*l - *r);
51 2 : } else if (lenl>lenr) {
52 1 : return 1;
53 : } else {
54 1 : return -1;
55 : }
56 : } else {
57 24 : return (*l - *r);
58 : }
59 : }
60 :
61 : } // anonymous namespace
62 :
63 35 : int compareVersionStrings(const OUString& a, const OUString& b)
64 : {
65 35 : return strverscmp(OUStringToOString(a, RTL_TEXTENCODING_UTF8).getStr(), OUStringToOString(b, RTL_TEXTENCODING_UTF8).getStr());
66 : }
67 :
68 : } }
69 :
70 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|