]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/DEVEL/pxp/pxp/tools/insert_variant
Initial revision
[helm.git] / helm / DEVEL / pxp / pxp / tools / insert_variant
diff --git a/helm/DEVEL/pxp/pxp/tools/insert_variant b/helm/DEVEL/pxp/pxp/tools/insert_variant
new file mode 100755 (executable)
index 0000000..cb592bb
--- /dev/null
@@ -0,0 +1,105 @@
+#! /bin/sh
+# (*
+exec ocaml "$0" "$@"
+*) directory ".";;
+
+(* $Id$
+ * ----------------------------------------------------------------------
+ *
+ *)
+
+let get_arg variant insert_line =
+  (* returns the argument of an "#insert" line *)
+  let s = ref "" in
+  for i = 8 to String.length insert_line - 1 do
+    match insert_line.[i] with
+       ' ' -> ()
+      | '*' ->
+         (* replace '*' with 'variant' *)
+         s := !s ^ variant
+      | c ->
+         s := !s ^ String.make 1 c
+  done;
+  !s
+;;
+
+
+let edit_file variant name =
+  let basename = Filename.chop_suffix name ".src" in
+  let mllname = basename ^ "_" ^ variant ^ ".mll" in
+  let chin = open_in name in
+  let chout = open_out mllname in
+  output_string chout "(* File generated by insert_variant; DO NOT EDIT! *)\n";
+  begin try
+    while true do
+      let line = input_line chin in
+      (* We do not have Str here. *)
+      if String.length line >= 8 & String.sub line 0 8 = "#insert " then begin
+       let insname = get_arg variant line in
+       (* Copy the file 'insname' to chout *)
+       let chcopy = open_in insname in
+       let n = in_channel_length chcopy in
+       let s = String.create n in
+       really_input chcopy s 0 n;
+       close_in chcopy;
+       output_string chout s;
+      end
+      else begin
+       output_string chout line;
+       output_char chout '\n';
+      end
+    done
+  with
+      End_of_file -> ()
+  end;
+  close_in chin;
+  close_out chout
+;;
+
+
+let main() =
+  let variant = ref "" in
+  let files = ref [] in
+  Arg.current := 0;          (* Because of a OCaml-3.00 bug *)
+  Arg.parse
+      [ "-variant", Arg.String (fun s -> variant := s),
+               "<name>  Set the variant (character encoding)";
+      ]
+      (fun s -> files := !files @ [s])
+      "insert_variant [ options ] file.src ...
+
+Reads the files, replaces the #insert lines by the referred files, and 
+writes the file file_variant.mll. 
+
+The #insert lines include the specified file into the source. The
+asterisk (*) is replaced by the name of the variant.
+
+Options:
+";
+  
+  if !variant = "" then 
+    failwith "No variant specified!";
+
+  List.iter 
+    (fun name -> edit_file !variant name)
+    !files
+;;
+
+
+main();;
+
+(* ======================================================================
+ * History:
+ * 
+ * $Log$
+ * Revision 1.1  2000/11/17 09:57:35  lpadovan
+ * Initial revision
+ *
+ * Revision 1.2  2000/05/20 21:14:33  gerd
+ *     Workaround for an OCaml 3.00 bug.
+ *
+ * Revision 1.1  2000/05/20 20:30:15  gerd
+ *     Initial revision.
+ *
+ * 
+ *)