2 * Copyright 2005-2010, Ecole des Mines de Nantes, University of Copenhagen
3 * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
4 * This file is part of Coccinelle.
6 * Coccinelle is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, according to version 2 of the License.
10 * Coccinelle is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with Coccinelle. If not, see <http://www.gnu.org/licenses/>.
18 * The authors reserve the right to distribute this or future versions of
19 * Coccinelle under other licenses.
24 * Copyright 2005-2010, Ecole des Mines de Nantes, University of Copenhagen
25 * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
26 * This file is part of Coccinelle.
28 * Coccinelle is free software: you can redistribute it and/or modify
29 * it under the terms of the GNU General Public License as published by
30 * the Free Software Foundation, according to version 2 of the License.
32 * Coccinelle is distributed in the hope that it will be useful,
33 * but WITHOUT ANY WARRANTY; without even the implied warranty of
34 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
35 * GNU General Public License for more details.
37 * You should have received a copy of the GNU General Public License
38 * along with Coccinelle. If not, see <http://www.gnu.org/licenses/>.
40 * The authors reserve the right to distribute this or future versions of
41 * Coccinelle under other licenses.
52 let pp_meta (_
,x
) = pp x
54 let rec pp_binding_kind = function
55 | Ast_c.MetaIdVal
(s
,_
) -> pp ("id " ^ s
)
56 | Ast_c.MetaFuncVal s
-> pp ("func " ^ s
)
57 | Ast_c.MetaLocalFuncVal s
-> pp ("localfunc " ^ s
)
58 | Ast_c.MetaExprVal
(expr
,_
) -> Pretty_print_c.pp_expression_simple expr
59 | Ast_c.MetaExprListVal expr_list
-> pp "<<exprlist>>"
60 | Ast_c.MetaInitVal ini
->
61 Pretty_print_c.pp_init_simple ini
62 | Ast_c.MetaTypeVal typ
->
63 Pretty_print_c.pp_type_simple typ
64 | Ast_c.MetaStmtVal statement
->
65 Pretty_print_c.pp_statement_simple statement
66 | Ast_c.MetaParamVal params
-> pp "<<param>>"
67 | Ast_c.MetaParamListVal params
-> pp "<<paramlist>>"
68 | Ast_c.MetaListlenVal n
-> pp (string_of_int n
)
69 | Ast_c.MetaPosVal
(pos1
, pos2
) ->
70 let print_pos = function
71 Ast_cocci.Real x
-> string_of_int x
72 | Ast_cocci.Virt
(x
,off
) -> Printf.sprintf
"%d+%d" x off
in
73 pp (Common.sprintf
("pos(%s,%s)") (print_pos pos1
) (print_pos pos2
))
74 | Ast_c.MetaPosValList l
->
75 pp (Common.sprintf
("poss[%s]")
78 (function (fl
,ce
,(minl
,minc
),(maxl
,maxc
)) ->
79 Printf.sprintf
"(%s,%s,(%d,%d),(%d,%d))"
80 fl ce minl minc maxl maxc
)
83 and pp_binding subst
=
86 Common.print_between
(fun () -> pp ";"; Format.print_cut
() )
88 pp r
; pp "."; pp s
; pp " --> "; pp_binding_kind kind
)
94 let pp_binding_kind2 = function
95 | ParenVal s
-> pp "pv("; pp_meta s
; pp ")"
96 | NormalMetaVal x
-> pp_binding_kind x
97 | LabelVal
(Absolute xs
) ->
101 Common.print_between
(fun () -> pp ",") Format.print_int xs
;
104 | LabelVal
(Prefix xs
) ->
108 Common.print_between
(fun () -> pp ",") Format.print_int xs
;
111 | GoodVal
-> pp "goodval"
112 | BadVal
-> pp "badval"
115 let rec pp_predicate = function
116 | InLoop
-> pp "InLoop"
117 | TrueBranch
-> pp "TrueBranch"
118 | FalseBranch
-> pp "FalseBranch"
119 | After
-> pp "After"
120 | FallThrough
-> pp "FallThrough"
121 | LoopFallThrough
-> pp "LoopFallThrough"
122 | Return
-> pp "Return"
123 | FunHeader
-> pp "FunHeader"
125 | ErrorExit
-> pp "ErrorExit"
128 | Paren s
-> pp "Paren("; pp_meta s
; pp ")"
129 | Match
(re
) -> Pretty_print_cocci.print_rule_elem re
130 | Label s
-> pp "Label("; pp_meta s
; pp ")"
131 | BCLabel s
-> pp "BreakContinueLabel("; pp_meta s
; pp ")"
132 | PrefixLabel s
-> pp "PrefixLabel("; pp_meta s
; pp ")"
133 | BindGood s
-> pp "BindGood("; pp_meta s
; pp ")"
134 | BindBad s
-> pp "BindBad("; pp_meta s
; pp ")"
135 | FakeBrace
-> pp "FakeBrace"
137 and pp_binding2 subst
=
140 Common.print_between
(fun () -> pp ";";Format.print_cut
(); )
141 (fun (s
, kind
) -> pp s
; pp " --> "; pp_binding_kind2 kind
)
146 and pp_binding2_ctlsubst subst
=
149 Common.print_between
(fun () -> pp ";"; Format.print_cut
(); )
151 Ast_ctl.Subst
(s
, kind
) ->
152 pp_meta s
; pp " --> "; pp_binding_kind2 kind
;
153 | Ast_ctl.NegSubst
(s
, kind
) ->
154 pp_meta s
; pp " -/-> "; pp_binding_kind2 kind
;
160 let predicate_to_string pred
=
161 Common.format_to_string
(function _
-> pp_predicate pred
)
164 let pp_pred_smodif = fun (pred
, smodif
) ->
169 | Ast_ctl.Modif x | Ast_ctl.UnModif x -> pp " with <modifTODO>"
170 | Ast_ctl.Control -> ()
176 let pp_ctlcocci show_plus inline_let_def ctl
=
180 Pretty_print_cocci.print_plus_flag
:= true;
181 Pretty_print_cocci.print_minus_flag
:= true;
184 Pretty_print_cocci.print_plus_flag
:= false;
185 Pretty_print_cocci.print_minus_flag
:= false;
187 Common.pp_do_in_box
(fun () ->
188 Pretty_print_ctl.pp_ctl
(pp_pred_smodif,(fun s
-> pp_meta s
))