X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Frectext.c;h=fd7f38d05d6332294802c1bda755506b21c46b85;hb=69d2833ca96efad6777b13a1e52f23a09c749509;hp=1de656755ccd86cca6ac31ecb375f9b970114ad6;hpb=9926cccd021b92bbfd461f378c5fcad8af358ede;p=idzebra-moved-to-github.git diff --git a/recctrl/rectext.c b/recctrl/rectext.c index 1de6567..fd7f38d 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.19 2004-08-06 12:55:03 adam Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -28,13 +28,22 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include "rectext.h" +struct text_info { + char *sep; +}; + static void *text_init (RecType recType) { - return 0; + struct text_info *tinfo = (struct text_info *) xmalloc(sizeof(*tinfo)); + tinfo->sep = 0; + return tinfo; } static void text_destroy (void *clientData) { + struct text_info *tinfo = clientData; + xfree (tinfo->sep); + xfree (tinfo); } struct buf_info { @@ -55,7 +64,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 +76,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 +93,34 @@ 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(LOG_LOG, "text_extract off=%ld", + (long) (*fi->p->tellf)(fi->p->fh)); +#endif + xfree(tinfo->sep); + tinfo->sep = 0; + if (p->subType) { + if (!strncmp(p->subType, "sep=", 4)) + tinfo->sep = xstrdup(p->subType+4); + } (*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 +183,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) {