Release coccinelle-0.2.4rc2
[bpt/coccinelle.git] / ocaml / run_ocamlcocci.ml
CommitLineData
174d1640
C
1open Common
2
aba5c457
C
3let string_binding vl = function
4 None -> []
5 | Some _ ->
6 [match vl with
7 Ast_c.MetaPosValList l ->
8 let locs =
9 List.map
10 (function
11 (fname,current_element,(line,col),(line_end,col_end)) ->
12 { Coccilib.current_element = current_element;
13 Coccilib.file = fname;
14 Coccilib.line = line;
15 Coccilib.col = col;
16 Coccilib.line_end = line_end;
17 Coccilib.col_end = col_end }) l in
18 Coccilib.Pos locs
19 | Ast_c.MetaListlenVal n -> Coccilib.Int n
20 | _ -> Coccilib.Str (Ocamlcocci_aux.stringrep vl)]
21
22let ast_binding vl = function
23 None -> []
24 | Some _ ->
25 [match vl with
26 Ast_c.MetaIdVal(id,_) | Ast_c.MetaFuncVal id
27 | Ast_c.MetaLocalFuncVal id ->
28 Coccilib.Str id
29
30 | Ast_c.MetaExprVal(expr,_) -> Coccilib.Expr expr
31 | Ast_c.MetaExprListVal arglist -> Coccilib.ExprList arglist
32 | Ast_c.MetaParamVal param -> Coccilib.Param param
33 | Ast_c.MetaParamListVal paramlist -> Coccilib.ParamList paramlist
34
35 | Ast_c.MetaTypeVal ty -> Coccilib.Type ty
36 | Ast_c.MetaInitVal init -> Coccilib.Init init
413ffc02
C
37 | Ast_c.MetaDeclVal decl -> Coccilib.Decl decl
38 | Ast_c.MetaFieldVal field -> Coccilib.Field field
aba5c457
C
39 | Ast_c.MetaStmtVal stm -> Coccilib.Stmt stm
40
41 | Ast_c.MetaPosVal _ | Ast_c.MetaPosValList _ | Ast_c.MetaListlenVal _ ->
42 failwith "not associated with a declared metavariable"]
43
413ffc02 44let run mv ve script_vars name code =
174d1640
C
45 (* set up variables *)
46 let find_binding (r,m) =
47 try
48 let elem =
49 List.find (function ((re,rm),_) -> r =*= re && m =$= rm) ve in
50 Some elem
51 with Not_found -> None in
52
53 let args =
aba5c457
C
54 List.concat
55 (List.map
56 (function ((str_name,ast_name),(r,m),_) ->
57 match find_binding (r,m) with
58 None -> []
59 | Some (_,vl) ->
60 (string_binding vl str_name) @ (ast_binding vl ast_name))
61 mv) in
174d1640 62
413ffc02
C
63 let script_args = List.map (function _ -> ref "") script_vars in
64
174d1640
C
65 (* call the function *)
66 Coccilib.include_match true;
67 let fn =
68 try Hashtbl.find Coccilib.fcts name
69 with Not_found -> failwith (Printf.sprintf "%s not found" name) in
413ffc02
C
70 fn args script_args;
71 List.map (function x -> !x) script_args