]> gerrit.simantics Code Review - simantics/fmil.git/blob - org.simantics.fmil.core/native/FMILibrary/src/XML/src/FMI1/fmi1_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 / FMI1 / fmi1_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 FMI1_XML_XMLPARSER_H
17 #define FMI1_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
25 #include <FMI1/fmi1_xml_model_description.h>
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 #define FMI1_XML_ATTRLIST(EXPAND_XML_ATTRNAME) \
32     EXPAND_XML_ATTRNAME(fmiVersion), \
33     EXPAND_XML_ATTRNAME(displayUnit), \
34     EXPAND_XML_ATTRNAME(gain), \
35     EXPAND_XML_ATTRNAME(offset), \
36     EXPAND_XML_ATTRNAME(unit), \
37     EXPAND_XML_ATTRNAME(name), \
38     EXPAND_XML_ATTRNAME(description), \
39     EXPAND_XML_ATTRNAME(quantity), \
40     EXPAND_XML_ATTRNAME(relativeQuantity), \
41     EXPAND_XML_ATTRNAME(min), \
42     EXPAND_XML_ATTRNAME(max), \
43     EXPAND_XML_ATTRNAME(nominal), \
44     EXPAND_XML_ATTRNAME(declaredType), \
45     EXPAND_XML_ATTRNAME(start), \
46     EXPAND_XML_ATTRNAME(fixed), \
47     EXPAND_XML_ATTRNAME(startTime), \
48     EXPAND_XML_ATTRNAME(stopTime), \
49     EXPAND_XML_ATTRNAME(tolerance), \
50     EXPAND_XML_ATTRNAME(value), \
51     EXPAND_XML_ATTRNAME(valueReference), \
52     EXPAND_XML_ATTRNAME(variability), \
53     EXPAND_XML_ATTRNAME(causality), \
54     EXPAND_XML_ATTRNAME(alias), \
55     EXPAND_XML_ATTRNAME(modelName), \
56     EXPAND_XML_ATTRNAME(modelIdentifier), \
57     EXPAND_XML_ATTRNAME(guid), \
58     EXPAND_XML_ATTRNAME(author), \
59     EXPAND_XML_ATTRNAME(version), \
60     EXPAND_XML_ATTRNAME(generationTool), \
61     EXPAND_XML_ATTRNAME(generationDateAndTime), \
62     EXPAND_XML_ATTRNAME(variableNamingConvention), \
63     EXPAND_XML_ATTRNAME(numberOfContinuousStates), \
64     EXPAND_XML_ATTRNAME(numberOfEventIndicators), \
65     EXPAND_XML_ATTRNAME(input), \
66     EXPAND_XML_ATTRNAME(canHandleVariableCommunicationStepSize), \
67     EXPAND_XML_ATTRNAME(canHandleEvents), \
68     EXPAND_XML_ATTRNAME(canRejectSteps), \
69     EXPAND_XML_ATTRNAME(canInterpolateInputs), \
70     EXPAND_XML_ATTRNAME(maxOutputDerivativeOrder), \
71     EXPAND_XML_ATTRNAME(canRunAsynchronuously), \
72     EXPAND_XML_ATTRNAME(canSignalEvents), \
73     EXPAND_XML_ATTRNAME(canBeInstantiatedOnlyOncePerProcess), \
74     EXPAND_XML_ATTRNAME(canNotUseMemoryManagementFunctions), \
75     EXPAND_XML_ATTRNAME(file), \
76     EXPAND_XML_ATTRNAME(entryPoint), \
77     EXPAND_XML_ATTRNAME(manualStart), \
78     EXPAND_XML_ATTRNAME(type)
79
80 #define FMI1_XML_ATTR_ID(attr) fmi_attr_id_##attr
81 typedef enum fmi1_xml_attr_enu_t {
82     FMI1_XML_ATTRLIST(FMI1_XML_ATTR_ID),
83     fmi1_xml_attr_number
84 } fmi1_xml_attr_enu_t;
85
86 #define FMI1_XML_ELMLIST(EXPAND_XML_ELMNAME) \
87     EXPAND_XML_ELMNAME(fmiModelDescription) \
88     EXPAND_XML_ELMNAME(UnitDefinitions) \
89     EXPAND_XML_ELMNAME(BaseUnit) \
90     EXPAND_XML_ELMNAME(DisplayUnitDefinition) \
91     EXPAND_XML_ELMNAME(TypeDefinitions) \
92     EXPAND_XML_ELMNAME(Type) \
93     EXPAND_XML_ELMNAME(RealType) \
94     EXPAND_XML_ELMNAME(IntegerType) \
95     EXPAND_XML_ELMNAME(BooleanType) \
96     EXPAND_XML_ELMNAME(StringType) \
97     EXPAND_XML_ELMNAME(EnumerationType) \
98     EXPAND_XML_ELMNAME(Item) \
99     EXPAND_XML_ELMNAME(DefaultExperiment) \
100     EXPAND_XML_ELMNAME(VendorAnnotations) \
101     EXPAND_XML_ELMNAME(Tool) \
102     EXPAND_XML_ELMNAME(Annotation) \
103     EXPAND_XML_ELMNAME(ModelVariables) \
104     EXPAND_XML_ELMNAME(ScalarVariable) \
105     EXPAND_XML_ELMNAME(DirectDependency) \
106     EXPAND_XML_ELMNAME(Name) \
107     EXPAND_XML_ELMNAME(Real) \
108     EXPAND_XML_ELMNAME(Integer) \
109     EXPAND_XML_ELMNAME(Boolean) \
110     EXPAND_XML_ELMNAME(String) \
111     EXPAND_XML_ELMNAME(Enumeration) \
112     EXPAND_XML_ELMNAME(Implementation) \
113     EXPAND_XML_ELMNAME(CoSimulation_StandAlone) \
114     EXPAND_XML_ELMNAME(Capabilities) \
115     EXPAND_XML_ELMNAME(CoSimulation_Tool) \
116     EXPAND_XML_ELMNAME(Model) \
117     EXPAND_XML_ELMNAME(File)
118
119 typedef struct fmi1_xml_parser_context_t fmi1_xml_parser_context_t;
120 #define EXPAND_ELM_HANDLE(elm) extern int fmi1_xml_handle_##elm(fmi1_xml_parser_context_t *context, const char* data);
121 FMI1_XML_ELMLIST(EXPAND_ELM_HANDLE)
122
123 #define FMI1_XML_ELM_ID(elm) ,fmi1_xml_elmID_##elm
124 typedef enum fmi1_xml_elm_enu_t {
125         fmi1_xml_elmID_none = -1
126     FMI1_XML_ELMLIST(FMI1_XML_ELM_ID)
127     ,fmi1_xml_elm_number
128 } fmi1_xml_elm_enu_t;
129
130 typedef int (*fmi1_xml_element_handle_ft)(fmi1_xml_parser_context_t *context, const char* data);
131
132 typedef struct fmi1_xml_element_handle_map_t fmi1_xml_element_handle_map_t;
133
134 typedef struct {
135         fmi1_xml_elm_enu_t parentID;
136         int siblingIndex;
137         int multipleAllowed;
138 } fmi1_xml_scheme_info_t;
139
140 struct fmi1_xml_element_handle_map_t {
141     const char* elementName;
142     fmi1_xml_element_handle_ft elementHandle;
143         fmi1_xml_elm_enu_t elemID;
144 };
145
146
147 jm_vector_declare_template(fmi1_xml_element_handle_map_t)
148
149 #define fmi1_xml_diff_elmName(a, b) strcmp(a.elementName,b.elementName)
150
151 jm_define_comp_f(fmi1_xml_compare_elmName, fmi1_xml_element_handle_map_t, fmi1_xml_diff_elmName)
152
153 #define XML_BLOCK_SIZE 16000
154
155 struct fmi1_xml_parser_context_t {
156     fmi1_xml_model_description_t* modelDescription;
157     jm_callbacks* callbacks;
158
159     XML_Parser parser;
160     jm_vector(jm_voidp) parseBuffer;
161
162     jm_vector(jm_named_ptr)* attrMap;
163     jm_vector(fmi1_xml_element_handle_map_t)* elmMap;
164     jm_vector(jm_string)* attrBuffer;
165
166     fmi1_xml_unit_t* lastBaseUnit;
167
168     jm_vector(jm_voidp) directDependencyBuf;
169
170     jm_vector(jm_string) directDependencyStringsStore;
171
172     int skipOneVariableFlag;
173         int skipElementCnt;
174
175     jm_stack(int) elmStack;
176     jm_vector(char) elmData;
177
178         fmi1_xml_elm_enu_t lastElmID;
179         fmi1_xml_elm_enu_t currentElmID;
180 };
181
182 jm_vector(char) * fmi1_xml_reserve_parse_buffer(fmi1_xml_parser_context_t *context, size_t index, size_t size);
183 jm_vector(char) * fmi1_xml_get_parse_buffer(fmi1_xml_parser_context_t *context, size_t index);
184 int fmi1_xml_alloc_parse_buffer(fmi1_xml_parser_context_t *context, size_t items);
185
186 void fmi1_xml_free_parse_buffer(fmi1_xml_parser_context_t *context);
187
188 void fmi1_xml_parse_fatal(fmi1_xml_parser_context_t *context, const char* fmt, ...);
189 void fmi1_xml_parse_error(fmi1_xml_parser_context_t *context, const char* fmt, ...);
190
191 int fmi1_xml_set_attr_string(fmi1_xml_parser_context_t *context, fmi1_xml_elm_enu_t elmID, fmi1_xml_attr_enu_t attrID, int required, jm_vector(char)* field);
192 int fmi1_xml_set_attr_uint(fmi1_xml_parser_context_t *context, fmi1_xml_elm_enu_t elmID, fmi1_xml_attr_enu_t attrID, int required, unsigned int* field, unsigned int defaultVal);
193 int fmi1_xml_set_attr_enum(fmi1_xml_parser_context_t *context, fmi1_xml_elm_enu_t elmID, fmi1_xml_attr_enu_t attrID, int required, unsigned int* field, unsigned int defaultVal, jm_name_ID_map_t* nameMap);
194 int fmi1_xml_set_attr_boolean(fmi1_xml_parser_context_t *context, fmi1_xml_elm_enu_t elmID, fmi1_xml_attr_enu_t attrID, int required, int* field, int defaultVal);
195 int fmi1_xml_set_attr_int(fmi1_xml_parser_context_t *context, fmi1_xml_elm_enu_t elmID, fmi1_xml_attr_enu_t attrID, int required, int* field, int defaultVal);
196 int fmi1_xml_set_attr_double(fmi1_xml_parser_context_t *context, fmi1_xml_elm_enu_t elmID, fmi1_xml_attr_enu_t attrID, int required, double* field, double defaultVal);
197 int fmi1_xml_is_attr_defined(fmi1_xml_parser_context_t *context, fmi1_xml_attr_enu_t attrID);
198
199 #ifdef __cplusplus
200 }
201 #endif
202
203 #endif /* FMI1_XML_XMLPARSER_H */
204