From 8c9b5601a87d4d30e6be5e621bbaf1950a3ef9b4 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Tue, 22 Sep 2015 22:29:37 +0200 Subject: [PATCH] add `CCString.compare_versions` --- src/core/CCString.cppo.ml | 24 ++++++++++++++++++++++++ src/core/CCString.mli | 16 ++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/core/CCString.cppo.ml b/src/core/CCString.cppo.ml index 03053161..7fd6e70e 100644 --- a/src/core/CCString.cppo.ml +++ b/src/core/CCString.cppo.ml @@ -198,6 +198,30 @@ module Split = struct else Some (String.sub s 0 i, String.sub s (i+1) (String.length s - i - 1)) end +let compare_versions a b = + let of_int s = try Some (int_of_string s) with _ -> None in + let rec cmp_rec a b = match a(), b() with + | None, None -> 0 + | Some _, None -> 1 + | None, Some _ -> -1 + | Some x, Some y -> + match of_int x, of_int y with + | None, None -> + let c = String.compare x y in + if c<>0 then c else cmp_rec a b + | Some _, None -> 1 + | None, Some _ -> -1 + | Some x, Some y -> + let c = Pervasives.compare x y in + if c<>0 then c else cmp_rec a b + in + cmp_rec (Split.gen_cpy ~by:"." a) (Split.gen_cpy ~by:"." b) + +(*$Q + Q.(pair printable_string printable_string) (fun (a,b) -> \ + CCOrd.equiv (compare_versions a b) (CCOrd.opp (compare_versions b a))) +*) + let repeat s n = assert (n>=0); let len = String.length s in diff --git a/src/core/CCString.mli b/src/core/CCString.mli index d3272145..2f93d061 100644 --- a/src/core/CCString.mli +++ b/src/core/CCString.mli @@ -312,6 +312,22 @@ module Split : sig *) end +(** {2 Utils} *) + +val compare_versions : string -> string -> int +(** [compare_versions a b] compares {i version strings} [a] and [b], + considering that numbers are above text. + @since NEXT_RELEASE *) + +(*$T + compare_versions "0.1.3" "0.1" > 0 + compare_versions "10.1" "2.0" > 0 + compare_versions "0.1.alpha" "0.1" > 0 + compare_versions "0.3.dev" "0.4" < 0 + compare_versions "0.foo" "0.0" < 0 + compare_versions "1.2.3.4" "01.2.4.3" < 0 +*) + (** {2 Slices} A contiguous part of a string *) module Sub : sig