Version française
Home     About     Download     Resources     Contact us    
Browse thread
Re: [Caml-list] Dynamic linking
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Jeffrey Loren Shaw <shawjef3@m...>
Subject: Re: [Caml-list] Dynamic linking
Philippe, here's a little program I wrote that you might find useful. 

compile: 

ocamlopt -o keepsource keepsource.ml 

usage: 

./keepsource foo.ml 

creates a new file foo_keepsource.ml. If you compile it to the executable 
foo you can do ./foo -source to get the original source back. 

./keepsource foo.ml -compile 

does the same thing bug gives you an executable named foo in addition to 
foo_keepsource.ml. 

It will only work on single-file programs, and I haven't tested it much. 

(* keepsource.ml *) 

let replace_quote str =
 let result = ref [] in
 for i = 0 to String.length str - 1 do
   match str.[i] with
     '\\' -> result := '\\'::'\\'::!result
   | '\"' -> result := '\"'::'\\'::!result
   | a -> result := a::!result
 done;
 let buffer = " " in
 List.fold_left
   (fun accum a ->
      buffer.[0] <- a;
      buffer ^ accum
   )
   ""
   !result;; 

let print_help () =
   print_endline
   "usage: keepsource infile.ml (-compile)";; 

if Array.length Sys.argv = 1 then print_help ();; 

let sourcefile = Sys.argv.(1);; 

let sourcefile_keepsource = String.sub sourcefile 0 (String.length 
sourcefile - 3) ^ "_keepsource.ml";; 

if Sys.file_exists sourcefile then
 let inchan = open_in sourcefile in
 let source = ref [] in
 (
   try
     while true do
	source := (input_line inchan)::!source
     done
   with
     End_of_file -> ()
 );
 close_in inchan;
 source := List.rev !source;
 let outchan = open_out sourcefile_keepsource in
 let output = output_string outchan in
 output "let sourcecode = \"";
 List.iter (fun s -> output (replace_quote s^"\n")) !source;
 output "\"\n\nlet main () = (";
 List.iter (fun s -> output (s^"\n")) !source;
 output ");; 

if Array.length Sys.argv > 1 then
 if Sys.argv.(1) = \"-source\" then
   (
     print_endline sourcecode;
     exit 0
   )
 else
   main ()
 else
   main ()
";
 close_out outchan;; 

if Array.length Sys.argv > 2 then
 if Sys.argv.(2) = "-compile" then
   let compile_command =
     "ocamlopt -o " ^ String.sub sourcefile 0 (String.length sourcefile - 3) 
^ " "^ sourcefile_keepsource in
   ignore
     (
	Sys.command compile_command
     )