mrc0mmand / rpms / libguestfs

Forked from rpms/libguestfs 3 years ago
Clone

Blame SOURCES/0033-v2v-DOM-Add-doc_to_string-function.patch

e9bfca
From 4b5304704a5fa4cad1e5869ce97f27ff64ac492f Mon Sep 17 00:00:00 2001
e9bfca
From: "Richard W.M. Jones" <rjones@redhat.com>
e9bfca
Date: Tue, 20 Feb 2018 15:21:48 +0000
e9bfca
Subject: [PATCH] v2v: DOM: Add doc_to_string function.
e9bfca
e9bfca
Convert a document to an in-memory string.
e9bfca
e9bfca
(cherry picked from commit 802c8635cc2537a7d4b7af8981c670e2fdbb2675)
e9bfca
---
e9bfca
 v2v/DOM.ml  | 61 +++++++++++++++++++++++++++++++++--------------------
e9bfca
 v2v/DOM.mli |  3 +++
e9bfca
 2 files changed, 41 insertions(+), 23 deletions(-)
e9bfca
e9bfca
diff --git a/v2v/DOM.ml b/v2v/DOM.ml
e9bfca
index 7f66e0920..8b106224b 100644
e9bfca
--- a/v2v/DOM.ml
e9bfca
+++ b/v2v/DOM.ml
e9bfca
@@ -46,43 +46,48 @@ let e name attrs children =
e9bfca
  * we will be writing, ie. libvirt XML and OVF metadata, where
e9bfca
  * whitespace is generally not significant, but readability is useful.
e9bfca
  *)
e9bfca
-let rec node_to_chan ?(indent = 0) chan = function
e9bfca
-  | PCData str -> output_string chan (xml_quote_pcdata str)
e9bfca
+let rec node_to_buf ?(indent = 0) buf = function
e9bfca
+  | PCData str ->
e9bfca
+     Buffer.add_string buf (xml_quote_pcdata str)
e9bfca
   | Comment str ->
e9bfca
-    output_spaces chan indent;
e9bfca
-    fprintf chan "" (xml_quote_pcdata str)
e9bfca
-  | Element e -> element_to_chan ~indent chan e
e9bfca
-and element_to_chan ?(indent = 0) chan
e9bfca
+     buffer_add_spaces buf indent;
e9bfca
+     bprintf buf "" (xml_quote_pcdata str)
e9bfca
+  | Element e ->
e9bfca
+     element_to_buf ~indent buf e
e9bfca
+and element_to_buf ?(indent = 0) buf
e9bfca
     { e_name = name; e_attrs = attrs; e_children = children } =
e9bfca
-  output_spaces chan indent;
e9bfca
-  fprintf chan "<%s" name;
e9bfca
-  List.iter (fun (n, v) -> fprintf chan " %s='%s'" n (xml_quote_attr v)) attrs;
e9bfca
+  buffer_add_spaces buf indent;
e9bfca
+  bprintf buf "<%s" name;
e9bfca
+  List.iter (fun (n, v) -> bprintf buf " %s='%s'" n (xml_quote_attr v)) attrs;
e9bfca
   if children <> [] then (
e9bfca
-    output_string chan ">";
e9bfca
+    Buffer.add_string buf ">";
e9bfca
     let last_child_was_element = ref false in
e9bfca
     List.iter (
e9bfca
       function
e9bfca
       | Element _ as child ->
e9bfca
         last_child_was_element := true;
e9bfca
-        output_char chan '\n';
e9bfca
-        node_to_chan ~indent:(indent+2) chan child;
e9bfca
+        Buffer.add_char buf '\n';
e9bfca
+        node_to_buf ~indent:(indent+2) buf child;
e9bfca
       | PCData _ as child ->
e9bfca
         last_child_was_element := false;
e9bfca
-        node_to_chan ~indent:(indent+2) chan child;
e9bfca
+        node_to_buf ~indent:(indent+2) buf child;
e9bfca
       | Comment _ as child ->
e9bfca
         last_child_was_element := true;
e9bfca
-        output_char chan '\n';
e9bfca
-        node_to_chan ~indent:(indent+2) chan child;
e9bfca
+        Buffer.add_char buf '\n';
e9bfca
+        node_to_buf ~indent:(indent+2) buf child;
e9bfca
     ) children;
e9bfca
     if !last_child_was_element then (
e9bfca
-      output_char chan '\n';
e9bfca
-      output_spaces chan indent
e9bfca
+      Buffer.add_char buf '\n';
e9bfca
+      buffer_add_spaces buf indent
e9bfca
     );
e9bfca
-    fprintf chan "</%s>" name
e9bfca
+    bprintf buf "</%s>" name
e9bfca
   ) else (
e9bfca
-    output_string chan "/>"
e9bfca
+    Buffer.add_string buf "/>"
e9bfca
   )
e9bfca
 
e9bfca
+and buffer_add_spaces buf n =
e9bfca
+  Buffer.add_string buf (String.spaces n)
e9bfca
+
e9bfca
 (* Quote XML <element attr='...'> content.  Note you must use single
e9bfca
  * quotes around the attribute.
e9bfca
  *)
e9bfca
@@ -99,10 +104,20 @@ and xml_quote_pcdata str =
e9bfca
   let str = String.replace str ">" ">" in
e9bfca
   str
e9bfca
 
e9bfca
-let doc_to_chan chan (Doc doc) =
e9bfca
-  fprintf chan "\n";
e9bfca
-  element_to_chan chan doc;
e9bfca
-  fprintf chan "\n"
e9bfca
+let doc_to_buf buf (Doc doc) =
e9bfca
+  bprintf buf "\n";
e9bfca
+  element_to_buf buf doc;
e9bfca
+  bprintf buf "\n"
e9bfca
+
e9bfca
+let doc_to_string doc =
e9bfca
+  let buf = Buffer.create 4096 in
e9bfca
+  doc_to_buf buf doc;
e9bfca
+  Buffer.contents buf
e9bfca
+
e9bfca
+let doc_to_chan chan doc =
e9bfca
+  let buf = Buffer.create 4096 in
e9bfca
+  doc_to_buf buf doc;
e9bfca
+  Buffer.output_buffer chan buf
e9bfca
 
e9bfca
 let path_to_nodes (Doc doc) path =
e9bfca
   match path with
e9bfca
diff --git a/v2v/DOM.mli b/v2v/DOM.mli
e9bfca
index 1aa89b7e7..99223c389 100644
e9bfca
--- a/v2v/DOM.mli
e9bfca
+++ b/v2v/DOM.mli
e9bfca
@@ -60,6 +60,9 @@ v}
e9bfca
 v}
e9bfca
 *)
e9bfca
 
e9bfca
+val doc_to_string : doc -> string
e9bfca
+(** Convert a document to a string representation. *)
e9bfca
+
e9bfca
 val doc_to_chan : out_channel -> doc -> unit
e9bfca
 (** Write the XML document to an output channel. *)
e9bfca
 
e9bfca
-- 
e9bfca
2.17.1
e9bfca