34 #include <yaz/snprintf.h>
36 #include <yaz/xmalloc.h>
41 #define XML_CHUNK 1024
51 static void report_xml_error(XML_Parser parser)
53 zint line = XML_GetCurrentLineNumber(parser);
54 zint col = XML_GetCurrentColumnNumber(parser);
56 line, col, XML_ErrorString(XML_GetErrorCode(parser)));
59 static void cb_start(
void *user,
const char *el,
const char **attr)
61 struct user_info *ui = (
struct user_info*) user;
64 ui->d1_stack[ui->level] =
data1_mk_tag(ui->dh, ui->nmem, el, attr,
65 ui->d1_stack[ui->level-1]);
67 yaz_log (ui->loglevel,
"cb_start %s", el);
70 static void cb_end (
void *user,
const char *el)
72 struct user_info *ui = (
struct user_info*) user;
75 yaz_log(ui->loglevel,
"cb_end %s", el);
78 static void cb_chardata(
void *user,
const char *s,
int len)
80 struct user_info *ui = (
struct user_info*) user;
82 yaz_log (ui->loglevel,
"cb_chardata %.*s", len, s);
85 ui->d1_stack[ui->level -1]);
88 static void cb_decl(
void *user,
const char *version,
const char *encoding,
91 struct user_info *ui = (
struct user_info*) user;
92 const char *attr_list[7];
94 attr_list[0] =
"version";
95 attr_list[1] = version;
97 attr_list[2] =
"encoding";
98 attr_list[3] =
"UTF-8";
100 attr_list[4] =
"standalone";
101 attr_list[5] = standalone ?
"yes" :
"no";
106 ui->d1_stack[ui->level-1]);
108 yaz_log (YLOG_LOG,
"decl version=%s encoding=%s",
109 version ? version :
"null",
110 encoding ? encoding :
"null");
114 static void cb_processing(
void *user,
const char *target,
117 struct user_info *ui = (
struct user_info*) user;
120 ui->d1_stack[ui->level-1]);
123 yaz_log(ui->loglevel,
"decl processing target=%s data=%s",
124 target ? target :
"null",
125 data ? data :
"null");
128 static void cb_comment(
void *user,
const char *data)
130 struct user_info *ui = (
struct user_info*) user;
131 yaz_log(ui->loglevel,
"decl comment data=%s", data ? data :
"null");
135 static void cb_doctype_start(
void *userData,
const char *doctypeName,
136 const char *sysid,
const char *pubid,
137 int has_internal_subset)
139 struct user_info *ui = (
struct user_info*) userData;
140 yaz_log(ui->loglevel,
"doctype start doctype=%s sysid=%s pubid=%s",
141 doctypeName, sysid, pubid);
144 static void cb_doctype_end(
void *userData)
146 struct user_info *ui = (
struct user_info*) userData;
147 yaz_log(ui->loglevel,
"doctype end");
151 static void cb_entity_decl(
void *userData,
const char *entityName,
152 int is_parameter_entity,
153 const char *value,
int value_length,
154 const char *base,
const char *systemId,
155 const char *publicId,
const char *notationName)
157 struct user_info *ui = (
struct user_info*) userData;
158 yaz_log(ui->loglevel,
159 "entity decl %s is_para_entry=%d value=%.*s base=%s systemId=%s"
160 " publicId=%s notationName=%s",
161 entityName, is_parameter_entity, value_length, value,
162 base, systemId, publicId, notationName);
166 static int cb_external_entity(XML_Parser pparser,
169 const char *systemId,
170 const char *publicId)
172 struct user_info *ui = (
struct user_info*) XML_GetUserData(pparser);
177 yaz_log(ui->loglevel,
178 "external entity context=%s base=%s systemid=%s publicid=%s",
179 context, base, systemId, publicId);
183 if (!(
inf = fopen(systemId,
"rb")))
185 yaz_log (YLOG_WARN|YLOG_ERRNO,
"fopen %s", systemId);
189 parser = XML_ExternalEntityParserCreate(pparser,
"", 0);
193 void *buf = XML_GetBuffer(parser, XML_CHUNK);
196 yaz_log(YLOG_WARN,
"XML_GetBuffer fail");
199 r = fread(buf, 1, XML_CHUNK,
inf);
204 yaz_log(YLOG_WARN|YLOG_ERRNO,
"fread %s", systemId);
209 if (!XML_ParseBuffer(parser, r, done))
212 report_xml_error(parser);
216 XML_ParserFree(parser);
222 static int cb_encoding_convert(
void *data,
const char *s)
224 iconv_t t = (iconv_t) data;
227 char outbuf_[2], *outbuf = outbuf_;
229 char *inbuf = (
char *) s;
233 yaz_log(YLOG_LOG,
"------------------------- cb_encoding_convert --- ");
235 ret = iconv(t, &inbuf, &inleft, &outbuf, &outleft);
236 if (ret == (
size_t) (-1) && errno != E2BIG)
238 iconv (t, 0, 0, 0, 0);
243 memcpy (&code, outbuf_,
sizeof(
short));
247 static void cb_encoding_release(
void *data)
249 iconv_t t = (iconv_t) data;
253 static int cb_encoding_handler(
void *userData,
const char *name,
258 struct user_info *ui = (
struct user_info*) userData;
260 iconv_t t = iconv_open(
"UNICODE", name);
261 if (t == (iconv_t) (-1))
265 yaz_log(ui->loglevel,
"Encoding handler of %s", name);
266 for (i = 0; i<256; i++)
271 char *inbuf = inbuf_;
272 char *outbuf = outbuf_;
277 iconv (t, 0, 0, 0, 0);
279 ret = iconv(t, &inbuf, &inleft, &outbuf, &outleft);
280 if (ret == (
size_t) (-1))
284 yaz_log(ui->loglevel,
"Encoding %d: invalid sequence", i);
303 assert (i >= 0 && i<255);
305 ret = iconv(t, &inbuf, &inleft, &outbuf, &outleft);
306 if (ret == (
size_t) (-1))
308 if (errno == EILSEQ || errno == E2BIG)
314 else if (errno == EINVAL)
320 else if (outleft == 0)
331 if (info->map[i] < -1)
332 yaz_log(ui->loglevel,
"Encoding %d: multibyte input %d",
335 yaz_log(ui->loglevel,
"Encoding %d: multibyte input failed",
342 yaz_log(YLOG_WARN,
"Encoding %d: no room for output",
346 else if (outleft == 0)
349 memcpy (&code, outbuf_,
sizeof(
short));
356 yaz_log (YLOG_DEBUG,
"Encoding %d: bad state", i);
361 info->convert = cb_encoding_convert;
362 info->release = cb_encoding_release;
378 static void cb_ns_start(
void *userData,
const char *prefix,
const char *uri)
380 struct user_info *ui = (
struct user_info*) userData;
382 yaz_log(ui->loglevel,
"cb_ns_start %s %s", prefix, uri);
385 static void cb_ns_end(
void *userData,
const char *prefix)
387 struct user_info *ui = (
struct user_info*) userData;
389 yaz_log(ui->loglevel,
"cb_ns_end %s", prefix);
397 struct user_info uinfo;
402 uinfo.loglevel = YLOG_DEBUG;
407 uinfo.d1_stack[1] = 0;
409 parser = XML_ParserCreate (0 );
411 XML_SetElementHandler(parser, cb_start, cb_end);
412 XML_SetCharacterDataHandler(parser, cb_chardata);
413 XML_SetXmlDeclHandler(parser, cb_decl);
414 XML_SetProcessingInstructionHandler(parser, cb_processing);
415 XML_SetUserData(parser, &uinfo);
416 XML_SetCommentHandler(parser, cb_comment);
417 XML_SetDoctypeDeclHandler(parser, cb_doctype_start, cb_doctype_end);
418 XML_SetEntityDeclHandler(parser, cb_entity_decl);
419 XML_SetExternalEntityRefHandler(parser, cb_external_entity);
420 XML_SetNamespaceDeclHandler(parser, cb_ns_start, cb_ns_end);
422 XML_SetUnknownEncodingHandler(parser, cb_encoding_handler, &uinfo);
427 void *buf = XML_GetBuffer(parser, XML_CHUNK);
431 yaz_log(YLOG_WARN,
"XML_GetBuffer fail");
434 r = stream->
readf(stream, buf, XML_CHUNK);
438 yaz_log(YLOG_WARN,
"XML read fail");
445 if (no_read && !XML_ParseBuffer(parser, r, done))
448 report_xml_error(parser);
451 XML_ParserFree(parser);
454 if (!uinfo.d1_stack[1] || !done)
457 first_node = uinfo.d1_stack[0]->
child;
461 const char *attr_list[5];
463 attr_list[0] =
"version";
464 attr_list[1] =
"1.0";
466 attr_list[2] =
"encoding";
467 attr_list[3] =
"UTF-8";
474 return uinfo.d1_stack[0];
478 XML_Expat_Version expat_version;
488 struct xml_info *p = (
struct xml_info *) xmalloc (
sizeof(*p));
490 p->expat_version = XML_ExpatVersionInfo();
497 struct xml_info *p = (
struct xml_info *) clientData;
523 #if IDZEBRA_STATIC_GRS_XML
524 idzebra_filter_grs_xml
data1_node * data1_mk_tag(data1_handle dh, NMEM nmem, const char *tag, const char **attr, data1_node *at)
data1_node * data1_insert_preprocess(data1_handle dh, NMEM nmem, const char *target, const char **attr, data1_node *at)
data1_node * data1_mk_comment(data1_handle dh, NMEM mem, const char *buf, data1_node *parent)
data1_node * data1_mk_node2(data1_handle dh, NMEM m, int type, data1_node *parent)
#define DATA1N_preprocess
data1_node * data1_mk_text_n(data1_handle dh, NMEM mem, const char *buf, size_t len, data1_node *parent)
data1_node * data1_mk_text_nf(data1_handle dh, NMEM mem, const char *buf, size_t len, data1_node *parent)
data1_node * data1_mk_preprocess(data1_handle dh, NMEM nmem, const char *target, const char **attr, data1_node *at)
void data1_set_root(data1_handle dh, data1_node *res, NMEM nmem, const char *name)
static void filter_destroy(void *clientData)
static int filter_retrieve(void *clientData, struct recRetrieveCtrl *p)
static int filter_extract(void *clientData, struct recExtractCtrl *p)
static struct recType filter_type
static void * filter_init(Res res, RecType recType)
int zebra_grs_retrieve(void *clientData, struct recRetrieveCtrl *p, data1_node *(*grs_read)(struct grs_read_info *))
int zebra_grs_extract(void *clientData, struct recExtractCtrl *p, data1_node *(*grs_read)(struct grs_read_info *))
int(* readf)(struct ZebraRecStream *s, char *buf, size_t count)
read function
struct data1_node::@2::@7 preprocess
struct data1_node * child
struct ZebraRecStream * stream