00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <stdlib.h>
00011
00012 #include "hi_util_hbm.h"
00013
00014
00015
00016
00017
00018
00019 #ifndef WIN32
00020 HBM_STRUCT * hbm_prepx(HBM_STRUCT *p, unsigned char * pat, int m)
00021 {
00022 int k;
00023
00024 if( !m ) return 0;
00025 if( !p ) return 0;
00026
00027
00028 p->P = pat;
00029
00030 p->M = m;
00031
00032
00033 for(k = 0; k < 256; k++) p->bcShift[k] = m;
00034 for(k = 0; k < m; k++) p->bcShift[pat[k]] = m - k - 1;
00035
00036 return p;
00037 }
00038 #endif
00039
00040
00041
00042
00043 #ifndef WIN32
00044 HBM_STRUCT * hbm_prep(unsigned char * pat, int m)
00045 {
00046 HBM_STRUCT *p;
00047
00048 p = (HBM_STRUCT*)malloc( sizeof(HBM_STRUCT) );
00049 if( !p ) return 0;
00050
00051 return hbm_prepx( p, pat, m );
00052 }
00053 #endif
00054
00055
00056
00057
00058
00059
00060
00061 unsigned char * hbm_match(HBM_STRUCT * px, unsigned char *text, int n)
00062 {
00063 unsigned char *pat, *t, *et, *q;
00064 int m1, k;
00065 short *bcShift;
00066
00067 m1 = px->M-1;
00068 pat = px->P;
00069 bcShift= px->bcShift;
00070
00071 t = text + m1;
00072 et = text + n;
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 while( t < et )
00086 {
00087
00088 do
00089 {
00090 t += bcShift[*t];
00091 if( t >= et )return 0;;
00092
00093 t += (k=bcShift[*t]);
00094 if( t >= et )return 0;
00095
00096 } while( k );
00097
00098
00099 k = m1;
00100 q = t - m1;
00101 while( k >= 4 )
00102 {
00103 if( pat[k] != q[k] )goto NoMatch; k--;
00104 if( pat[k] != q[k] )goto NoMatch; k--;
00105 if( pat[k] != q[k] )goto NoMatch; k--;
00106 if( pat[k] != q[k] )goto NoMatch; k--;
00107 }
00108
00109 while( k >= 0 )
00110 {
00111 if( pat[k] != q[k] )goto NoMatch; k--;
00112 }
00113
00114 return q;
00115
00116 NoMatch:
00117
00118
00119 t++;
00120 }
00121
00122 return 0;
00123 }
00124