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 FMI1_XML_QUERY_H
16 #define FMI1_XML_QUERY_H
18 #include <jm_vector.h>
20 #include <FMI1/fmi1_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 FMI1_XML_Q_ELEMENTARY(HANDLE) \
59 typedef enum fmi1_xml_elementary_enu_t {
60 #define FMI1_XML_Q_ELEMENTARY_PREFIX(elem) fmi1_xml_q_elmentary_enu_##elem,
61 FMI1_XML_Q_ELEMENTARY(FMI1_XML_Q_ELEMENTARY_PREFIX)
62 fmi1_xml_elementary_enu_num
63 } fmi1_xml_elementary_enu_t;
65 typedef struct fmi1_xml_q_context_t fmi1_xml_q_context_t;
66 typedef struct fmi1_xml_q_terminal_t fmi1_xml_q_terminal_t;
68 typedef int (*fmi1_xml_q_scan_elementary_ft)(fmi1_xml_q_context_t*, fmi1_xml_q_terminal_t* term);
70 #define FMI1_XML_Q_ELEMENTARY_DECLARE_SCAN(name) int fmi1_xml_q_scan_elementary_##name(fmi1_xml_q_context_t*, fmi1_xml_q_terminal_t* term);
71 FMI1_XML_Q_ELEMENTARY(FMI1_XML_Q_ELEMENTARY_DECLARE_SCAN)
74 typedef int (*fmi1_xml_q_eval_elementary_ft)(fmi1_xml_variable_t* var, fmi1_xml_q_terminal_t* term);
76 #define FMI1_XML_Q_ELEMENTARY_DECLARE_EVAL(name) int fmi1_xml_q_eval_elementary_##name(fmi1_xml_variable_t* var, fmi1_xml_q_terminal_t* term);
77 FMI1_XML_Q_ELEMENTARY(FMI1_XML_Q_ELEMENTARY_DECLARE_EVAL)
79 typedef enum fmi1_xml_q_term_enu_t {
80 fmi1_xml_q_term_enu_elementary,
81 fmi1_xml_q_term_enu_LP,
82 fmi1_xml_q_term_enu_RP,
83 fmi1_xml_q_term_enu_OR,
84 fmi1_xml_q_term_enu_AND,
85 fmi1_xml_q_term_enu_NOT,
86 fmi1_xml_q_term_enu_END,
87 fmi1_xml_q_term_enu_TRUE,
88 fmi1_xml_q_term_enu_FALSE
89 } fmi1_xml_q_terminal_enu_t;
92 struct fmi1_xml_q_terminal_t {
93 fmi1_xml_q_terminal_enu_t kind;
95 fmi1_xml_elementary_enu_t specific;
104 jm_vector_declare_template(fmi1_xml_q_terminal_t)
106 typedef jm_vector(fmi1_xml_q_terminal_t) fmi1_xml_q_term_vt;
108 typedef struct fmi1_xml_q_expression_t fmi1_xml_q_expression_t;
110 struct fmi1_xml_q_expression_t {
111 jm_vector(jm_voidp) expression;
113 jm_vector(jm_voidp) stack;
115 fmi1_xml_q_terminal_t termFalse, termTrue;
116 fmi1_xml_q_term_vt terms;
117 jm_vector(char) strbuf;
120 struct fmi1_xml_q_context_t {
121 jm_vector(jm_name_ID_map_t) elementary_map;
130 fmi1_xml_q_expression_t expr;
133 void fmi1_xml_q_init_context(fmi1_xml_q_context_t*, jm_callbacks* cb);
134 void fmi1_xml_q_free_context_data(fmi1_xml_q_context_t*);
135 int fmi1_xml_q_filter_variable(fmi1_xml_variable_t* var, fmi1_xml_q_expression_t* );
136 int fmi1_xml_q_parse_query(fmi1_xml_q_context_t* context, jm_string query);
141 #endif /* FMI1_XML_QUERY_H */