Commit | Line | Data |
---|---|---|
174d1640 C |
1 | open Common |
2 | ||
aba5c457 C |
3 | let 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 | ||
22 | let 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 | 46 | let 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 |