Version 0.3.2.8.
[virt-top.git] / virt-top / virt_top_utils.ml
diff --git a/virt-top/virt_top_utils.ml b/virt-top/virt_top_utils.ml
new file mode 100644 (file)
index 0000000..3a0c4ba
--- /dev/null
@@ -0,0 +1,74 @@
+(* 'top'-like tool for libvirt domains.
+ * $Id: virt_top.ml,v 1.5 2007/08/30 13:52:40 rjones Exp $
+ *)
+
+let (//) = Filename.concat
+
+(* Input a whole file as a list of lines. *)
+let input_all_lines chan =
+  let lines = ref [] in
+  (try
+     while true; do
+       lines := input_line chan :: !lines
+     done
+   with
+     End_of_file -> ());
+  List.rev !lines
+
+(* Trim whitespace from the beginning and end of strings. *)
+let isspace c =
+  c = ' '
+  (* || c = '\f' *) || c = '\n' || c = '\r' || c = '\t' (* || c = '\v' *)
+
+let triml ?(test = isspace) str =
+  let i = ref 0 in
+  let n = ref (String.length str) in
+  while !n > 0 && test str.[!i]; do
+    decr n;
+    incr i
+  done;
+  if !i = 0 then str
+  else String.sub str !i !n
+
+let trimr ?(test = isspace) str =
+  let n = ref (String.length str) in
+  while !n > 0 && test str.[!n-1]; do
+    decr n
+  done;
+  if !n = String.length str then str
+  else String.sub str 0 !n
+
+let trim ?(test = isspace) str =
+  trimr (triml str)
+
+(* Read a configuration file as a list of (key, value) pairs.
+ * If the config file is missing this returns an empty list.
+ *)
+let blanks_and_comments = Str.regexp "^[ \t]*\\(#.*\\)?$"
+
+let read_config_file filename =
+  let lines =
+    try
+      let chan = open_in filename in
+      let lines = input_all_lines chan in
+      close_in chan;
+      lines
+    with
+      Sys_error _ -> [] in          (* Ignore errors opening file. *)
+
+  (* Line numbers. *)
+  let lines =
+    let i = ref 0 in List.map (fun line -> (incr i; !i), line) lines in
+
+  (* Remove blank lines and comment lines. *)
+  let lines =
+    List.filter
+      (fun (lineno, line) ->
+        not (Str.string_match blanks_and_comments line 0)) lines in
+
+  (* Convert to key, value pairs. *)
+  List.map (
+    fun (lineno, line) ->
+      let key, value = ExtString.String.split line " " in
+      lineno, trim key, trim value
+  ) lines