blob: 894d219548207ac31634739b63205e6606609bde [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) 2020 Cyril Hrubis <chrubis@suse.cz>
*/
#ifndef TST_BOOL_EXPR_H__
#define TST_BOOL_EXPR_H__
enum tst_op {
TST_OP_NOT,
TST_OP_AND,
TST_OP_OR,
TST_OP_VAR,
/* Used only internally */
TST_OP_LPAR,
TST_OP_RPAR,
};
struct tst_expr_tok {
enum tst_op op;
const char *tok;
size_t tok_len;
struct tst_expr_tok *next;
const void *priv;
};
struct tst_expr {
struct tst_expr_tok *rpn;
struct tst_expr_tok buf[];
};
/*
* Parses an boolean expression and returns a simplified RPN version.
*
* If expression is not valid the call prints error into stderr and returns
* NULL. On success pointer to an expression is returned which can be evaluated
* by the tst_bool_expr_eval() function and has to be later freed by the
* caller.
*
* The boolean expression can consists of:
*
* - unary negation opeartion !
* - two binary operations & and |
* - correct sequence of parentheses ()
* - strings that are treated as boolean variables
*
* e.g. '(A | B) & C' or 'Variable_1 & Variable_2' are both a valid boolean
* expressions.
*
* @expr String containing a boolean expression to be parsed.
* @return Pointer to an RPN expression.
*/
struct tst_expr *tst_bool_expr_parse(const char *expr);
/*
* Prints an string representation of the expression into a FILE.
*
* @param A FILE to print to.
* @expr An expression to print.
*/
void tst_bool_expr_print(FILE *f, struct tst_expr *expr);
/*
* Evaluates an expression given a map for variables.
*
* The call will fail if:
* - map function returns -1 which indicates undefined variable
* - the eval function runs out of stack
*
* @param expr Boolean expression in RPN.
* @param map Mapping function for boolean variables.
*
* @return Returns 0 or 1 if expression was evaluated correctly and -1 on error.
*/
int tst_bool_expr_eval(struct tst_expr *expr,
int (*map)(struct tst_expr_tok *var));
/*
* Frees the memory allocated by the tst_bool_expr_parse().
*
* @param Boolean expression.
*/
void tst_bool_expr_free(struct tst_expr *expr);
#endif /* TST_BOOL_EXPR_H__ */