The order of the terms in ParenType require implementing a special case for ParenType. This case handles only the following:
<type> ( * id [ .* ] ) ( params ) i.e., a function pointer or an array of function pointers, and will fail for any other cases. This is similar to the function used to print ParenType in Pretty_print_c. Signed-off-by: Jaskaran Singh <jaskaransingh7654...@gmail.com> --- parsing_cocci/visitor_ast0.ml | 147 ++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) diff --git a/parsing_cocci/visitor_ast0.ml b/parsing_cocci/visitor_ast0.ml index c282e1f8..76ec4e5c 100644 --- a/parsing_cocci/visitor_ast0.ml +++ b/parsing_cocci/visitor_ast0.ml @@ -339,6 +339,12 @@ let visitor mode bind option_default | Ast0.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2) -> let (t,id) = function_pointer (ty,lp1,star,None,rp1,lp2,params,rp2) in t + | Ast0.ParenType(lp,ty,rp) -> + let (t,id) = + parentype_type (lp,ty,None,rp) in t + | Ast0.FunctionType(ty,lp,params,rp) -> + let (t,id) = + functiontype_type (ty,None,lp,params,rp) in t | Ast0.Array(ty,lb,size,rb) -> let (t,id) = array_type (ty,None,lb,size,rb) in t | Ast0.Decimal(dec,lp,length,comma,precision_opt,rp) -> @@ -435,6 +441,68 @@ let visitor mode bind option_default ((multibind ([ty_n] @ idl @ [lb_n;size_n;rb_n]), Ast0.Array(ty,lb,size,rb)), idu) + and parentype_type (lp,ty,(id : Ast0.ident option),rp) = + let function_pointer ty1 array_decs = + match Ast0.unwrap ty1 with + Ast0.Pointer(ty2,star) -> + (match Ast0.unwrap ty2 with + Ast0.FunctionType(ty3,lp3,params,rp3) -> + let (ty_n,typ) = typeC ty3 in + let (lp_n,lp) = string_mcode lp in + let (star_n,star) = string_mcode star in + let (idl,idu) = + match id with + Some a -> let (b,c) = ident a in ([b],Some c) + | None -> ([],None) in + let (array_n, array_t) = + match array_decs with + Some(lb1,size1,rb1) -> + let (lb1_n,lb1) = string_mcode lb1 in + let (size_n,size1) = get_option expression size1 in + let (rb1_n,rb1) = string_mcode rb1 in + ([lb1_n;size_n;rb1_n], + Some(lb1,size1,rb1)) + | None -> ([], None) in + let (rp_n,rp) = string_mcode rp in + let (lp3_n,lp3) = string_mcode lp3 in + let (params_n,params) = parameter_dots params in + let (rp3_n,rp3) = string_mcode rp3 in + let bind_val = + multibind ([ty_n;lp_n;star_n] + @ idl @ array_n @ [rp_n;lp3_n;params_n;rp3_n]) in + let inner_type = + let inner_type1 = + Ast0.rewrap ty2 + (Ast0.Pointer + (Ast0.rewrap ty3 + (Ast0.FunctionType + (typ,lp3,params,rp3)),star)) in + match array_t with + Some(lb1,size1,rb1) -> + Ast0.rewrap ty1 + (Ast0.Array(inner_type1,lb1,size1,rb1)) + | None -> inner_type1 in + ((bind_val, Ast0.ParenType (lp,inner_type,rp)), idu) + | _ -> failwith "ParenType Visitor_ast0") + | _ -> failwith "ParenType Visitor_ast0" in + match Ast0.unwrap ty with + Ast0.Array(ty1,lb1,size,rb1) -> + function_pointer ty1 (Some(lb1,size,rb1)) + | Ast0.Pointer(ty1,star) -> + function_pointer ty None + | _ -> failwith "ParenType Visitor_ast0" + + and functiontype_type (ty,(id : Ast0.ident option),lp,params,rp) = + let (ty_n,ty) = typeC ty in + let (idl,idu) = (match id with + | Some a -> let (b,c) = ident a in ([b],Some c) + | None -> ([],None)) in + let (lp_n,lp) = string_mcode lp in + let (params_n,params) = parameter_dots params in + let (rp_n,rp) = string_mcode rp in + ((multibind ([ty_n] @ idl @ [lp_n; params_n; rp_n]), + Ast0.FunctionType(ty,lp,params,rp)), idu) + and named_type ty id = match Ast0.unwrap ty with Ast0.FunctionPointer(rty,lp1,star,rp1,lp2,params,rp2) -> @@ -446,6 +514,14 @@ let visitor mode bind option_default let (tyres, idn) = array_type (rty,Some id,lb,size,rb) in let idn = match idn with Some i -> i | None -> failwith "Impossible" in (rewrap ty tyres, idn) + | Ast0.ParenType(lp,rty,rp) -> + let (tyres, idn) = parentype_type (lp,rty,Some id,rp) in + let idn = match idn with Some i -> i | None -> failwith "Impossible" in + (rewrap ty tyres, idn) + | Ast0.FunctionType(rty,lp,params,rp) -> + let (tyres, idn) = functiontype_type (rty,Some id,lp,params,rp) in + let idn = match idn with Some i -> i | None -> failwith "Impossible" in + (rewrap ty tyres, idn) | _ -> let (ty_n,ty) = typeC ty in let (id_n,id) = ident id in ((bind ty_n id_n, ty), id) @@ -479,6 +555,69 @@ let visitor mode bind option_default ((multibind ([ty_n] @ idl @ [lb_n;size_n;rb_n]), Ast0.Array(ty,lb,size,rb)), idu) + (* returns ((bind value,original value),id) since id may have been updated*) + and parentype_typedef (lp,ty,id,rp) = + let function_pointer ty1 array_decs = + match Ast0.unwrap ty1 with + Ast0.Pointer(ty2,star) -> + (match Ast0.unwrap ty2 with + Ast0.FunctionType(ty3,lp3,params,rp3) -> + let (ty_n,typ) = typeC ty3 in + let (lp_n,lp) = string_mcode lp in + let (star_n,star) = string_mcode star in + let (idl,idu) = + match id with + Some a -> let (b,c) = typeC a in ([b],Some c) + | None -> ([],None) in + let (array_n, array_t) = + match array_decs with + Some(lb1,size1,rb1) -> + let (lb1_n,lb1) = string_mcode lb1 in + let (size_n,size1) = get_option expression size1 in + let (rb1_n,rb1) = string_mcode rb1 in + ([lb1_n;size_n;rb1_n], + Some(lb1,size1,rb1)) + | None -> ([], None) in + let (rp_n,rp) = string_mcode rp in + let (lp3_n,lp3) = string_mcode lp3 in + let (params_n,params) = parameter_dots params in + let (rp3_n,rp3) = string_mcode rp3 in + let bind_val = + multibind ([ty_n;lp_n;star_n] + @ idl @ array_n @ [rp_n;lp3_n;params_n;rp3_n]) in + let inner_type = + let inner_type1 = + Ast0.rewrap ty2 + (Ast0.Pointer + (Ast0.rewrap ty3 + (Ast0.FunctionType + (typ,lp3,params,rp3)),star)) in + match array_t with + Some(lb1,size1,rb1) -> + Ast0.rewrap ty1 + (Ast0.Array(inner_type1,lb1,size1,rb1)) + | None -> inner_type1 in + ((bind_val, Ast0.ParenType (lp,inner_type,rp)), idu) + | _ -> failwith "ParenType Visitor_ast0") + | _ -> failwith "ParenType Visitor_ast0" in + match Ast0.unwrap ty with + Ast0.Array(ty1,lb1,size,rb1) -> + function_pointer ty1 (Some(lb1,size,rb1)) + | Ast0.Pointer(ty1,star) -> + function_pointer ty None + | _ -> failwith "ParenType Visitor_ast0" + + and functiontype_typedef (ty,id,lp,params,rp) = + let (ty_n,ty) = typeC ty in + let (idl,idu) = (match id with + | Some a -> let (b,c) = typeC a in ([b],Some c) + | None -> ([],None)) in + let (lp_n,lp) = string_mcode lp in + let (params_n,params) = parameter_dots params in + let (rp_n,rp) = string_mcode rp in + ((multibind ([ty_n] @ idl @ [lp_n; params_n; rp_n]), + Ast0.FunctionType(ty,lp,params,rp)), idu) + and named_type_typedef ty id = match Ast0.unwrap ty with Ast0.FunctionPointer(rty,lp1,star,rp1,lp2,params,rp2) -> @@ -490,6 +629,14 @@ let visitor mode bind option_default let (tyres, idn) = array_type_typedef (rty,Some id,lb,size,rb) in let idn = match idn with Some i -> i | None -> failwith "Impossible" in (rewrap ty tyres, idn) + | Ast0.ParenType(lp,rty,rp) -> + let (tyres, idn) = parentype_typedef (lp,rty,Some id,rp) in + let idn = match idn with Some i -> i | None -> failwith "Impossible" in + (rewrap ty tyres, idn) + | Ast0.FunctionType(rty,lp,params,rp) -> + let (tyres, idn) = functiontype_typedef (rty,Some id,lp,params,rp) in + let idn = match idn with Some i -> i | None -> failwith "Impossible" in + (rewrap ty tyres, idn) | _ -> let (ty_n,ty) = typeC ty in let (id_n,id) = typeC id in ((bind ty_n id_n, ty), id) -- 2.21.1 _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci