Commits

"Rör...@gmail.com>"  committed 4c5d3ad

Substituted almost all loops with recursion or higher-order-function.

  • Participants
  • Parent commits b0db7fc

Comments (0)

Files changed (1)

File footnotes.ml

 
 let output_endline c s = output_string c s; output_char c '\n'
 
-exception End_of_body
-
 (* read the body from inc, substitute the references from table refs *)
 (* if ref is not in refs, evaluate unknown_ref; print to outc *)
-let process_body inc outc refs unknown_ref =
-  let sub_ref l _ =
+let rec process_body inc outc refs unknown_ref =
+  let l = input_line inc in
+  if l = sep_line then output_endline outc sep_line else
+  let sub_ref _ =
     let old_n = int_of_string (Str.matched_group 1 l) in
     try ref_of_int (Hashtbl.find refs old_n)
-    with Not_found -> unknown_ref old_n
-  in
-  try
-    while true do
-      let l = input_line inc in
-      if l = sep_line then raise End_of_body;
-      output_endline outc
-	(Str.global_substitute ref_regexp (sub_ref l) l)
-    done
-  with End_of_body -> output_endline outc sep_line
+    with Not_found -> unknown_ref old_n in
+  output_endline outc (Str.global_substitute ref_regexp sub_ref l);
+  process_body inc outc refs unknown_ref
 
 (* read the foots from inc, process the lines with process_foot *)
-let process_foots inc process_foot malformed_foot =
-  try
-    while true do
-      let l = input_line inc in
+let rec process_foots inc process_foot malformed_foot =
+  let lo = try Some (input_line inc) with End_of_file -> None in
+  match lo with
+    None   -> ()
+  | Some l ->
       if Str.string_match ref_regexp l 0 then
 	process_foot l (int_of_string (Str.matched_group 1 l))
-      else malformed_foot l
-    done
-  with End_of_file -> ()
+      else malformed_foot l;
+      process_foots inc process_foot malformed_foot
 
 (* insert a new reference for old_n into refs and return the new n *)
 let insert_ref refs old_n =
       Not_found -> prerr_endline ("unreferenced footnote: " ^ l)
   and prerr_malformed l = prerr_endline ("malformed footnote: " ^ l) in
   process_foots inc add_foot prerr_malformed;
-  for i = 1 to Array.length foots do
-    output_string outc (ref_of_int (i));
-    match foots.(i-1) with
+  let print_foot i foot =
+    output_string outc (ref_of_int (i + 1));
+    match foot with
       None   -> output_endline outc " ### missing footnote ###"
-    | Some l -> output_endline outc l
-  done
+    | Some l -> output_endline outc l in
+  Array.iteri print_foot foots
 
 (* renumber the footnote references by the original footnote order *)
 let renumber_by_foots inc outc =
-  while input_line inc <> sep_line do () done;
+  while input_line inc <> sep_line do () done; (* skip the body *)
   let refs = Hashtbl.create 1000000 in
   let add_foot_ref _ old_n =
-    if not (Hashtbl.mem refs old_n) then ignore (insert_ref refs old_n)
-  in
+    if not (Hashtbl.mem refs old_n) then
+      ignore (insert_ref refs old_n) in
   process_foots inc add_foot_ref ignore;
-  seek_in inc 0;
+  seek_in inc 0;			(* back to beginning *)
   process_body inc outc refs (function _ -> "[?]");
   let print_foot l old_n =
     let n = Hashtbl.find refs old_n in
     output_string outc (ref_of_int n);
-    output_endline outc (Str.string_after l (Str.match_end ()))
-  in
+    output_endline outc (Str.string_after l (Str.match_end ())) in
   process_foots inc print_foot (output_endline outc)
 
 (* renumber the footnote references *)
     let do_file f =
       let c = open_in f in
       (try renumber !by_foots c stdout with e -> close_in c; raise e);
-      close_in c
-    in
+      close_in c in
     Arg.parse [("-f", Arg.Set by_foots,
 		"Renumber footnotes by their original order")]
       do_file "Usage: footnotes [OPTION...] [file...]"