unsigned int    good_shift[];
 };
 
+static unsigned int matchpat(const u8 *pattern, unsigned int patlen,
+                            const u8 *text, bool icase)
+{
+       unsigned int i;
+
+       for (i = 0; i < patlen; i++) {
+               u8 t = *(text-i);
+
+               if (icase)
+                       t = toupper(t);
+
+               if (t != *(pattern-i))
+                       break;
+       }
+
+       return i;
+}
+
 static unsigned int bm_find(struct ts_config *conf, struct ts_state *state)
 {
        struct ts_bm *bm = ts_config_priv(conf);
                        break;
 
                while (shift < text_len) {
-                       DEBUGP("Searching in position %d (%c)\n", 
-                               shift, text[shift]);
-                       for (i = 0; i < bm->patlen; i++) 
-                               if ((icase ? toupper(text[shift-i])
-                                   : text[shift-i])
-                                       != bm->pattern[bm->patlen-1-i])
-                                    goto next;
-
-                       /* London calling... */
-                       DEBUGP("found!\n");
-                       return consumed + (shift-(bm->patlen-1));
-
-next:                  bs = bm->bad_shift[text[shift-i]];
+                       DEBUGP("Searching in position %d (%c)\n",
+                              shift, text[shift]);
+
+                       i = matchpat(&bm->pattern[bm->patlen-1], bm->patlen,
+                                    &text[shift], icase);
+                       if (i == bm->patlen) {
+                               /* London calling... */
+                               DEBUGP("found!\n");
+                               return consumed + (shift-(bm->patlen-1));
+                       }
+
+                       bs = bm->bad_shift[text[shift-i]];
 
                        /* Now jumping to... */
                        shift = max_t(int, shift-i+bs, shift+bm->good_shift[i]);