X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fextract.c;h=aa695502246c84e03bf02c969aeae1dcaf557b18;hb=0ca8a9894b43c838980d650dd265f7a3da4ed219;hp=7af719096f2cb808255f1a586324c062f350d33e;hpb=30c13aff20c90ba746c40c7ab85b9460faac2c48;p=idzebra-moved-to-github.git diff --git a/index/extract.c b/index/extract.c index 7af7190..aa69550 100644 --- a/index/extract.c +++ b/index/extract.c @@ -4,7 +4,22 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: extract.c,v $ - * Revision 1.69 1997-04-29 09:26:03 adam + * Revision 1.73 1997-09-04 13:57:20 adam + * New file extract/retrieve method tellf (added). + * Added O_BINARY for open calls. + * + * Revision 1.72 1997/07/15 16:32:29 adam + * Bug fix: Match handler didn't terminate the resulting string! + * + * Revision 1.71 1997/07/15 16:28:41 adam + * Bug fix: storeData didn't work with files with multiple records. + * Bug fix: fixed memory management with records; not really well + * thought through. + * + * Revision 1.70 1997/07/01 13:00:42 adam + * Bug fix in routine searchRecordKey: uninitialized variables. + * + * Revision 1.69 1997/04/29 09:26:03 adam * Bug fix: generic recordId handling didn't work for compressed internal * keys. * @@ -656,6 +671,9 @@ static const char **searchRecordKey (struct recKeys *reckeys, int off = 0; int startSeq = -1; int i; + short attrUse; + char attrSet; + int seqno = 0; for (i = 0; i<32; i++) ws[i] = NULL; @@ -666,9 +684,6 @@ static const char **searchRecordKey (struct recKeys *reckeys, const char *src = reckeys->buf + off; const char *wstart; int lead; - short attrUse; - char attrSet; - int seqno; lead = *src++; @@ -741,6 +756,12 @@ static off_t file_seek (void *handle, off_t offset) return lseek (p->fd, offset, SEEK_SET); } +static off_t file_tell (void *handle) +{ + struct file_read_info *p = handle; + return p->file_offset; +} + static int file_read (void *handle, char *buf, size_t count) { struct file_read_info *p = handle; @@ -915,6 +936,7 @@ static char *fileMatchStr (struct recKeys *reckeys, struct recordGroup *rGroup, fname, rGroup->groupName ? rGroup->groupName : "none"); return NULL; } + *dst = '\0'; return dstBuf; } @@ -966,6 +988,7 @@ static int recordExtract (SYSNO *sysno, const char *fname, extractCtrl.offset = recordOffset; extractCtrl.readf = file_read; extractCtrl.seekf = file_seek; + extractCtrl.tellf = file_tell; extractCtrl.endf = file_end; extractCtrl.map_chrs_input = map_chrs_input; extractCtrl.flagShowRecords = rGroup->flagShowRecords; @@ -1140,16 +1163,18 @@ static int recordExtract (SYSNO *sysno, const char *fname, xfree (rec->info[recInfo_storeData]); if (rGroup->flagStoreData == 1) { - rec->size[recInfo_storeData] = fi->file_max; - rec->info[recInfo_storeData] = xmalloc (fi->file_max); + int size = fi->file_moffset - recordOffset; + if (!size) + size = fi->file_max - recordOffset; + rec->size[recInfo_storeData] = size; + rec->info[recInfo_storeData] = xmalloc (size); if (lseek (fi->fd, recordOffset, SEEK_SET) < 0) { logf (LOG_ERRNO|LOG_FATAL, "seek to %ld in %s", fname, (long) recordOffset); exit (1); } - if (read (fi->fd, rec->info[recInfo_storeData], fi->file_max) - < fi->file_max) + if (read (fi->fd, rec->info[recInfo_storeData], size) < size) { logf (LOG_ERRNO|LOG_FATAL, "read %d bytes of %s", fi->file_max, fname); @@ -1295,7 +1320,7 @@ int fileExtract (SYSNO *sysno, const char *fname, fd = -1; else { - if ((fd = open (fname, O_RDONLY)) == -1) + if ((fd = open (fname, O_BINARY|O_RDONLY)) == -1) { logf (LOG_WARN|LOG_ERRNO, "open %s", fname); return 0;