X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Frectext.c;h=de72fdb5c11026e5869874cee0ba348f221456f2;hb=2e4e9c6def27f1e1463dcb6f205fab6a98054f38;hp=99957160e14c15d27e8f2c9242750ece899e18ec;hpb=896c0427df9d8eff5de6a1735dcd992e067df844;p=idzebra-moved-to-github.git diff --git a/recctrl/rectext.c b/recctrl/rectext.c index 9995716..de72fdb 100644 --- a/recctrl/rectext.c +++ b/recctrl/rectext.c @@ -1,5 +1,5 @@ -/* $Id: rectext.c,v 1.15 2002-08-02 19:26:56 adam Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 +/* $Id: rectext.c,v 1.18 2004-06-16 20:32:41 adam Exp $ + Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps This file is part of the Zebra server. @@ -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; @@ -111,7 +137,8 @@ static int text_retrieve (void *clientData, struct recRetrieveCtrl *p) int r, text_ptr = 0; static char *text_buf = NULL; static int text_size = 0; - int start_flag = 1; + int make_header = 1; + int make_body = 1; const char *elementSetName = NULL; int no_lines = 0; @@ -119,9 +146,21 @@ static int text_retrieve (void *clientData, struct recRetrieveCtrl *p) p->comp->u.simple->which == Z_ElementSetNames_generic) elementSetName = p->comp->u.simple->u.generic; - /* don't make header for the R(aw) element set name */ - if (elementSetName && !strcmp(elementSetName, "R")) - start_flag = 0; + if (elementSetName) + { + /* don't make header for the R(aw) element set name */ + if (!strcmp(elementSetName, "R")) + { + make_header = 0; + make_body = 1; + } + /* only make header for the H(eader) element set name */ + else if (!strcmp(elementSetName, "H")) + { + make_header = 1; + make_body = 0; + } + } while (1) { if (text_ptr + 4096 >= text_size) @@ -137,9 +176,8 @@ static int text_retrieve (void *clientData, struct recRetrieveCtrl *p) } text_buf = nb; } - if (start_flag) + if (make_header && text_ptr == 0) { - start_flag = 0; if (p->score >= 0) { sprintf (text_buf, "Rank: %d\n", p->score); @@ -147,7 +185,15 @@ static int text_retrieve (void *clientData, struct recRetrieveCtrl *p) } sprintf (text_buf + text_ptr, "Local Number: %d\n", p->localno); text_ptr = strlen(text_buf); + if (p->fname) + { + sprintf (text_buf + text_ptr, "Filename: %s\n", p->fname); + text_ptr = strlen(text_buf); + } + strcpy(text_buf+text_ptr++, "\n"); } + if (!make_body) + break; r = (*p->readf)(p->fh, text_buf + text_ptr, 4096); if (r <= 0) break;