2 Copyright (C) 2012 Modelon AB
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the BSD style license.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 FMILIB_License.txt file for more details.
12 You should have received a copy of the FMILIB_License.txt file
13 along with this program. If not, contact Modelon AB <http://www.modelon.com>.
15 #ifndef FMI2_XML_QUERY_H
16 #define FMI2_XML_QUERY_H
18 #include <jm_vector.h>
20 #include <FMI2/fmi2_xml_variable.h>
25 /* Query below has the following syntax:
26 query = elementary_query
31 elementary_query = "name" '=' <string>
32 | "quantity" '=' <string>
33 | "basetype" '=' (real| integer | enumeration |boolean |string)
36 | "displayUnit" '=' <string>
37 | "fixed" '=' ("true"|"false")
38 | "hasStart" '=' ("true"|"false")
40 | "alias" '=' ['-']<variable name> (negative value for negated-aliases)
42 Example: "name='a.*' & fixed=false"
45 #define FMI2_XML_Q_ELEMENTARY(HANDLE) \
59 typedef enum fmi2_xml_elementary_enu_t {
60 #define FMI2_XML_Q_ELEMENTARY_PREFIX(elem) fmi2_xml_q_elmentary_enu_##elem,
61 FMI2_XML_Q_ELEMENTARY(FMI2_XML_Q_ELEMENTARY_PREFIX)
62 fmi2_xml_elementary_enu_num
63 } fmi2_xml_elementary_enu_t;
65 typedef struct fmi2_xml_q_context_t fmi2_xml_q_context_t;
66 typedef struct fmi2_xml_q_terminal_t fmi2_xml_q_terminal_t;
68 typedef int (*fmi2_xml_q_scan_elementary_ft)(fmi2_xml_q_context_t*, fmi2_xml_q_terminal_t* term);
70 #define FMI2_XML_Q_ELEMENTARY_DECLARE_SCAN(name) int fmi2_xml_q_scan_elementary_##name(fmi2_xml_q_context_t*, fmi2_xml_q_terminal_t* term);
71 FMI2_XML_Q_ELEMENTARY(FMI2_XML_Q_ELEMENTARY_DECLARE_SCAN)
74 typedef int (*fmi2_xml_q_eval_elementary_ft)(fmi2_xml_variable_t* var, fmi2_xml_q_terminal_t* term);
76 #define FMI2_XML_Q_ELEMENTARY_DECLARE_EVAL(name) int fmi2_xml_q_eval_elementary_##name(fmi2_xml_variable_t* var, fmi2_xml_q_terminal_t* term);
77 FMI2_XML_Q_ELEMENTARY(FMI2_XML_Q_ELEMENTARY_DECLARE_EVAL)
79 typedef enum fmi2_xml_q_term_enu_t {
80 fmi2_xml_q_term_enu_elementary,
81 fmi2_xml_q_term_enu_LP,
82 fmi2_xml_q_term_enu_RP,
83 fmi2_xml_q_term_enu_OR,
84 fmi2_xml_q_term_enu_AND,
85 fmi2_xml_q_term_enu_NOT,
86 fmi2_xml_q_term_enu_END,
87 fmi2_xml_q_term_enu_TRUE,
88 fmi2_xml_q_term_enu_FALSE
89 } fmi2_xml_q_terminal_enu_t;
92 struct fmi2_xml_q_terminal_t {
93 fmi2_xml_q_terminal_enu_t kind;
95 fmi2_xml_elementary_enu_t specific;
104 jm_vector_declare_template(fmi2_xml_q_terminal_t)
106 typedef jm_vector(fmi2_xml_q_terminal_t) fmi2_xml_q_term_vt;
108 typedef struct fmi2_xml_q_expression_t fmi2_xml_q_expression_t;
110 struct fmi2_xml_q_expression_t {
111 jm_vector(jm_voidp) expression;
113 jm_vector(jm_voidp) stack;
115 fmi2_xml_q_terminal_t termFalse, termTrue;
116 fmi2_xml_q_term_vt terms;
117 jm_vector(char) strbuf;
120 struct fmi2_xml_q_context_t {
121 jm_vector(jm_name_ID_map_t) elementary_map;
130 fmi2_xml_q_expression_t expr;
133 void fmi2_xml_q_init_context(fmi2_xml_q_context_t*, jm_callbacks* cb);
134 void fmi2_xml_q_free_context_data(fmi2_xml_q_context_t*);
135 int fmi2_xml_q_filter_variable(fmi2_xml_variable_t* var, fmi2_xml_q_expression_t* );
136 int fmi2_xml_q_parse_query(fmi2_xml_q_context_t* context, jm_string query);
141 #endif /* FMI2_XML_QUERY_H */