LCOV - code coverage report
Current view: top level - comphelper/source/misc - compareversionstrings.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 26 26 100.0 %
Date: 2015-06-13 12:38:46 Functions: 2 2 100.0 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11