URI:
       strverscmp.c - noice - small file browser (mirror / fork from 2f30.org)
  HTML git clone git://git.codemadness.org/noice
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       strverscmp.c (979B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include <ctype.h>
            3 #include <stdlib.h>
            4 #include <string.h>
            5 
            6 #include "util.h"
            7 
            8 int
            9 strverscmp(const char *str1, const char *str2)
           10 {
           11         size_t len1 = strlen(str1);
           12         size_t len2 = strlen(str2);
           13         size_t i1 = 0;
           14         size_t i2 = 0;
           15         for (; i1 < len1 && i2 < len2; i1++, i2++) {
           16                 unsigned char c1 = str1[i1];
           17                 unsigned char c2 = str2[i2];
           18                 if (isdigit(c1) && isdigit(c2)) {
           19                         unsigned long long int num1;
           20                         unsigned long long int num2;
           21                         char *end1;
           22                         char *end2;
           23                         num1 = strtoull(str1 + i1, &end1, 10);
           24                         num2 = strtoull(str2 + i2, &end2, 10);
           25                         DPRINTF_LLU(num1);
           26                         DPRINTF_LLU(num2);
           27                         if (num1 < num2)
           28                                 return -1;
           29                         if (num1 > num2)
           30                                 return 1;
           31                         i1 = end1 - str1 - 1;
           32                         i2 = end2 - str2 - 1;
           33                         if (i1 < i2)
           34                                 return -1;
           35                         if (i1 > i2)
           36                                 return 1;
           37                 } else {
           38                         if (c1 < c2)
           39                                 return -1;
           40                         if (c1 > c2)
           41                                 return 1;
           42                 }
           43         }
           44         if (len1 < len2)
           45                 return -1;
           46         if (len1 > len2)
           47                 return 1;
           48         return 0;
           49 }