7179f35d7f08ae3929d6e0e3093d98eb1a5697a2
[idzebra-moved-to-github.git] / recctrl / sgmlread.c
1 /*
2  * Copyright (C) 1994-1999, Index Data
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: sgmlread.c,v $
7  * Revision 1.9  1999-07-14 10:56:16  adam
8  * Filter handles multiple records in one file.
9  *
10  * Revision 1.8  1999/06/25 13:47:25  adam
11  * Minor change that prevents MSVC warning.
12  *
13  * Revision 1.7  1999/05/21 12:00:17  adam
14  * Better diagnostics for extraction process.
15  *
16  * Revision 1.6  1999/05/20 12:57:18  adam
17  * Implemented TCL filter. Updated recctrl system.
18  *
19  * Revision 1.5  1999/02/02 14:51:31  adam
20  * Updated WIN32 code specific sections. Changed header.
21  *
22  * Revision 1.4  1997/09/17 12:19:22  adam
23  * Zebra version corresponds to YAZ version 1.4.
24  * Changed Zebra server so that it doesn't depend on global common_resource.
25  *
26  * Revision 1.3  1997/09/04 13:54:41  adam
27  * Added MARC filter - type grs.marc.<syntax> where syntax refers
28  * to abstract syntax. New method tellf in retrieve/extract method.
29  *
30  * Revision 1.2  1997/04/30 08:56:08  quinn
31  * null
32  *
33  * Revision 1.1  1996/10/11  10:57:32  adam
34  * New module recctrl. Used to manage records (extract/retrieval).
35  *
36  */
37 #include <assert.h>
38 #include <log.h>
39
40 #include "grsread.h"
41
42 struct sgml_getc_info {
43     char *buf;
44     int buf_size;
45     int size;
46     int off;
47     int moffset;
48     void *fh;
49     int (*readf)(void *, char *, size_t);
50     WRBUF wrbuf;
51 };
52
53 int sgml_getc (void *clientData)
54 {
55     struct sgml_getc_info *p = (struct sgml_getc_info *) clientData;
56     int res;
57     
58     if (p->off < p->size)
59         return p->buf[(p->off)++];
60     if (p->size < p->buf_size)
61         return 0;
62     p->moffset += p->off;
63     p->off = 0;
64     p->size = 0;
65     res = (*p->readf)(p->fh, p->buf, p->buf_size);
66     if (res > 0)
67     {
68         p->size += res;
69         return p->buf[(p->off)++];
70     }
71     return 0;
72 }
73
74 static data1_node *grs_read_sgml (struct grs_read_info *p)
75 {
76     struct sgml_getc_info *sgi = (struct sgml_getc_info *) p->clientData;
77     data1_node *node;
78     int res;
79     
80     sgi->moffset = p->offset;
81     sgi->fh = p->fh;
82     sgi->readf = p->readf;
83     sgi->off = 0;
84     sgi->size = 0;
85     res = (*sgi->readf)(sgi->fh, sgi->buf, sgi->buf_size);
86     if (res > 0)
87         sgi->size += res;
88     else
89         return 0;
90     node = data1_read_nodex (p->dh, p->mem, sgml_getc, sgi, sgi->wrbuf);
91     if (node && p->endf)
92         (*p->endf)(sgi->fh, sgi->moffset + sgi->off);
93     return node;
94 }
95
96 static void *grs_init_sgml(void)
97 {
98     struct sgml_getc_info *p = (struct sgml_getc_info *) xmalloc (sizeof(*p));
99     p->buf_size = 512;
100     p->buf = xmalloc (p->buf_size);
101     p->wrbuf = wrbuf_alloc();
102     return p;
103 }
104
105 static void grs_destroy_sgml(void *clientData)
106 {
107     struct sgml_getc_info *p = (struct sgml_getc_info *) clientData;
108
109     wrbuf_free(p->wrbuf, 1);
110     xfree (p->buf);
111     xfree (p);
112 }
113
114 static struct recTypeGrs sgml_type = {
115     "sgml",
116     grs_init_sgml,
117     grs_destroy_sgml,
118     grs_read_sgml
119 };
120
121 RecTypeGrs recTypeGrs_sgml = &sgml_type;
122