17 #define STR_ROOT_NAME_00 \
18 "_SHOGUN_SERIALIZABLE_XML_FILE_V_00_"
20 using namespace shogun;
22 CSerializableXmlFile::CSerializableXmlFile()
25 CSerializableXmlFile::CSerializableXmlFile(
const char* fname,
char rw,
29 CSerializableFile::init(NULL, rw, fname);
33 CSerializableXmlFile::~CSerializableXmlFile()
39 CSerializableXmlFile::new_reader(
char* dest_version,
size_t n)
43 if ((name = xmlGetNodePath(m_stack_stream.back())) == NULL)
46 strncpy(dest_version, (
const char*) (name+1), n);
49 if (strcmp(STR_ROOT_NAME_00, dest_version) == 0)
50 return new SerializableXmlReader00(
this);
56 CSerializableXmlFile::push_node(
const xmlChar* name)
59 = xmlNewChild(m_stack_stream.back(), NULL, name, NULL);
61 m_stack_stream.push_back(node);
67 CSerializableXmlFile::join_node(
const xmlChar* name)
69 for (xmlNode* cur=m_stack_stream.back()->children; cur!=NULL;
71 if (cur->type != XML_ELEMENT_NODE
72 || xmlStrcmp(cur->name, name) != 0)
continue;
74 m_stack_stream.push_back(cur);
82 CSerializableXmlFile::next_node(
const xmlChar* name)
84 for (xmlNode* cur=m_stack_stream.back()->next; cur!=NULL;
86 if (cur->type != XML_ELEMENT_NODE
87 || xmlStrcmp(cur->name, name) != 0)
continue;
90 m_stack_stream.push_back(cur);
98 CSerializableXmlFile::pop_node()
100 m_stack_stream.pop_back();
104 CSerializableXmlFile::init(
bool format)
106 m_format = format, m_doc = NULL;
110 if (m_filename == NULL || *m_filename ==
'\0') {
111 SG_WARNING(
"Filename not given for opening file!\n")
115 SG_DEBUG("Opening '%s'\n", m_filename)
120 if ((m_doc = xmlReadFile(m_filename, NULL, XML_PARSE_HUGE | XML_PARSE_NONET)) == NULL
121 || (tmp = xmlDocGetRootElement(m_doc)) == NULL)
123 SG_WARNING(
"Could not open file `%s' for reading!\n", m_filename)
126 m_stack_stream.push_back(tmp);
129 m_doc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION);
130 m_stack_stream.push_back(xmlNewNode(
131 NULL, BAD_CAST STR_ROOT_NAME_00));
132 xmlDocSetRootElement(m_doc, m_stack_stream.back());
135 SG_WARNING("Could not open file `%s', unknown mode!\n",
142 CSerializableXmlFile::close()
144 while (m_stack_stream.get_num_elements() > 0) pop_node();
148 && xmlSaveFormatFileEnc(m_filename, m_doc,
"UTF-8",
150 SG_WARNING(
"Could not close file `%s' for writing!\n",
154 xmlFreeDoc(m_doc); m_doc = NULL;
160 CSerializableXmlFile::is_opened()
162 return m_doc != NULL;
166 CSerializableXmlFile::write_scalar_wrapped(
173 if (snprintf(buf,
STRING_LEN,
"%s", *(
bool*) param? STR_TRUE
174 : STR_FALSE) <= 0)
return false;
177 if (snprintf(buf,
STRING_LEN,
"%c", *(
char*) param
178 ) <= 0)
return false;
181 if (snprintf(buf,
STRING_LEN,
"%" PRIi8, *(int8_t*) param
182 ) <= 0)
return false;
185 if (snprintf(buf,
STRING_LEN,
"%" PRIu8, *(uint8_t*) param
186 ) <= 0)
return false;
189 if (snprintf(buf,
STRING_LEN,
"%" PRIi16, *(int16_t*) param
190 ) <= 0)
return false;
193 if (snprintf(buf,
STRING_LEN,
"%" PRIu16, *(uint16_t*) param
194 ) <= 0)
return false;
197 if (snprintf(buf,
STRING_LEN,
"%" PRIi32, *(int32_t*) param
198 ) <= 0)
return false;
201 if (snprintf(buf,
STRING_LEN,
"%" PRIu32, *(uint32_t*) param
202 ) <= 0)
return false;
205 if (snprintf(buf,
STRING_LEN,
"%" PRIi64, *(int64_t*) param
206 ) <= 0)
return false;
209 if (snprintf(buf,
STRING_LEN,
"%" PRIu64, *(uint64_t*) param
210 ) <= 0)
return false;
214 ) <= 0)
return false;
218 ) <= 0)
return false;
222 param) <= 0)
return false;
225 if (snprintf(buf,
STRING_LEN,
"(%.16lg,%.16lg)",
227 ) <= 0)
return false;
230 SG_ERROR(
"write_scalar_wrapped(): Implementation error during"
231 " writing XmlFile!");
235 xmlNodeAddContent(m_stack_stream.back(), BAD_CAST buf);
240 CSerializableXmlFile::write_cont_begin_wrapped(
247 CSerializableXmlFile::write_cont_end_wrapped(
251 if (len_real_y*len_real_x>0)
258 CSerializableXmlFile::write_string_begin_wrapped(
265 CSerializableXmlFile::write_string_end_wrapped(
272 CSerializableXmlFile::write_stringentry_begin_wrapped(
275 if (!push_node(BAD_CAST STR_STRING))
return false;
281 CSerializableXmlFile::write_stringentry_end_wrapped(
290 CSerializableXmlFile::write_sparse_begin_wrapped(
297 CSerializableXmlFile::write_sparse_end_wrapped(
304 CSerializableXmlFile::write_sparseentry_begin_wrapped(
308 push_node(BAD_CAST STR_SPARSE);
311 snprintf(buf,
STRING_LEN,
"%" PRIi32, feat_index);
312 if (xmlNewProp(m_stack_stream.back(), BAD_CAST STR_PROP_FEATINDEX,
313 BAD_CAST buf) == NULL)
return false;
318 CSerializableXmlFile::write_sparseentry_end_wrapped(
328 CSerializableXmlFile::write_item_begin_wrapped(
334 if (x != 0) pop_node();
337 if (!push_node(BAD_CAST buf_x))
return false;
341 push_node(BAD_CAST STR_ITEM);
347 CSerializableXmlFile::write_item_end_wrapped(
356 CSerializableXmlFile::write_sgserializable_begin_wrapped(
357 const TSGDataType* type,
const char* sgserializable_name,
358 EPrimitiveType
generic)
360 if (*sgserializable_name ==
'\0') {
361 if (xmlNewProp(m_stack_stream.back(), BAD_CAST STR_PROP_IS_NULL,
362 BAD_CAST STR_TRUE) == NULL)
return false;
366 if (xmlNewProp(m_stack_stream.back(),
367 BAD_CAST STR_PROP_INSTANCE_NAME,
368 BAD_CAST sgserializable_name) == NULL)
return false;
373 if (xmlNewProp(m_stack_stream.back(),
374 BAD_CAST STR_PROP_GENERIC_NAME, BAD_CAST buf)
375 == NULL)
return false;
382 CSerializableXmlFile::write_sgserializable_end_wrapped(
383 const TSGDataType* type,
const char* sgserializable_name,
384 EPrimitiveType
generic)
390 CSerializableXmlFile::write_type_begin_wrapped(
391 const TSGDataType* type,
const char* name,
const char* prefix)
393 if (!push_node(BAD_CAST name))
return false;
399 if (xmlNewProp(m_stack_stream.back(), BAD_CAST STR_PROP_TYPE,
400 BAD_CAST buf) == NULL)
return false;
406 CSerializableXmlFile::write_type_end_wrapped(
407 const TSGDataType* type,
const char* name,
const char* prefix)