2 * Copyright (c) 2002, Index Data.
3 * See the file LICENSE for details.
5 * $Id: d1_expat.c,v 1.1 2002-05-13 14:13:37 adam Exp $
14 #include <yaz/xmalloc.h>
16 #include <yaz/data1.h>
21 data1_node *d1_stack[256];
27 static void cb_start (void *user, const char *el, const char **attr)
29 struct user_info *ui = (struct user_info*) user;
32 ui->d1_stack[ui->level] = data1_mk_tag (ui->dh, ui->nmem, el, attr,
33 ui->d1_stack[ui->level-1]);
37 ui->d1_stack[0] = data1_mk_root (ui->dh, ui->nmem, el);
42 static void cb_end (void *user, const char *el)
44 struct user_info *ui = (struct user_info*) user;
49 static void cb_chardata (void *user, const char *s, int len)
51 struct user_info *ui = (struct user_info*) user;
52 ui->d1_stack[ui->level] = data1_mk_text_n (ui->dh, ui->nmem, s, len,
53 ui->d1_stack[ui->level -1]);
56 #define XML_CHUNK 1024
58 data1_node *data1_read_xml (data1_handle dh,
59 int (*rf)(void *, char *, size_t), void *fh,
63 struct user_info uinfo;
68 uinfo.d1_stack[0] = 0;
71 parser = XML_ParserCreate (0 /* encoding */);
73 XML_SetElementHandler (parser, cb_start, cb_end);
74 XML_SetCharacterDataHandler (parser, cb_chardata);
75 XML_SetUserData (parser, &uinfo);
80 void *buf = XML_GetBuffer (parser, XML_CHUNK);
86 r = (*rf)(fh, buf, XML_CHUNK);
94 XML_ParseBuffer (parser, r, done);
96 XML_ParserFree (parser);
97 return uinfo.d1_stack[0];