-/* $Id: regxread.c,v 1.1 2006-07-03 14:27:09 adam Exp $
- Copyright (C) 1995-2005
+/* $Id: regxread.c,v 1.4 2006-10-30 11:18:26 adam Exp $
+ Copyright (C) 1995-2006
Index Data ApS
This file is part of the Zebra server.
for more details.
You should have received a copy of the GNU General Public License
-along with Zebra; see the file LICENSE.zebra. If not, write to the
-Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
*/
#include <stdio.h>
#if HAVE_TCL_H
Tcl_Interp *tcl_interp;
#endif
- void *f_win_fh;
- void (*f_win_ef)(void *, off_t);
+ struct ZebraRecStream *stream;
+ off_t (*f_win_ef)(struct ZebraRecStream *s, off_t *);
int f_win_start; /* first byte of buffer is this file offset */
int f_win_end; /* last byte of buffer is this offset - 1 */
int f_win_size; /* size of buffer */
char *f_win_buf; /* buffer itself */
- int (*f_win_rf)(void *, char *, size_t);
- off_t (*f_win_sf)(void *, off_t);
+ int (*f_win_rf)(struct ZebraRecStream *, char *, size_t);
+ off_t (*f_win_sf)(struct ZebraRecStream *, off_t);
struct lexConcatBuf *concatBuf;
int maxLevel;
}
if (off < 0 || start_pos >= spec->f_win_end)
{
- (*spec->f_win_sf)(spec->f_win_fh, start_pos);
+ (*spec->f_win_sf)(spec->stream, start_pos);
spec->f_win_start = start_pos;
if (!spec->f_win_buf)
spec->f_win_buf = (char *) xmalloc (spec->f_win_size);
- *size = (*spec->f_win_rf)(spec->f_win_fh, spec->f_win_buf,
+ *size = (*spec->f_win_rf)(spec->stream, spec->f_win_buf,
spec->f_win_size);
spec->f_win_end = spec->f_win_start + *size;
}
for (i = 0; i<spec->f_win_end - start_pos; i++)
spec->f_win_buf[i] = spec->f_win_buf[i + off];
- r = (*spec->f_win_rf)(spec->f_win_fh,
+ r = (*spec->f_win_rf)(spec->stream,
spec->f_win_buf + i,
spec->f_win_size - i);
spec->f_win_start = start_pos;
{
if (spec->f_win_ef && *ptr != F_WIN_EOF)
{
+ off_t end_offset = *ptr;
#if REGX_DEBUG
yaz_log (YLOG_LOG, "regx: endf ptr=%d", *ptr);
#endif
- (*spec->f_win_ef)(spec->f_win_fh, *ptr);
+ (*spec->f_win_ef)(spec->stream, &end_offset);
}
return NULL;
}
}
#endif
execAction (spec, lt->beginActionList, ptr, &ptr);
+
lexNode (spec, &ptr);
while (spec->d1_level)
{
tagDataRelease (spec);
(spec->d1_level)--;
}
+ /* return here if no 'end record' was issued and we're dealing
+ with non-first record in stream */
+ if (spec->stop_flag == 0 && offset)
+ return 0;
+
execAction (spec, lt->endActionList, ptr, &ptr);
return spec->d1_stack[0];
}
int res;
struct lexSpecs *specs = (struct lexSpecs *) p->clientData;
struct lexSpec **curLexSpec = &specs->spec;
+ off_t start_offset;
#if REGX_DEBUG
yaz_log (YLOG_LOG, "grs_read_regx");
}
}
(*curLexSpec)->dh = p->dh;
- if (!p->offset)
+ start_offset = p->stream->tellf(p->stream);
+ if (start_offset == 0)
{
(*curLexSpec)->f_win_start = 0;
(*curLexSpec)->f_win_end = 0;
- (*curLexSpec)->f_win_rf = p->readf;
- (*curLexSpec)->f_win_sf = p->seekf;
- (*curLexSpec)->f_win_fh = p->fh;
- (*curLexSpec)->f_win_ef = p->endf;
+ (*curLexSpec)->f_win_rf = p->stream->readf;
+ (*curLexSpec)->f_win_sf = p->stream->seekf;
+ (*curLexSpec)->stream = p->stream;
+ (*curLexSpec)->f_win_ef = p->stream->endf;
(*curLexSpec)->f_win_size = 500000;
}
(*curLexSpec)->m = p->mem;
- return lexRoot (*curLexSpec, p->offset, "main");
+ return lexRoot (*curLexSpec, start_offset, "main");
}
static int extract_regx(void *clientData, struct recExtractCtrl *ctrl)
int res;
struct lexSpecs *specs = (struct lexSpecs *) p->clientData;
struct lexSpec **curLexSpec = &specs->spec;
+ off_t start_offset;
#if REGX_DEBUG
yaz_log (YLOG_LOG, "grs_read_tcl");
}
}
(*curLexSpec)->dh = p->dh;
- if (!p->offset)
+ start_offset = p->stream->tellf(p->stream);
+ if (start_offset == 0)
{
(*curLexSpec)->f_win_start = 0;
(*curLexSpec)->f_win_end = 0;
- (*curLexSpec)->f_win_rf = p->readf;
- (*curLexSpec)->f_win_sf = p->seekf;
- (*curLexSpec)->f_win_fh = p->fh;
- (*curLexSpec)->f_win_ef = p->endf;
+ (*curLexSpec)->f_win_rf = p->stream->readf;
+ (*curLexSpec)->f_win_sf = p->stream->seekf;
+ (*curLexSpec)->stream = p->stream;
+ (*curLexSpec)->f_win_ef = p->stream->endf;
(*curLexSpec)->f_win_size = 500000;
}
(*curLexSpec)->m = p->mem;
- return lexRoot (*curLexSpec, p->offset, "main");
+ return lexRoot (*curLexSpec, start_offset, "main");
}
static int extract_tcl(void *clientData, struct recExtractCtrl *ctrl)