Release coccinelle-0.1.2
[bpt/coccinelle.git] / parsing_c / lib_parsing_c.ml
CommitLineData
485bce71 1(* Copyright (C) 2007, 2008 Yoann Padioleau
34e49164
C
2 *
3 * This program is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU General Public License (GPL)
5 * version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * file license.txt for more details.
11 *)
12open Common
13
14(*****************************************************************************)
15(* Abstract line *)
16(*****************************************************************************)
17
18(* todo?: al_expr doit enlever les infos de type ? et doit remettre en
19 * emptyAnnot ?
20 *)
21
22(* drop all info information *)
23
24let strip_info_visitor _ =
25 { Visitor_c.default_visitor_c_s with
26 Visitor_c.kinfo_s =
27 (* traversal should be deterministic... *)
28 (let ctr = ref 0 in
29 (function (k,_) ->
30 function i -> ctr := !ctr + 1; Ast_c.al_info !ctr i));
31
32 Visitor_c.kexpr_s = (fun (k,_) e ->
33 let (e', ty),ii' = k e in
34 (e', Ast_c.noType()(*ref !ty*)), ii' (* keep type - jll *)
35 );
36
37(*
38 Visitor_c.ktype_s = (fun (k,_) ft ->
39 let ft' = k ft in
40 match Ast_c.unwrap_typeC ft' with
41 | Ast_c.TypeName (s,_typ) ->
42 Ast_c.TypeName (s, Ast_c.noTypedefDef()) +> Ast_c.rewrap_typeC ft'
43 | _ -> ft'
44
45 );
46*)
47
48 }
49
50let al_expr x = Visitor_c.vk_expr_s (strip_info_visitor()) x
51let al_statement x = Visitor_c.vk_statement_s (strip_info_visitor()) x
52let al_type x = Visitor_c.vk_type_s (strip_info_visitor()) x
53let al_param x = Visitor_c.vk_param_s (strip_info_visitor()) x
54let al_params x = Visitor_c.vk_params_s (strip_info_visitor()) x
55let al_arguments x = Visitor_c.vk_arguments_s (strip_info_visitor()) x
56
57let al_program x = List.map (Visitor_c.vk_toplevel_s (strip_info_visitor())) x
58
59let semi_strip_info_visitor = (* keep position information *)
60 { Visitor_c.default_visitor_c_s with
61 Visitor_c.kinfo_s = (fun (k,_) i -> Ast_c.semi_al_info i);
62
63 Visitor_c.kexpr_s = (fun (k,_) e ->
64 let (e', ty),ii' = k e in
65 (e', Ast_c.noType()(*ref !ty*)), ii' (* keep type - jll *)
66 );
67
68 }
69
70let semi_al_expr = Visitor_c.vk_expr_s semi_strip_info_visitor
71let semi_al_statement = Visitor_c.vk_statement_s semi_strip_info_visitor
72let semi_al_type = Visitor_c.vk_type_s semi_strip_info_visitor
73let semi_al_param = Visitor_c.vk_param_s semi_strip_info_visitor
74let semi_al_params = Visitor_c.vk_params_s semi_strip_info_visitor
75let semi_al_arguments = Visitor_c.vk_arguments_s semi_strip_info_visitor
76
77let semi_al_program = List.map (Visitor_c.vk_toplevel_s semi_strip_info_visitor)
78
79(*****************************************************************************)
80(* Extract infos *)
81(*****************************************************************************)
82
83let extract_info_visitor recursor x =
84 let globals = ref [] in
85 let visitor =
86 {
87 Visitor_c.default_visitor_c with
88 Visitor_c.kinfo = (fun (k, _) i -> Common.push2 i globals)
89 } in
90 begin
91 recursor visitor x;
92 !globals
93 end
94
95let ii_of_decl = extract_info_visitor Visitor_c.vk_decl
96let ii_of_node = extract_info_visitor Visitor_c.vk_node
97let ii_of_expr = extract_info_visitor Visitor_c.vk_expr
98let ii_of_stmt = extract_info_visitor Visitor_c.vk_statement
99let ii_of_args = extract_info_visitor Visitor_c.vk_args_splitted
100let ii_of_type = extract_info_visitor Visitor_c.vk_type
101let ii_of_ini = extract_info_visitor Visitor_c.vk_ini
102let ii_of_param = extract_info_visitor Visitor_c.vk_param
103let ii_of_params = extract_info_visitor Visitor_c.vk_params_splitted
104let ii_of_struct_fields = extract_info_visitor Visitor_c.vk_struct_fields
485bce71
C
105(*let ii_of_struct_field = extract_info_visitor Visitor_c.vk_struct_field*)
106let ii_of_struct_fieldkinds = extract_info_visitor Visitor_c.vk_struct_fieldkinds
34e49164
C
107let ii_of_cst = extract_info_visitor Visitor_c.vk_cst
108let ii_of_define_params =
109 extract_info_visitor Visitor_c.vk_define_params_splitted
485bce71 110let ii_of_toplevel = extract_info_visitor Visitor_c.vk_toplevel
34e49164 111
485bce71 112(*****************************************************************************)
34e49164
C
113let max_min_ii_by_pos xs =
114 match xs with
115 | [] -> failwith "empty list, max_min_ii_by_pos"
116 | [x] -> (x, x)
117 | x::xs ->
118 let pos_leq p1 p2 = (Ast_c.compare_pos p1 p2) = (-1) in
119 xs +> List.fold_left (fun (maxii,minii) e ->
120 let maxii' = if pos_leq maxii e then e else maxii in
121 let minii' = if pos_leq e minii then e else minii in
122 maxii', minii'
123 ) (x,x)
124
125let info_to_fixpos ii =
126 match Ast_c.pinfo_of_info ii with
127 Ast_c.OriginTok pi -> Ast_cocci.Real pi.Common.charpos
128 | Ast_c.ExpandedTok (_,(pi,offset)) ->
129 Ast_cocci.Virt (pi.Common.charpos,offset)
130 | Ast_c.FakeTok (_,(pi,offset)) ->
131 Ast_cocci.Virt (pi.Common.charpos,offset)
132 | Ast_c.AbstractLineTok pi -> failwith "unexpected abstract"
133
134let max_min_by_pos xs =
135 let (i1, i2) = max_min_ii_by_pos xs in
136 (info_to_fixpos i1, info_to_fixpos i2)
137
138let lin_col_by_pos xs =
139 (* put min before max; no idea why they are backwards above *)
140 let (i2, i1) = max_min_ii_by_pos xs in
141 let posf x = Ast_c.col_of_info x in
142 let mposf x = Ast_c.col_of_info x + String.length (Ast_c.str_of_info x) in
485bce71 143 (Ast_c.file_of_info i1,!Flag.current_element,
34e49164
C
144 (Ast_c.line_of_info i1, posf i1), (Ast_c.line_of_info i2, mposf i2))
145
146