X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Fregxread.c;h=f56738d21d8bbe7f2fb6c4adea3fe9d9387cec84;hb=291f3ed7fc3e5d55e7993ae4e5c19e0bb0158d3d;hp=945c7055264b0d9b851fdf888a63c6d5c26dabcc;hpb=3f1ccb1a5d47e99a07c4236f149f199dfebd21d0;p=idzebra-moved-to-github.git diff --git a/recctrl/regxread.c b/recctrl/regxread.c index 945c705..f56738d 100644 --- a/recctrl/regxread.c +++ b/recctrl/regxread.c @@ -1,9 +1,26 @@ -/* - * Copyright (C) 1994-2002, Index Data - * All rights reserved. - * - * $Id: regxread.c,v 1.39 2002-04-15 09:07:10 adam Exp $ - */ +/* $Id: regxread.c,v 1.46 2002-09-24 19:41:00 adam Exp $ + Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 + Index Data Aps + +This file is part of the Zebra server. + +Zebra is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +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. +*/ + + #include #include #include @@ -672,28 +689,14 @@ static void execData (struct lexSpec *spec, { org_len = 0; - res = data1_mk_node (spec->dh, spec->m); - res->parent = parent; - res->which = DATA1N_data; + res = data1_mk_node2 (spec->dh, spec->m, DATA1N_data, parent); res->u.data.what = DATA1I_text; res->u.data.len = 0; res->u.data.formatted_text = formatted_text; -#if 0 - if (elen > DATA1_LOCALDATA) - res->u.data.data = nmem_malloc (spec->m, elen); - else - res->u.data.data = res->lbuf; - memcpy (res->u.data.data, ebuf, elen); -#else res->u.data.data = 0; -#endif - res->root = parent->root; - parent->last_child = res; if (spec->d1_stack[spec->d1_level]) spec->d1_stack[spec->d1_level]->next = res; - else - parent->child = res; spec->d1_stack[spec->d1_level] = res; } if (org_len + elen >= spec->concatBuf[spec->d1_level].max) @@ -776,21 +779,9 @@ static void variantBegin (struct lexSpec *spec, if (parent->which != DATA1N_variant) { - res = data1_mk_node (spec->dh, spec->m); - res->parent = parent; - res->which = DATA1N_variant; - res->u.variant.type = 0; - res->u.variant.value = 0; - res->root = parent->root; - - parent->last_child = res; + res = data1_mk_node2 (spec->dh, spec->m, DATA1N_variant, parent); if (spec->d1_stack[spec->d1_level]) - { tagDataRelease (spec); - spec->d1_stack[spec->d1_level]->next = res; - } - else - parent->child = res; spec->d1_stack[spec->d1_level] = res; spec->d1_stack[++(spec->d1_level)] = NULL; } @@ -805,10 +796,7 @@ static void variantBegin (struct lexSpec *spec, logf (LOG_LOG, "variant node (%d)", spec->d1_level); #endif parent = spec->d1_stack[spec->d1_level-1]; - res = data1_mk_node (spec->dh, spec->m); - res->parent = parent; - res->which = DATA1N_variant; - res->root = parent->root; + res = data1_mk_node2 (spec->dh, spec->m, DATA1N_variant, parent); res->u.variant.type = tp; if (value_len >= DATA1_LOCALDATA) @@ -818,14 +806,8 @@ static void variantBegin (struct lexSpec *spec, res->u.variant.value = res->lbuf; - parent->last_child = res; if (spec->d1_stack[spec->d1_level]) - { tagDataRelease (spec); - spec->d1_stack[spec->d1_level]->next = res; - } - else - parent->child = res; spec->d1_stack[spec->d1_level] = res; spec->d1_stack[++(spec->d1_level)] = NULL; } @@ -846,58 +828,21 @@ static void tagStrip (const char **tag, int *len) static void tagBegin (struct lexSpec *spec, const char *tag, int len) { - struct data1_node *parent; - data1_element *elem = NULL; - data1_node *partag; - data1_node *res; - data1_element *e = NULL; - int localtag = 0; - if (spec->d1_level == 0) { logf (LOG_WARN, "in element begin. No record type defined"); return ; } tagStrip (&tag, &len); + if (spec->d1_stack[spec->d1_level]) + tagDataRelease (spec); - parent = spec->d1_stack[spec->d1_level -1]; - partag = get_parent_tag(spec->dh, parent); - - res = data1_mk_node_type (spec->dh, spec->m, DATA1N_tag); - res->parent = parent; - - if (len >= DATA1_LOCALDATA) - res->u.tag.tag = (char *) nmem_malloc (spec->m, len+1); - else - res->u.tag.tag = res->lbuf; - - memcpy (res->u.tag.tag, tag, len); - res->u.tag.tag[len] = '\0'; - #if REGX_DEBUG - logf (LOG_LOG, "begin tag %s (%d)", res->u.tag.tag, spec->d1_level); + logf (LOG_LOG, "begin tag %s (%d)", tag, spec->d1_level); #endif - if (parent->which == DATA1N_variant) - return ; - if (partag) - if (!(e = partag->u.tag.element)) - localtag = 1; - - elem = data1_getelementbytagname (spec->dh, - spec->d1_stack[0]->u.root.absyn, - e, res->u.tag.tag); - res->u.tag.element = elem; - res->root = parent->root; - parent->last_child = res; - if (spec->d1_stack[spec->d1_level]) - { - tagDataRelease (spec); - spec->d1_stack[spec->d1_level]->next = res; - } - else - parent->child = res; - spec->d1_stack[spec->d1_level] = res; + spec->d1_stack[spec->d1_level] = data1_mk_tag_n ( + spec->dh, spec->m, tag, len, 0, spec->d1_stack[spec->d1_level -1]); spec->d1_stack[++(spec->d1_level)] = NULL; } @@ -1074,23 +1019,20 @@ static int cmd_tcl_begin (ClientData clientData, Tcl_Interp *interp, if (!strcmp(argv[1], "record") && argc == 3) { char *absynName = argv[2]; - data1_absyn *absyn; data1_node *res; #if REGX_DEBUG logf (LOG_LOG, "begin record %s", absynName); #endif - absyn = data1_get_absyn (spec->dh, absynName); - - res = data1_mk_node (spec->dh, spec->m); - res->which = DATA1N_root; - res->u.root.type = - data1_insert_string(spec->dh, res, spec->m, absynName); - res->u.root.absyn = absyn; - res->root = res; + res = data1_mk_root (spec->dh, spec->m, absynName); - spec->d1_stack[spec->d1_level] = res; - spec->d1_stack[++(spec->d1_level)] = NULL; + spec->d1_stack[spec->d1_level++] = res; + + res = data1_mk_tag (spec->dh, spec->m, absynName, 0, res); + + spec->d1_stack[spec->d1_level++] = res; + + spec->d1_stack[spec->d1_level] = NULL; } else if (!strcmp(argv[1], "element") && argc == 3) { @@ -1322,27 +1264,24 @@ static void execCode (struct lexSpec *spec, struct regxCode *code) if (spec->d1_level == 0) { static char absynName[64]; - data1_absyn *absyn; data1_node *res; if (cmd_len > 63) cmd_len = 63; memcpy (absynName, cmd_str, cmd_len); absynName[cmd_len] = '\0'; - #if REGX_DEBUG logf (LOG_LOG, "begin record %s", absynName); #endif - absyn = data1_get_absyn (spec->dh, absynName); - - res = data1_mk_node (spec->dh, spec->m); - res->which = DATA1N_root; - res->u.root.type = absynName; - res->u.root.absyn = absyn; - res->root = res; + res = data1_mk_root (spec->dh, spec->m, absynName); - spec->d1_stack[spec->d1_level] = res; - spec->d1_stack[++(spec->d1_level)] = NULL; + spec->d1_stack[spec->d1_level++] = res; + + res = data1_mk_tag (spec->dh, spec->m, absynName, 0, res); + + spec->d1_stack[spec->d1_level++] = res; + + spec->d1_stack[spec->d1_level] = NULL; } r = execTok (spec, &s, &cmd_str, &cmd_len); }