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_c/unparse_cocci.ml | 60 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/parsing_c/unparse_cocci.ml b/parsing_c/unparse_cocci.ml index 30e755e9..9dd84821 100644 --- a/parsing_c/unparse_cocci.ml +++ b/parsing_c/unparse_cocci.ml @@ -722,6 +722,13 @@ and typeC ty = | Ast.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2) -> print_function_pointer (ty,lp1,star,rp1,lp2,params,rp2) (function _ -> ()) + | Ast.ParenType(lp,ty,rp) -> + print_parentype (lp,ty,rp) (function _ -> ()) + | Ast.FunctionType(ty,lp,params,rp) -> + fullType ty; + mcode print_string lp; + parameter_list params; + mcode print_string rp | Ast.Array(ty,lb,size,rb) -> fullType ty; mcode print_string lb; print_option expression size; mcode print_string rb @@ -786,6 +793,57 @@ and storage = function | Ast.Register -> print_string "register" | Ast.Extern -> print_string "extern" +(* --------------------------------------------------------------------- *) +(* ParenType *) + +and print_parentype (lp,ty,rp) fn = + match Ast.unwrap ty with + Ast.Type(_,_,fty1) -> + (match Ast.unwrap fty1 with + Ast.Pointer(ty1,star) -> + (match Ast.unwrap ty1 with + Ast.Type(_,_,fty2) -> + (match Ast.unwrap fty2 with + Ast.FunctionType(ty2,lp2,params,rp2) -> + fullType ty2; + pr_space(); + mcode print_string lp; + mcode print_string star; + fn(); + mcode print_string rp; + mcode print_string lp2; + parameter_list params; + mcode print_string rp2 + | _ -> failwith "ParenType Unparse_cocci") + | _ -> failwith "ParenType Unparse_cocci") + | Ast.Array(ty1,lb1,size1,rb1) -> + (match Ast.unwrap ty1 with + Ast.Type(_,_,fty2) -> + (match Ast.unwrap fty2 with + Ast.Pointer(ty2,star) -> + (match Ast.unwrap ty2 with + Ast.Type(_,_,fty3) -> + (match Ast.unwrap fty3 with + Ast.FunctionType(ty3,lp3,params,rp3) -> + fullType ty3; + pr_space(); + mcode print_string lp; + mcode print_string star; + fn(); + mcode print_string lb1; + print_option expression size1; + mcode print_string rb1; + mcode print_string rp; + mcode print_string lp3; + parameter_list params; + mcode print_string rp3 + | _ -> failwith "ParenType Unparse_cocci") + | _ -> failwith "ParenType Unparse_cocci") + | _ -> failwith "ParenType Unparse_cocci") + | _ -> failwith "ParenType Unparse_cocci") + | _ -> failwith "ParenType Unparse_cocci") + | _ -> failwith "ParenType Unparse_cocci" + (* --------------------------------------------------------------------- *) (* Variable declaration *) @@ -818,6 +876,8 @@ and print_named_type ty id = pretty_print_c.Pretty_print_c.type_with_ident ty (function _ -> id()) | _ -> error name ty "type value expected") + | Ast.ParenType(lp,ty,rp) -> + print_parentype (lp,ty,rp) (function _ -> id()) (*| should have a case here for pointer to array or function type that would put ( * ) around the variable. This makes one wonder why we really need a special case for function pointer *) -- 2.21.1 _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci