aboutsummaryrefslogtreecommitdiffstats
path: root/www/quickie/files/freebsd.h
diff options
context:
space:
mode:
Diffstat (limited to 'www/quickie/files/freebsd.h')
-rw-r--r--www/quickie/files/freebsd.h43
1 files changed, 43 insertions, 0 deletions
diff --git a/www/quickie/files/freebsd.h b/www/quickie/files/freebsd.h
new file mode 100644
index 00000000000..52826298f5b
--- /dev/null
+++ b/www/quickie/files/freebsd.h
@@ -0,0 +1,43 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+int
+strverscmp(const char *s1, const char *s2);
+
+int
+strverscmp(const char *s1, const char *s2)
+{
+ static const char *digits = "0123456789";
+ int ret;
+ long n1, n2;
+ size_t p1, p2;
+
+ do {
+ p1 = strcspn(s1, digits);
+ p2 = strcspn(s2, digits);
+
+ /* Different prefix */
+ if ((ret = strncmp(s1, s2, p1)) != 0)
+ return ret;
+
+ s1 += p1;
+ s2 += p2;
+ n1 = strtol(s1, NULL, 10);
+ n2 = strtol(s2, NULL, 10);
+
+ if (n1 < n2)
+ return -1;
+ else if (n1 > n2)
+ return 1;
+
+ /* Numbers are equal or not present, try with next ones. */
+ p1 = strspn(s1, digits);
+ p2 = strspn(s2, digits);
+ s1 += p1;
+ s2 += p2;
+ } while (p1 == p2 && p1 != 0 && p1 != 0);
+
+ return strcmp(s1, s2);
+}