Home | History | Annotate | Download | only in server
      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