]> gerrit.simantics Code Review - simantics/fmil.git/blob - org.simantics.fmil.core/native/FMILibrary/src/XML/src/FMI1/fmi1_xml_query.h
Add FMILibrary-2.0.3 to org.simantics.fmil.core\native.
[simantics/fmil.git] / org.simantics.fmil.core / native / FMILibrary / src / XML / src / FMI1 / fmi1_xml_query.h
1 /*
2     Copyright (C) 2012 Modelon AB
3
4     This program is free software: you can redistribute it and/or modify
5     it under the terms of the BSD style license.
6
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.
11
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>.
14 */
15 #ifndef FMI1_XML_QUERY_H
16 #define FMI1_XML_QUERY_H
17
18 #include <jm_vector.h>
19 #include <jm_stack.h>
20 #include <FMI1/fmi1_xml_variable.h>
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24
25 /* Query below has the following syntax:
26   query =   elementary_query
27                   | '(' query ')'
28                   | query 'or' query
29                   | query 'and' query
30                   | 'not' query
31   elementary_query =  "name" '=' <string>
32                     | "quantity" '=' <string>
33                     | "basetype" '=' (real| integer | enumeration |boolean |string)
34                     | "type" '=' <string>
35                     | "unit" '=' <string>
36                     | "displayUnit" '=' <string>
37                     | "fixed" '=' ("true"|"false")
38                     | "hasStart" '='  ("true"|"false")
39                     | "isAlias"
40                     | "alias" '=' ['-']<variable name> (negative value for negated-aliases)
41
42 Example: "name='a.*' & fixed=false"
43 */
44
45 #define FMI1_XML_Q_ELEMENTARY(HANDLE) \
46     HANDLE(name) \
47     HANDLE(unit) \
48
49 /*
50     HANDLE(type) \
51     HANDLE(fixed) \
52     HANDLE(hasstart) \
53     HANDLE(isalias) 
54     HANDLE(alias)
55     HANDLE(basetype) \
56     HANDLE(displayunit) \
57 */
58
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;
64
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;
67
68 typedef int (*fmi1_xml_q_scan_elementary_ft)(fmi1_xml_q_context_t*, fmi1_xml_q_terminal_t* term);
69
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)
72
73
74 typedef int (*fmi1_xml_q_eval_elementary_ft)(fmi1_xml_variable_t* var, fmi1_xml_q_terminal_t* term);
75
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)
78
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;
90
91
92 struct fmi1_xml_q_terminal_t {
93         fmi1_xml_q_terminal_enu_t kind;
94
95         fmi1_xml_elementary_enu_t specific;
96
97         int param_i;
98         double param_d;
99         void* param_p;
100         char* param_str;
101
102 };
103
104 jm_vector_declare_template(fmi1_xml_q_terminal_t)
105
106 typedef jm_vector(fmi1_xml_q_terminal_t) fmi1_xml_q_term_vt;
107
108 typedef struct fmi1_xml_q_expression_t fmi1_xml_q_expression_t;
109
110 struct fmi1_xml_q_expression_t {
111     jm_vector(jm_voidp) expression;
112
113     jm_vector(jm_voidp) stack;
114
115     fmi1_xml_q_terminal_t termFalse, termTrue;
116     fmi1_xml_q_term_vt terms;
117         jm_vector(char) strbuf;
118 };
119
120 struct fmi1_xml_q_context_t {
121     jm_vector(jm_name_ID_map_t) elementary_map;
122
123         jm_string query;
124
125         size_t qlen;
126         int curCh;
127
128         jm_vector(char) buf;
129
130         fmi1_xml_q_expression_t expr;
131 };
132
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);
137
138 #ifdef __cplusplus
139 }
140 #endif
141 #endif /* FMI1_XML_QUERY_H */