X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Frectext.c;h=c6668164dc8fa7ec154147c0639f5d1f4c1f51cf;hb=0939cbe40b2dab77c8dbdcd129f4a3b226eaf9b5;hp=1de656755ccd86cca6ac31ecb375f9b970114ad6;hpb=9926cccd021b92bbfd461f378c5fcad8af358ede;p=idzebra-moved-to-github.git diff --git a/recctrl/rectext.c b/recctrl/rectext.c index 1de6567..c666816 100644 --- a/recctrl/rectext.c +++ b/recctrl/rectext.c @@ -1,4 +1,4 @@ -/* $Id: rectext.c,v 1.16 2004-03-22 20:52:11 adam Exp $ +/* $Id: rectext.c,v 1.22 2004-11-19 10:27:13 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -26,15 +26,29 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include -#include "rectext.h" +#include -static void *text_init (RecType recType) +struct text_info { + char *sep; +}; + +static void *text_init (Res res, RecType recType) { - return 0; + struct text_info *tinfo = (struct text_info *) xmalloc(sizeof(*tinfo)); + tinfo->sep = 0; + return tinfo; +} + +static void text_config(void *clientData, Res res, const char *args) +{ + } static void text_destroy (void *clientData) { + struct text_info *tinfo = clientData; + xfree (tinfo->sep); + xfree (tinfo); } struct buf_info { @@ -55,7 +69,7 @@ struct buf_info *buf_open (struct recExtractCtrl *p) return fi; } -int buf_read (struct buf_info *fi, char *dst) +int buf_read (struct text_info *tinfo, struct buf_info *fi, char *dst) { if (fi->offset >= fi->max) { @@ -67,6 +81,12 @@ int buf_read (struct buf_info *fi, char *dst) return 0; } *dst = fi->buf[(fi->offset)++]; + if (tinfo->sep && *dst == *tinfo->sep) + { + off_t off = (*fi->p->tellf)(fi->p->fh); + (*fi->p->endf)(fi->p->fh, off - (fi->max - fi->offset)); + return 0; + } return 1; } @@ -78,23 +98,30 @@ void buf_close (struct buf_info *fi) static int text_extract (void *clientData, struct recExtractCtrl *p) { + struct text_info *tinfo = clientData; char w[512]; RecWord recWord; int r; struct buf_info *fi = buf_open (p); +#if 0 + yaz_log(YLOG_LOG, "text_extract off=%ld", + (long) (*fi->p->tellf)(fi->p->fh)); +#endif + xfree(tinfo->sep); + tinfo->sep = 0; (*p->init)(p, &recWord); recWord.reg_type = 'w'; do { int i = 0; - r = buf_read (fi, w); + r = buf_read (tinfo, fi, w); while (r > 0 && i < 511 && w[i] != '\n' && w[i] != '\r') { i++; - r = buf_read (fi, w + i); - } + r = buf_read (tinfo, fi, w + i); + } if (i) { recWord.string = w; @@ -157,7 +184,8 @@ static int text_retrieve (void *clientData, struct recRetrieveCtrl *p) sprintf (text_buf, "Rank: %d\n", p->score); text_ptr = strlen(text_buf); } - sprintf (text_buf + text_ptr, "Local Number: %d\n", p->localno); + sprintf (text_buf + text_ptr, "Local Number: " ZINT_FORMAT "\n", + p->localno); text_ptr = strlen(text_buf); if (p->fname) { @@ -203,9 +231,20 @@ static int text_retrieve (void *clientData, struct recRetrieveCtrl *p) static struct recType text_type = { "text", text_init, + text_config, text_destroy, text_extract, text_retrieve }; -RecType recTypeText = &text_type; +RecType +#ifdef IDZEBRA_STATIC_TEXT +idzebra_filter_text +#else +idzebra_filter +#endif + +[] = { + &text_type, + 0, +};