/* 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"
/* 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 */
#define CRAS_EXPR_VALUE_INIT {}
/* 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 */
#define CRAS_EXPR_ENV_INIT {}
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);
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_value_free(struct cras_expr_value *value);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* CRAS_EXPR_H_ */