From: Vincent Hanquez Date: Wed, 29 Apr 2009 13:39:49 +0000 (+0100) Subject: add base64 lib X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=99711431f67e60add0d75c3267018b3e20d49a61;p=xenclient%2Ftoolstack.git add base64 lib --- diff --git a/Makefile b/Makefile index ef5e90d..a7630da 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ INSTALL = install HOTPLUG_SCRIPTS=block block-frontend tap vif SUBDIRS = libs/uuid libs/stdext libs/mmap \ + libs/base64 \ libs/json libs/jsonrpc \ libs/log libs/xc libs/eventchn \ libs/xb libs/xs libs/netdev \ diff --git a/libs/base64/Makefile b/libs/base64/Makefile new file mode 100644 index 0000000..7b205a2 --- /dev/null +++ b/libs/base64/Makefile @@ -0,0 +1,28 @@ +TOPLEVEL=../.. +include $(TOPLEVEL)/common.make + +OCAMLINCLUDE += -I ../stdext + +OBJS = base64 +INTF = +LIBS = base64.cma base64.cmxa + +all: $(INTF) $(LIBS) $(PROGRAMS) + +bins: $(PROGRAMS) + +libs: $(LIBS) + +base64_OBJS = $(OBJS) +OCAML_NOC_LIBRARY = base64 + +.PHONY: install +install: $(LIBS) META + ocamlfind install -destdir $(DESTDIR)$(shell ocamlfind printconf destdir) -ldconf ignore base64 META $(INTF) $(LIBS) *.a *.so *.cmx + +.PHONY: uninstall +uninstall: + ocamlfind remove base64 + +include $(TOPLEVEL)/Makefile.rules + diff --git a/libs/base64/base64.ml b/libs/base64/base64.ml new file mode 100644 index 0000000..0085ba1 --- /dev/null +++ b/libs/base64/base64.ml @@ -0,0 +1,74 @@ +(* + * Copyright (C) 2008-2009 Citrix Ltd. + * Author Dave Scott + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; version 2.1 only. with the special + * exception on linking described in file LICENSE. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + *) + +open Stringext + +let code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +let padding = '=' + +let of_char x = if x = padding then 0 else String.index code x + +let to_char x = code.[x] + +let strip_whitespace s = + String.implode (List.filter (fun x->not (List.mem x [' ';'\t';'\n';'\r'])) (String.explode s)) + +let decode x = + let x = strip_whitespace x in + let words = String.length x / 4 in + let padding = + if String.length x = 0 then 0 else ( + if x.[String.length x - 2] = padding + then 2 else (if x.[String.length x - 1] = padding then 1 else 0)) in + let output = String.make (words * 3 - padding) '\000' in + for i = 0 to words - 1 do + let a = of_char x.[4 * i + 0] + and b = of_char x.[4 * i + 1] + and c = of_char x.[4 * i + 2] + and d = of_char x.[4 * i + 3] in + let n = (a lsl 18) lor (b lsl 12) lor (c lsl 6) lor d in + let x = (n lsr 16) land 255 + and y = (n lsr 8) land 255 + and z = n land 255 in + output.[3 * i + 0] <- char_of_int x; + if i <> words - 1 || padding < 2 then output.[3 * i + 1] <- char_of_int y; + if i <> words - 1 || padding < 1 then output.[3 * i + 2] <- char_of_int z; + done; + output + +let encode x = + let length = String.length x in + let words = (length + 2) / 3 in (* rounded up *) + let padding = if length mod 3 = 0 then 0 else 3 - (length mod 3) in + let output = String.make (words * 4) '\000' in + let get i = if i >= length then 0 else int_of_char x.[i] in + for i = 0 to words - 1 do + let x = get (3 * i + 0) + and y = get (3 * i + 1) + and z = get (3 * i + 2) in + let n = (x lsl 16) lor (y lsl 8) lor z in + let a = (n lsr 18) land 63 + and b = (n lsr 12) land 63 + and c = (n lsr 6) land 63 + and d = n land 63 in + output.[4 * i + 0] <- to_char a; + output.[4 * i + 1] <- to_char b; + output.[4 * i + 2] <- to_char c; + output.[4 * i + 3] <- to_char d; + done; + for i = 1 to padding do + output.[String.length output - i] <- '='; + done; + output diff --git a/libs/base64/base64.mli b/libs/base64/base64.mli new file mode 100644 index 0000000..6765b64 --- /dev/null +++ b/libs/base64/base64.mli @@ -0,0 +1,7 @@ + +(** decode a string encoded in base64. Will leave trailing NULLs on the string + padding it out to a multiple of 3 characters *) +val decode: string -> string + +(** encode a string into base64 *) +val encode: string -> string