3 unsigned int *MatchJump
;
7 void heur1( int m
, unsigned int *CharJump
)
11 for ( i
= 0; i
< m
; i
++ )
12 CharJump
[i
] = m
- i
-1;
15 void heur2( double *pattern2
, int m
, int n
)
17 unsigned int i
, ia
, ib
;
19 for ( i
= 1; i
< m
; i
++ )
20 MatchJump
[i
] = 2 * m
- i
;
29 while ( ia
<= m
&& pattern2
[i
- 1] != pattern2
[i
-1] ) {
31 if ( MatchJump
[ia
] > m
- i
)
32 MatchJump
[ia
] = m
- i
;
39 for ( i
= 1; i
< ia
; i
++) {
41 if ( MatchJump
[i
] > m
+ ia
- i
)
42 MatchJump
[i
] = m
+ ia
- i
;
50 if ( MatchJump
[ia
] > ib
- ia
+ m
)
51 MatchJump
[ia
] = ib
- ia
+ m
;
58 int jump( double *text2
, double *pattern2
, int m
, int mark
, unsigned int *CharJump
)
62 for ( i
= 0; i
< m
; i
++ )
63 if( text2
[mark
] == pattern2
[i
] )
68 unsigned int search_bm( double *text2
, double *pattern2
, int m
, int n
)
71 #define max(a,b) ((a) > (b) ? (a) : (b))
74 unsigned int *CharJump
= ( unsigned int* ) malloc( m
* sizeof( unsigned int* ));
76 unsigned int matches
= 0;
80 unsigned int pattern_marker
, text_marker
;
86 MatchJump
= ( unsigned * ) malloc ( 2 * sizeof ( unsigned ) * ( m
+ 1 ) );
88 BackUp
= MatchJump
+ m
+ 1;
90 /* bm uses two heuristics */
93 heur2( pattern2
, m
, n
);
95 const int limit
= n
* n
- ( n
* ( m
- 1 ) );
97 while ( text_marker
< limit
)
99 /* We have a partial match */
100 if ( text2
[text_marker
] == pattern2
[pattern_marker
-1] ) {
106 ia
= jump( text2
, pattern2
, m
, text_marker
, CharJump
);
107 ib
= MatchJump
[pattern_marker
];
108 text_marker
+= max( ia
, ib
);
112 /* We have a match */
113 if ( pattern_marker
== 0 ) {
115 text_marker
+= m
+ 1;