Coccinelle release 1.0.0-rc4
[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
8f657093 37 | Ast_c.MetaInitListVal init -> Coccilib.InitList init
413ffc02
C
38 | Ast_c.MetaDeclVal decl -> Coccilib.Decl decl
39 | Ast_c.MetaFieldVal field -> Coccilib.Field field
190f1acf 40 | Ast_c.MetaFieldListVal field -> Coccilib.FieldList field
aba5c457
C
41 | Ast_c.MetaStmtVal stm -> Coccilib.Stmt stm
42
43 | Ast_c.MetaPosVal _ | Ast_c.MetaPosValList _ | Ast_c.MetaListlenVal _ ->
44 failwith "not associated with a declared metavariable"]
45
413ffc02 46let run mv ve script_vars name code =
174d1640
C
47 (* set up variables *)
48 let find_binding (r,m) =
49 try
50 let elem =
51 List.find (function ((re,rm),_) -> r =*= re && m =$= rm) ve in
52 Some elem
53 with Not_found -> None in
54
55 let args =
aba5c457
C
56 List.concat
57 (List.map
58 (function ((str_name,ast_name),(r,m),_) ->
59 match find_binding (r,m) with
60 None -> []
61 | Some (_,vl) ->
62 (string_binding vl str_name) @ (ast_binding vl ast_name))
63 mv) in
174d1640 64
413ffc02
C
65 let script_args = List.map (function _ -> ref "") script_vars in
66
174d1640
C
67 (* call the function *)
68 Coccilib.include_match true;
5427db06 69 Coccilib.exited := false;
174d1640
C
70 let fn =
71 try Hashtbl.find Coccilib.fcts name
72 with Not_found -> failwith (Printf.sprintf "%s not found" name) in
413ffc02
C
73 fn args script_args;
74 List.map (function x -> !x) script_args