(*
* Copyright 2010, INRIA, University of Copenhagen
* Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
* This file is part of Coccinelle.
*
* Coccinelle is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, according to version 2 of the License.
*
* Coccinelle is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Coccinelle. If not, see .
*
* The authors reserve the right to distribute this or future versions of
* Coccinelle under other licenses.
*)
(*
* Copyright 2010, INRIA, University of Copenhagen
* Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
* This file is part of Coccinelle.
*
* Coccinelle is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, according to version 2 of the License.
*
* Coccinelle is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Coccinelle. If not, see .
*
* The authors reserve the right to distribute this or future versions of
* Coccinelle under other licenses.
*)
let lines =
["Copyright 2010, INRIA, University of Copenhagen";
"Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix";
"Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen";
"Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix";
"This file is part of Coccinelle.";
"";
"Coccinelle is free software: you can redistribute it and/or modify";
"it under the terms of the GNU General Public License as published by";
"the Free Software Foundation, according to version 2 of the License.";
"";
"Coccinelle is distributed in the hope that it will be useful,";
"but WITHOUT ANY WARRANTY; without even the implied warranty of";
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the";
"GNU General Public License for more details.";
"";
"You should have received a copy of the GNU General Public License";
"along with Coccinelle. If not, see .";
"";
"The authors reserve the right to distribute this or future versions of";
"Coccinelle under other licenses."
]
let comment_lines =
List.map (function x -> if x <> "" then " * "^x else " *") lines
let cpp_lines = "/*" :: comment_lines @ [" */"]
let ml_lines = "(*" :: comment_lines @ [" *)"]
let make_lines = (List.map (function x -> if x <> "" then "# "^x else "#") lines)
let c_lines = (List.map (function x -> if x <> "" then "// "^x else "//") lines)
let do_one file =
let lines =
if Filename.check_suffix file ".cocci" then c_lines else
if Filename.check_suffix file ".mly" then cpp_lines else
if Filename.check_suffix file ".ml" then ml_lines else
if Filename.check_suffix file ".mli" then ml_lines else
if Filename.check_suffix file ".mll" then ml_lines else
if Filename.check_suffix file ".pl" then make_lines else
if Filename.basename file = "Makefile" then make_lines else
failwith (Printf.sprintf "unknown file type: %s" file) in
let _ = Sys.command (Printf.sprintf "cp %s /tmp/tmpfl" file) in
let o = open_out file in
List.iter (function l -> Printf.fprintf o "%s\n" l) lines;
Printf.fprintf o "\n";
Printf.fprintf o "\n";
close_out o;
let _ = Sys.command (Printf.sprintf "cat /tmp/tmpfl >> %s" file) in
()
(* pad's modif *)
let (+>) o f = f o
let cat file =
let chan = open_in file in
let rec cat_aux acc () =
(* cant do input_line chan::aux() cos ocaml eval from right to left ! *)
let (b, l) = try (true, input_line chan) with End_of_file -> (false, "") in
if b
then cat_aux (l::acc) ()
else acc
in
cat_aux [] () +> List.rev +> (fun x -> close_in chan; x)
let rec process dir =
let files =
try
List.map (function fl -> dir^"/"^fl)
(Array.to_list(Sys.readdir dir))
with Sys_error _ -> [] in
List.iter (function file ->
try
let xs = cat file in
if List.exists (fun s ->
s = "* This file is part of Coccinelle."
||
s = "# This file is part of Coccinelle."
||
s = "// This file is part of Coccinelle."
||
Str.string_match (Str.regexp_string "Copyright") s 0
) xs
then print_string ("already processed: " ^ file ^ "\n")
else begin
do_one file;
print_string ("processed: " ^ file ^ "\n");
end
with _ ->
print_string ("skipped: " ^ file ^ "\n");
()
) files;
(* pad: no recursive call in directory List.iter process files *)
()
let _ = process "."