From b4c853f7d493af1d71f352832fed29eb7e377e8f Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Fri, 26 Nov 2010 21:49:58 +0000 Subject: [PATCH] generator: More options for internal pod2text generator. Allow extra width, and trimming options. This necessitates a change in the memoized format. To avoid causing crashes if a new generator loads the old format, also change the filename of the memo file. --- .gitignore | 2 +- generator/generator_utils.ml | 21 ++++++++++++++------- generator/generator_utils.mli | 21 +++++++++++++++------ 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 7da3f32..791b09e 100644 --- a/.gitignore +++ b/.gitignore @@ -99,7 +99,7 @@ fuse/guestmount fuse/guestmount.1 fuse/guestmount.static fuse/stamp-guestmount.pod -generator/.pod2text.data +generator/.pod2text.data* generator/generator generator/stamp-generator guestfish.1 diff --git a/generator/generator_utils.ml b/generator/generator_utils.ml index 6dc11bf..27b543d 100644 --- a/generator/generator_utils.ml +++ b/generator/generator_utils.ml @@ -244,15 +244,17 @@ let seq_of_test = function | TestLastFail s -> s let c_quote str = + let str = replace_str str "\\" "\\\\" in let str = replace_str str "\r" "\\r" in let str = replace_str str "\n" "\\n" in let str = replace_str str "\t" "\\t" in let str = replace_str str "\000" "\\0" in + let str = replace_str str "\"" "\\\"" in str (* Used to memoize the result of pod2text. *) -let pod2text_memo_filename = "generator/.pod2text.data" -let pod2text_memo : ((int * string * string), string list) Hashtbl.t = +let pod2text_memo_filename = "generator/.pod2text.data.version.2" +let pod2text_memo : ((int option * bool * bool * string * string), string list) Hashtbl.t = try let chan = open_in pod2text_memo_filename in let v = input_value chan in @@ -271,22 +273,27 @@ let pod2text_memo_updated () = * Because this is very slow (the slowest part of autogeneration), * we memoize the results. *) -let pod2text ~width name longdesc = - let key = width, name, longdesc in +let pod2text ?width ?(trim = true) ?(discard = true) name longdesc = + let key = width, trim, discard, name, longdesc in try Hashtbl.find pod2text_memo key with Not_found -> let filename, chan = Filename.open_temp_file "gen" ".tmp" in fprintf chan "=head1 %s\n\n%s\n" name longdesc; close_out chan; - let cmd = sprintf "pod2text -w %d %s" width (Filename.quote filename) in + let cmd = + match width with + | Some width -> + sprintf "pod2text -w %d %s" width (Filename.quote filename) + | None -> + sprintf "pod2text %s" (Filename.quote filename) in let chan = open_process_in cmd in let lines = ref [] in let rec loop i = let line = input_line chan in - if i = 1 then (* discard the first line of output *) + if i = 1 && discard then (* discard the first line of output *) loop (i+1) else ( - let line = triml line in + let line = if trim then triml line else line in lines := line :: !lines; loop (i+1) ) in diff --git a/generator/generator_utils.mli b/generator/generator_utils.mli index bbdab79..5104a16 100644 --- a/generator/generator_utils.mli +++ b/generator/generator_utils.mli @@ -91,14 +91,23 @@ val seq_of_test : Generator_types.test -> Generator_types.seq val c_quote : string -> string (** Perform quoting on a string so it is safe to include in a C source file. *) -val pod2text : width:int -> string -> string -> string list -(** [pod2text ~width name longdesc] converts the POD in [longdesc] to - plain ASCII lines of text. This is the slowest part of - autogeneration, so the results are memoized into a temporary - file. *) +val pod2text : ?width:int -> ?trim:bool -> ?discard:bool -> string -> string -> string list + (** [pod2text ?width ?trim ?discard name longdesc] converts the POD in + [longdesc] to plain ASCII lines of text. + + [width] is the width in characters. If not specified, then + use the pod2text default. + + [trim] means trim the left margin (useful when including the + output inside comments, as in Java generator). + + [discard] means discard the first heading. + + This is the slowest part of autogeneration, so the results are + memoized into a temporary file. *) val action_compare : Generator_types.action -> Generator_types.action -> int -(** Compare the names of two actions, for sorting. *) + (** Compare the names of two actions, for sorting. *) val chars : char -> int -> string (** [chars c n] creates a string containing character c repeated n times. *) -- 1.8.3.1