1 /* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2 * Use of this source code is governed by a BSD-style license that can be 3 * found in the LICENSE file. 4 */ 5 6 #ifndef CRAS_EXPR_H_ 7 #define CRAS_EXPR_H_ 8 9 #ifdef __cplusplus 10 extern "C" { 11 #endif 12 13 #include "array.h" 14 15 /* Value */ 16 17 enum cras_expr_value_type { 18 CRAS_EXPR_VALUE_TYPE_NONE, 19 CRAS_EXPR_VALUE_TYPE_BOOLEAN, 20 CRAS_EXPR_VALUE_TYPE_INT, 21 CRAS_EXPR_VALUE_TYPE_STRING, 22 CRAS_EXPR_VALUE_TYPE_FUNCTION, 23 }; 24 25 DECLARE_ARRAY_TYPE(struct cras_expr_value, cras_expr_value_array); 26 typedef void (*cras_expr_function_type)(cras_expr_value_array *operands, 27 struct cras_expr_value *result); 28 29 struct cras_expr_value { 30 enum cras_expr_value_type type; 31 union { 32 char boolean; 33 int integer; 34 const char *string; 35 cras_expr_function_type function; 36 } u; 37 }; 38 39 /* initial value for the value type is zero */ 40 #define CRAS_EXPR_VALUE_INIT {} 41 42 /* Expression */ 43 44 enum expr_type { 45 EXPR_TYPE_NONE, 46 EXPR_TYPE_LITERAL, 47 EXPR_TYPE_VARIABLE, 48 EXPR_TYPE_COMPOUND, 49 }; 50 51 DECLARE_ARRAY_TYPE(struct cras_expr_expression *, expr_array); 52 53 struct cras_expr_expression { 54 enum expr_type type; 55 union { 56 struct cras_expr_value literal; 57 const char *variable; 58 expr_array children; 59 } u; 60 }; 61 62 /* Environment */ 63 64 DECLARE_ARRAY_TYPE(const char *, string_array); 65 66 struct cras_expr_env { 67 string_array keys; 68 cras_expr_value_array values; 69 }; 70 71 /* initial value for the environment type is zero */ 72 #define CRAS_EXPR_ENV_INIT {} 73 74 void cras_expr_env_install_builtins(struct cras_expr_env *env); 75 void cras_expr_env_set_variable_boolean(struct cras_expr_env *env, 76 const char *name, char boolean); 77 void cras_expr_env_set_variable_integer(struct cras_expr_env *env, 78 const char *name, int integer); 79 void cras_expr_env_set_variable_string(struct cras_expr_env *env, 80 const char *name, const char *str); 81 void cras_expr_env_free(struct cras_expr_env *env); 82 83 struct cras_expr_expression *cras_expr_expression_parse(const char *str); 84 void cras_expr_expression_eval(struct cras_expr_expression *expr, 85 struct cras_expr_env *env, 86 struct cras_expr_value *value); 87 int cras_expr_expression_eval_boolean(struct cras_expr_expression *expr, 88 struct cras_expr_env *env, char *boolean); 89 int cras_expr_expression_eval_int(struct cras_expr_expression *expr, 90 struct cras_expr_env *env, int *integer); 91 void cras_expr_expression_free(struct cras_expr_expression *expr); 92 void cras_expr_value_free(struct cras_expr_value *value); 93 94 #ifdef __cplusplus 95 } /* extern "C" */ 96 #endif 97 98 #endif /* CRAS_EXPR_H_ */ 99