On 2023-06-20, at 19:09:25 +0100, Jeremy Sowden wrote: > 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. > > Signed-off-by: Jeremy Sowden <jeremy@xxxxxxxxxx> > --- > lib/ts_bm.c | 42 +++++++++++++++++++++++++++++------------- > 1 file changed, 29 insertions(+), 13 deletions(-) Sent the wrong version. Apologies. J. > diff --git a/lib/ts_bm.c b/lib/ts_bm.c > index 1f2234221dd1..d74fdb87d269 100644 > --- a/lib/ts_bm.c > +++ b/lib/ts_bm.c > @@ -55,6 +55,24 @@ struct ts_bm > unsigned int good_shift[]; > }; > > +static bool patmtch(const u8 *pattern, const u8 *text, unsigned int patlen, > + bool icase) > +{ > + unsigned int i; > + > + for (i = 0; i < patlen; i++) { > + u8 t = *(text-i); > + > + if (icase) > + t = toupper(t); > + > + if (t != *(pattern-i)) > + return false; > + } > + > + return true; > +} > + > static unsigned int bm_find(struct ts_config *conf, struct ts_state *state) > { > struct ts_bm *bm = ts_config_priv(conf); > @@ -70,19 +88,17 @@ 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]); > + > + if (patmtch(&bm->pattern[bm->patlen-1], &text[shift], > + bm->patlen, icase)) { > + /* 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]); > -- > 2.39.2 >
Attachment:
signature.asc
Description: PGP signature