gboolean tf_cond_prepare(LogTemplateFunction *self, LogTemplate *parent, gint argc, gchar *argv[], gpointer *state, GDestroyNotify *state_destroy, GError **error) { TFCondState *args; CfgLexer *lexer; gint i; g_return_val_if_fail(error == NULL || *error == NULL, FALSE); args = g_malloc0(sizeof(TFCondState) + (argc - 1) * sizeof(LogTemplate *)); args->argc = argc - 1; lexer = cfg_lexer_new_buffer(argv[0], strlen(argv[0])); if (!cfg_run_parser(parent->cfg, lexer, &filter_expr_parser, (gpointer *) &args->filter, NULL)) { g_set_error(error, LOG_TEMPLATE_ERROR, LOG_TEMPLATE_ERROR_COMPILE, "Error parsing conditional filter expression"); goto error; } for (i = 1; i < argc; i++) { args->argv[i - 1] = log_template_new(parent->cfg, NULL); log_template_set_escape(args->argv[i - 1], TRUE); if (!log_template_compile(args->argv[i - 1], argv[i], error)) goto error; } *state = args; *state_destroy = (GDestroyNotify) tf_cond_free_state; return TRUE; error: tf_cond_free_state(args); return FALSE; }
gboolean tf_simple_func_prepare(LogTemplateFunction *self, gpointer s, LogTemplate *parent, gint argc, gchar *argv[], GError **error) { TFSimpleFuncState *state = (TFSimpleFuncState *) s; gint i; g_return_val_if_fail(error == NULL || *error == NULL, FALSE); state->argv = g_malloc(sizeof(LogTemplate *) * (argc - 1)); /* NOTE: the argv argument con tains the function name as argv[0], * but the LogTemplate array doesn't. Thus the index is shifted by * one. */ for (i = 0; i < argc - 1; i++) { state->argv[i] = log_template_new(parent->cfg, NULL); log_template_set_escape(state->argv[i], parent->escape); if (!log_template_compile(state->argv[i], argv[i + 1], error)) goto error; } state->argc = argc - 1; return TRUE; error: return FALSE; }