• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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