2 * Copyright 2010, INRIA, University of Copenhagen
3 * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
4 * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
5 * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
6 * This file is part of Coccinelle.
8 * Coccinelle is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, according to version 2 of the License.
12 * Coccinelle is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Coccinelle. If not, see <http://www.gnu.org/licenses/>.
20 * The authors reserve the right to distribute this or future versions of
21 * Coccinelle under other licenses.
25 (* create an index for each constructor *)
26 (* current max is 155 *)
28 (* doesn't really work - requires that identical terms with no token
29 subterms (eg dots) not appear on the same line *)
31 module Ast
= Ast_cocci
32 module Ast0
= Ast0_cocci
34 (* if a dot list is empty, add the starting line of the dot list to the
35 address. Otherwise add 0. An empty dot list should only match with another
37 let expression_dots d
=
38 let ln = (Ast0.get_info d
).Ast0.pos_info
.Ast0.line_start
in
39 match Ast0.unwrap d
with
40 Ast0.DOTS
(l
) -> 1::(if l
= [] then [ln] else [0])
41 | Ast0.CIRCLES
(l
) -> 2::(if l
= [] then [ln] else [0])
42 | Ast0.STARS
(l
) -> 3::(if l
= [] then [ln] else [0])
44 let initialiser_dots d
=
45 let ln = (Ast0.get_info d
).Ast0.pos_info
.Ast0.line_start
in
46 match Ast0.unwrap d
with
47 Ast0.DOTS
(l
) -> 113::(if l
= [] then [ln] else [0])
48 | Ast0.CIRCLES
(l
) -> 114::(if l
= [] then [ln] else [0])
49 | Ast0.STARS
(l
) -> 115::(if l
= [] then [ln] else [0])
51 let parameter_dots d
=
52 let ln = (Ast0.get_info d
).Ast0.pos_info
.Ast0.line_start
in
53 match Ast0.unwrap d
with
54 Ast0.DOTS
(l
) -> 4::(if l
= [] then [ln] else [0])
55 | Ast0.CIRCLES
(l
) -> 5::(if l
= [] then [ln] else [0])
56 | Ast0.STARS
(l
) -> 6::(if l
= [] then [ln] else [0])
58 let statement_dots d
=
59 let ln = (Ast0.get_info d
).Ast0.pos_info
.Ast0.line_start
in
60 match Ast0.unwrap d
with
61 Ast0.DOTS
(l
) -> 7::(if l
= [] then [ln] else [0])
62 | Ast0.CIRCLES
(l
) -> 8::(if l
= [] then [ln] else [0])
63 | Ast0.STARS
(l
) -> 9::(if l
= [] then [ln] else [0])
65 let declaration_dots d
=
66 let ln = (Ast0.get_info d
).Ast0.pos_info
.Ast0.line_start
in
67 match Ast0.unwrap d
with
68 Ast0.DOTS
(l
) -> 134::(if l
= [] then [ln] else [0])
69 | Ast0.CIRCLES
(l
) -> 135::(if l
= [] then [ln] else [0])
70 | Ast0.STARS
(l
) -> 136::(if l
= [] then [ln] else [0])
72 let case_line_dots d
=
73 let ln = (Ast0.get_info d
).Ast0.pos_info
.Ast0.line_start
in
74 match Ast0.unwrap d
with
75 Ast0.DOTS
(l
) -> 138::(if l
= [] then [ln] else [0])
76 | Ast0.CIRCLES
(l
) -> 139::(if l
= [] then [ln] else [0])
77 | Ast0.STARS
(l
) -> 140::(if l
= [] then [ln] else [0])
80 match Ast0.unwrap i
with
82 | Ast0.MetaId
(name
,_
,_
,_
) -> [11]
83 | Ast0.MetaFunc
(name
,_
,_
) -> [12]
84 | Ast0.MetaLocalFunc
(name
,_
,_
) -> [13]
85 | Ast0.DisjId
(_
,id_list
,_
,_
) -> [152]
86 | Ast0.OptIdent
(id
) -> [14]
87 | Ast0.UniqueIdent
(id
) -> [15]
90 match Ast0.unwrap e
with
91 Ast0.Ident
(id
) -> [17]
92 | Ast0.Constant
(const
) -> [18]
93 | Ast0.FunCall
(fn
,lp
,args
,rp
) -> [19]
94 | Ast0.Assignment
(left
,op
,right
,simple
) -> [20]
95 | Ast0.CondExpr
(exp1
,why
,exp2
,colon
,exp3
) -> [21]
96 | Ast0.Postfix
(exp
,op
) -> [22]
97 | Ast0.Infix
(exp
,op
) -> [23]
98 | Ast0.Unary
(exp
,op
) -> [24]
99 | Ast0.Binary
(left
,op
,right
) -> [25]
100 | Ast0.Nested
(left
,op
,right
) -> failwith
"nested in index not possible"
101 | Ast0.Paren
(lp
,exp
,rp
) -> [26]
102 | Ast0.ArrayAccess
(exp1
,lb
,exp2
,rb
) -> [27]
103 | Ast0.RecordAccess
(exp
,pt
,field
) -> [28]
104 | Ast0.RecordPtAccess
(exp
,ar
,field
) -> [29]
105 | Ast0.Cast
(lp
,ty
,rp
,exp
) -> [30]
106 | Ast0.SizeOfExpr
(szf
,exp
) -> [98] (* added after *)
107 | Ast0.SizeOfType
(szf
,lp
,ty
,rp
) -> [99] (* added after *)
108 | Ast0.TypeExp
(ty
) -> [123] (* added after *)
109 | Ast0.Constructor
(lp
,ty
,rp
,init
) -> [155]
110 | Ast0.MetaErr
(name
,_
,_
) -> [32]
111 | Ast0.MetaExpr
(name
,_
,ty
,_
,_
) -> [33]
112 | Ast0.MetaExprList
(name
,_
,_
) -> [34]
113 | Ast0.EComma
(cm
) -> [35]
114 | Ast0.DisjExpr
(_
,expr_list
,_
,_
) -> [36]
115 | Ast0.NestExpr
(_
,expr_dots
,_
,_
,_
) -> [37]
116 | Ast0.Edots
(dots
,whencode
) -> [38]
117 | Ast0.Ecircles
(dots
,whencode
) -> [39]
118 | Ast0.Estars
(dots
,whencode
) -> [40]
119 | Ast0.OptExp
(exp
) -> [41]
120 | Ast0.UniqueExp
(exp
) -> [42]
123 match Ast0.unwrap t
with
124 Ast0.ConstVol
(cv
,ty
) -> [44]
125 | Ast0.BaseType
(ty
,strings
) -> [48]
126 | Ast0.Signed
(sign
,ty
) -> [129]
127 | Ast0.Pointer
(ty
,star
) -> [49]
128 | Ast0.FunctionPointer
(ty
,lp1
,star
,rp1
,lp2
,params
,rp2
) -> [131]
129 | Ast0.FunctionType
(ty
,lp1
,params
,rp1
) -> [132]
130 | Ast0.Array
(ty
,lb
,size
,rb
) -> [50]
131 | Ast0.EnumName
(kind
,name
) -> [146]
132 | Ast0.EnumDef
(ty
,lb
,decls
,rb
) -> [150]
133 | Ast0.StructUnionName
(kind
,name
) -> [51]
134 | Ast0.StructUnionDef
(ty
,lb
,decls
,rb
) -> [117]
135 | Ast0.TypeName
(name
) -> [52]
136 | Ast0.MetaType
(name
,_
) -> [53]
137 | Ast0.DisjType
(_
,type_list
,_
,_
) -> [130]
138 | Ast0.OptType
(ty
) -> [45]
139 | Ast0.UniqueType
(ty
) -> [46]
142 match Ast0.unwrap d
with
143 Ast0.MetaDecl
(name
,_
) -> [148]
144 | Ast0.MetaField
(name
,_
) -> [149]
145 | Ast0.MetaFieldList
(name
,_
,_
) -> [152]
146 | Ast0.Init
(stg
,ty
,id
,eq
,exp
,sem
) -> [54]
147 | Ast0.UnInit
(stg
,ty
,id
,sem
) -> [55]
148 | Ast0.MacroDecl
(name
,lp
,args
,rp
,sem
) -> [137]
149 | Ast0.TyDecl
(ty
,sem
) -> [116]
150 | Ast0.Typedef
(stg
,ty
,id
,sem
) -> [143]
151 | Ast0.DisjDecl
(_
,decls
,_
,_
) -> [97] (* added after *)
152 | Ast0.Ddots
(dots
,whencode
) -> [133]
153 | Ast0.OptDecl
(decl
) -> [56]
154 | Ast0.UniqueDecl
(decl
) -> [57]
157 match Ast0.unwrap i
with
158 Ast0.MetaInit
(nm
,_
) -> [106] (* added after *)
159 | Ast0.MetaInitList
(nm
,_
,_
) -> [153] (* added after *)
160 | Ast0.InitExpr
(exp
) -> [102]
161 | Ast0.InitList
(lb
,initlist
,rb
,ordered
) -> [103]
162 | Ast0.InitGccExt
(designators
,eq
,ini
) -> [104]
163 | Ast0.InitGccName
(name
,eq
,ini
) -> [105]
164 | Ast0.IComma
(cm
) -> [108]
165 | Ast0.Idots
(d
,whencode
) -> [109]
166 | Ast0.OptIni
(id
) -> [110]
167 | Ast0.UniqueIni
(id
) -> [111]
169 let parameterTypeDef p
=
170 match Ast0.unwrap p
with
171 Ast0.VoidParam
(ty
) -> [59]
172 | Ast0.Param
(ty
,id
) -> [60]
173 | Ast0.MetaParam
(name
,_
) -> [61]
174 | Ast0.MetaParamList
(name
,_
,_
) -> [62]
175 | Ast0.PComma
(cm
) -> [63]
176 | Ast0.Pdots
(dots
) -> [64]
177 | Ast0.Pcircles
(dots
) -> [65]
178 | Ast0.OptParam
(param
) -> [66]
179 | Ast0.UniqueParam
(param
) -> [67]
182 match Ast0.unwrap s
with
183 Ast0.FunDecl
(bef
,fninfo
,name
,lp
,params
,rp
,lbrace
,body
,rbrace
) -> [68]
184 | Ast0.Decl
(bef
,decl
) -> [69]
185 | Ast0.Seq
(lbrace
,body
,rbrace
) -> [70]
186 | Ast0.ExprStatement
(exp
,sem
) -> [71]
187 | Ast0.IfThen
(iff
,lp
,exp
,rp
,branch1
,aft
) -> [72]
188 | Ast0.IfThenElse
(iff
,lp
,exp
,rp
,branch1
,els
,branch2
,aft
) -> [73]
189 | Ast0.While
(whl
,lp
,exp
,rp
,body
,_
) -> [74]
190 | Ast0.Do
(d
,body
,whl
,lp
,exp
,rp
,sem
) -> [75]
191 | Ast0.For
(fr
,lp
,e1
,sem1
,e2
,sem2
,e3
,rp
,body
,_
) -> [76]
192 | Ast0.Iterator
(nm
,lp
,args
,rp
,body
,_
) -> [142]
193 | Ast0.Switch
(switch
,lp
,exp
,rp
,lb
,decls
,cases
,rb
) -> [125]
194 | Ast0.Break
(br
,sem
) -> [100]
195 | Ast0.Continue
(cont
,sem
) -> [101]
196 | Ast0.Label
(l
,dd
) -> [144]
197 | Ast0.Goto
(goto
,l
,sem
) -> [145]
198 | Ast0.Return
(ret
,sem
) -> [77]
199 | Ast0.ReturnExpr
(ret
,exp
,sem
) -> [78]
200 | Ast0.MetaStmt
(name
,_
) -> [79]
201 | Ast0.MetaStmtList
(name
,_
) -> [80]
202 | Ast0.Disj
(_
,statement_dots_list
,_
,_
) -> [81]
203 | Ast0.Nest
(_
,stmt_dots
,_
,_
,_
) -> [82]
204 | Ast0.Exp
(exp
) -> [83]
205 | Ast0.TopExp
(exp
) -> [141]
206 | Ast0.Ty
(ty
) -> [124]
207 | Ast0.TopInit
(init
) -> [146]
208 | Ast0.Dots
(d
,whencode
) -> [84]
209 | Ast0.Circles
(d
,whencode
) -> [85]
210 | Ast0.Stars
(d
,whencode
) -> [86]
211 | Ast0.Include
(inc
,name
) -> [118]
212 | Ast0.Undef
(def
,id
) -> [151]
213 | Ast0.Define
(def
,id
,params
,body
) -> [119]
214 | Ast0.OptStm
(re
) -> [87]
215 | Ast0.UniqueStm
(re
) -> [88]
218 match Ast0.unwrap c
with
219 Ast0.Default
(def
,colon
,code
) -> [126]
220 | Ast0.Case
(case
,exp
,colon
,code
) -> [127]
221 | Ast0.DisjCase
(_
,case_lines
,_
,_
) -> [107]
222 | Ast0.OptCase
(case
) -> [128]
225 match Ast0.unwrap t
with
226 Ast0.NONDECL
(stmt
) -> [90]
227 | Ast0.FILEINFO
(old_file
,new_file
) -> [92]
228 | Ast0.CODE
(stmt_dots
) -> [94]
229 | Ast0.ERRORWORDS
(exps
) -> [95]
230 | Ast0.OTHER
(_
) -> [96]
231 | Ast0.TOPCODE
(_
) -> [154]
233 (* 99-101 already used *)