Here is another attempt: @initialize:ocaml@ @@
let check p = let p = List.hd p in p.line_end = p.current_element_line_end @ detect_func @ identifier CLI_FN, AVM, AIN, ACMD; fresh identifier LAIN = "line_" ## AIN; expression ERR, exp; statement S1; typedef clib_error_t, vlib_main_t, unformat_input_t, vlib_cli_command_t; @@ static clib_error_t *CLI_FN (vlib_main_t * AVM, unformat_input_t * AIN, vlib_cli_command_t * ACMD) { + clib_error_t *e = 0; + unformat_input_t *LAIN; ... + if (!unformat_user (AIN, unformat_line_input, LAIN)) { + return 0; + } + - while (unformat_check_input (AIN) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (LAIN) != UNFORMAT_END_OF_INPUT) S1 <... - return ERR; + e = ERR; + goto done; ...> } // the following rule should rematch the function matched in the previous rule @@ identifier detect_func.CLI_FN, detect_func.AVM, detect_func.AIN, detect_func.LAIN, detect_func.ACMD; position p : script:ocaml() { check p }; // check that the matched position is at the end of the function @@ static clib_error_t *CLI_FN (vlib_main_t * AVM, unformat_input_t * AIN, vlib_cli_command_t * ACMD) { ... when exists +done: + unformat_free(LAIN); + return e; }@p _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci