lib/ts_bm: add helper to reduce indentation and improve readability
authorJeremy Sowden <jeremy@azazel.net>
Tue, 20 Jun 2023 18:11:00 +0000 (19:11 +0100)
committerFlorian Westphal <fw@strlen.de>
Thu, 27 Jul 2023 11:45:51 +0000 (13:45 +0200)
The flow-control of `bm_find` is very deeply nested with a conditional
comparing a ternary expression against the pattern inside a for-loop
inside a while-loop inside a for-loop.

Move the inner for-loop into a helper function to reduce the amount of
indentation and make the code easier to read.

Fix indentation and trailing white-space in preceding debug logging
statement.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
Signed-off-by: Florian Westphal <fw@strlen.de>
lib/ts_bm.c

index c8ecbf74ef295d6ee9ba04a7faab8ec4c54fa3d9..e5f30f9177df96dce04ce7b0edc812f94f8f30f7 100644 (file)
@@ -55,6 +55,24 @@ struct ts_bm
        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);
@@ -72,19 +90,18 @@ static unsigned int bm_find(struct ts_config *conf, struct ts_state *state)
                        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]);