struct sieve_binary *sieve_compile_script (struct sieve_script *script, struct sieve_error_handler *ehandler, enum sieve_compile_flags flags, enum sieve_error *error_r) { struct sieve_ast *ast; struct sieve_binary *sbin; enum sieve_error error, *errorp; if ( error_r != NULL ) errorp = error_r; else errorp = &error; *errorp = SIEVE_ERROR_NONE; /* Parse */ if ( (ast = sieve_parse(script, ehandler, errorp)) == NULL ) { switch ( *errorp ) { case SIEVE_ERROR_NOT_FOUND: if (error_r == NULL) { sieve_error(ehandler, sieve_script_name(script), "script not found"); } break; default: sieve_error(ehandler, sieve_script_name(script), "parse failed"); } return NULL; } /* Validate */ if ( !sieve_validate(ast, ehandler, flags, errorp) ) { sieve_error(ehandler, sieve_script_name(script), "validation failed"); sieve_ast_unref(&ast); return NULL; } /* Generate */ if ( (sbin=sieve_generate(ast, ehandler, flags, errorp)) == NULL ) { sieve_error(ehandler, sieve_script_name(script), "code generation failed"); sieve_ast_unref(&ast); return NULL; } /* Cleanup */ sieve_ast_unref(&ast); return sbin; }
void sieve_generator_free(struct sieve_generator **gentr) { sieve_ast_unref(&(*gentr)->genenv.ast); sieve_error_handler_unref(&(*gentr)->ehandler); sieve_binary_debug_writer_deinit(&(*gentr)->dwriter); if ( (*gentr)->genenv.sbin != NULL ) sieve_binary_unref(&(*gentr)->genenv.sbin); pool_unref(&((*gentr)->pool)); *gentr = NULL; }