#include "searchstr.h" static int eq(const unsigned char *s1, const unsigned char *s2, int n, const char *eqv) { for (;n>0;n--) if (eqv[*s1++] != eqv[*s2++]) return(0); return(1); } void searchstr_maketbl(unsigned char (*tbl)[256], const unsigned char *str, unsigned int len, const unsigned char equiv[256]) { const unsigned char *str1; int i; int j; int k; int l; if (len < 1) return; str1 = str + 1; for (i=len-1;i>=0;i--) { l = len - 1 - i; for (j=255;j>=0;j--) { for (k=i;k>=0;k--) { if ((equiv[str[k]] == equiv[j]) && ((l == 0) || (k == i) || eq(str1+k,str1+i,l,equiv))) { tbl[i][j] = i - k; break; } } if (k < 0) { for (k=0;k= l) tbl[i][j] = len; } } } } int searchstr(const unsigned char *str, unsigned int len, unsigned char (*tbl)[256], unsigned int tbllen) { unsigned int strpos; unsigned int stridx; unsigned int stroff; unsigned int adv; strpos = 0; while (1) { stroff = tbllen - 1; stridx = strpos + stroff; if (stridx >= len) return(-1); while (1) { adv = tbl[stroff][str[stridx]]; if (adv == 0) { if (stroff == 0) { return(stridx); } stroff --; stridx --; } else { strpos += adv; break; } } } }