30 #include <libxml/parser.h>
31 #include <libxml/tree.h>
161 const xmlNode *ptr_data)
170 const xmlNode *ptr_data)
213 const char *data,
size_t data_len)
224 sprintf(msg,
"controlfield:");
225 for (i = 0; i < 16 && i < data_len; i++)
226 sprintf(msg + strlen(msg),
" %02X", data[i] & 0xff);
228 sprintf(msg + strlen(msg),
" ..");
234 const char *indicator,
size_t indicator_len)
255 const char *attribute_name,
char *code_data,
size_t code_len)
262 for (index = 0; index < code_len; index++)
264 if (!((code_data[index] >=
'0' && code_data[index] <=
'9') ||
265 (code_data[index] >=
'a' && code_data[index] <=
'z') ||
266 (code_data[index] >=
'A' && code_data[index] <=
'Z')))
270 if (encode && attribute_name)
273 if (!encode || attribute_name)
278 if (encode && attribute_name)
285 const char *indicator,
size_t indicator_len)
318 const char *code_data,
size_t code_data_len)
325 sprintf(msg,
"subfield:");
326 for (i = 0; i < 16 && i < code_data_len; i++)
327 sprintf(msg + strlen(msg),
" %02X", code_data[i] & 0xff);
328 if (i < code_data_len)
329 sprintf(msg + strlen(msg),
" ..");
348 if (leader[offset] <
' ' || leader[offset] > 127)
351 "Leader character at offset %d is non-ASCII. "
352 "Setting value to '%c'", offset, ch_default);
353 leader[offset] = ch_default;
358 int *indicator_length,
359 int *identifier_length,
361 int *length_data_entry,
362 int *length_starting,
363 int *length_implementation)
367 memcpy(leader, leader_c, 24);
377 "Indicator length at offset 10 should hold a digit."
380 *indicator_length = 2;
385 "Identifier length at offset 11 should hold a digit."
388 *identifier_length = 2;
393 "Base address at offsets 12..16 should hold a number."
403 "Length data entry at offset 20 should hold a digit."
405 *length_data_entry = 4;
411 "Length starting at offset 21 should hold a digit."
413 *length_starting = 5;
419 "Length implementation at offset 22 should hold a digit."
421 *length_implementation = 0;
456 for (i = 1; i<5; i++)
459 size_t outbytesleft =
sizeof(outbuf);
461 const char *inp = buf;
463 size_t inbytesleft = i;
465 &outp, &outbytesleft);
467 if (r != (
size_t) (-1))
486 int identifier_length;
518 int identifier_length)
523 if (identifier_length > 2)
524 return identifier_length - 1;
532 int identifier_length;
659 int identifier_length;
815 xmlDocPtr doc = xmlNewDoc(BAD_CAST
"1.0");
818 xmlDocSetRootElement(doc, root_ptr);
819 xmlDocDumpMemory(doc, &buf_out, &len_out);
842 "http://www.loc.gov/MARC21/slim",
853 "http://www.indexdata.com/turbomarc", 0, 0, 1);
861 "info:lc/xmlns/marcxchange-v1",
869 xmlNsPtr ns_record,
WRBUF wr_cdata,
870 int identifier_length)
881 ptr = xmlNewChild(record_ptr, ns_record, BAD_CAST field, 0);
894 xmlNewProp(ptr, BAD_CAST ind_str, BAD_CAST ind_val);
900 xmlNode *ptr_subfield;
910 ptr_subfield = xmlNewTextChild(ptr, ns_record,
918 xmlNewProp(ptr_subfield, BAD_CAST
"code", BAD_CAST
wrbuf_cstr(wr_cdata));
930 int identifier_length;
950 record_ptr = xmlNewNode(0, BAD_CAST
"r");
951 *root_ptr = record_ptr;
953 ns_record = xmlNewNs(record_ptr, BAD_CAST ns, 0);
954 xmlSetNs(record_ptr, ns_record);
957 xmlNewProp(record_ptr, BAD_CAST
"format", BAD_CAST format);
959 xmlNewProp(record_ptr, BAD_CAST
"type", BAD_CAST type);
979 ptr = xmlNewTextChild(record_ptr, ns_record,
984 ptr = xmlNewComment(BAD_CAST n->
u.
comment);
985 xmlAddChild(record_ptr, ptr);
988 xmlNewTextChild(record_ptr, ns_record, BAD_CAST
"l",
1004 int identifier_length;
1006 xmlNode *record_ptr;
1024 record_ptr = xmlNewNode(0, BAD_CAST
"record");
1025 *root_ptr = record_ptr;
1027 ns_record = xmlNewNs(record_ptr, BAD_CAST ns, 0);
1028 xmlSetNs(record_ptr, ns_record);
1031 xmlNewProp(record_ptr, BAD_CAST
"format", BAD_CAST format);
1033 xmlNewProp(record_ptr, BAD_CAST
"type", BAD_CAST type);
1042 ptr = xmlNewChild(record_ptr, ns_record, BAD_CAST
"datafield", 0);
1043 xmlNewProp(ptr, BAD_CAST
"tag", BAD_CAST n->
u.
datafield.
tag);
1052 sprintf(ind_str,
"ind%d", i+1);
1055 xmlNewProp(ptr, BAD_CAST ind_str, BAD_CAST ind_val);
1060 xmlNode *ptr_subfield;
1067 ptr_subfield = xmlNewTextChild(
1069 BAD_CAST
"subfield", BAD_CAST
wrbuf_cstr(wr_cdata));
1074 xmlNewProp(ptr_subfield, BAD_CAST
"code",
1083 ptr = xmlNewTextChild(record_ptr, ns_record,
1084 BAD_CAST
"controlfield",
1090 ptr = xmlNewComment(BAD_CAST n->
u.
comment);
1091 xmlAddChild(record_ptr, ptr);
1094 xmlNewTextChild(record_ptr, ns_record, BAD_CAST
"leader",
1108 int indicator_length;
1109 int identifier_length;
1110 int length_data_entry;
1111 int length_starting;
1112 int length_implementation;
1113 int data_offset = 0;
1115 WRBUF wr_dir, wr_head, wr_data_tmp;
1132 if (!
atoi_n_check(leader+22, 1, &length_implementation))
1139 int data_length = 0;
1146 data_length += indicator_length;
1178 wrbuf_printf(wr_dir,
"%0*d", length_data_entry, data_length);
1179 wrbuf_printf(wr_dir,
"%0*d", length_starting, data_offset);
1180 data_offset += data_length;
1192 wrbuf_printf(wr_head,
"%05d", base_address + data_offset + 1);
1250 const char **result,
size_t *rsize)
1292 memcpy(leader+off, str, strlen(str));
1303 char dummy_leader[24];
1313 const char *cp = leader_spec;
1318 int no_read = 0, no = 0;
1320 no = sscanf(cp,
"%d=%20[^,]%n", &pos, val, &no_read);
1321 if (no < 2 || no_read < 3)
1323 if (pos < 0 || (
size_t) pos >= size)
1328 const char *vp = strchr(val+1,
'\'');
1334 if (len + pos > size)
1336 memcpy(leader + pos, val+1, len);
1338 else if (*val >=
'0' && *val <=
'9')
1357 if (!strcmp(arg,
"marc"))
1359 if (!strcmp(arg,
"marcxml"))
1361 if (!strcmp(arg,
"turbomarc"))
1363 if (!strcmp(arg,
"marcxchange"))
1365 if (!strcmp(arg,
"line"))