- if (ptr->type == XML_ELEMENT_NODE && !xmlStrcmp(ptr->name, BAD_CAST elem))
- return 1;
- return 0;
-}
-
-#define CHECK_TYPE 0
-
-static int match_xsd_string_n(xmlNodePtr ptr, const char *elem, ODR o,
- char **val, int *len)
-{
-#if CHECK_TYPE
- struct _xmlAttr *attr;
-#endif
- if (!match_element(ptr, elem))
- return 0;
-#if CHECK_TYPE
- for (attr = ptr->properties; attr; attr = attr->next)
- if (!strcmp(attr->name, "type") &&
- attr->children && attr->children->type == XML_TEXT_NODE)
- {
- const char *t = strchr(attr->children->content, ':');
- if (t)
- t = t + 1;
- else
- t = attr->children->content;
- if (!strcmp(t, "string"))
- break;
- }
- if (!attr)
- return 0;
-#endif
- ptr = ptr->children;
- if (!ptr || ptr->type != XML_TEXT_NODE)
- {
- *val = "";
- return 1;
- }
- *val = odr_strdup(o, (const char *) ptr->content);
- if (len)
- *len = xmlStrlen(ptr->content);
- return 1;
-}
-
-
-static int match_xsd_string(xmlNodePtr ptr, const char *elem, ODR o,
- char **val)
-{
- return match_xsd_string_n(ptr, elem, o, val, 0);
-}
-
-static int match_xsd_XML_n(xmlNodePtr ptr, const char *elem, ODR o,
- char **val, int *len)
-{
- xmlBufferPtr buf;
-
- if (!match_element(ptr, elem))
- return 0;
- ptr = ptr->children;
- while (ptr && (ptr->type == XML_TEXT_NODE || ptr->type == XML_COMMENT_NODE))
- ptr = ptr->next;
- if (!ptr)
- return 0;
- buf = xmlBufferCreate();
-
- xmlNodeDump(buf, ptr->doc, ptr, 0, 0);
-
- *val = odr_malloc(o, buf->use+1);
- memcpy (*val, buf->content, buf->use);
- (*val)[buf->use] = '\0';
-
- if (len)
- *len = buf->use;
-
- xmlBufferFree(buf);
-
- return 1;
-}
-
-static int match_xsd_integer(xmlNodePtr ptr, const char *elem, ODR o, int **val)
-{
-#if CHECK_TYPE
- struct _xmlAttr *attr;
-#endif
- if (!match_element(ptr, elem))
- return 0;
-#if CHECK_TYPE
- for (attr = ptr->properties; attr; attr = attr->next)
- if (!strcmp(attr->name, "type") &&
- attr->children && attr->children->type == XML_TEXT_NODE)
- {
- const char *t = strchr(attr->children->content, ':');
- if (t)
- t = t + 1;
- else
- t = attr->children->content;
- if (!strcmp(t, "integer"))
- break;
- }
- if (!attr)
- return 0;
-#endif
- ptr = ptr->children;
- if (!ptr || ptr->type != XML_TEXT_NODE)
- return 0;
- *val = odr_intdup(o, atoi((const char *) ptr->content));
- return 1;
-}
-
-static int yaz_srw_extra_record(ODR o, xmlNodePtr pptr,
- Z_SRW_extra_record *rec,
- void *client_data, const char *ns)
-{
- if (o->direction == ODR_DECODE)
- {
- xmlNodePtr ptr;
- rec->type = 1;
- rec->recordId = 0;
- rec->recordReviewCode = 0;
- rec->recordReviewNote = 0;
- rec->recordLockStatus = 0;
- rec->recordOldVersion = 0;
- rec->nonDupRecordId = 0;
- for (ptr = pptr->children; ptr; ptr = ptr->next)
- {
- if (match_xsd_string(ptr, "recordId", o,
- &rec->recordId ))
- ;
- else if (match_xsd_string(ptr, "recordReviewCode", o,
- &rec->recordReviewCode ))
- ;
- else if (match_xsd_string(ptr, "recordReviewNote", o,
- &rec->recordReviewNote ))
- ;
- else if (match_xsd_string(ptr, "nonDupRecordId", o,
- &rec->nonDupRecordId ))
- ;
- else if (match_xsd_string(ptr, "recordLockStatus", o,
- &rec->recordLockStatus ))
- ;
- else if (match_xsd_string(ptr, "recordOldVersion", o,
- &rec->recordOldVersion ))
- ;
- }
- }
- else if (o->direction == ODR_ENCODE)
- {
- xmlNodePtr ptr = pptr;
- if ( rec->recordId )
- add_xsd_string(ptr, "recordId", rec->recordId);
- if ( rec->recordReviewCode )
- add_xsd_string(ptr, "recordReviewCode", rec->recordReviewCode);
- if ( rec->recordReviewNote )
- add_xsd_string(ptr, "recordReviewNote", rec->recordReviewNote);
- if ( rec->nonDupRecordId )
- add_xsd_string(ptr, "nonDupRecordId", rec->nonDupRecordId);
- if ( rec->recordLockStatus )
- add_xsd_string(ptr, "recordLockStatus", rec->recordLockStatus);
- if ( rec->recordOldVersion )
- add_xsd_string(ptr, "recordOldVersion", rec->recordOldVersion);
- }