22 sprintf(buf,
"%d", i);
31 if (strcmp(node->
name, name) == 0)
48 assert(i<node->n_attributes);
56 assert(i<node->n_attributes);
74 static void DumpTree(
PMXML_NODE node,
int level = 0)
78 for (
int k=0; k<level; k++)
80 printf(
"node name: \"%s\"\n", node->
name);
82 for (
int k=0; k<level; k++)
87 for (
int k=0; k<level; k++)
89 printf(
"node text: \"%s\"\n", node->
value);
92 DumpTree(node->
child + i, level + 1);
96 static void DumpDirTree(
PMXML_NODE node,
int level = 0)
100 const char* name = node->
name;
102 if (strcmp(name,
"dir") != 0)
105 for (
int k=0; k<level; k++)
107 printf(
"node name: \"%s\"\n", node->
name);
110 for (
int k=0; k<level; k++)
116 DumpDirTree(node->
child + i, level + 1);
121 template <
typename T>
154 return 0xFFFF & strtoul(text, NULL, 0);
160 return strtoul(text, NULL, 0);
164 std::string GetXmlValue<std::string>(
const char* text)
220 msg +=
"Cannot find ";
234 msg +=
"XML node for ";
265 if (*path==0 || *path==
'/')
277 const char* nodename = node->
name;
278 const char* namevalue =
GetAttr(node,
"name");
282 bool isDir = strcmp(nodename,
"dir") == 0;
283 bool isKey = strcmp(nodename,
"key") == 0;
284 bool isKeyArray = strcmp(nodename,
"keyarray") == 0;
286 if (!isKey && !isDir && !isKeyArray)
293 if (strcasecmp(elem.c_str(), namevalue) == 0) {
298 }
else if (isKey || isKeyArray) {
322 if (strcmp(node->
name,
"dir") != 0) {
327 msg +=
" XML node is ";
331 msg +=
" instead of \"dir\"";
349 void ReadKey(
const char* varname,
int *tid,
int *num_values,
int *total_size,
int *item_size,
MVOdbError* error)
352 if (num_values) *num_values = 0;
353 if (total_size) *total_size = 0;
354 if (item_size) *item_size = 0;
359 void ReadDir(std::vector<std::string>* varname, std::vector<int> *tid, std::vector<int> *num_values, std::vector<int> *total_size, std::vector<int> *item_size,
MVOdbError* error)
365 void RB(
const char* varname,
bool *value,
bool create,
MVOdbError* error)
367 RBAI(varname, 0, value, error);
370 void RI(
const char* varname,
int *value,
bool create,
MVOdbError* error)
372 RIAI(varname, 0, value, error);
375 void RD(
const char* varname,
double *value,
bool create,
MVOdbError* error)
377 RDAI(varname, 0, value, error);
380 void RF(
const char* varname,
float *value,
bool create,
MVOdbError* error)
382 RFAI(varname, 0, value, error);
385 void RS(
const char* varname, std::string *value,
bool create,
int create_string_length,
MVOdbError* error)
387 RSAI(varname, 0, value, error);
392 RU16AI(varname, 0, value, error);
397 RU32AI(varname, 0, value, error);
408 const char* attr_type =
GetAttr(node,
"type");
411 fprintf(stderr,
"XmlOdb::FindXmlNode: Error: no type attribute in varname \"%s\"!\n", varname);
416 if (strcmp(attr_type, type1) != 0) {
417 if (strcmp(attr_type, type2) != 0) {
418 fprintf(stderr,
"XmlOdb::FindXmlNode: Error: type mismatch, wanted \"%s\" or \"%s\", got \"%s\"!\n", type1, type2, attr_type);
427 template <
typename T>
428 void RXA(
const char* varname,
const char* type1,
const char* type2, std::vector<T> *value,
MVOdbError* error)
441 if (strcmp(node->
name,
"keyarray") == 0) {
442 const char* num_values_text =
GetAttr(node,
"num_values");
443 if (!num_values_text) {
444 fprintf(stderr,
"no num_values!\n");
449 int num_values = atoi(num_values_text);
452 fprintf(stderr,
"num_values mismatch %d vs %d children!\n", num_values, node->
n_children);
461 const char* text = elem->
value;
466 T v = GetXmlValue<T>(text);
472 }
else if (strcmp(node->
name,
"key") == 0) {
473 const char* text = node->
value;
479 T v = GetXmlValue<T>(text);
484 fprintf(stderr,
"unexpected node %s\n", node->
name);
490 void RBA(
const char* varname, std::vector<bool> *value,
bool create,
int create_size,
MVOdbError* error)
492 RXA(varname,
"BOOL",
"BOOL", value, error);
495 void RIA(
const char* varname, std::vector<int> *value,
bool create,
int create_size,
MVOdbError* error)
497 RXA(varname,
"INT",
"INT32", value, error);
500 void RDA(
const char* varname, std::vector<double> *value,
bool create,
int create_size,
MVOdbError* error)
502 RXA(varname,
"DOUBLE",
"DOUBLE", value, error);
505 void RFA(
const char* varname, std::vector<float> *value,
bool create,
int create_size,
MVOdbError* error)
507 RXA(varname,
"FLOAT",
"FLOAT", value, error);
510 void RSA(
const char* varname, std::vector<std::string> *value,
bool create,
int create_size,
int create_string_length,
MVOdbError* error)
512 RXA(varname,
"STRING",
"STIRNG", value, error);
515 void RU16A(
const char* varname, std::vector<uint16_t> *value,
bool create,
int create_size,
MVOdbError* error)
517 RXA(varname,
"WORD",
"UINT16", value, error);
520 void RU32A(
const char* varname, std::vector<uint32_t> *value,
bool create,
int create_size,
MVOdbError* error)
522 RXA(varname,
"DWORD",
"UINT32", value, error);
525 template <
typename T>
526 void RXAI(
const char* varname,
int index,
const char* type1,
const char* type2, T* value,
MVOdbError* error)
539 if (strcmp(node->
name,
"keyarray") == 0) {
540 const char* num_values_text =
GetAttr(node,
"num_values");
541 if (!num_values_text) {
542 fprintf(stderr,
"no num_values!\n");
547 int num_values = atoi(num_values_text);
550 fprintf(stderr,
"num_values mismatch %d vs %d children!\n", num_values, node->
n_children);
556 fprintf(stderr,
"bad index %d, num_values %d!\n", index, num_values);
561 if (index >= num_values) {
562 fprintf(stderr,
"bad index %d, num_values %d!\n", index, num_values);
568 const char* text = elem->
value;
574 *value = GetXmlValue<T>(text);
578 }
else if (strcmp(node->
name,
"key") == 0) {
581 fprintf(stderr,
"non-zero index %d for non-array!\n", index);
586 const char* text = node->
value;
592 *value = GetXmlValue<T>(text);
597 fprintf(stderr,
"unexpected node %s\n", node->
name);
605 RXAI(varname, index,
"BOOL",
"BOOL", value, error);
610 RXAI(varname, index,
"INT",
"INT32", value, error);
615 RXAI(varname, index,
"DOUBLE",
"DOUBLE", value, error);
620 RXAI(varname, index,
"FLOAT",
"FLOAT", value, error);
625 RXAI(varname, index,
"STRING",
"STRING", value, error);
630 RXAI(varname, index,
"WORD",
"UINT16", value, error);
635 RXAI(varname, index,
"DWORD",
"UINT32", value, error);
644 void WS(
const char* varname,
const char* v,
int string_length,
MVOdbError* error) {
SetOk(error); };
652 void WSA(
const char* varname,
const std::vector<std::string>& data,
int odb_string_length,
MVOdbError* error) {
SetOk(error); };
670 int XmlOdb::odbReadArraySize(
const char*name)
675 const char* num_values =
GetAttr(node,
"num_values");
678 return atoi(num_values);
689 msg +=
"mxml_parse_file() error ";
697 SetError(error,
true, filename, msg);
705 msg +=
"invalid XML tree: no ODB tag";
706 SetError(error,
true, filename, msg);
710 return new XmlOdb(node, odb_node, error);
723 char*buf = (
char*)malloc(bufLength);
724 memcpy(buf, xbuf, bufLength);
725 for (
int i=0; i<bufLength; i++)
726 if (!isascii(buf[i])) {
728 }
else if (buf[i]==
'\n') {
729 }
else if (buf[i]==
'\r') {
730 }
else if (!isprint(buf[i])) {
732 }
else if (buf[i] == 0x1D) {
736 char* xend = strstr(buf,
"odb>");
746 msg +=
"mxml_parse_buffer() error ";
752 SetError(error,
true,
"buffer", msg);
760 msg +=
"invalid XML tree: no ODB tag";
761 SetError(error,
true,
"buffer", msg);
765 return new XmlOdb(node, odb_node, error);
Access to ODB saved in XML format inside midas .mid files.
void WSA(const char *varname, const std::vector< std::string > &data, int odb_string_length, MVOdbError *error)
void RU32A(const char *varname, std::vector< uint32_t > *value, bool create, int create_size, MVOdbError *error)
void WDA(const char *varname, const std::vector< double > &v, MVOdbError *error)
void WSAI(const char *varname, int index, const char *v, MVOdbError *error)
void Delete(const char *odbname, MVOdbError *error)
void WU16(const char *varname, uint16_t v, MVOdbError *error)
void RU16(const char *varname, uint16_t *value, bool create, MVOdbError *error)
void WI(const char *varname, int v, MVOdbError *error)
void RXA(const char *varname, const char *type1, const char *type2, std::vector< T > *value, MVOdbError *error)
void RU16A(const char *varname, std::vector< uint16_t > *value, bool create, int create_size, MVOdbError *error)
void WU16A(const char *varname, const std::vector< uint16_t > &v, MVOdbError *error)
void RU32AI(const char *varname, int index, uint32_t *value, MVOdbError *error)
void WB(const char *varname, bool v, MVOdbError *error)
void RIAI(const char *varname, int index, int *value, MVOdbError *error)
void WF(const char *varname, float v, MVOdbError *error)
void WBAI(const char *varname, int index, bool v, MVOdbError *error)
void WFA(const char *varname, const std::vector< float > &v, MVOdbError *error)
void WIAI(const char *varname, int index, int v, MVOdbError *error)
void WIA(const char *varname, const std::vector< int > &v, MVOdbError *error)
void RFAI(const char *varname, int index, float *value, MVOdbError *error)
void WU32A(const char *varname, const std::vector< uint32_t > &v, MVOdbError *error)
void RS(const char *varname, std::string *value, bool create, int create_string_length, MVOdbError *error)
void ReadKey(const char *varname, int *tid, int *num_values, int *total_size, int *item_size, MVOdbError *error)
void RFA(const char *varname, std::vector< float > *value, bool create, int create_size, MVOdbError *error)
void SetNotFound(MVOdbError *error, const char *varname)
void RDA(const char *varname, std::vector< double > *value, bool create, int create_size, MVOdbError *error)
void WDAI(const char *varname, int index, double v, MVOdbError *error)
void SetPrintError(bool v)
void WU32(const char *varname, uint32_t v, MVOdbError *error)
void SetNullValue(MVOdbError *error, const char *varname)
void WU32AI(const char *varname, int index, uint32_t v, MVOdbError *error)
XmlOdb(PMXML_NODE root, PMXML_NODE dir, MVOdbError *error)
void RI(const char *varname, int *value, bool create, MVOdbError *error)
void RB(const char *varname, bool *value, bool create, MVOdbError *error)
void ReadDir(std::vector< std::string > *varname, std::vector< int > *tid, std::vector< int > *num_values, std::vector< int > *total_size, std::vector< int > *item_size, MVOdbError *error)
void RIA(const char *varname, std::vector< int > *value, bool create, int create_size, MVOdbError *error)
void RXAI(const char *varname, int index, const char *type1, const char *type2, T *value, MVOdbError *error)
void RDAI(const char *varname, int index, double *value, MVOdbError *error)
PMXML_NODE FindXmlNode(PMXML_NODE dir, const char *varname, const char *type1, const char *type2, MVOdbError *error)
void RU16AI(const char *varname, int index, uint16_t *value, MVOdbError *error)
void RF(const char *varname, float *value, bool create, MVOdbError *error)
void RBA(const char *varname, std::vector< bool > *value, bool create, int create_size, MVOdbError *error)
void RSA(const char *varname, std::vector< std::string > *value, bool create, int create_size, int create_string_length, MVOdbError *error)
void WBA(const char *varname, const std::vector< bool > &v, MVOdbError *error)
void WFAI(const char *varname, int index, float v, MVOdbError *error)
void RD(const char *varname, double *value, bool create, MVOdbError *error)
void RBAI(const char *varname, int index, bool *value, MVOdbError *error)
void RU32(const char *varname, uint32_t *value, bool create, MVOdbError *error)
static PMXML_NODE FindPath(PMXML_NODE dir, const char *path)
Follow the ODB path through the XML DOM tree.
void WD(const char *varname, double v, MVOdbError *error)
void RSAI(const char *varname, int index, std::string *value, MVOdbError *error)
bool GetPrintError() const
void WS(const char *varname, const char *v, int string_length, MVOdbError *error)
void WU16AI(const char *varname, int index, uint16_t v, MVOdbError *error)
MVOdb * Chdir(const char *subdir, bool create, MVOdbError *error)
void SetError(MVOdbError *error, bool print, const std::string &path, const std::string &message)
void SetOk(MVOdbError *error)
void mxml_free_tree(PMXML_NODE tree)
PMXML_NODE mxml_parse_file(const char *file_name, char *error, int error_size, int *error_line)
PMXML_NODE mxml_parse_buffer(const char *buffer, char *error, int error_size, int *error_line)
uint32_t GetXmlValue< uint32_t >(const char *text)
float GetXmlValue< float >(const char *text)
int GetXmlValue< int >(const char *text)
static const char * GetAttr(PMXML_NODE node, const char *attrName)
Return the value of the named attribute.
uint16_t GetXmlValue< uint16_t >(const char *text)
static T GetXmlValue(const char *text)
static const char * GetAttrName(PMXML_NODE node, int i)
Return the name of the indexed attribute.
bool GetXmlValue< bool >(const char *text)
double GetXmlValue< double >(const char *text)
MVOdb * MakeXmlFileOdb(const char *filename, MVOdbError *error)
static std::string toString(int i)
static PMXML_NODE FindNode(PMXML_NODE dir, const char *name)
static const char * GetAttrValue(PMXML_NODE node, int i)
Return the value of the indexed attribute.
MVOdb * MakeXmlBufferOdb(const char *buf, int bufsize, MVOdbError *error)
char name[MXML_NAME_LENGTH]