#ifndef DAVQLPARSER_H
#define DAVQLPARSER_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <cx/string.h>
#include <cx/list.h>
typedef enum {DAVQL_ERROR, DAVQL_SELECT, DAVQL_SET} davqltype_t;
typedef enum {
DAVQL_TOKEN_INVALID, DAVQL_TOKEN_KEYWORD,
DAVQL_TOKEN_IDENTIFIER, DAVQL_TOKEN_FMTSPEC,
DAVQL_TOKEN_STRING, DAVQL_TOKEN_NUMBER, DAVQL_TOKEN_TIMESTAMP,
DAVQL_TOKEN_COMMA, DAVQL_TOKEN_OPENP, DAVQL_TOKEN_CLOSEP,
DAVQL_TOKEN_OPERATOR, DAVQL_TOKEN_END
} davqltokenclass_t;
typedef enum {
DAVQL_UNDEFINED_TYPE,
DAVQL_NUMBER, DAVQL_STRING, DAVQL_TIMESTAMP, DAVQL_IDENTIFIER,
DAVQL_UNARY, DAVQL_BINARY, DAVQL_LOGICAL, DAVQL_FUNCCALL
} davqlexprtype_t;
typedef enum {
DAVQL_NOOP, DAVQL_CALL, DAVQL_ARGLIST,
DAVQL_ADD, DAVQL_SUB, DAVQL_MUL, DAVQL_DIV,
DAVQL_AND, DAVQL_OR, DAVQL_XOR, DAVQL_NEG,
DAVQL_NOT, DAVQL_LAND, DAVQL_LOR, DAVQL_LXOR,
DAVQL_EQ, DAVQL_NEQ, DAVQL_LT, DAVQL_GT, DAVQL_LE, DAVQL_GE,
DAVQL_LIKE, DAVQL_UNLIKE
} davqloperator_t;
typedef struct DavQLToken DavQLToken;
struct DavQLToken {
davqltokenclass_t tokenclass;
cxstring value;
DavQLToken *prev;
DavQLToken *next;
};
typedef struct _davqlexpr DavQLExpression;
struct _davqlexpr {
cxstring srctext;
davqlexprtype_t type;
davqloperator_t op;
DavQLExpression *left;
DavQLExpression *right;
};
typedef struct {
DavQLExpression *column;
_Bool descending;
} DavQLOrderCriterion;
typedef struct {
cxstring name;
DavQLExpression *expr;
} DavQLField;
typedef struct {
cxstring srctext;
davqltype_t type;
int errorcode;
char* errormessage;
CxList* fields;
cxstring path;
DavQLExpression* where;
CxList* orderby;
int depth;
CxList* args;
} DavQLStatement;
#define DAV_DEPTH_INFINITY -1
#define DAV_DEPTH_PLACEHOLDER -2
#define DAVQL_ERROR_UNEXPECTED_TOKEN 1
#define DAVQL_ERROR_INVALID_TOKEN 2
#define DAVQL_ERROR_MISSING_TOKEN 11
#define DAVQL_ERROR_MISSING_EXPR 12
#define DAVQL_ERROR_MISSING_PAR 13
#define DAVQL_ERROR_MISSING_ASSIGN 14
#define DAVQL_ERROR_INVALID_EXPR 21
#define DAVQL_ERROR_INVALID_UNARY_OP 22
#define DAVQL_ERROR_INVALID_LOGICAL_OP 23
#define DAVQL_ERROR_INVALID_FMTSPEC 24
#define DAVQL_ERROR_INVALID_STRING 25
#define DAVQL_ERROR_INVALID_ORDER_CRITERION 26
#define DAVQL_ERROR_INVALID_DEPTH 101
#define DAVQL_ERROR_INVALID -1
#define DAVQL_ERROR_OUT_OF_MEMORY -2
void dav_debug_statement(DavQLStatement *stmt);
DavQLStatement* dav_parse_statement(cxstring stmt);
#define dav_parse_cstr_statement(stmt) dav_parse_statement(cx_str(stmt))
void dav_free_statement(DavQLStatement *stmt);
#ifdef __cplusplus
}
#endif
#endif