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_ast.ml | 66 ++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/parsing_cocci/visitor_ast.ml b/parsing_cocci/visitor_ast.ml index 3d5de794..6f2e3dab 100644 --- a/parsing_cocci/visitor_ast.ml +++ b/parsing_cocci/visitor_ast.ml @@ -318,6 +318,52 @@ let combiner bind option_default let lrb = string_mcode rb in multibind ([lty] @ lid @ [lb; lsize; lrb]) + and parentype_type (lp,ty,(id : Ast.ident option),rp) = + let function_pointer ty1 array_dec = + match Ast.unwrap ty1 with + Ast.Type(_,_,fty1) -> + (match Ast.unwrap fty1 with + Ast.Pointer(ty2,star) -> + (match Ast.unwrap ty2 with + Ast.Type(_,_,fty3) -> + (match Ast.unwrap fty3 with + Ast.FunctionType(ty3,lp3,params,rp3) -> + let ltyp = fullType ty3 in + let llp = string_mcode lp in + let lstar = string_mcode star in + let lid = + match id with + Some idd -> [ident idd] + | None -> [] in + let larray = + match array_dec with + Some(lb1,size1,rb1) -> + let llb1 = string_mcode lb1 in + let lsize1 = get_option expression size1 in + let lrb1 = string_mcode rb1 in + [llb1;lsize1;lrb1] + | None -> [] in + let lrp = string_mcode rp in + let llp3 = string_mcode lp3 in + let lparams = parameter_dots params in + let lrp3 = string_mcode rp3 in + multibind + ([ltyp;llp;lstar] @ lid @ larray @ + [lrp;llp3;lparams;lrp3]) + | _ -> failwith "ParenType Visitor_ast") + | _ -> failwith "ParenType Visitor_ast") + | _ -> failwith "ParenType Visitor_ast") + | _ -> failwith "ParenType Visitor_ast" in + match Ast.unwrap ty with + Ast.Type(_,_,fty1) -> + (match Ast.unwrap fty1 with + Ast.Array(ty1,lb1,size,rb1) -> + function_pointer ty1 (Some(lb1,size,rb1)) + | Ast.Pointer(ty1,star) -> + function_pointer ty None + | _ -> failwith "ParenType Visitor_ast") + | _ -> failwith "ParenType Visitor_ast" + and typeC ty = let k ty = match Ast.unwrap ty with @@ -332,6 +378,14 @@ let combiner bind option_default bind lty lstar | Ast.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2) -> function_pointer (ty,lp1,star,None,rp1,lp2,params,rp2) + | Ast.ParenType(lp,ty,rp) -> + parentype_type (lp,ty,None,rp) + | Ast.FunctionType(ty,lp,params,rp) -> + let lty = fullType ty in + let llp = string_mcode lp in + let lparams = parameter_dots params in + let lrp = string_mcode rp in + multibind [lty; llp; lparams; lrp] | Ast.Array(ty,lb,size,rb) -> array_type (ty,None,lb,size,rb) | Ast.Decimal(dec,lp,length,comma,precision_opt,rp) -> let ldec = string_mcode dec in @@ -384,6 +438,7 @@ let combiner bind option_default Ast.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2) -> function_pointer (ty, lp1, star, Some id, rp1, lp2, params, rp2) | Ast.Array(ty,lb,size,rb) -> array_type (ty, Some id, lb, size, rb) + | Ast.ParenType(lp,ty,rp) -> parentype_type (lp, ty, Some id, rp) | _ -> let lty = fullType ty in let lid = ident id in bind lty lid) @@ -1253,6 +1308,17 @@ let rebuilder let lparams = parameter_dots params in let lrp2 = string_mcode rp2 in Ast.FunctionPointer(lty, llp1, lstar, lrp1, llp2, lparams, lrp2) + | Ast.ParenType(lp,ty,rp) -> + let llp = string_mcode lp in + let lty = fullType ty in + let lrp = string_mcode rp in + Ast.ParenType(llp,lty,lrp) + | Ast.FunctionType(ty,lp,params,rp) -> + let lty = fullType ty in + let llp = string_mcode lp in + let lparams = parameter_dots params in + let lrp = string_mcode rp in + Ast.FunctionType(lty,llp,lparams,lrp) | Ast.Array(ty,lb,size,rb) -> let lty = fullType ty in let llb = string_mcode lb in -- 2.21.1 _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci