summaryrefslogtreecommitdiff
path: root/ext/standard/levenshtein.c
diff options
context:
space:
mode:
authorHartmut Holzgraefe <hholzgra@php.net>2002-04-07 19:46:45 +0000
committerHartmut Holzgraefe <hholzgra@php.net>2002-04-07 19:46:45 +0000
commit954dbb2d3554080dbfe84c4c6f7ee2017c48807e (patch)
tree8d99e222041e5bf2e3111f54dfdfcdc0bca7f757 /ext/standard/levenshtein.c
parent6303972256ca0b5c296dc3fbafd7da85fbf92885 (diff)
downloadphp-git-954dbb2d3554080dbfe84c4c6f7ee2017c48807e.tar.gz
fix and regression test for Bug #16473
Diffstat (limited to 'ext/standard/levenshtein.c')
-rw-r--r--ext/standard/levenshtein.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/ext/standard/levenshtein.c b/ext/standard/levenshtein.c
index 47a8de7540..f5c23687cf 100644
--- a/ext/standard/levenshtein.c
+++ b/ext/standard/levenshtein.c
@@ -40,33 +40,31 @@ static int reference_levdist(const char *s1, int l1,
if((l1>LEVENSHTEIN_MAX_LENTH)||(l2>LEVENSHTEIN_MAX_LENTH))
return -1;
- if(!(p1=emalloc(l2*sizeof(int)))) {
+ if(!(p1=emalloc((l2+1)*sizeof(int)))) {
return -2;
}
- if(!(p2=emalloc(l2*sizeof(int)))) {
+ if(!(p2=emalloc((l2+1)*sizeof(int)))) {
free(p1);
return -2;
}
- p1[0]=(s1[0]==s2[0])?0:cost_rep;
+ for(i2=0;i2<=l2;i2++)
+ p1[i2] = i2*cost_ins;
- for(i2=1;i2<l2;i2++)
- p1[i2]=i2*cost_ins;
-
- for(i1=1;i1<l1;i1++)
+ for(i1=0;i1<l1;i1++)
{
- p2[0]=i1*cost_del;
- for(i2=1;i2<l2;i2++)
+ p2[0]=p1[0]+cost_del;
+ for(i2=0;i2<l2;i2++)
{
- c0=p1[i2-1]+((s1[i1]==s2[i2])?0:cost_rep);
- c1=p1[i2]+cost_del; if(c1<c0) c0=c1;
- c2=p2[i2-1]+cost_ins; if(c2<c0) c0=c2;
- p2[i2]=c0;
+ c0=p1[i2]+((s1[i1]==s2[i2])?0:cost_rep);
+ c1=p1[i2+1]+cost_del; if(c1<c0) c0=c1;
+ c2=p2[i2]+cost_ins; if(c2<c0) c0=c2;
+ p2[i2+1]=c0;
}
tmp=p1; p1=p2; p2=tmp;
}
- c0=p1[l2-1];
+ c0=p1[l2];
efree(p1);
efree(p2);