summaryrefslogtreecommitdiffstats
path: root/ocaml
diff options
context:
space:
mode:
authorRichard Jones <rjones@trick.home.annexia.org>2009-09-30 15:32:41 +0100
committerRichard Jones <rjones@trick.home.annexia.org>2009-09-30 16:14:35 +0100
commitd525103c8621f6ff0293311a8e8f9ac0c3580805 (patch)
tree65e5fd6115e3a1b7ab23513a303043be6632bf91 /ocaml
parentd278ef8ad9090441a713c7334804199318aeb3e1 (diff)
downloadlibguestfs-d525103c8621f6ff0293311a8e8f9ac0c3580805.tar.gz
libguestfs-d525103c8621f6ff0293311a8e8f9ac0c3580805.tar.xz
libguestfs-d525103c8621f6ff0293311a8e8f9ac0c3580805.zip
OCaml viewer: Use ocamlduce to replace xpath code.
Diffstat (limited to 'ocaml')
-rw-r--r--ocaml/examples/LICENSE3
-rw-r--r--ocaml/examples/Makefile.am6
-rw-r--r--ocaml/examples/viewer.ml57
-rw-r--r--ocaml/examples/xmllight_loader.ml16
-rw-r--r--ocaml/examples/xmllight_loader.mli2
5 files changed, 36 insertions, 48 deletions
diff --git a/ocaml/examples/LICENSE b/ocaml/examples/LICENSE
index 990daefc..78d360e7 100644
--- a/ocaml/examples/LICENSE
+++ b/ocaml/examples/LICENSE
@@ -4,3 +4,6 @@ copied without any restrictions.
The files 'Throbber.png' and 'Throbber.gif' come from the source to
Firefox, and you should check the Firefox license before
redistributing those files.
+
+The files 'xmllight_loader.ml' and 'xmllight_loader.mli' come from
+http://yquem.inria.fr/~frisch/ocamlcduce/samples/xmllight/
diff --git a/ocaml/examples/Makefile.am b/ocaml/examples/Makefile.am
index d088c4a9..b516647d 100644
--- a/ocaml/examples/Makefile.am
+++ b/ocaml/examples/Makefile.am
@@ -13,11 +13,11 @@ if BUILD_OCAML_VIEWER
noinst_SCRIPTS += viewer
-viewer: throbber.ml viewer.ml
- $(OCAMLFIND) ocamlopt \
+viewer: throbber.ml xmllight_loader.mli xmllight_loader.ml viewer.ml
+ ocamlducefind opt \
-warn-error A \
-thread \
- -package libvirt,lablgtk2,extlib,xml-light,threads -I .. \
+ -package libvirt,lablgtk2,extlib,xml-light,ocamlduce,threads -I .. \
-predicates init,threads \
-linkpkg mlguestfs.cmxa gtkThread.cmx \
$^ -o $@
diff --git a/ocaml/examples/viewer.ml b/ocaml/examples/viewer.ml
index ef6627b1..eeff5252 100644
--- a/ocaml/examples/viewer.ml
+++ b/ocaml/examples/viewer.ml
@@ -10,6 +10,7 @@
* - extlib (http://code.google.com/p/ocaml-extlib/)
* - lablgtk2 (http://wwwfun.kurims.kyoto-u.ac.jp/soft/lsl/lablgtk.html
* - xml-light (http://tech.motion-twin.com/xmllight.html)
+ * - cduce and ocamlduce (http://cduce.org/)
* - ocaml-libvirt (http://libvirt.org/ocaml)
* - ocaml-libguestfs
*
@@ -314,52 +315,18 @@ end = struct
(match !dom with Some dom -> D.free dom | None -> ());
dom := None
- (* This would be much simpler if OCaml had either a decent XPath
- * implementation, or if ocamlduce was stable enough that we
- * could rely on it being available. So this is *not* an example
- * of either good OCaml or good programming. XXX
- *)
and get_devices_from_xml xml =
- let xml = Xml.parse_string xml in
- let devices =
- match xml with
- | Xml.Element ("domain", _, children) ->
- let devices =
- List.filter_map (
- function
- | Xml.Element ("devices", _, devices) -> Some devices
- | _ -> None
- ) children in
- List.concat devices
- | _ ->
- failwith "get_xml_desc didn't return <domain/>" in
- let rec source_dev_of = function
- | [] -> None
- | Xml.Element ("source", attrs, _) :: rest ->
- (try Some (List.assoc "dev" attrs)
- with Not_found -> source_dev_of rest)
- | _ :: rest -> source_dev_of rest
- in
- let rec source_file_of = function
- | [] -> None
- | Xml.Element ("source", attrs, _) :: rest ->
- (try Some (List.assoc "file" attrs)
- with Not_found -> source_file_of rest)
- | _ :: rest -> source_file_of rest
- in
- let devs =
- List.filter_map (
- function
- | Xml.Element ("disk", _, children) -> source_dev_of children
- | _ -> None
- ) devices in
- let files =
- List.filter_map (
- function
- | Xml.Element ("disk", _, children) -> source_file_of children
- | _ -> None
- ) devices in
- devs @ files
+ (* Lengthy discussion of the merits or otherwise of this code here:
+ * http://groups.google.com/group/fa.caml/browse_thread/thread/48e05d49b0f21b8a/5296bceb31ebfff3
+ *)
+ let xml = Xmllight_loader.from_string xml in
+ let xs = {{ [xml] }} in
+ let xs = {{ (((xs.(<domain..>_)) / .(<devices..>_)) / .(<disk..>_)) / }} in
+ let xs = {{ map xs with
+ | <source dev=(Latin1 & s) ..>_
+ | <source file=(Latin1 & s) ..>_ -> [s]
+ | _ -> [] }} in
+ {: xs :}
end
(* End of slave thread code. *)
(*----------------------------------------------------------------------*)
diff --git a/ocaml/examples/xmllight_loader.ml b/ocaml/examples/xmllight_loader.ml
new file mode 100644
index 00000000..46dd77f7
--- /dev/null
+++ b/ocaml/examples/xmllight_loader.ml
@@ -0,0 +1,16 @@
+open Xml
+open Ocamlduce.Load
+
+
+let from_xml ?ns xml =
+ let l = make ?ns () in
+ let rec aux = function
+ | Element (tag, attrs, child) ->
+ start_elem l tag attrs; List.iter aux child; end_elem l ()
+ | PCData s ->
+ text l s in
+ aux xml;
+ get l
+
+let from_file ?ns s = from_xml ?ns (parse_file s)
+let from_string ?ns s = from_xml ?ns (parse_string s)
diff --git a/ocaml/examples/xmllight_loader.mli b/ocaml/examples/xmllight_loader.mli
new file mode 100644
index 00000000..6c7bbe97
--- /dev/null
+++ b/ocaml/examples/xmllight_loader.mli
@@ -0,0 +1,2 @@
+val from_file : ?ns:bool -> string -> Ocamlduce.Load.anyxml
+val from_string : ?ns:bool -> string -> Ocamlduce.Load.anyxml