27 #include <yaz/oid_db.h>
28 #include <yaz/snprintf.h>
74 fi->
buf = (
char *) xmalloc (4096);
127 yaz_log(YLOG_LOG,
"filter_extract off=%ld",
128 (
long) (*fi->
p->tellf)(fi->
p->fh));
132 if (!
fi_gets(fi, line,
sizeof(line)-1))
137 while (
fi_gets(fi, line,
sizeof(line)-1))
141 const char *cp = line;
144 yaz_log(YLOG_LOG,
"safari line: %s", line);
147 if (*cp >=
'0' && *cp <=
'9')
150 type_cstr[0] = *cp++;
163 yaz_log(YLOG_WARN,
"Bad safari record line: %s", line);
174 yaz_log(YLOG_WARN,
"Bad safari record line: %s", line);
179 for (cp = cp + nor; *cp ==
' '; cp++)
193 int r, filter_ptr = 0;
195 static char *filter_buf = NULL;
196 static int filter_size = 0;
199 const char *elementSetName = NULL;
202 if (
p->comp &&
p->comp->which == Z_RecordComp_simple &&
203 p->comp->u.simple->which == Z_ElementSetNames_generic)
204 elementSetName =
p->comp->u.simple->u.generic;
209 if (!strcmp(elementSetName,
"R"))
215 else if (!strcmp(elementSetName,
"H"))
223 if (filter_ptr + 4096 >= filter_size)
227 filter_size = 2*filter_size + 8192;
228 nb = (
char *) xmalloc(filter_size);
231 memcpy(nb, filter_buf, filter_ptr);
236 if (make_header && filter_ptr == 0)
240 yaz_snprintf(filter_buf, 50,
"Rank: %d\n",
p->score);
241 filter_ptr = strlen(filter_buf);
243 yaz_snprintf(filter_buf + filter_ptr, 50,
"Local Number: " ZINT_FORMAT "\n",
245 filter_ptr = strlen(filter_buf);
248 yaz_snprintf(filter_buf + filter_ptr, 200,
"Filename: %s\n",
p->fname);
249 filter_ptr = strlen(filter_buf);
251 strcpy(filter_buf+filter_ptr++,
"\n");
260 filter_buf[filter_ptr] =
'\0';
263 if (!strcmp(elementSetName,
"B"))
265 if (!strcmp(elementSetName,
"M"))
270 char *
p = filter_buf;
273 while (++i <= no_lines && (
p = strchr (
p,
'\n')))
278 filter_ptr =
p-filter_buf;
281 p->output_format = yaz_oid_recsyn_sutrs;
282 p->rec_buf = filter_buf;
283 p->rec_len = filter_ptr;
308 #if IDZEBRA_STATIC_SAFARI
309 idzebra_filter_safari
static void filter_destroy(void *clientData)
static void fi_close(struct fi_info *fi)
static struct recType filter_type2
static int fi_gets(struct fi_info *fi, char *dst, int max)
static struct fi_info * fi_open(struct recExtractCtrl *p)
static int filter_retrieve(void *clientData, struct recRetrieveCtrl *p)
static int filter_extract(void *clientData, struct recExtractCtrl *p)
static struct recType filter_type
static int fi_getchar(struct fi_info *fi, char *dst)
static void * filter_init(Res res, RecType recType)
static void * filter_init2(Res res, RecType recType)
static ZEBRA_RES filter_config(void *clientData, Res res, const char *args)
#define RECCTRL_EXTRACT_EOF
#define RECCTRL_EXTRACT_ERROR_GENERIC
#define RECCTRL_EXTRACT_OK
int(* readf)(struct ZebraRecStream *s, char *buf, size_t count)
read function
struct recExtractCtrl * p
short ZEBRA_RES
Common return type for Zebra API.