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 #include "dumper.h" 15 16 /* Value */ 17 18 enum cras_expr_value_type { 19 CRAS_EXPR_VALUE_TYPE_NONE, 20 CRAS_EXPR_VALUE_TYPE_BOOLEAN, 21 CRAS_EXPR_VALUE_TYPE_INT, 22 CRAS_EXPR_VALUE_TYPE_STRING, 23 CRAS_EXPR_VALUE_TYPE_FUNCTION, 24 }; 25 26 DECLARE_ARRAY_TYPE(struct cras_expr_value, cras_expr_value_array); 27 typedef void (*cras_expr_function_type)(cras_expr_value_array *operands, 28 struct cras_expr_value *result); 29 30 struct cras_expr_value { 31 enum cras_expr_value_type type; 32 union { 33 char boolean; 34 int integer; 35 const char *string; 36 cras_expr_function_type function; 37 } u; 38 }; 39 40 /* initial value for the value type is zero */ 41 #define CRAS_EXPR_VALUE_INIT {} 42 43 /* Expression */ 44 45 enum expr_type { 46 EXPR_TYPE_NONE, 47 EXPR_TYPE_LITERAL, 48 EXPR_TYPE_VARIABLE, 49 EXPR_TYPE_COMPOUND, 50 }; 51 52 DECLARE_ARRAY_TYPE(struct cras_expr_expression *, expr_array); 53 54 struct cras_expr_expression { 55 enum expr_type type; 56 union { 57 struct cras_expr_value literal; 58 const char *variable; 59 expr_array children; 60 } u; 61 }; 62 63 /* Environment */ 64 65 DECLARE_ARRAY_TYPE(const char *, string_array); 66 67 struct cras_expr_env { 68 string_array keys; 69 cras_expr_value_array values; 70 }; 71 72 /* initial value for the environment type is zero */ 73 #define CRAS_EXPR_ENV_INIT {} 74 75 void cras_expr_env_install_builtins(struct cras_expr_env *env); 76 void cras_expr_env_set_variable_boolean(struct cras_expr_env *env, 77 const char *name, char boolean); 78 void cras_expr_env_set_variable_integer(struct cras_expr_env *env, 79 const char *name, int integer); 80 void cras_expr_env_set_variable_string(struct cras_expr_env *env, 81 const char *name, const char *str); 82 void cras_expr_env_free(struct cras_expr_env *env); 83 void cras_expr_env_dump(struct dumper *d, const struct cras_expr_env *env); 84 85 struct cras_expr_expression *cras_expr_expression_parse(const char *str); 86 void cras_expr_expression_eval(struct cras_expr_expression *expr, 87 struct cras_expr_env *env, 88 struct cras_expr_value *value); 89 int cras_expr_expression_eval_boolean(struct cras_expr_expression *expr, 90 struct cras_expr_env *env, char *boolean); 91 int cras_expr_expression_eval_int(struct cras_expr_expression *expr, 92 struct cras_expr_env *env, int *integer); 93 void cras_expr_expression_free(struct cras_expr_expression *expr); 94 void cras_expr_expression_dump(struct dumper *d, 95 const struct cras_expr_expression *expr); 96 void cras_expr_value_free(struct cras_expr_value *value); 97 void cras_expr_value_dump(struct dumper *d, 98 const struct cras_expr_value *value); 99 100 #ifdef __cplusplus 101 } /* extern "C" */ 102 #endif 103 104 #endif /* CRAS_EXPR_H_ */ 105