#ifndef ZABBIX_EXPR_H
#define ZABBIX_EXPR_H
#include "zbxcommon.h"
int zbx_is_hostname_char(unsigned char c);
int zbx_is_key_char(unsigned char c);
int zbx_is_function_char(unsigned char c);
int zbx_is_macro_char(unsigned char c);
int zbx_is_discovery_macro(const char *name);
int zbx_parse_key(const char **exp);
int zbx_parse_host_key(char *exp, char **host, char **key);
void zbx_make_hostname(char *host);
int zbx_check_hostname(const char *hostname, char **error);
int zbx_function_validate(const char *expr, size_t *par_l, size_t *par_r, char *error, int max_error_len);
int zbx_function_validate_parameters(const char *expr, size_t *length);
int zbx_user_macro_parse(const char *macro, int *macro_r, int *context_l, int *context_r,
unsigned char *context_op);
int zbx_user_macro_parse_dyn(const char *macro, char **name, char **context, int *length,
unsigned char *context_op);
char *zbx_user_macro_unquote_context_dyn(const char *context, int len);
char *zbx_user_macro_quote_context_dyn(const char *context, int force_quote, char **error);
int zbx_function_find(const char *expr, size_t *func_pos, size_t *par_l, size_t *par_r, char *error,
int max_error_len);
char *zbx_function_param_unquote_dyn_ext(const char *param, size_t len, int *quoted, int esc_bs);
char *zbx_function_param_unquote_dyn(const char *param, size_t len, int *quoted);
char *zbx_function_param_unquote_dyn_compat(const char *param, size_t len, int *quoted);
int zbx_function_param_quote(char **param, int forced, int esc_bs);
char *zbx_function_get_param_dyn(const char *params, int Nparam);
#define ZBX_BACKSLASH_ESC_OFF 0
#define ZBX_BACKSLASH_ESC_ON 1
void zbx_function_param_parse_ext(const char *expr, zbx_uint32_t allowed_macros, int esc_bs, size_t *param_pos,
size_t *length, size_t *sep_pos);
void zbx_function_param_parse(const char *expr, size_t *param_pos, size_t *length, size_t *sep_pos);
void zbx_trigger_function_param_parse(const char *expr, size_t *param_pos, size_t *length, size_t *sep_pos);
void zbx_lld_function_param_parse(const char *expr, int esc_flags, size_t *param_pos, size_t *length,
size_t *sep_pos);
int zbx_function_param_parse_count(const char *expr);
typedef enum
{
ZBX_FUNCTION_TYPE_UNKNOWN,
ZBX_FUNCTION_TYPE_HISTORY,
ZBX_FUNCTION_TYPE_TIMER,
ZBX_FUNCTION_TYPE_TRENDS
}
zbx_function_type_t;
zbx_function_type_t zbx_get_function_type(const char *func);
int zbx_is_double_suffix(const char *str, unsigned char flags);
double zbx_str2double(const char *str);
int zbx_suffixed_number_parse(const char *number, int *len);
int zbx_strmatch_condition(const char *value, const char *pattern, unsigned char op);
int zbx_uint64match_condition(zbx_uint64_t value, zbx_uint64_t pattern, unsigned char op);
#define ZBX_TOKEN_UNKNOWN 0x00000
#define ZBX_TOKEN_OBJECTID 0x00001
#define ZBX_TOKEN_MACRO 0x00002
#define ZBX_TOKEN_LLD_MACRO 0x00004
#define ZBX_TOKEN_USER_MACRO 0x00008
#define ZBX_TOKEN_FUNC_MACRO 0x00010
#define ZBX_TOKEN_SIMPLE_MACRO 0x00020
#define ZBX_TOKEN_REFERENCE 0x00040
#define ZBX_TOKEN_LLD_FUNC_MACRO 0x00080
#define ZBX_TOKEN_EXPRESSION_MACRO 0x00100
#define ZBX_TOKEN_USER_FUNC_MACRO 0x00200
#define ZBX_TOKEN_VAR_MACRO 0x00400
#define ZBX_TOKEN_VAR_FUNC_MACRO 0x00800
#define ZBX_TOKEN_JSON 0x0010000