diff -r 76f2f5d532d0 -r bb7cff720dd0 src/server/util/object.h --- a/src/server/util/object.h Wed Nov 09 11:51:19 2022 +0100 +++ b/src/server/util/object.h Sat Nov 12 11:01:11 2022 +0100 @@ -32,6 +32,9 @@ #include "../public/nsapi.h" #include "pool.h" +#include +#include + #ifdef __cplusplus extern "C" { #endif @@ -120,6 +123,73 @@ uint32_t ref; // reference counter }; + + +typedef struct NSAPIExpression NSAPIExpression; +typedef enum NSAPIExpressionType NSAPIExpressionType; +typedef enum NSAPIExpressionOperator NSAPIExpressionOperator; + +enum NSAPIExpressionType { + NSAPI_EXPRESSION_BOOL = 0, + NSAPI_EXPRESSION_INT, + NSAPI_EXPRESSION_DOUBLE, + NSAPI_EXPRESSION_STRING, + NSAPI_EXPRESSION_VARIABLE, + NSAPI_EXPRESSION_LOGICAL, + NSAPI_EXPRESSION_UNARY, + NSAPI_EXPRESSION_BINARY +}; + +enum NSAPIExpressionOperator { + NSAPI_EXPRESSION_NOOP = 0, + NSAPI_EXPRESSION_NOT, + NSAPI_EXPRESSION_AND, + NSAPI_EXPRESSION_OR, + NSAPI_EXPRESSION_XOR, + NSAPI_EXPRESSION_EQ, + NSAPI_EXPRESSION_NEQ, + NSAPI_EXPRESSION_GT, + NSAPI_EXPRESSION_LT, + NSAPI_EXPRESSION_GE, + NSAPI_EXPRESSION_LE, + NSAPI_EXPRESSION_ADD, + NSAPI_EXPRESSION_SUB, + NSAPI_EXPRESSION_MUL, + NSAPI_EXPRESSION_DIV, + NSAPI_EXPRESSION_MOD +}; + +union NSAPIExpressionValue { + cxstring str; + cxstring var; + int64_t i; + double f; + int b; +}; + +struct NSAPIExpression { + // value.ptr is not null if + // type is one of (bool, int, string): literal text + // type is variable: variable name + union NSAPIExpressionValue value; + + NSAPIExpressionType type; + + NSAPIExpressionOperator operator; + + /* + * left/single operand + */ + NSAPIExpression *left; + + /* + * right operand or NULL + */ + NSAPIExpression *right; +}; + + + /* * creates a new httpd_object */ @@ -171,6 +241,16 @@ void nsapi_context_next_stage(NSAPIContext *context); +/* + * parses an expression from a list of cxstring tokens and compiles the + * expression into an Expression object + * + * tokens: CxList that contains cxstring + */ +Expression* condition_create(pool_handle_t *pool, CxList *tokens); + +NSAPIExpression* expr_parse_logical_expr(pool_handle_t *pool, CxList *tokens, size_t *pos); + int condition_evaluate(Condition *condition, Session *sn, Request *rq);