fixes from bruce: there are four, not three types of pattern that the

routine findworst should look for
This commit is contained in:
ceriel 1988-09-27 11:16:04 +00:00
parent 751854f36a
commit 391d115b4d
2 changed files with 23 additions and 3 deletions

View file

@ -5,6 +5,7 @@ COMPARE = $(EMHOME)/modules/compare
LINT = lint LINT = lint
BINDIR = $(EMHOME)/lib BINDIR = $(EMHOME)/lib
LIBOPT = libemopt.a LIBOPT = libemopt.a
LIBCEOPT = libemoptCE.a
# set HOWMUCH to head -20 to limit number of patterns used # set HOWMUCH to head -20 to limit number of patterns used
#HOWMUCH = head -20 #HOWMUCH = head -20
@ -26,7 +27,7 @@ CMD = '$(CC) -c $(CFLAGS)'
.SUFFIXES: .d .r .SUFFIXES: .d .r
.r.d: ; CMD=$(CMD); export CMD; awk -f makefuns.awk $*.r | sh .r.d: ; CMD=$(CMD); export CMD; awk -f makefuns.awk $*.r | sh -x
touch $@ touch $@
CSRC = main.c nopt.c mkstrct.c aux.c outputdfa.c outcalls.c\ CSRC = main.c nopt.c mkstrct.c aux.c outputdfa.c outcalls.c\
@ -100,6 +101,12 @@ $(LIBOPT): dfadummy $(NOFILES) mkstrct.o pseudo.d incalls.d
ar rc $(LIBOPT) O_*.o $(NOFILES) mkstrct.o ar rc $(LIBOPT) O_*.o $(NOFILES) mkstrct.o
-sh -c 'ranlib $(LIBOPT)' -sh -c 'ranlib $(LIBOPT)'
libCEopt.a:
make clean
make PREFLAGS='$(INCLDIR) -DPRIVATE=static -DCODE_EXPANDER' $(LIBOPT)
mv $(LIBOPT) libCEopt.a
make clean
dfadummy: patterns parser dfadummy: patterns parser
-/lib/cpp patterns | $(HOWMUCH) >/tmp/patts -/lib/cpp patterns | $(HOWMUCH) >/tmp/patts
parser </tmp/patts parser </tmp/patts

View file

@ -23,11 +23,14 @@ findworst(patt,repl)
/* and a goto to state 0. /* and a goto to state 0.
/* c) pattern of form: ri ri+1 ... rn pc ... pd /* c) pattern of form: ri ri+1 ... rn pc ... pd
/* i.e. a suffix of <repl> starts a pattern. /* i.e. a suffix of <repl> starts a pattern.
/* requires a backup of n-i+1 instructions and a goto to state 0. /* requires a backup of j-i+1 instructions and a goto to state 0.
/* d) pattern of the form: ri ri+1 ... rj
/* i.e. a substring of <repl> is a complete pattern
/* requires a backup of j-i+1 instructions and a goto to state 0.
*/ */
int n = repl.m_len; int n = repl.m_len;
int diff = patt.m_len - repl.m_len; int diff = patt.m_len - repl.m_len;
int first,i; int first,i,j;
int s; int s;
int mostbackups = 0; int mostbackups = 0;
if(n==0) { if(n==0) {
@ -56,6 +59,16 @@ findworst(patt,repl)
UPDATEWORST(n-i+1); UPDATEWORST(n-i+1);
} }
} }
/* look for case d */
for(i=2;i<=n;i++) {
for(j=n-1;j>i;j--) {
if((first=leftmatch(patterns[s],repl,i,j)) &&
(first==1)&&
(j-i+1 == patterns[s].m_len)) {
UPDATEWORST(n-i+1);
}
}
}
} }
fprintf(ofile,"\t\tOO_mkrepl(%d,%d,%d);\n",n,diff,mostbackups); fprintf(ofile,"\t\tOO_mkrepl(%d,%d,%d);\n",n,diff,mostbackups);
} }