summaryrefslogtreecommitdiff
path: root/cras/src/server/cras_expr.h
blob: a26e98d4c383fed839ffd49f8e11a3a68e911a1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/* 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_ */