[Libguestfs] [PATCH 3/5] mllib: Add (Char|String).(lower|upper)case_ascii functions.
Pino Toscano
ptoscano at redhat.com
Wed Oct 7 11:26:12 UTC 2015
On Tuesday 06 October 2015 13:30:48 Richard W.M. Jones wrote:
> These functions come from upstream OCaml (4.03) where they were
> written by Gabriel Scherer under a compatible license.
>
> See also:
> http://caml.inria.fr/mantis/view.php?id=6694
> http://caml.inria.fr/mantis/view.php?id=6695
> ---
> mllib/common_utils.ml | 13 +++++++++++++
> mllib/common_utils.mli | 6 ++++++
> v2v/convert_windows.ml | 3 ++-
> v2v/utils.ml | 6 +++---
> 4 files changed, 24 insertions(+), 4 deletions(-)
>
> diff --git a/mllib/common_utils.ml b/mllib/common_utils.ml
> index f375317..97363df 100644
> --- a/mllib/common_utils.ml
> +++ b/mllib/common_utils.ml
> @@ -22,10 +22,23 @@ open Common_gettext.Gettext
>
> module Char = struct
> include Char
> +
> + let lowercase_ascii c =
> + if (c >= 'A' && c <= 'Z')
> + then unsafe_chr (code c + 32)
> + else c
> +
> + let uppercase_ascii c =
> + if (c >= 'a' && c <= 'z')
> + then unsafe_chr (code c - 32)
> + else c
> end
>
> module String = struct
> include String
> +
> + let lowercase_ascii s = map Char.lowercase_ascii s
> + let uppercase_ascii s = map Char.uppercase_ascii s
> end
>
> let (//) = Filename.concat
> diff --git a/mllib/common_utils.mli b/mllib/common_utils.mli
> index f42ae64..c0941f6 100644
> --- a/mllib/common_utils.mli
> +++ b/mllib/common_utils.mli
> @@ -25,6 +25,9 @@ module Char : sig
> val lowercase : char -> char
> val unsafe_chr : int -> char
> val uppercase : char -> char
> +
> + val lowercase_ascii : char -> char
> + val uppercase_ascii : char -> char
> end
> (** Override the Char module from stdlib. *)
>
> @@ -58,6 +61,9 @@ module String : sig
> val unsafe_get : string -> int -> char
> val unsafe_set : string -> int -> char -> unit
> val uppercase : string -> string
> +
> + val lowercase_ascii : string -> string
> + val uppercase_ascii : string -> string
> end
> (** Override the String module from stdlib. *)
>
> diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml
> index 67f5f25..ac281a0 100644
> --- a/v2v/convert_windows.ml
> +++ b/v2v/convert_windows.ml
> @@ -170,7 +170,8 @@ let convert ~keep_serial_console (g : G.guestfs) inspect source =
> let len = String.length data in
> let data =
> if len >= 8 &&
> - String.lowercase (String.sub data (len-8) 8) = "uninst.exe" then
> + String.lowercase_ascii (String.sub data (len-8) 8) = "uninst.exe"
> + then
> (String.sub data 0 (len-8)) ^ "_uninst.exe"
> else
> data in
> diff --git a/v2v/utils.ml b/v2v/utils.ml
> index 23d9e51..cdf7535 100644
> --- a/v2v/utils.ml
> +++ b/v2v/utils.ml
> @@ -230,10 +230,10 @@ let find_virtio_win_drivers virtio_win =
> fun (path, original_source, basename, get_contents) ->
> try
> (* Lowercased path, since the ISO may contain upper or lowercase
> - * path elements. XXX This won't work if paths contain non-ASCII.
> + * path elements.
> *)
> - let lc_path = String.lowercase path in
> - let lc_basename = String.lowercase basename in
> + let lc_path = String.lowercase_ascii path in
> + let lc_basename = String.lowercase_ascii basename in
>
> let extension =
> match last_part_of lc_basename '.' with
I guess these usages of String.lowercase reveal actual bugs in v2v,
which is not handling non-ASCII paths in Windows guests?
--
Pino Toscano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20151007/b497ccea/attachment.sig>
More information about the Libguestfs
mailing list