36 #include <libxml/tree.h>
37 #include <libxml/parser.h>
43 static inline void strtrimcat(
char *dest,
const char *src)
66 *(++last_nonspace) =
'\0';
69 static inline void strtrimcpy(
char *dest,
const char *src)
79 memset(
new, 0,
sizeof (
struct marchash));
86 xmlNodePtr field_node;
89 field_node = rec_node->children;
93 if (field_node->type == XML_ELEMENT_NODE)
96 if (!strcmp((
const char *) field_node->name,
"controlfield"))
98 xmlChar *content = xmlNodeGetContent(field_node);
99 xmlChar *tag = xmlGetProp(field_node, BAD_CAST
"tag");
102 marchash, (
const char *) tag, (
const char *) content);
106 else if (!strcmp((
const char *) field_node->name,
"datafield"))
108 xmlChar *content = xmlNodeGetContent(field_node);
109 xmlChar *tag = xmlGetProp(field_node, BAD_CAST
"tag");
112 marchash, (
const char *) tag, (
const char *) content);
118 sub_node = field_node->children;
121 if ((sub_node->type == XML_ELEMENT_NODE) &&
122 !strcmp((
const char *) sub_node->name,
"subfield"))
124 xmlChar *content = xmlNodeGetContent(sub_node);
125 xmlChar *code = xmlGetProp(sub_node, BAD_CAST
"code");
129 code[0], (
const char *) content);
133 sub_node = sub_node->next;
137 field_node = field_node->next;
142 const char *
key,
const char *
val)
167 strncpy(new->key,
key, 4);
170 if (new->key[3] !=
'\0')
173 new->val = nmem_malloc(
marchash->
nmem, sizeof (
char) * strlen(
val) + 1);
181 const char key,
const char *
val)
203 new->val = nmem_malloc(
marchash->
nmem, sizeof (
char) * strlen(
val) + 1);
204 strcpy(new->val,
val);
218 if (!strcmp(cur->
key,
key))
244 const char *delim, NMEM nmem)
248 int delimsize = strlen(delim);
249 int outsize = 1-delimsize;
251 cur = field -> subfields;
254 outsize += strlen(cur->
val) + delimsize;
258 output = nmem_malloc(nmem, outsize);
262 cur = field -> subfields;
267 strcat(output, delim);
unsigned int jenkins_hash(const unsigned char *key)
struct marcfield * marchash_add_field(struct marchash *marchash, const char *key, const char *val)
char * marchash_catenate_subfields(struct marcfield *field, const char *delim, NMEM nmem)
struct marcsubfield * marchash_add_subfield(struct marchash *marchash, struct marcfield *field, const char key, const char *val)
static void strtrimcat(char *dest, const char *src)
struct marcsubfield * marchash_get_subfield(char key, struct marcfield *field, struct marcsubfield *last)
struct marcfield * marchash_get_field(struct marchash *marchash, const char *key, struct marcfield *last)
static void strtrimcpy(char *dest, const char *src)
struct marchash * marchash_create(NMEM nmem)
void marchash_ingest_marcxml(struct marchash *marchash, xmlNodePtr rec_node)
struct marcsubfield * subfields
struct marcfield * table[MARCHASH_MASK+1]
struct marcsubfield * next