28 #include <yaz/oid_db.h>
29 #include <yaz/snprintf.h>
51 tinfo->
sep = xstrdup(args);
74 fi->
buf = (
char *) xmalloc(4096);
92 if (tinfo->
sep && *dst == *tinfo->
sep)
95 off_t end_offset = off - (fi->
max - fi->
offset);
118 yaz_log(YLOG_LOG,
"filter_extract off=%ld",
119 (
long) (*fi->
p->tellf)(fi->
p->fh));
127 while (r > 0 && i < 511 && w[i] !=
'\n' && w[i] !=
'\r')
148 int r, filter_ptr = 0;
150 static char *filter_buf = NULL;
151 static int filter_size = 0;
154 const char *elementSetName = NULL;
157 if (
p->comp &&
p->comp->which == Z_RecordComp_simple &&
158 p->comp->u.simple->which == Z_ElementSetNames_generic)
159 elementSetName =
p->comp->u.simple->u.generic;
164 if (!strcmp(elementSetName,
"R"))
170 else if (!strcmp(elementSetName,
"H"))
178 if (filter_ptr + 4096 >= filter_size)
182 filter_size = 2*filter_size + 8192;
183 nb = (
char *) xmalloc(filter_size);
186 memcpy(nb, filter_buf, filter_ptr);
191 if (make_header && filter_ptr == 0)
195 yaz_snprintf(filter_buf, 50,
"Rank: %d\n",
p->score);
196 filter_ptr = strlen(filter_buf);
198 yaz_snprintf(filter_buf + filter_ptr, 50,
"Local Number: " ZINT_FORMAT "\n",
200 filter_ptr = strlen(filter_buf);
203 yaz_snprintf(filter_buf + filter_ptr, 200,
"Filename: %s\n",
p->fname);
204 filter_ptr = strlen(filter_buf);
206 strcpy(filter_buf+filter_ptr++,
"\n");
215 filter_buf[filter_ptr] =
'\0';
218 if (!strcmp(elementSetName,
"B"))
220 if (!strcmp(elementSetName,
"M"))
225 char *
p = filter_buf;
228 while (++i <= no_lines && (
p = strchr(
p,
'\n')))
233 filter_ptr =
p-filter_buf;
236 p->output_format = yaz_oid_recsyn_sutrs;
237 p->rec_buf = filter_buf;
238 p->rec_len = filter_ptr;
253 #if IDZEBRA_STATIC_TEXT
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 buf_close(struct buf_info *fi)
static void * filter_init(Res res, RecType recType)
static struct buf_info * buf_open(struct recExtractCtrl *p)
static int buf_getchar(struct filter_info *tinfo, struct buf_info *fi, char *dst)
static ZEBRA_RES filter_config(void *clientData, Res res, const char *args)
#define RECCTRL_EXTRACT_EOF
#define RECCTRL_EXTRACT_OK
off_t(* endf)(struct ZebraRecStream *s, off_t *offset)
set and get of record position
int(* readf)(struct ZebraRecStream *s, char *buf, size_t count)
read function
off_t(* tellf)(struct ZebraRecStream *s)
tell function
struct recExtractCtrl * p
short ZEBRA_RES
Common return type for Zebra API.