]> gerrit.simantics Code Review - simantics/fmil.git/blob - org.simantics.fmil.core/native/FMILibrary/src/XML/src/FMI2/fmi2_xml_parser.h
Add FMILibrary-2.0.3 to org.simantics.fmil.core\native.
[simantics/fmil.git] / org.simantics.fmil.core / native / FMILibrary / src / XML / src / FMI2 / fmi2_xml_parser.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
16 #ifndef FMI2_XML_XMLPARSER_H
17 #define FMI2_XML_XMLPARSER_H
18
19 #include <expat.h>
20
21 #include <JM/jm_vector.h>
22 #include <JM/jm_stack.h>
23 #include <JM/jm_named_ptr.h>
24 #include <FMI2/fmi2_xml_callbacks.h>
25
26 #include <FMI2/fmi2_enums.h>
27 #include <FMI2/fmi2_xml_model_description.h>
28
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 #define FMI2_XML_ATTRLIST(EXPAND_XML_ATTRNAME) \
35     EXPAND_XML_ATTRNAME(fmiVersion) \
36     EXPAND_XML_ATTRNAME(factor) \
37     EXPAND_XML_ATTRNAME(offset) \
38         FMI2_SI_BASE_UNITS(EXPAND_XML_ATTRNAME) \
39     EXPAND_XML_ATTRNAME(name) \
40     EXPAND_XML_ATTRNAME(description) \
41     EXPAND_XML_ATTRNAME(quantity) \
42     EXPAND_XML_ATTRNAME(unit) \
43     EXPAND_XML_ATTRNAME(displayUnit) \
44     EXPAND_XML_ATTRNAME(relativeQuantity) \
45     EXPAND_XML_ATTRNAME(unbounded) \
46         EXPAND_XML_ATTRNAME(min) \
47     EXPAND_XML_ATTRNAME(max) \
48     EXPAND_XML_ATTRNAME(nominal) \
49     EXPAND_XML_ATTRNAME(declaredType) \
50     EXPAND_XML_ATTRNAME(start) \
51     EXPAND_XML_ATTRNAME(derivative) \
52     EXPAND_XML_ATTRNAME(reinit) \
53     EXPAND_XML_ATTRNAME(startTime) \
54     EXPAND_XML_ATTRNAME(stopTime) \
55     EXPAND_XML_ATTRNAME(tolerance) \
56     EXPAND_XML_ATTRNAME(stepSize) \
57     EXPAND_XML_ATTRNAME(value) \
58     EXPAND_XML_ATTRNAME(valueReference) \
59     EXPAND_XML_ATTRNAME(variability) \
60     EXPAND_XML_ATTRNAME(causality) \
61     EXPAND_XML_ATTRNAME(initial) \
62     EXPAND_XML_ATTRNAME(previous) \
63     EXPAND_XML_ATTRNAME(canHandleMultipleSetPerTimeInstant) \
64     EXPAND_XML_ATTRNAME(index) \
65     EXPAND_XML_ATTRNAME(dependencies) \
66     EXPAND_XML_ATTRNAME(dependenciesKind) \
67     EXPAND_XML_ATTRNAME(modelName) \
68     EXPAND_XML_ATTRNAME(modelIdentifier) \
69     EXPAND_XML_ATTRNAME(guid) \
70     EXPAND_XML_ATTRNAME(author) \
71     EXPAND_XML_ATTRNAME(copyright) \
72     EXPAND_XML_ATTRNAME(license) \
73     EXPAND_XML_ATTRNAME(version) \
74     EXPAND_XML_ATTRNAME(generationTool) \
75     EXPAND_XML_ATTRNAME(generationDateAndTime) \
76     EXPAND_XML_ATTRNAME(variableNamingConvention) \
77     EXPAND_XML_ATTRNAME(numberOfEventIndicators) \
78     EXPAND_XML_ATTRNAME(input) \
79     EXPAND_XML_ATTRNAME(needsExecutionTool) \
80     EXPAND_XML_ATTRNAME(canHandleVariableCommunicationStepSize) \
81         EXPAND_XML_ATTRNAME(completedIntegratorStepNotNeeded) \\r
82         EXPAND_XML_ATTRNAME(canBeInstantiatedOnlyOncePerProcess) \\r
83         EXPAND_XML_ATTRNAME(canNotUseMemoryManagementFunctions) \\r
84         EXPAND_XML_ATTRNAME(canGetAndSetFMUstate) \\r
85         EXPAND_XML_ATTRNAME(canSerializeFMUstate) \\r
86         EXPAND_XML_ATTRNAME(providesDirectionalDerivatives) /* Beta4 spelling. TODO: remove */ \\r
87         EXPAND_XML_ATTRNAME(providesDirectionalDerivative) \\r
88     EXPAND_XML_ATTRNAME(canInterpolateInputs) \
89     EXPAND_XML_ATTRNAME(maxOutputDerivativeOrder) \
90     EXPAND_XML_ATTRNAME(canRunAsynchronuously)
91
92 #define FMI2_XML_ATTR_ID(attr) fmi_attr_id_##attr,
93 typedef enum fmi2_xml_attr_enu_t {
94     FMI2_XML_ATTRLIST(FMI2_XML_ATTR_ID)
95     fmi2_xml_attr_number
96 } fmi2_xml_attr_enu_t;
97
98 /** \brief Element names used in XML */
99 #define FMI2_XML_ELMLIST(EXPAND_XML_ELMNAME) \
100     EXPAND_XML_ELMNAME(fmiModelDescription) \
101         EXPAND_XML_ELMNAME(ModelExchange) \
102     EXPAND_XML_ELMNAME(CoSimulation) \
103     EXPAND_XML_ELMNAME(SourceFiles) \
104     EXPAND_XML_ELMNAME(File) \
105     EXPAND_XML_ELMNAME(UnitDefinitions) \
106     EXPAND_XML_ELMNAME(Unit) \
107     EXPAND_XML_ELMNAME(BaseUnit) \
108     EXPAND_XML_ELMNAME(DisplayUnit) \
109     EXPAND_XML_ELMNAME(TypeDefinitions) \
110     EXPAND_XML_ELMNAME(SimpleType) \
111     EXPAND_XML_ELMNAME(Item) \
112     EXPAND_XML_ELMNAME(DefaultExperiment) \
113     EXPAND_XML_ELMNAME(VendorAnnotations) \
114     EXPAND_XML_ELMNAME(Tool) \
115     EXPAND_XML_ELMNAME(ModelVariables) \
116     EXPAND_XML_ELMNAME(ScalarVariable) \
117     EXPAND_XML_ELMNAME(Annotations) \
118         EXPAND_XML_ELMNAME(LogCategories) \
119         EXPAND_XML_ELMNAME(Category) \
120     EXPAND_XML_ELMNAME(Real) \
121     EXPAND_XML_ELMNAME(Integer) \
122     EXPAND_XML_ELMNAME(Boolean) \
123     EXPAND_XML_ELMNAME(String) \
124     EXPAND_XML_ELMNAME(Enumeration) \
125     EXPAND_XML_ELMNAME(ModelStructure) \
126     EXPAND_XML_ELMNAME(Outputs) \
127     EXPAND_XML_ELMNAME(Derivatives) \
128     EXPAND_XML_ELMNAME(DiscreteStates) \
129     EXPAND_XML_ELMNAME(InitialUnknowns) \
130     EXPAND_XML_ELMNAME(Unknown)
131
132
133 /** \brief Element that can be placed under different parents get alternative names from the info struct */
134 #define FMI2_XML_ELMLIST_ALT(EXPAND_XML_ELMNAME) \
135     EXPAND_XML_ELMNAME(RealVariable) \
136     EXPAND_XML_ELMNAME(IntegerVariable) \
137     EXPAND_XML_ELMNAME(BooleanVariable) \
138     EXPAND_XML_ELMNAME(StringVariable) \
139     EXPAND_XML_ELMNAME(EnumerationVariable)  \
140     EXPAND_XML_ELMNAME(VariableTool) \
141     EXPAND_XML_ELMNAME(SourceFilesCS) \
142     EXPAND_XML_ELMNAME(FileCS) \
143     EXPAND_XML_ELMNAME(DerivativeUnknown) \
144     EXPAND_XML_ELMNAME(DiscreteStateUnknown) \
145     EXPAND_XML_ELMNAME(InitialUnknown)
146
147
148 typedef struct fmi2_xml_parser_context_t fmi2_xml_parser_context_t;
149 #define EXPAND_ELM_HANDLE(elm) extern int fmi2_xml_handle_##elm(fmi2_xml_parser_context_t *context, const char* data);
150 FMI2_XML_ELMLIST(EXPAND_ELM_HANDLE)
151 FMI2_XML_ELMLIST_ALT(EXPAND_ELM_HANDLE)
152
153 #define FMI2_XML_ELM_ID(elm) fmi2_xml_elmID_##elm
154 #define FMI2_XML_LIST_ELM_ID(elm) ,FMI2_XML_ELM_ID(elm)
155 typedef enum fmi2_xml_elm_enu_t {
156         fmi2_xml_elmID_none = -1
157     FMI2_XML_ELMLIST(FMI2_XML_LIST_ELM_ID)
158         ,fmi2_xml_elm_actual_number
159         FMI2_XML_ELMLIST_ALT(FMI2_XML_LIST_ELM_ID)
160     ,fmi2_xml_elm_number
161 } fmi2_xml_elm_enu_t;
162
163 typedef int (*fmi2_xml_element_handle_ft)(fmi2_xml_parser_context_t *context, const char* data);
164
165 typedef struct fmi2_xml_element_handle_map_t fmi2_xml_element_handle_map_t;
166
167 /** Keeps information about the allowed parent element ID, index among siblings in a sequence and if
168         multiple elements of this type are allowed in a sequence.
169 */
170 typedef struct {
171         fmi2_xml_elm_enu_t parentID; /* expected parent ID for an element */
172         int siblingIndex;       /* index among siblings */
173         int multipleAllowed;    /* multiple elements of this kind kan come in a sequence as siblings*/
174 } fmi2_xml_scheme_info_t;
175
176 struct fmi2_xml_element_handle_map_t {
177     const char* elementName;
178     fmi2_xml_element_handle_ft elementHandle;
179         fmi2_xml_elm_enu_t elemID;
180 };
181
182
183 jm_vector_declare_template(fmi2_xml_element_handle_map_t)
184
185 #define fmi2_xml_diff_elmName(a, b) strcmp(a.elementName,b.elementName)
186
187 jm_define_comp_f(fmi2_xml_compare_elmName, fmi2_xml_element_handle_map_t, fmi2_xml_diff_elmName)
188
189 #define XML_BLOCK_SIZE 16000
190
191 struct fmi2_xml_parser_context_t {
192     fmi2_xml_model_description_t* modelDescription;
193     jm_callbacks* callbacks;
194
195     XML_Parser parser;
196     jm_vector(jm_voidp) parseBuffer;
197
198     jm_vector(jm_named_ptr)* attrMap;
199     jm_vector(fmi2_xml_element_handle_map_t)* elmMap;
200     jm_vector(jm_string)* attrBuffer;
201
202     fmi2_xml_unit_t* lastBaseUnit;
203
204     int skipOneVariableFlag;
205         int skipElementCnt;
206         int has_produced_data_warning;
207
208     jm_stack(int) elmStack;
209     jm_vector(char) elmData;
210
211         fmi2_xml_elm_enu_t lastElmID;
212         fmi2_xml_elm_enu_t currentElmID;
213
214         int anyElmCount;
215         int useAnyHandleFlg;
216         char* anyToolName;
217         void* anyParent;
218         fmi2_xml_callbacks_t* anyHandle;
219 };
220
221 jm_vector(char) * fmi2_xml_reserve_parse_buffer(fmi2_xml_parser_context_t *context, size_t index, size_t size);
222 jm_vector(char) * fmi2_xml_get_parse_buffer(fmi2_xml_parser_context_t *context, size_t index);
223 int fmi2_xml_alloc_parse_buffer(fmi2_xml_parser_context_t *context, size_t items);
224
225 void fmi2_xml_free_parse_buffer(fmi2_xml_parser_context_t *context);
226
227 void fmi2_xml_parse_fatal(fmi2_xml_parser_context_t *context, const char* fmt, ...);
228 void fmi2_xml_parse_error(fmi2_xml_parser_context_t *context, const char* fmt, ...);
229
230 int fmi2_xml_set_attr_string(fmi2_xml_parser_context_t *context, fmi2_xml_elm_enu_t elmID, fmi2_xml_attr_enu_t attrID, int required, jm_vector(char)* field);
231 int fmi2_xml_set_attr_uint(fmi2_xml_parser_context_t *context, fmi2_xml_elm_enu_t elmID, fmi2_xml_attr_enu_t attrID, int required, unsigned int* field, unsigned int defaultVal);
232 int fmi2_xml_set_attr_enum(fmi2_xml_parser_context_t *context, fmi2_xml_elm_enu_t elmID, fmi2_xml_attr_enu_t attrID, int required, unsigned int* field, unsigned int defaultVal, jm_name_ID_map_t* nameMap);
233 int fmi2_xml_set_attr_boolean(fmi2_xml_parser_context_t *context, fmi2_xml_elm_enu_t elmID, fmi2_xml_attr_enu_t attrID, int required, unsigned int* field, unsigned int defaultVal);
234 int fmi2_xml_set_attr_int(fmi2_xml_parser_context_t *context, fmi2_xml_elm_enu_t elmID, fmi2_xml_attr_enu_t attrID, int required, int* field, int defaultVal);
235 int fmi2_xml_set_attr_double(fmi2_xml_parser_context_t *context, fmi2_xml_elm_enu_t elmID, fmi2_xml_attr_enu_t attrID, int required, double* field, double defaultVal);
236 int fmi2_xml_is_attr_defined(fmi2_xml_parser_context_t *context, fmi2_xml_attr_enu_t attrID);
237 int fmi2_xml_get_attr_str(fmi2_xml_parser_context_t *context, fmi2_xml_elm_enu_t elmID, fmi2_xml_attr_enu_t attrID, int required,const char** valp);
238
239 void fmi2_xml_set_element_handle(fmi2_xml_parser_context_t *context, const char* elm, fmi2_xml_elm_enu_t id);
240
241
242 #ifdef __cplusplus
243 }
244 #endif
245
246 #endif /* FMI2_XML_XMLPARSER_H */
247