/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef CRAS_EXPR_H_ #define CRAS_EXPR_H_ #ifdef __cplusplus extern "C" { #endif #include "array.h" #include "dumper.h" /* Value */ enum cras_expr_value_type { CRAS_EXPR_VALUE_TYPE_NONE, CRAS_EXPR_VALUE_TYPE_BOOLEAN, CRAS_EXPR_VALUE_TYPE_INT, CRAS_EXPR_VALUE_TYPE_STRING, CRAS_EXPR_VALUE_TYPE_FUNCTION, }; DECLARE_ARRAY_TYPE(struct cras_expr_value, cras_expr_value_array); typedef void (*cras_expr_function_type)(cras_expr_value_array *operands, struct cras_expr_value *result); struct cras_expr_value { enum cras_expr_value_type type; union { char boolean; int integer; const char *string; cras_expr_function_type function; } u; }; /* initial value for the value type is zero */ // clang-format off #define CRAS_EXPR_VALUE_INIT {} // clang-format on /* Expression */ enum expr_type { EXPR_TYPE_NONE, EXPR_TYPE_LITERAL, EXPR_TYPE_VARIABLE, EXPR_TYPE_COMPOUND, }; DECLARE_ARRAY_TYPE(struct cras_expr_expression *, expr_array); struct cras_expr_expression { enum expr_type type; union { struct cras_expr_value literal; const char *variable; expr_array children; } u; }; /* Environment */ DECLARE_ARRAY_TYPE(const char *, string_array); struct cras_expr_env { string_array keys; cras_expr_value_array values; }; /* initial value for the environment type is zero */ // clang-format off #define CRAS_EXPR_ENV_INIT {} // clang-format on void cras_expr_env_install_builtins(struct cras_expr_env *env); void cras_expr_env_set_variable_boolean(struct cras_expr_env *env, const char *name, char boolean); void cras_expr_env_set_variable_integer(struct cras_expr_env *env, const char *name, int integer); void cras_expr_env_set_variable_string(struct cras_expr_env *env, const char *name, const char *str); void cras_expr_env_free(struct cras_expr_env *env); void cras_expr_env_dump(struct dumper *d, const struct cras_expr_env *env); struct cras_expr_expression *cras_expr_expression_parse(const char *str); void cras_expr_expression_eval(struct cras_expr_expression *expr, struct cras_expr_env *env, struct cras_expr_value *value); int cras_expr_expression_eval_boolean(struct cras_expr_expression *expr, struct cras_expr_env *env, char *boolean); int cras_expr_expression_eval_int(struct cras_expr_expression *expr, struct cras_expr_env *env, int *integer); void cras_expr_expression_free(struct cras_expr_expression *expr); void cras_expr_expression_dump(struct dumper *d, const struct cras_expr_expression *expr); void cras_expr_value_free(struct cras_expr_value *value); void cras_expr_value_dump(struct dumper *d, const struct cras_expr_value *value); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* CRAS_EXPR_H_ */