From eb15a2b4b168b0b618c12834735774667cd3a9ef Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Thu, 15 Oct 1998 13:11:46 +0000 Subject: [PATCH] Added support for option -record for "end element". When specified end element will mark end-of-record when at outer-level. --- recctrl/regxread.c | 45 +++++++++++++++++++++++++++++---------------- tab/sgml.flt | 4 ++-- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/recctrl/regxread.c b/recctrl/regxread.c index 2b67424..0416b95 100644 --- a/recctrl/regxread.c +++ b/recctrl/regxread.c @@ -1,10 +1,14 @@ /* - * Copyright (C) 1994-1998, Index Data I/S + * Copyright (C) 1994-1998, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: regxread.c,v $ - * Revision 1.17 1998-07-01 10:13:51 adam + * Revision 1.18 1998-10-15 13:11:47 adam + * Added support for option -record for "end element". When specified + * end element will mark end-of-record when at outer-level. + * + * Revision 1.17 1998/07/01 10:13:51 adam * Minor fix. * * Revision 1.16 1998/06/30 15:15:09 adam @@ -904,13 +908,15 @@ static void tagBegin (struct lexSpec *spec, } static void tagEnd (struct lexSpec *spec, - data1_node **d1_stack, int *d1_level, + data1_node **d1_stack, int *d1_level, int min_level, const char *tag, int len) { tagStrip (&tag, &len); - while (*d1_level > 1) + while (*d1_level > min_level) { (*d1_level)--; + if (*d1_level == 0) + break; if ((d1_stack[*d1_level]->which == DATA1N_tag) && (!tag || (strlen(d1_stack[*d1_level]->u.tag.tag) == (size_t) len && @@ -1225,23 +1231,30 @@ static int execCode (struct lexSpec *spec, } else if (!strcmp (p, "element")) { - r = execTok (spec, &s, arg_no, arg_start, arg_end, - &cmd_str, &cmd_len); -#if 0 - if (*d1_level == 1) - { - *d1_level = 0; - returnCode = 0; - } -#endif + int min_level = 1; + while ((r = execTok (spec, &s, arg_no, arg_start, arg_end, + &cmd_str, &cmd_len)) == 3) + { + if (cmd_len==7 && !memcmp ("-record", cmd_str, cmd_len)) + min_level = 0; + } if (r > 2) { - tagEnd (spec, d1_stack, d1_level, cmd_str, cmd_len); + tagEnd (spec, d1_stack, d1_level, min_level, + cmd_str, cmd_len); r = execTok (spec, &s, arg_no, arg_start, arg_end, &cmd_str, &cmd_len); } else - tagEnd (spec, d1_stack, d1_level, NULL, 0); + tagEnd (spec, d1_stack, d1_level, min_level, NULL, 0); + if (*d1_level == 0) + { +#if REGX_DEBUG + logf (LOG_DEBUG, "end element end records"); +#endif + returnCode = 0; + } + } else if (!strcmp (p, "context")) { @@ -1293,7 +1306,7 @@ static int execCode (struct lexSpec *spec, &cmd_str, &cmd_len); } while (r > 1); if (element_str) - tagEnd (spec, d1_stack, d1_level, NULL, 0); + tagEnd (spec, d1_stack, d1_level, 1, NULL, 0); } else if (!strcmp (p, "unread")) { diff --git a/tab/sgml.flt b/tab/sgml.flt index 83ad5dd..43a9d02 100644 --- a/tab/sgml.flt +++ b/tab/sgml.flt @@ -1,8 +1,8 @@ -# $Id: sgml.flt,v 1.4 1997-11-06 11:41:01 adam Exp $ +# $Id: sgml.flt,v 1.5 1998-10-15 13:11:46 adam Exp $ BEGIN /\n*\n*/ { begin record $2 } /\n*<[Vv][Aa][Rr][ ]+/ /[^ >]+/ /[ ]+/ /[^ >]+/ /[ ]+/ /[^ >]+/ /[ ]*>/ { begin variant $1 $3 $5 } /\n*\n*/ { begin element $1 } -/\n*<\// BODY />\n*/ { end element } +/\n*<\// BODY />\n*/ { end element -record } /[ \n\t]+/ { data " " } -- 1.7.10.4