(* * 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. *) open Common.Infix open Lib_engine let pp = Common.pp let pp_meta (_,x) = pp x let rec pp_binding_kind = function | Ast_c.MetaIdVal (s,_) -> pp ("id " ^ s) | Ast_c.MetaFuncVal s -> pp ("func " ^ s) | Ast_c.MetaLocalFuncVal s -> pp ("localfunc " ^ s) | Ast_c.MetaExprVal (expr,_) -> Pretty_print_c.pp_expression_simple expr | Ast_c.MetaExprListVal expr_list -> pp "<>" | Ast_c.MetaInitVal ini -> Pretty_print_c.pp_init_simple ini | Ast_c.MetaTypeVal typ -> Pretty_print_c.pp_type_simple typ | Ast_c.MetaStmtVal statement -> Pretty_print_c.pp_statement_simple statement | Ast_c.MetaParamVal params -> pp "<>" | Ast_c.MetaParamListVal params -> pp "<>" | Ast_c.MetaListlenVal n -> pp (string_of_int n) | Ast_c.MetaPosVal (pos1, pos2) -> let print_pos = function Ast_cocci.Real x -> string_of_int x | Ast_cocci.Virt(x,off) -> Printf.sprintf "%d+%d" x off in pp (Common.sprintf ("pos(%s,%s)") (print_pos pos1) (print_pos pos2)) | Ast_c.MetaPosValList l -> pp (Common.sprintf ("poss[%s]") (String.concat ", " (List.map (function (fl,ce,(minl,minc),(maxl,maxc)) -> Printf.sprintf "(%s,%s,(%d,%d),(%d,%d))" fl ce minl minc maxl maxc) l))) and pp_binding subst = begin pp "["; Common.print_between (fun () -> pp ";"; Format.print_cut() ) (fun ((r,s), kind) -> pp r; pp "."; pp s; pp " --> "; pp_binding_kind kind) subst; pp "]"; end let pp_binding_kind2 = function | ParenVal s -> pp "pv("; pp_meta s; pp ")" | NormalMetaVal x -> pp_binding_kind x | LabelVal (Absolute xs) -> begin pp "labelval"; pp "("; Common.print_between (fun () -> pp ",") Format.print_int xs; pp ")"; end | LabelVal (Prefix xs) -> begin pp "prefixlabelval"; pp "("; Common.print_between (fun () -> pp ",") Format.print_int xs; pp ")"; end | GoodVal -> pp "goodval" | BadVal -> pp "badval" let rec pp_predicate = function | InLoop -> pp "InLoop" | TrueBranch -> pp "TrueBranch" | FalseBranch -> pp "FalseBranch" | After -> pp "After" | FallThrough -> pp "FallThrough" | LoopFallThrough -> pp "LoopFallThrough" | Return -> pp "Return" | FunHeader -> pp "FunHeader" | Top -> pp "Top" | ErrorExit -> pp "ErrorExit" | Exit -> pp "Exit" | Goto -> pp "Goto" | Paren s -> pp "Paren("; pp_meta s; pp ")" | Match (re) -> Pretty_print_cocci.print_rule_elem re | Label s -> pp "Label("; pp_meta s; pp ")" | BCLabel s -> pp "BreakContinueLabel("; pp_meta s; pp ")" | PrefixLabel s -> pp "PrefixLabel("; pp_meta s; pp ")" | BindGood s -> pp "BindGood("; pp_meta s; pp ")" | BindBad s -> pp "BindBad("; pp_meta s; pp ")" | FakeBrace -> pp "FakeBrace" and pp_binding2 subst = begin pp "["; Common.print_between (fun () -> pp ";";Format.print_cut(); ) (fun (s, kind) -> pp s; pp " --> "; pp_binding_kind2 kind) subst; pp "]"; end and pp_binding2_ctlsubst subst = begin pp "["; Common.print_between (fun () -> pp ";"; Format.print_cut(); ) (function Ast_ctl.Subst (s, kind) -> pp_meta s; pp " --> "; pp_binding_kind2 kind; | Ast_ctl.NegSubst (s, kind) -> pp_meta s; pp " -/-> "; pp_binding_kind2 kind; ) subst; pp "]"; end let predicate_to_string pred = Common.format_to_string (function _ -> pp_predicate pred) let pp_pred_smodif = fun (pred, smodif) -> begin pp_predicate pred; (* (match smodif with | Ast_ctl.Modif x | Ast_ctl.UnModif x -> pp " with " | Ast_ctl.Control -> () ) *) end let pp_ctlcocci show_plus inline_let_def ctl = begin if show_plus then begin Pretty_print_cocci.print_plus_flag := true; Pretty_print_cocci.print_minus_flag := true; end else begin Pretty_print_cocci.print_plus_flag := false; Pretty_print_cocci.print_minus_flag := false; end; Common.pp_do_in_box (fun () -> Pretty_print_ctl.pp_ctl (pp_pred_smodif,(fun s -> pp_meta s)) inline_let_def ctl; ); end