/* Zz Dynamic Parser Library Copyright (C) 1989 - I.N.F.N - S.Cabasino, P.S.Paolucci, G.M.Todesco The Zz Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The Zz Library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "rule.h" struct s_l_node { struct s_l_node *next; int dot_n; struct s_dot **dots; int id,ref_count; }; #define MAX_N 100 static struct s_l_node *sets[MAX_N+1]; static int id=1000; /*----------------------------------------------------------------*/ struct s_l_node *lazy_search(dots,n) int n; struct s_dot *dots[]; { struct s_dot *dot; struct s_l_node **pnode,*node; int i,j,k; if(n>MAX_N) i = MAX_N; else i=n; pnode = &sets[i]; while(node= *pnode) { if(node->dot_n!=n) continue; for(j=0;jdots[k]!=dot;k++); if(k>=n) break; } if(j>=n) { node->ref_count++; return node; } else { pnode = &(node->next); } } node = (struct s_l_node *)malloc(sizeof(struct s_l_node)); node->next= *pnode; *pnode = node; node->dot_n=n; node->dots=(struct s_dot**)calloc(n,sizeof(struct s_dot *)); memcpy(node->dots,dots,n*sizeof(struct s_dot*)); node->id=id++; node->ref_count = 1; return node; } /*----------------------------------------------------------------*/ lazy_rec(dots,len) struct s_dot *dots[]; int len; { int i; struct s_l_node *node; node = lazy_search(dots,len); /* printf("--> set%d\n",node->id); */ } /*----------------------------------------------------------------*/ print_lazy_report() { struct s_l_node *node; int k,i,count,flag; printf("lazy report:\n"); flag= -1; for(i=0;iid,node->ref_count); node=node->next; } } i=MAX_N; if(sets[i]) { printf("(>%d dots)\n",i); node=sets[i]; while(node) { printf(" set%d (%d dots) (%d ref)\n", node->id,node->dot_n,node->ref_count); node=node->next; } } } static char sccsid[]="@(#)lazy.c 6.1\t9/7/94"; static char rcsid[] = "$Id: lazy.c,v 1.3 2002/01/11 11:52:02 brooks Exp $ ";