+struct sgml_getc_info {
+ char *buf;
+ int buf_size;
+ int size;
+ int off;
+ int moffset;
+ void *fh;
+ int (*readf)(void *, char *, size_t);
+ WRBUF wrbuf;
+};
+
+int sgml_getc (void *clientData)
+{
+ struct sgml_getc_info *p = (struct sgml_getc_info *) clientData;
+ int res;
+
+ if (p->off < p->size)
+ return p->buf[(p->off)++];
+ if (p->size < p->buf_size)
+ return 0;
+ p->moffset += p->off;
+ p->off = 0;
+ p->size = 0;
+ res = (*p->readf)(p->fh, p->buf, p->buf_size);
+ if (res > 0)
+ {
+ p->size += res;
+ return p->buf[(p->off)++];
+ }
+ return 0;
+}
+
+static data1_node *grs_read_sgml (struct grs_read_info *p)
+{
+ struct sgml_getc_info *sgi = (struct sgml_getc_info *) p->clientData;
+ data1_node *node;
+ int res;
+
+ sgi->moffset = p->offset;
+ sgi->fh = p->fh;
+ sgi->readf = p->readf;
+ sgi->off = 0;
+ sgi->size = 0;
+ res = (*sgi->readf)(sgi->fh, sgi->buf, sgi->buf_size);
+ if (res > 0)
+ sgi->size += res;
+ else
+ return 0;
+ node = data1_read_nodex (p->dh, p->mem, sgml_getc, sgi, sgi->wrbuf);
+ if (node && p->endf)
+ (*p->endf)(sgi->fh, sgi->moffset + sgi->off);
+ return node;
+}
+
+static void *grs_init_sgml(Res res, RecType recType)