Release coccinelle-0.2.3rc1
[bpt/coccinelle.git] / parsing_cocci / index.ml
1 (*
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.
5 *
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.
9 *
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.
14 *
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/>.
17 *
18 * The authors reserve the right to distribute this or future versions of
19 * Coccinelle under other licenses.
20 *)
21
22
23 (*
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.
27 *
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.
31 *
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.
36 *
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/>.
39 *
40 * The authors reserve the right to distribute this or future versions of
41 * Coccinelle under other licenses.
42 *)
43
44
45 (* create an index for each constructor *)
46 (* current max is 147 *)
47
48 (* doesn't really work - requires that identical terms with no token
49 subterms (eg dots) not appear on the same line *)
50
51 module Ast = Ast_cocci
52 module Ast0 = Ast0_cocci
53
54 (* if a dot list is empty, add the starting line of the dot list to the
55 address. Otherwise add 0. An empty dot list should only match with another
56 empty one. *)
57 let expression_dots d =
58 let ln = (Ast0.get_info d).Ast0.pos_info.Ast0.line_start in
59 match Ast0.unwrap d with
60 Ast0.DOTS(l) -> 1::(if l = [] then [ln] else [0])
61 | Ast0.CIRCLES(l) -> 2::(if l = [] then [ln] else [0])
62 | Ast0.STARS(l) -> 3::(if l = [] then [ln] else [0])
63
64 let initialiser_dots d =
65 let ln = (Ast0.get_info d).Ast0.pos_info.Ast0.line_start in
66 match Ast0.unwrap d with
67 Ast0.DOTS(l) -> 113::(if l = [] then [ln] else [0])
68 | Ast0.CIRCLES(l) -> 114::(if l = [] then [ln] else [0])
69 | Ast0.STARS(l) -> 115::(if l = [] then [ln] else [0])
70
71 let parameter_dots d =
72 let ln = (Ast0.get_info d).Ast0.pos_info.Ast0.line_start in
73 match Ast0.unwrap d with
74 Ast0.DOTS(l) -> 4::(if l = [] then [ln] else [0])
75 | Ast0.CIRCLES(l) -> 5::(if l = [] then [ln] else [0])
76 | Ast0.STARS(l) -> 6::(if l = [] then [ln] else [0])
77
78 let statement_dots d =
79 let ln = (Ast0.get_info d).Ast0.pos_info.Ast0.line_start in
80 match Ast0.unwrap d with
81 Ast0.DOTS(l) -> 7::(if l = [] then [ln] else [0])
82 | Ast0.CIRCLES(l) -> 8::(if l = [] then [ln] else [0])
83 | Ast0.STARS(l) -> 9::(if l = [] then [ln] else [0])
84
85 let declaration_dots d =
86 let ln = (Ast0.get_info d).Ast0.pos_info.Ast0.line_start in
87 match Ast0.unwrap d with
88 Ast0.DOTS(l) -> 134::(if l = [] then [ln] else [0])
89 | Ast0.CIRCLES(l) -> 135::(if l = [] then [ln] else [0])
90 | Ast0.STARS(l) -> 136::(if l = [] then [ln] else [0])
91
92 let case_line_dots d =
93 let ln = (Ast0.get_info d).Ast0.pos_info.Ast0.line_start in
94 match Ast0.unwrap d with
95 Ast0.DOTS(l) -> 138::(if l = [] then [ln] else [0])
96 | Ast0.CIRCLES(l) -> 139::(if l = [] then [ln] else [0])
97 | Ast0.STARS(l) -> 140::(if l = [] then [ln] else [0])
98
99 let ident i =
100 match Ast0.unwrap i with
101 Ast0.Id(name) -> [10]
102 | Ast0.MetaId(name,_,_) -> [11]
103 | Ast0.MetaFunc(name,_,_) -> [12]
104 | Ast0.MetaLocalFunc(name,_,_) -> [13]
105 | Ast0.OptIdent(id) -> [14]
106 | Ast0.UniqueIdent(id) -> [15]
107
108 let expression e =
109 match Ast0.unwrap e with
110 Ast0.Ident(id) -> [17]
111 | Ast0.Constant(const) -> [18]
112 | Ast0.FunCall(fn,lp,args,rp) -> [19]
113 | Ast0.Assignment(left,op,right,simple) -> [20]
114 | Ast0.CondExpr(exp1,why,exp2,colon,exp3) -> [21]
115 | Ast0.Postfix(exp,op) -> [22]
116 | Ast0.Infix(exp,op) -> [23]
117 | Ast0.Unary(exp,op) -> [24]
118 | Ast0.Binary(left,op,right) -> [25]
119 | Ast0.Nested(left,op,right) -> failwith "nested in index not possible"
120 | Ast0.Paren(lp,exp,rp) -> [26]
121 | Ast0.ArrayAccess(exp1,lb,exp2,rb) -> [27]
122 | Ast0.RecordAccess(exp,pt,field) -> [28]
123 | Ast0.RecordPtAccess(exp,ar,field) -> [29]
124 | Ast0.Cast(lp,ty,rp,exp) -> [30]
125 | Ast0.SizeOfExpr(szf,exp) -> [98] (* added after *)
126 | Ast0.SizeOfType(szf,lp,ty,rp) -> [99] (* added after *)
127 | Ast0.TypeExp(ty) -> [123] (* added after *)
128 | Ast0.MetaErr(name,_,_) -> [32]
129 | Ast0.MetaExpr(name,_,ty,_,_) -> [33]
130 | Ast0.MetaExprList(name,_,_) -> [34]
131 | Ast0.EComma(cm) -> [35]
132 | Ast0.DisjExpr(_,expr_list,_,_) -> [36]
133 | Ast0.NestExpr(_,expr_dots,_,_,_) -> [37]
134 | Ast0.Edots(dots,whencode) -> [38]
135 | Ast0.Ecircles(dots,whencode) -> [39]
136 | Ast0.Estars(dots,whencode) -> [40]
137 | Ast0.OptExp(exp) -> [41]
138 | Ast0.UniqueExp(exp) -> [42]
139
140 let typeC t =
141 match Ast0.unwrap t with
142 Ast0.ConstVol(cv,ty) -> [44]
143 | Ast0.BaseType(ty,strings) -> [48]
144 | Ast0.Signed(sign,ty) -> [129]
145 | Ast0.Pointer(ty,star) -> [49]
146 | Ast0.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2) -> [131]
147 | Ast0.FunctionType(ty,lp1,params,rp1) -> [132]
148 | Ast0.Array(ty,lb,size,rb) -> [50]
149 | Ast0.EnumName(kind,name) -> [146]
150 | Ast0.StructUnionName(kind,name) -> [51]
151 | Ast0.StructUnionDef(ty,lb,decls,rb) -> [117]
152 | Ast0.TypeName(name) -> [52]
153 | Ast0.MetaType(name,_) -> [53]
154 | Ast0.DisjType(_,type_list,_,_) -> [130]
155 | Ast0.OptType(ty) -> [45]
156 | Ast0.UniqueType(ty) -> [46]
157
158 let declaration d =
159 match Ast0.unwrap d with
160 Ast0.Init(stg,ty,id,eq,exp,sem) -> [54]
161 | Ast0.UnInit(stg,ty,id,sem) -> [55]
162 | Ast0.MacroDecl(name,lp,args,rp,sem) -> [137]
163 | Ast0.TyDecl(ty,sem) -> [116]
164 | Ast0.Typedef(stg,ty,id,sem) -> [143]
165 | Ast0.DisjDecl(_,decls,_,_) -> [97] (* added after *)
166 | Ast0.Ddots(dots,whencode) -> [133]
167 | Ast0.OptDecl(decl) -> [56]
168 | Ast0.UniqueDecl(decl) -> [57]
169
170 let initialiser i =
171 match Ast0.unwrap i with
172 Ast0.MetaInit(nm,_) -> [106] (* added after *)
173 | Ast0.InitExpr(exp) -> [102]
174 | Ast0.InitList(lb,initlist,rb) -> [103]
175 | Ast0.InitGccExt(designators,eq,ini) -> [104]
176 | Ast0.InitGccName(name,eq,ini) -> [105]
177 | Ast0.IComma(cm) -> [108]
178 | Ast0.Idots(d,whencode) -> [109]
179 | Ast0.OptIni(id) -> [110]
180 | Ast0.UniqueIni(id) -> [111]
181
182 let parameterTypeDef p =
183 match Ast0.unwrap p with
184 Ast0.VoidParam(ty) -> [59]
185 | Ast0.Param(ty,id) -> [60]
186 | Ast0.MetaParam(name,_) -> [61]
187 | Ast0.MetaParamList(name,_,_) -> [62]
188 | Ast0.PComma(cm) -> [63]
189 | Ast0.Pdots(dots) -> [64]
190 | Ast0.Pcircles(dots) -> [65]
191 | Ast0.OptParam(param) -> [66]
192 | Ast0.UniqueParam(param) -> [67]
193
194 let statement s =
195 match Ast0.unwrap s with
196 Ast0.FunDecl(bef,fninfo,name,lp,params,rp,lbrace,body,rbrace) -> [68]
197 | Ast0.Decl(bef,decl) -> [69]
198 | Ast0.Seq(lbrace,body,rbrace) -> [70]
199 | Ast0.ExprStatement(exp,sem) -> [71]
200 | Ast0.IfThen(iff,lp,exp,rp,branch1,aft) -> [72]
201 | Ast0.IfThenElse(iff,lp,exp,rp,branch1,els,branch2,aft) -> [73]
202 | Ast0.While(whl,lp,exp,rp,body,_) -> [74]
203 | Ast0.Do(d,body,whl,lp,exp,rp,sem) -> [75]
204 | Ast0.For(fr,lp,e1,sem1,e2,sem2,e3,rp,body,_) -> [76]
205 | Ast0.Iterator(nm,lp,args,rp,body,_) -> [142]
206 | Ast0.Switch(switch,lp,exp,rp,lb,decls,cases,rb) -> [125]
207 | Ast0.Break(br,sem) -> [100]
208 | Ast0.Continue(cont,sem) -> [101]
209 | Ast0.Label(l,dd) -> [144]
210 | Ast0.Goto(goto,l,sem) -> [145]
211 | Ast0.Return(ret,sem) -> [77]
212 | Ast0.ReturnExpr(ret,exp,sem) -> [78]
213 | Ast0.MetaStmt(name,_) -> [79]
214 | Ast0.MetaStmtList(name,_) -> [80]
215 | Ast0.Disj(_,statement_dots_list,_,_) -> [81]
216 | Ast0.Nest(_,stmt_dots,_,_,_) -> [82]
217 | Ast0.Exp(exp) -> [83]
218 | Ast0.TopExp(exp) -> [141]
219 | Ast0.Ty(ty) -> [124]
220 | Ast0.TopInit(init) -> [146]
221 | Ast0.Dots(d,whencode) -> [84]
222 | Ast0.Circles(d,whencode) -> [85]
223 | Ast0.Stars(d,whencode) -> [86]
224 | Ast0.Include(inc,name) -> [118]
225 | Ast0.Define(def,id,params,body) -> [119]
226 | Ast0.OptStm(re) -> [87]
227 | Ast0.UniqueStm(re) -> [88]
228
229 let case_line c =
230 match Ast0.unwrap c with
231 Ast0.Default(def,colon,code) -> [126]
232 | Ast0.Case(case,exp,colon,code) -> [127]
233 | Ast0.DisjCase(_,case_lines,_,_) -> [107]
234 | Ast0.OptCase(case) -> [128]
235
236 let top_level t =
237 match Ast0.unwrap t with
238 Ast0.DECL(stmt) -> [90]
239 | Ast0.FILEINFO(old_file,new_file) -> [92]
240 | Ast0.CODE(stmt_dots) -> [94]
241 | Ast0.ERRORWORDS(exps) -> [95]
242 | Ast0.OTHER(_) -> [96]
243
244 (* 99-101 already used *)