suricata
util-spm.c
Go to the documentation of this file.
1 /* Copyright (C) 2007-2022 Open Information Security Foundation
2  *
3  * You can copy, redistribute or modify this Program under the terms of
4  * the GNU General Public License version 2 as published by the Free
5  * Software Foundation.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * version 2 along with this program; if not, write to the Free Software
14  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15  * 02110-1301, USA.
16  */
17 
18 /**
19  * \file
20  *
21  * \author Pablo Rincon Crespo <pablo.rincon.crespo@gmail.com>
22  *
23  * PR (17/01/2010): Single pattern search algorithms:
24  * Currently there are 3 algorithms to choose: BasicSearch, Bs2Bm and
25  * BoyerMoore (Boyer Moores algorithm). The first one doesn't need a context.
26  * But for Bs2Bm and BoyerMoore, you'll need to build some arrays.
27  *
28  * !! If you are going to use the same pattern multiple times,
29  * please, try to store the context some where. For Bs2Bm, the
30  * context is an array of "badchars". For BoyerMoore you need to store
31  * two arrays of shifts. Have a look at the wrappers and unittests
32  * for examples of this. If you cant store the context, use the
33  * wrappers: Bs2bmSearch, BoyerMooreSearch, and the ones caseless, or BasicSearch
34  * That is the most basic.
35  *
36  * Use the stats and util-clock.h to determine which one fit better for you
37  * Boyer Moore should be used for patterns greater than 1 of length
38  * In the range of 2 - 6, if the text length is greater than 1000 you could
39  * use boyer moore, otherwise, basic search. If the pattern is greater
40  * than 6 and the textlen is greater than 500, use boyer moore.
41  * This is an aproximation, but use the stats and util-clock to determine which one
42  * fit better for your case.
43  *
44  */
45 
46 #include "suricata-common.h"
47 #include "util-unittest.h"
48 
49 #include "conf.h"
50 
51 #include "util-spm.h"
52 #include "util-spm-bs.h"
53 #include "util-spm-bs2bm.h"
54 #include "util-spm-bm.h"
55 #include "util-spm-hs.h"
56 #include "util-clock.h"
57 #ifdef BUILD_HYPERSCAN
58 #include "hs.h"
59 #endif
60 #include "util-debug.h"
61 
63 
64 /**
65  * \brief Returns the single pattern matcher algorithm to be used, based on the
66  * spm-algo setting in yaml.
67  */
69 {
70  const char *spm_algo;
71  if ((ConfGet("spm-algo", &spm_algo)) == 1) {
72  if (spm_algo != NULL) {
73  if (strcmp("auto", spm_algo) == 0) {
74  goto default_matcher;
75  }
76  for (uint8_t i = 0; i < SPM_TABLE_SIZE; i++) {
77  if (spm_table[i].name == NULL) {
78  continue;
79  }
80  if (strcmp(spm_table[i].name, spm_algo) == 0) {
81  return i;
82  }
83  }
84  }
85 
86 #ifndef BUILD_HYPERSCAN
87  if ((spm_algo != NULL) && (strcmp(spm_algo, "hs") == 0)) {
88  FatalError("Hyperscan (hs) support for spm-algo is "
89  "not compiled into Suricata.");
90  }
91 #endif
92  SCLogError("Invalid spm algo supplied "
93  "in the yaml conf file: \"%s\"",
94  spm_algo);
95  exit(EXIT_FAILURE);
96  }
97 
98 default_matcher:
99  /* When Suricata is built with Hyperscan support, default to using it for
100  * SPM. */
101 #ifdef BUILD_HYPERSCAN
102  #ifdef HAVE_HS_VALID_PLATFORM
103  /* Enable runtime check for SSSE3. Do not use Hyperscan SPM matcher if
104  * check is not successful. */
105  if (hs_valid_platform() != HS_SUCCESS) {
106  SCLogInfo("SSSE3 support not detected, disabling Hyperscan for "
107  "SPM");
108  /* Use Boyer-Moore as fallback. */
109  return SPM_BM;
110  } else {
111  return SPM_HS;
112  }
113  #else
114  return SPM_HS;
115  #endif
116 #else
117  /* Otherwise, default to Boyer-Moore */
118  return SPM_BM;
119 #endif
120 }
121 
122 void SpmTableSetup(void)
123 {
124  memset(spm_table, 0, sizeof(spm_table));
125 
126  SpmBMRegister();
127 #ifdef BUILD_HYPERSCAN
128  #ifdef HAVE_HS_VALID_PLATFORM
129  if (hs_valid_platform() == HS_SUCCESS) {
130  SpmHSRegister();
131  }
132  #else
133  SpmHSRegister();
134  #endif
135 #endif
136 }
137 
139 {
140  BUG_ON(spm_table[matcher].InitGlobalThreadCtx == NULL);
141  return spm_table[matcher].InitGlobalThreadCtx();
142 }
143 
145 {
146  if (global_thread_ctx == NULL) {
147  return;
148  }
149  uint8_t matcher = global_thread_ctx->matcher;
150  spm_table[matcher].DestroyGlobalThreadCtx(global_thread_ctx);
151 }
152 
154 {
155  if (global_thread_ctx == NULL) {
156  return NULL;
157  }
158  uint8_t matcher = global_thread_ctx->matcher;
159  BUG_ON(spm_table[matcher].MakeThreadCtx == NULL);
160  return spm_table[matcher].MakeThreadCtx(global_thread_ctx);
161 }
162 
164 {
165  if (thread_ctx == NULL) {
166  return;
167  }
168  uint8_t matcher = thread_ctx->matcher;
169  BUG_ON(spm_table[matcher].DestroyThreadCtx == NULL);
170  spm_table[matcher].DestroyThreadCtx(thread_ctx);
171 }
172 
173 SpmCtx *SpmInitCtx(const uint8_t *needle, uint16_t needle_len, int nocase,
174  SpmGlobalThreadCtx *global_thread_ctx)
175 {
176  BUG_ON(global_thread_ctx == NULL);
177  uint8_t matcher = global_thread_ctx->matcher;
178  BUG_ON(spm_table[matcher].InitCtx == NULL);
179  return spm_table[matcher].InitCtx(needle, needle_len, nocase,
180  global_thread_ctx);
181 }
182 
184 {
185  if (ctx == NULL) {
186  return;
187  }
188  uint8_t matcher = ctx->matcher;
189  BUG_ON(spm_table[matcher].DestroyCtx == NULL);
190  spm_table[matcher].DestroyCtx(ctx);
191 }
192 
193 uint8_t *SpmScan(const SpmCtx *ctx, SpmThreadCtx *thread_ctx,
194  const uint8_t *haystack, uint32_t haystack_len)
195 {
196  uint8_t matcher = ctx->matcher;
197  return spm_table[matcher].Scan(ctx, thread_ctx, haystack, haystack_len);
198 }
199 
200 /**
201  * Wrappers for building context and searching (Bs2Bm and boyermoore)
202  * Use them if you cant store the context
203  *
204  */
205 
206 /**
207  * \brief Search a pattern in the text using the Bs2Bm algorithm (build a bad characters array)
208  *
209  * \param text Text to search in
210  * \param textlen length of the text
211  * \param needle pattern to search for
212  * \param needlelen length of the pattern
213  */
214 uint8_t *Bs2bmSearch(const uint8_t *text, uint32_t textlen,
215  const uint8_t *needle, uint16_t needlelen)
216 {
217  uint8_t badchars[ALPHABET_SIZE];
218  Bs2BmBadchars(needle, needlelen, badchars);
219 
220  return Bs2Bm(text, textlen, needle, needlelen, badchars);
221 }
222 
223 /**
224  * \brief Search a pattern in the text using Boyer Moore algorithm
225  * (build a bad character shifts array and good prefixes shift array)
226  *
227  * \param text Text to search in
228  * \param textlen length of the text
229  * \param needle pattern to search for
230  * \param needlelen length of the pattern
231  */
232 uint8_t *BoyerMooreSearch(const uint8_t *text, uint32_t textlen,
233  const uint8_t *needle, uint16_t needlelen)
234 {
235  BmCtx *bm_ctx = BoyerMooreCtxInit(needle, needlelen);
236 
237  uint8_t *ret = BoyerMoore(needle, needlelen, text, textlen, bm_ctx);
238  BoyerMooreCtxDeInit(bm_ctx);
239 
240  return ret;
241 }
242 
243 /**
244  * \brief Search a pattern in the text using Boyer Moore nocase algorithm
245  * (build a bad character shifts array and good prefixes shift array)
246  *
247  * \param text Text to search in
248  * \param textlen length of the text
249  * \param needle pattern to search for
250  * \param needlelen length of the pattern
251  */
252 uint8_t *BoyerMooreNocaseSearch(const uint8_t *text, uint32_t textlen,
253  uint8_t *needle, uint16_t needlelen)
254 {
255  BmCtx *bm_ctx = BoyerMooreNocaseCtxInit(needle, needlelen);
256 
257  uint8_t *ret = BoyerMooreNocase(needle, needlelen, text, textlen, bm_ctx);
258  BoyerMooreCtxDeInit(bm_ctx);
259 
260  return ret;
261 }
262 
263 
264 #ifdef UNITTESTS
265 
266 /** Comment out this if you want stats
267  * #define ENABLE_SEARCH_STATS 1
268  */
269 
270 /**
271  * \brief Unittest helper function wrappers for the search algorithms
272  * \param text pointer to the buffer to search in
273  * \param needle pointer to the pattern to search for
274  * \param times If you are testing performance, se the numebr of times
275  * that you want to repeat the search
276  */
277 static uint8_t *BasicSearchWrapper(uint8_t *text, uint8_t *needle, int times)
278 {
279  uint32_t textlen = strlen((char *)text);
280  uint16_t needlelen = (uint16_t)strlen((char *)needle);
281 
282  uint8_t *ret = NULL;
283  int i = 0;
284 
285  CLOCK_INIT;
286  if (times > 1)
287  CLOCK_START;
288 
289  for (i = 0; i < times; i++) {
290  ret = BasicSearch(text, textlen, needle, needlelen);
291  }
292 
293  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
294  return ret;
295 }
296 
297 static uint8_t *BasicSearchNocaseWrapper(uint8_t *text, uint8_t *needle, int times)
298 {
299  uint32_t textlen = strlen((char *)text);
300  uint16_t needlelen = (uint16_t)strlen((char *)needle);
301 
302  uint8_t *ret = NULL;
303  int i = 0;
304 
305  CLOCK_INIT;
306  if (times > 1) CLOCK_START;
307  for (i = 0; i < times; i++) {
308  ret = BasicSearchNocase(text, textlen, needle, needlelen);
309  }
310  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
311  return ret;
312 }
313 
314 static uint8_t *Bs2bmWrapper(uint8_t *text, uint8_t *needle, int times)
315 {
316  uint32_t textlen = strlen((char *)text);
317  uint16_t needlelen = (uint16_t)strlen((char *)needle);
318 
319  uint8_t badchars[ALPHABET_SIZE];
320  Bs2BmBadchars(needle, needlelen, badchars);
321 
322  uint8_t *ret = NULL;
323  int i = 0;
324 
325  CLOCK_INIT;
326  if (times > 1) CLOCK_START;
327  for (i = 0; i < times; i++) {
328  ret = Bs2Bm(text, textlen, needle, needlelen, badchars);
329  }
330  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
331  return ret;
332 }
333 
334 static uint8_t *Bs2bmNocaseWrapper(uint8_t *text, uint8_t *needle, int times)
335 {
336  uint32_t textlen = strlen((char *)text);
337  uint16_t needlelen = (uint16_t)strlen((char *)needle);
338 
339  uint8_t badchars[ALPHABET_SIZE];
340  Bs2BmBadchars(needle, needlelen, badchars);
341 
342  uint8_t *ret = NULL;
343  int i = 0;
344 
345  CLOCK_INIT;
346  if (times > 1) CLOCK_START;
347  for (i = 0; i < times; i++) {
348  ret = Bs2BmNocase(text, textlen, needle, needlelen, badchars);
349  }
350  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
351  return ret;
352 }
353 
354 static uint8_t *BoyerMooreWrapper(uint8_t *text, uint8_t *needle, int times)
355 {
356  uint32_t textlen = strlen((char *)text);
357  uint16_t needlelen = (uint16_t)strlen((char *)needle);
358 
359  BmCtx *bm_ctx = BoyerMooreCtxInit(needle, needlelen);
360 
361  uint8_t *ret = NULL;
362  int i = 0;
363 
364  CLOCK_INIT;
365  if (times > 1) CLOCK_START;
366  for (i = 0; i < times; i++) {
367  ret = BoyerMoore(needle, needlelen, text, textlen, bm_ctx);
368  }
369  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
370  BoyerMooreCtxDeInit(bm_ctx);
371  return ret;
372 }
373 
374 static uint8_t *BoyerMooreNocaseWrapper(uint8_t *text, uint8_t *in_needle, int times)
375 {
376  uint32_t textlen = strlen((char *)text);
377  uint16_t needlelen = (uint16_t)strlen((char *)in_needle);
378 
379  /* Make a copy of in_needle to be able to convert it to lowercase. */
380  uint8_t *needle = SCMalloc(needlelen);
381  if (needle == NULL)
382  return NULL;
383  memcpy(needle, in_needle, needlelen);
384 
385  BmCtx *bm_ctx = BoyerMooreNocaseCtxInit(needle, needlelen);
386 
387  uint8_t *ret = NULL;
388  int i = 0;
389 
390  CLOCK_INIT;
391  if (times > 1) CLOCK_START;
392  for (i = 0; i < times; i++) {
393  ret = BoyerMooreNocase(needle, needlelen, text, textlen, bm_ctx);
394  }
395  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
396  BoyerMooreCtxDeInit(bm_ctx);
397  free(needle);
398  return ret;
399 
400 }
401 
402 #ifdef ENABLE_SEARCH_STATS
403 /* Number of times to repeat the search (for stats) */
404 #define STATS_TIMES 1000000
405 
406 /**
407  * \brief Unittest helper function wrappers for the search algorithms
408  * \param text pointer to the buffer to search in
409  * \param needle pointer to the pattern to search for
410  * \param times If you are testing performance, se the numebr of times
411  * that you want to repeat the search
412  */
413 static uint8_t *BasicSearchCtxWrapper(uint8_t *text, uint8_t *needle, int times)
414 {
415  uint32_t textlen = strlen((char *)text);
416  uint16_t needlelen = strlen((char *)needle);
417 
418  uint8_t *ret = NULL;
419  int i = 0;
420 
421  CLOCK_INIT;
422  if (times > 1) CLOCK_START;
423  for (i = 0; i < times; i++) {
424  /* This wrapper is a fake, no context needed! */
425  ret = BasicSearch(text, textlen, needle, needlelen);
426  }
427  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
428  return ret;
429 }
430 
431 static uint8_t *BasicSearchNocaseCtxWrapper(uint8_t *text, uint8_t *needle, int times)
432 {
433  uint32_t textlen = strlen((char *)text);
434  uint16_t needlelen = strlen((char *)needle);
435 
436  uint8_t *ret = NULL;
437  int i = 0;
438 
439  CLOCK_INIT;
440  if (times > 1) CLOCK_START;
441  for (i = 0; i < times; i++) {
442  /* This wrapper is a fake, no context needed! */
443  ret = BasicSearchNocase(text, textlen, needle, needlelen);
444  }
445  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
446  return ret;
447 }
448 
449 static uint8_t *Bs2bmCtxWrapper(uint8_t *text, uint8_t *needle, int times)
450 {
451  uint32_t textlen = strlen((char *)text);
452  uint16_t needlelen = strlen((char *)needle);
453 
454  uint8_t badchars[ALPHABET_SIZE];
455 
456  uint8_t *ret = NULL;
457  int i = 0;
458 
459  CLOCK_INIT;
460  if (times > 1) CLOCK_START;
461  for (i = 0; i < times; i++) {
462  /* Stats including context building */
463  Bs2BmBadchars(needle, needlelen, badchars);
464  ret = Bs2Bm(text, textlen, needle, needlelen, badchars);
465  }
466  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
467  return ret;
468 }
469 
470 static uint8_t *Bs2bmNocaseCtxWrapper(uint8_t *text, uint8_t *needle, int times)
471 {
472  uint32_t textlen = strlen((char *)text);
473  uint16_t needlelen = strlen((char *)needle);
474 
475  uint8_t badchars[ALPHABET_SIZE];
476 
477  uint8_t *ret = NULL;
478  int i = 0;
479 
480  CLOCK_INIT;
481  if (times > 1) CLOCK_START;
482  for (i = 0; i < times; i++) {
483  /* Stats including context building */
484  Bs2BmBadchars(needle, needlelen, badchars);
485  ret = Bs2BmNocase(text, textlen, needle, needlelen, badchars);
486  }
487  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
488  return ret;
489 }
490 
491 static uint8_t *BoyerMooreCtxWrapper(uint8_t *text, uint8_t *needle, int times)
492 {
493  uint32_t textlen = strlen((char *)text);
494  uint16_t needlelen = strlen((char *)needle);
495 
496  BmCtx *bm_ctx = BoyerMooreCtxInit(needle, needlelen);
497 
498  uint8_t *ret = NULL;
499  int i = 0;
500 
501  CLOCK_INIT;
502  if (times > 1) CLOCK_START;
503  for (i = 0; i < times; i++) {
504  /* Stats including context building */
505  ret = BoyerMoore(needle, needlelen, text, textlen, bm_ctx);
506  }
507  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
508  BoyerMooreCtxDeInit(bm_ctx);
509 
510  return ret;
511 }
512 
513 static uint8_t *RawCtxWrapper(uint8_t *text, uint8_t *needle, int times)
514 {
515  uint32_t textlen = strlen((char *)text);
516  uint16_t needlelen = strlen((char *)needle);
517 
518  uint8_t *ret = NULL;
519  int i = 0;
520 
521  CLOCK_INIT;
522  if (times > 1) CLOCK_START;
523  for (i = 0; i < times; i++) {
524  ret = SpmSearch(text, textlen, needle, needlelen);
525  }
526  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
527  return ret;
528 }
529 
530 static uint8_t *BoyerMooreNocaseCtxWrapper(uint8_t *text, uint8_t *in_needle, int times)
531 {
532  uint32_t textlen = strlen((char *)text);
533  uint16_t needlelen = strlen((char *)in_needle);
534 
535  /* Make a copy of in_needle to be able to convert it to lowercase. */
536  uint8_t *needle = SCMalloc(needlelen);
537  if (needle == NULL)
538  return NULL;
539  memcpy(needle, in_needle, needlelen);
540 
541  BmCtx *bm_ctx = BoyerMooreNocaseCtxInit(needle, needlelen);
542 
543  uint8_t *ret = NULL;
544  int i = 0;
545 
546  CLOCK_INIT;
547  if (times > 1) CLOCK_START;
548  for (i = 0; i < times; i++) {
549  ret = BoyerMooreNocase(needle, needlelen, text, textlen, bm_ctx);
550  }
551  if (times > 1) { CLOCK_END; CLOCK_PRINT_SEC; };
552  BoyerMooreCtxDeInit(bm_ctx);
553  free(needle);
554  return ret;
555 
556 }
557 #endif
558 
559 /**
560  * \test Generic test for BasicSearch matching
561  */
562 static int UtilSpmBasicSearchTest01(void)
563 {
564  uint8_t *needle = (uint8_t *)"oPqRsT";
565  uint8_t *text = (uint8_t *)"aBcDeFgHiJkLmNoPqRsTuVwXyZ";
566  uint8_t *found = BasicSearchWrapper(text, needle, 1);
567  //printf("found: %s\n", found);
568  if (found != NULL)
569  return 1;
570  else
571  return 0;
572 }
573 
574 /**
575  * \test Generic test for BasicSearch nocase matching
576  */
577 static int UtilSpmBasicSearchNocaseTest01(void)
578 {
579  uint8_t *needle = (uint8_t *)"OpQrSt";
580  uint8_t *text = (uint8_t *)"aBcDeFgHiJkLmNoPqRsTuVwXyZ";
581  uint8_t *found = BasicSearchNocaseWrapper(text, needle, 1);
582  //printf("found: %s\n", found);
583  if (found != NULL)
584  return 1;
585  else
586  return 0;
587 }
588 
589 /**
590  * \test Generic test for Bs2Bm matching
591  */
592 static int UtilSpmBs2bmSearchTest01(void)
593 {
594  uint8_t *needle = (uint8_t *)"oPqRsT";
595  uint8_t *text = (uint8_t *)"aBcDeFgHiJkLmNoPqRsTuVwXyZ";
596  uint8_t *found = Bs2bmWrapper(text, needle, 1);
597  //printf("found: %s\n", found);
598  if (found != NULL)
599  return 1;
600  else
601  return 0;
602 }
603 
604 /**
605  * \test Generic test for Bs2Bm no case matching
606  */
607 static int UtilSpmBs2bmSearchNocaseTest01(void)
608 {
609  uint8_t *needle = (uint8_t *)"OpQrSt";
610  uint8_t *text = (uint8_t *)"aBcDeFgHiJkLmNoPqRsTuVwXyZ";
611  uint8_t *found = Bs2bmNocaseWrapper(text, needle, 1);
612  //printf("found: %s\n", found);
613  if (found != NULL)
614  return 1;
615  else
616  return 0;
617 }
618 
619 /**
620  * \test Generic test for boyer moore matching
621  */
622 static int UtilSpmBoyerMooreSearchTest01(void)
623 {
624  uint8_t *needle = (uint8_t *)"oPqRsT";
625  uint8_t *text = (uint8_t *)"aBcDeFgHiJkLmNoPqRsTuVwXyZ";
626  uint8_t *found = BoyerMooreWrapper(text, needle, 1);
627  //printf("found: %s\n", found);
628  if (found != NULL)
629  return 1;
630  else
631  return 0;
632 }
633 
634 /**
635  * \test Generic test for boyer moore nocase matching
636  */
637 static int UtilSpmBoyerMooreSearchNocaseTest01(void)
638 {
639  uint8_t *needle = (uint8_t *)"OpQrSt";
640  uint8_t *text = (uint8_t *)"aBcDeFgHiJkLmNoPqRsTuVwXyZ";
641  uint8_t *found = BoyerMooreNocaseWrapper(text, needle, 1);
642  //printf("found: %s\n", found);
643  if (found != NULL)
644  return 1;
645  else
646  return 0;
647 }
648 
649 /**
650  * \test issue 130 (@redmine) check to ensure that the
651  * problem is not the algorithm implementation
652  */
653 static int UtilSpmBoyerMooreSearchNocaseTestIssue130(void)
654 {
655  uint8_t *needle = (uint8_t *)"WWW-Authenticate: ";
656  uint8_t *text = (uint8_t *)"Date: Mon, 23 Feb 2009 13:31:49 GMT"
657  "Server: Apache\r\n"
658  "Www-authenticate: Basic realm=\"Authentification user password\"\r\n"
659  "Vary: accept-language,accept-charset\r\n"
660  "Accept-ranges: bytes\r\n"
661  "Connection: close\r\n"
662  "Content-type: text/html; charset=iso-8859-1\r\n"
663  "Content-language: fr\r\n"
664  "Expires: Mon, 23 Feb 2009 13:31:49 GMT\r\n\r\n";
665  uint8_t *found = BoyerMooreNocaseWrapper(text, needle, 1);
666  //printf("found: %s\n", found);
667  if (found != NULL)
668  return 1;
669  else
670  return 0;
671 }
672 
673 /* Generic tests that should not match */
674 static int UtilSpmBasicSearchTest02(void)
675 {
676  uint8_t *needle = (uint8_t *)"oPQRsT";
677  uint8_t *text = (uint8_t *)"aBcDeFgHiJkLmNoPqRsTuVwXyZ";
678  uint8_t *found = BasicSearchWrapper(text, needle, 1);
679  //printf("found: %s\n", found);
680  if (found != NULL)
681  return 0;
682  else
683  return 1;
684 }
685 
686 static int UtilSpmBasicSearchNocaseTest02(void)
687 {
688  uint8_t *needle = (uint8_t *)"OpZrSt";
689  uint8_t *text = (uint8_t *)"aBcDeFgHiJkLmNoPqRsTuVwXyZ";
690  uint8_t *found = BasicSearchNocaseWrapper(text, needle, 1);
691  //printf("found: %s\n", found);
692  if (found != NULL)
693  return 0;
694  else
695  return 1;
696 }
697 
698 static int UtilSpmBs2bmSearchTest02(void)
699 {
700  uint8_t *needle = (uint8_t *)"oPQRsT";
701  uint8_t *text = (uint8_t *)"aBcDeFgHiJkLmNoPqRsTuVwXyZ";
702  uint8_t *found = Bs2bmWrapper(text, needle, 1);
703  //printf("found: %s\n", found);
704  if (found != NULL)
705  return 0;
706  else
707  return 1;
708 }
709 
710 static int UtilSpmBs2bmSearchNocaseTest02(void)
711 {
712  uint8_t *needle = (uint8_t *)"OpZrSt";
713  uint8_t *text = (uint8_t *)"aBcDeFgHiJkLmNoPqRsTuVwXyZ";
714  uint8_t *found = Bs2bmNocaseWrapper(text, needle, 1);
715  //printf("found: %s\n", found);
716  if (found != NULL)
717  return 0;
718  else
719  return 1;
720 }
721 
722 static int UtilSpmBoyerMooreSearchTest02(void)
723 {
724  uint8_t *needle = (uint8_t *)"oPQRsT";
725  uint8_t *text = (uint8_t *)"aBcDeFgHiJkLmNoPqRsTuVwXyZ";
726  uint8_t *found = BoyerMooreWrapper(text, needle, 1);
727  //printf("found: %s\n", found);
728  if (found != NULL)
729  return 0;
730  else
731  return 1;
732 }
733 
734 static int UtilSpmBoyerMooreSearchNocaseTest02(void)
735 {
736  uint8_t *needle = (uint8_t *)"OpZrSt";
737  uint8_t *text = (uint8_t *)"aBcDeFgHiJkLmNoPqRsTuVwXyZ";
738  uint8_t *found = BoyerMooreNocaseWrapper(text, needle, 1);
739  //printf("found: %s\n", found);
740  if (found != NULL)
741  return 0;
742  else
743  return 1;
744 }
745 
746 /**
747  * \test Check that all the algorithms work at any offset and any pattern length
748  */
749 static int UtilSpmSearchOffsetsTest01(void)
750 {
751  const char *text[26][27];
752  text[0][0]="azzzzzzzzzzzzzzzzzzzzzzzzzz";
753  text[0][1]="zazzzzzzzzzzzzzzzzzzzzzzzzz";
754  text[0][2]="zzazzzzzzzzzzzzzzzzzzzzzzzz";
755  text[0][3]="zzzazzzzzzzzzzzzzzzzzzzzzzz";
756  text[0][4]="zzzzazzzzzzzzzzzzzzzzzzzzzz";
757  text[0][5]="zzzzzazzzzzzzzzzzzzzzzzzzzz";
758  text[0][6]="zzzzzzazzzzzzzzzzzzzzzzzzzz";
759  text[0][7]="zzzzzzzazzzzzzzzzzzzzzzzzzz";
760  text[0][8]="zzzzzzzzazzzzzzzzzzzzzzzzzz";
761  text[0][9]="zzzzzzzzzazzzzzzzzzzzzzzzzz";
762  text[0][10]="zzzzzzzzzzazzzzzzzzzzzzzzzz";
763  text[0][11]="zzzzzzzzzzzazzzzzzzzzzzzzzz";
764  text[0][12]="zzzzzzzzzzzzazzzzzzzzzzzzzz";
765  text[0][13]="zzzzzzzzzzzzzazzzzzzzzzzzzz";
766  text[0][14]="zzzzzzzzzzzzzzazzzzzzzzzzzz";
767  text[0][15]="zzzzzzzzzzzzzzzazzzzzzzzzzz";
768  text[0][16]="zzzzzzzzzzzzzzzzazzzzzzzzzz";
769  text[0][17]="zzzzzzzzzzzzzzzzzazzzzzzzzz";
770  text[0][18]="zzzzzzzzzzzzzzzzzzazzzzzzzz";
771  text[0][19]="zzzzzzzzzzzzzzzzzzzazzzzzzz";
772  text[0][20]="zzzzzzzzzzzzzzzzzzzzazzzzzz";
773  text[0][21]="zzzzzzzzzzzzzzzzzzzzzazzzzz";
774  text[0][22]="zzzzzzzzzzzzzzzzzzzzzzazzzz";
775  text[0][23]="zzzzzzzzzzzzzzzzzzzzzzzazzz";
776  text[0][24]="zzzzzzzzzzzzzzzzzzzzzzzzazz";
777  text[0][25]="zzzzzzzzzzzzzzzzzzzzzzzzzaz";
778  text[0][26]="zzzzzzzzzzzzzzzzzzzzzzzzzza";
779  text[1][0]="aBzzzzzzzzzzzzzzzzzzzzzzzzz";
780  text[1][1]="zaBzzzzzzzzzzzzzzzzzzzzzzzz";
781  text[1][2]="zzaBzzzzzzzzzzzzzzzzzzzzzzz";
782  text[1][3]="zzzaBzzzzzzzzzzzzzzzzzzzzzz";
783  text[1][4]="zzzzaBzzzzzzzzzzzzzzzzzzzzz";
784  text[1][5]="zzzzzaBzzzzzzzzzzzzzzzzzzzz";
785  text[1][6]="zzzzzzaBzzzzzzzzzzzzzzzzzzz";
786  text[1][7]="zzzzzzzaBzzzzzzzzzzzzzzzzzz";
787  text[1][8]="zzzzzzzzaBzzzzzzzzzzzzzzzzz";
788  text[1][9]="zzzzzzzzzaBzzzzzzzzzzzzzzzz";
789  text[1][10]="zzzzzzzzzzaBzzzzzzzzzzzzzzz";
790  text[1][11]="zzzzzzzzzzzaBzzzzzzzzzzzzzz";
791  text[1][12]="zzzzzzzzzzzzaBzzzzzzzzzzzzz";
792  text[1][13]="zzzzzzzzzzzzzaBzzzzzzzzzzzz";
793  text[1][14]="zzzzzzzzzzzzzzaBzzzzzzzzzzz";
794  text[1][15]="zzzzzzzzzzzzzzzaBzzzzzzzzzz";
795  text[1][16]="zzzzzzzzzzzzzzzzaBzzzzzzzzz";
796  text[1][17]="zzzzzzzzzzzzzzzzzaBzzzzzzzz";
797  text[1][18]="zzzzzzzzzzzzzzzzzzaBzzzzzzz";
798  text[1][19]="zzzzzzzzzzzzzzzzzzzaBzzzzzz";
799  text[1][20]="zzzzzzzzzzzzzzzzzzzzaBzzzzz";
800  text[1][21]="zzzzzzzzzzzzzzzzzzzzzaBzzzz";
801  text[1][22]="zzzzzzzzzzzzzzzzzzzzzzaBzzz";
802  text[1][23]="zzzzzzzzzzzzzzzzzzzzzzzaBzz";
803  text[1][24]="zzzzzzzzzzzzzzzzzzzzzzzzaBz";
804  text[1][25]="zzzzzzzzzzzzzzzzzzzzzzzzzaB";
805  text[2][0]="aBczzzzzzzzzzzzzzzzzzzzzzzz";
806  text[2][1]="zaBczzzzzzzzzzzzzzzzzzzzzzz";
807  text[2][2]="zzaBczzzzzzzzzzzzzzzzzzzzzz";
808  text[2][3]="zzzaBczzzzzzzzzzzzzzzzzzzzz";
809  text[2][4]="zzzzaBczzzzzzzzzzzzzzzzzzzz";
810  text[2][5]="zzzzzaBczzzzzzzzzzzzzzzzzzz";
811  text[2][6]="zzzzzzaBczzzzzzzzzzzzzzzzzz";
812  text[2][7]="zzzzzzzaBczzzzzzzzzzzzzzzzz";
813  text[2][8]="zzzzzzzzaBczzzzzzzzzzzzzzzz";
814  text[2][9]="zzzzzzzzzaBczzzzzzzzzzzzzzz";
815  text[2][10]="zzzzzzzzzzaBczzzzzzzzzzzzzz";
816  text[2][11]="zzzzzzzzzzzaBczzzzzzzzzzzzz";
817  text[2][12]="zzzzzzzzzzzzaBczzzzzzzzzzzz";
818  text[2][13]="zzzzzzzzzzzzzaBczzzzzzzzzzz";
819  text[2][14]="zzzzzzzzzzzzzzaBczzzzzzzzzz";
820  text[2][15]="zzzzzzzzzzzzzzzaBczzzzzzzzz";
821  text[2][16]="zzzzzzzzzzzzzzzzaBczzzzzzzz";
822  text[2][17]="zzzzzzzzzzzzzzzzzaBczzzzzzz";
823  text[2][18]="zzzzzzzzzzzzzzzzzzaBczzzzzz";
824  text[2][19]="zzzzzzzzzzzzzzzzzzzaBczzzzz";
825  text[2][20]="zzzzzzzzzzzzzzzzzzzzaBczzzz";
826  text[2][21]="zzzzzzzzzzzzzzzzzzzzzaBczzz";
827  text[2][22]="zzzzzzzzzzzzzzzzzzzzzzaBczz";
828  text[2][23]="zzzzzzzzzzzzzzzzzzzzzzzaBcz";
829  text[2][24]="zzzzzzzzzzzzzzzzzzzzzzzzaBc";
830  text[3][0]="aBcDzzzzzzzzzzzzzzzzzzzzzzz";
831  text[3][1]="zaBcDzzzzzzzzzzzzzzzzzzzzzz";
832  text[3][2]="zzaBcDzzzzzzzzzzzzzzzzzzzzz";
833  text[3][3]="zzzaBcDzzzzzzzzzzzzzzzzzzzz";
834  text[3][4]="zzzzaBcDzzzzzzzzzzzzzzzzzzz";
835  text[3][5]="zzzzzaBcDzzzzzzzzzzzzzzzzzz";
836  text[3][6]="zzzzzzaBcDzzzzzzzzzzzzzzzzz";
837  text[3][7]="zzzzzzzaBcDzzzzzzzzzzzzzzzz";
838  text[3][8]="zzzzzzzzaBcDzzzzzzzzzzzzzzz";
839  text[3][9]="zzzzzzzzzaBcDzzzzzzzzzzzzzz";
840  text[3][10]="zzzzzzzzzzaBcDzzzzzzzzzzzzz";
841  text[3][11]="zzzzzzzzzzzaBcDzzzzzzzzzzzz";
842  text[3][12]="zzzzzzzzzzzzaBcDzzzzzzzzzzz";
843  text[3][13]="zzzzzzzzzzzzzaBcDzzzzzzzzzz";
844  text[3][14]="zzzzzzzzzzzzzzaBcDzzzzzzzzz";
845  text[3][15]="zzzzzzzzzzzzzzzaBcDzzzzzzzz";
846  text[3][16]="zzzzzzzzzzzzzzzzaBcDzzzzzzz";
847  text[3][17]="zzzzzzzzzzzzzzzzzaBcDzzzzzz";
848  text[3][18]="zzzzzzzzzzzzzzzzzzaBcDzzzzz";
849  text[3][19]="zzzzzzzzzzzzzzzzzzzaBcDzzzz";
850  text[3][20]="zzzzzzzzzzzzzzzzzzzzaBcDzzz";
851  text[3][21]="zzzzzzzzzzzzzzzzzzzzzaBcDzz";
852  text[3][22]="zzzzzzzzzzzzzzzzzzzzzzaBcDz";
853  text[3][23]="zzzzzzzzzzzzzzzzzzzzzzzaBcD";
854  text[4][0]="aBcDezzzzzzzzzzzzzzzzzzzzzz";
855  text[4][1]="zaBcDezzzzzzzzzzzzzzzzzzzzz";
856  text[4][2]="zzaBcDezzzzzzzzzzzzzzzzzzzz";
857  text[4][3]="zzzaBcDezzzzzzzzzzzzzzzzzzz";
858  text[4][4]="zzzzaBcDezzzzzzzzzzzzzzzzzz";
859  text[4][5]="zzzzzaBcDezzzzzzzzzzzzzzzzz";
860  text[4][6]="zzzzzzaBcDezzzzzzzzzzzzzzzz";
861  text[4][7]="zzzzzzzaBcDezzzzzzzzzzzzzzz";
862  text[4][8]="zzzzzzzzaBcDezzzzzzzzzzzzzz";
863  text[4][9]="zzzzzzzzzaBcDezzzzzzzzzzzzz";
864  text[4][10]="zzzzzzzzzzaBcDezzzzzzzzzzzz";
865  text[4][11]="zzzzzzzzzzzaBcDezzzzzzzzzzz";
866  text[4][12]="zzzzzzzzzzzzaBcDezzzzzzzzzz";
867  text[4][13]="zzzzzzzzzzzzzaBcDezzzzzzzzz";
868  text[4][14]="zzzzzzzzzzzzzzaBcDezzzzzzzz";
869  text[4][15]="zzzzzzzzzzzzzzzaBcDezzzzzzz";
870  text[4][16]="zzzzzzzzzzzzzzzzaBcDezzzzzz";
871  text[4][17]="zzzzzzzzzzzzzzzzzaBcDezzzzz";
872  text[4][18]="zzzzzzzzzzzzzzzzzzaBcDezzzz";
873  text[4][19]="zzzzzzzzzzzzzzzzzzzaBcDezzz";
874  text[4][20]="zzzzzzzzzzzzzzzzzzzzaBcDezz";
875  text[4][21]="zzzzzzzzzzzzzzzzzzzzzaBcDez";
876  text[4][22]="zzzzzzzzzzzzzzzzzzzzzzaBcDe";
877  text[5][0]="aBcDeFzzzzzzzzzzzzzzzzzzzzz";
878  text[5][1]="zaBcDeFzzzzzzzzzzzzzzzzzzzz";
879  text[5][2]="zzaBcDeFzzzzzzzzzzzzzzzzzzz";
880  text[5][3]="zzzaBcDeFzzzzzzzzzzzzzzzzzz";
881  text[5][4]="zzzzaBcDeFzzzzzzzzzzzzzzzzz";
882  text[5][5]="zzzzzaBcDeFzzzzzzzzzzzzzzzz";
883  text[5][6]="zzzzzzaBcDeFzzzzzzzzzzzzzzz";
884  text[5][7]="zzzzzzzaBcDeFzzzzzzzzzzzzzz";
885  text[5][8]="zzzzzzzzaBcDeFzzzzzzzzzzzzz";
886  text[5][9]="zzzzzzzzzaBcDeFzzzzzzzzzzzz";
887  text[5][10]="zzzzzzzzzzaBcDeFzzzzzzzzzzz";
888  text[5][11]="zzzzzzzzzzzaBcDeFzzzzzzzzzz";
889  text[5][12]="zzzzzzzzzzzzaBcDeFzzzzzzzzz";
890  text[5][13]="zzzzzzzzzzzzzaBcDeFzzzzzzzz";
891  text[5][14]="zzzzzzzzzzzzzzaBcDeFzzzzzzz";
892  text[5][15]="zzzzzzzzzzzzzzzaBcDeFzzzzzz";
893  text[5][16]="zzzzzzzzzzzzzzzzaBcDeFzzzzz";
894  text[5][17]="zzzzzzzzzzzzzzzzzaBcDeFzzzz";
895  text[5][18]="zzzzzzzzzzzzzzzzzzaBcDeFzzz";
896  text[5][19]="zzzzzzzzzzzzzzzzzzzaBcDeFzz";
897  text[5][20]="zzzzzzzzzzzzzzzzzzzzaBcDeFz";
898  text[5][21]="zzzzzzzzzzzzzzzzzzzzzaBcDeF";
899  text[6][0]="aBcDeFgzzzzzzzzzzzzzzzzzzzz";
900  text[6][1]="zaBcDeFgzzzzzzzzzzzzzzzzzzz";
901  text[6][2]="zzaBcDeFgzzzzzzzzzzzzzzzzzz";
902  text[6][3]="zzzaBcDeFgzzzzzzzzzzzzzzzzz";
903  text[6][4]="zzzzaBcDeFgzzzzzzzzzzzzzzzz";
904  text[6][5]="zzzzzaBcDeFgzzzzzzzzzzzzzzz";
905  text[6][6]="zzzzzzaBcDeFgzzzzzzzzzzzzzz";
906  text[6][7]="zzzzzzzaBcDeFgzzzzzzzzzzzzz";
907  text[6][8]="zzzzzzzzaBcDeFgzzzzzzzzzzzz";
908  text[6][9]="zzzzzzzzzaBcDeFgzzzzzzzzzzz";
909  text[6][10]="zzzzzzzzzzaBcDeFgzzzzzzzzzz";
910  text[6][11]="zzzzzzzzzzzaBcDeFgzzzzzzzzz";
911  text[6][12]="zzzzzzzzzzzzaBcDeFgzzzzzzzz";
912  text[6][13]="zzzzzzzzzzzzzaBcDeFgzzzzzzz";
913  text[6][14]="zzzzzzzzzzzzzzaBcDeFgzzzzzz";
914  text[6][15]="zzzzzzzzzzzzzzzaBcDeFgzzzzz";
915  text[6][16]="zzzzzzzzzzzzzzzzaBcDeFgzzzz";
916  text[6][17]="zzzzzzzzzzzzzzzzzaBcDeFgzzz";
917  text[6][18]="zzzzzzzzzzzzzzzzzzaBcDeFgzz";
918  text[6][19]="zzzzzzzzzzzzzzzzzzzaBcDeFgz";
919  text[6][20]="zzzzzzzzzzzzzzzzzzzzaBcDeFg";
920  text[7][0]="aBcDeFgHzzzzzzzzzzzzzzzzzzz";
921  text[7][1]="zaBcDeFgHzzzzzzzzzzzzzzzzzz";
922  text[7][2]="zzaBcDeFgHzzzzzzzzzzzzzzzzz";
923  text[7][3]="zzzaBcDeFgHzzzzzzzzzzzzzzzz";
924  text[7][4]="zzzzaBcDeFgHzzzzzzzzzzzzzzz";
925  text[7][5]="zzzzzaBcDeFgHzzzzzzzzzzzzzz";
926  text[7][6]="zzzzzzaBcDeFgHzzzzzzzzzzzzz";
927  text[7][7]="zzzzzzzaBcDeFgHzzzzzzzzzzzz";
928  text[7][8]="zzzzzzzzaBcDeFgHzzzzzzzzzzz";
929  text[7][9]="zzzzzzzzzaBcDeFgHzzzzzzzzzz";
930  text[7][10]="zzzzzzzzzzaBcDeFgHzzzzzzzzz";
931  text[7][11]="zzzzzzzzzzzaBcDeFgHzzzzzzzz";
932  text[7][12]="zzzzzzzzzzzzaBcDeFgHzzzzzzz";
933  text[7][13]="zzzzzzzzzzzzzaBcDeFgHzzzzzz";
934  text[7][14]="zzzzzzzzzzzzzzaBcDeFgHzzzzz";
935  text[7][15]="zzzzzzzzzzzzzzzaBcDeFgHzzzz";
936  text[7][16]="zzzzzzzzzzzzzzzzaBcDeFgHzzz";
937  text[7][17]="zzzzzzzzzzzzzzzzzaBcDeFgHzz";
938  text[7][18]="zzzzzzzzzzzzzzzzzzaBcDeFgHz";
939  text[7][19]="zzzzzzzzzzzzzzzzzzzaBcDeFgH";
940  text[8][0]="aBcDeFgHizzzzzzzzzzzzzzzzzz";
941  text[8][1]="zaBcDeFgHizzzzzzzzzzzzzzzzz";
942  text[8][2]="zzaBcDeFgHizzzzzzzzzzzzzzzz";
943  text[8][3]="zzzaBcDeFgHizzzzzzzzzzzzzzz";
944  text[8][4]="zzzzaBcDeFgHizzzzzzzzzzzzzz";
945  text[8][5]="zzzzzaBcDeFgHizzzzzzzzzzzzz";
946  text[8][6]="zzzzzzaBcDeFgHizzzzzzzzzzzz";
947  text[8][7]="zzzzzzzaBcDeFgHizzzzzzzzzzz";
948  text[8][8]="zzzzzzzzaBcDeFgHizzzzzzzzzz";
949  text[8][9]="zzzzzzzzzaBcDeFgHizzzzzzzzz";
950  text[8][10]="zzzzzzzzzzaBcDeFgHizzzzzzzz";
951  text[8][11]="zzzzzzzzzzzaBcDeFgHizzzzzzz";
952  text[8][12]="zzzzzzzzzzzzaBcDeFgHizzzzzz";
953  text[8][13]="zzzzzzzzzzzzzaBcDeFgHizzzzz";
954  text[8][14]="zzzzzzzzzzzzzzaBcDeFgHizzzz";
955  text[8][15]="zzzzzzzzzzzzzzzaBcDeFgHizzz";
956  text[8][16]="zzzzzzzzzzzzzzzzaBcDeFgHizz";
957  text[8][17]="zzzzzzzzzzzzzzzzzaBcDeFgHiz";
958  text[8][18]="zzzzzzzzzzzzzzzzzzaBcDeFgHi";
959  text[9][0]="aBcDeFgHiJzzzzzzzzzzzzzzzzz";
960  text[9][1]="zaBcDeFgHiJzzzzzzzzzzzzzzzz";
961  text[9][2]="zzaBcDeFgHiJzzzzzzzzzzzzzzz";
962  text[9][3]="zzzaBcDeFgHiJzzzzzzzzzzzzzz";
963  text[9][4]="zzzzaBcDeFgHiJzzzzzzzzzzzzz";
964  text[9][5]="zzzzzaBcDeFgHiJzzzzzzzzzzzz";
965  text[9][6]="zzzzzzaBcDeFgHiJzzzzzzzzzzz";
966  text[9][7]="zzzzzzzaBcDeFgHiJzzzzzzzzzz";
967  text[9][8]="zzzzzzzzaBcDeFgHiJzzzzzzzzz";
968  text[9][9]="zzzzzzzzzaBcDeFgHiJzzzzzzzz";
969  text[9][10]="zzzzzzzzzzaBcDeFgHiJzzzzzzz";
970  text[9][11]="zzzzzzzzzzzaBcDeFgHiJzzzzzz";
971  text[9][12]="zzzzzzzzzzzzaBcDeFgHiJzzzzz";
972  text[9][13]="zzzzzzzzzzzzzaBcDeFgHiJzzzz";
973  text[9][14]="zzzzzzzzzzzzzzaBcDeFgHiJzzz";
974  text[9][15]="zzzzzzzzzzzzzzzaBcDeFgHiJzz";
975  text[9][16]="zzzzzzzzzzzzzzzzaBcDeFgHiJz";
976  text[9][17]="zzzzzzzzzzzzzzzzzaBcDeFgHiJ";
977  text[10][0]="aBcDeFgHiJkzzzzzzzzzzzzzzzz";
978  text[10][1]="zaBcDeFgHiJkzzzzzzzzzzzzzzz";
979  text[10][2]="zzaBcDeFgHiJkzzzzzzzzzzzzzz";
980  text[10][3]="zzzaBcDeFgHiJkzzzzzzzzzzzzz";
981  text[10][4]="zzzzaBcDeFgHiJkzzzzzzzzzzzz";
982  text[10][5]="zzzzzaBcDeFgHiJkzzzzzzzzzzz";
983  text[10][6]="zzzzzzaBcDeFgHiJkzzzzzzzzzz";
984  text[10][7]="zzzzzzzaBcDeFgHiJkzzzzzzzzz";
985  text[10][8]="zzzzzzzzaBcDeFgHiJkzzzzzzzz";
986  text[10][9]="zzzzzzzzzaBcDeFgHiJkzzzzzzz";
987  text[10][10]="zzzzzzzzzzaBcDeFgHiJkzzzzzz";
988  text[10][11]="zzzzzzzzzzzaBcDeFgHiJkzzzzz";
989  text[10][12]="zzzzzzzzzzzzaBcDeFgHiJkzzzz";
990  text[10][13]="zzzzzzzzzzzzzaBcDeFgHiJkzzz";
991  text[10][14]="zzzzzzzzzzzzzzaBcDeFgHiJkzz";
992  text[10][15]="zzzzzzzzzzzzzzzaBcDeFgHiJkz";
993  text[10][16]="zzzzzzzzzzzzzzzzaBcDeFgHiJk";
994  text[11][0]="aBcDeFgHiJkLzzzzzzzzzzzzzzz";
995  text[11][1]="zaBcDeFgHiJkLzzzzzzzzzzzzzz";
996  text[11][2]="zzaBcDeFgHiJkLzzzzzzzzzzzzz";
997  text[11][3]="zzzaBcDeFgHiJkLzzzzzzzzzzzz";
998  text[11][4]="zzzzaBcDeFgHiJkLzzzzzzzzzzz";
999  text[11][5]="zzzzzaBcDeFgHiJkLzzzzzzzzzz";
1000  text[11][6]="zzzzzzaBcDeFgHiJkLzzzzzzzzz";
1001  text[11][7]="zzzzzzzaBcDeFgHiJkLzzzzzzzz";
1002  text[11][8]="zzzzzzzzaBcDeFgHiJkLzzzzzzz";
1003  text[11][9]="zzzzzzzzzaBcDeFgHiJkLzzzzzz";
1004  text[11][10]="zzzzzzzzzzaBcDeFgHiJkLzzzzz";
1005  text[11][11]="zzzzzzzzzzzaBcDeFgHiJkLzzzz";
1006  text[11][12]="zzzzzzzzzzzzaBcDeFgHiJkLzzz";
1007  text[11][13]="zzzzzzzzzzzzzaBcDeFgHiJkLzz";
1008  text[11][14]="zzzzzzzzzzzzzzaBcDeFgHiJkLz";
1009  text[11][15]="zzzzzzzzzzzzzzzaBcDeFgHiJkL";
1010  text[12][0]="aBcDeFgHiJkLmzzzzzzzzzzzzzz";
1011  text[12][1]="zaBcDeFgHiJkLmzzzzzzzzzzzzz";
1012  text[12][2]="zzaBcDeFgHiJkLmzzzzzzzzzzzz";
1013  text[12][3]="zzzaBcDeFgHiJkLmzzzzzzzzzzz";
1014  text[12][4]="zzzzaBcDeFgHiJkLmzzzzzzzzzz";
1015  text[12][5]="zzzzzaBcDeFgHiJkLmzzzzzzzzz";
1016  text[12][6]="zzzzzzaBcDeFgHiJkLmzzzzzzzz";
1017  text[12][7]="zzzzzzzaBcDeFgHiJkLmzzzzzzz";
1018  text[12][8]="zzzzzzzzaBcDeFgHiJkLmzzzzzz";
1019  text[12][9]="zzzzzzzzzaBcDeFgHiJkLmzzzzz";
1020  text[12][10]="zzzzzzzzzzaBcDeFgHiJkLmzzzz";
1021  text[12][11]="zzzzzzzzzzzaBcDeFgHiJkLmzzz";
1022  text[12][12]="zzzzzzzzzzzzaBcDeFgHiJkLmzz";
1023  text[12][13]="zzzzzzzzzzzzzaBcDeFgHiJkLmz";
1024  text[12][14]="zzzzzzzzzzzzzzaBcDeFgHiJkLm";
1025  text[13][0]="aBcDeFgHiJkLmNzzzzzzzzzzzzz";
1026  text[13][1]="zaBcDeFgHiJkLmNzzzzzzzzzzzz";
1027  text[13][2]="zzaBcDeFgHiJkLmNzzzzzzzzzzz";
1028  text[13][3]="zzzaBcDeFgHiJkLmNzzzzzzzzzz";
1029  text[13][4]="zzzzaBcDeFgHiJkLmNzzzzzzzzz";
1030  text[13][5]="zzzzzaBcDeFgHiJkLmNzzzzzzzz";
1031  text[13][6]="zzzzzzaBcDeFgHiJkLmNzzzzzzz";
1032  text[13][7]="zzzzzzzaBcDeFgHiJkLmNzzzzzz";
1033  text[13][8]="zzzzzzzzaBcDeFgHiJkLmNzzzzz";
1034  text[13][9]="zzzzzzzzzaBcDeFgHiJkLmNzzzz";
1035  text[13][10]="zzzzzzzzzzaBcDeFgHiJkLmNzzz";
1036  text[13][11]="zzzzzzzzzzzaBcDeFgHiJkLmNzz";
1037  text[13][12]="zzzzzzzzzzzzaBcDeFgHiJkLmNz";
1038  text[13][13]="zzzzzzzzzzzzzaBcDeFgHiJkLmN";
1039  text[14][0]="aBcDeFgHiJkLmNozzzzzzzzzzzz";
1040  text[14][1]="zaBcDeFgHiJkLmNozzzzzzzzzzz";
1041  text[14][2]="zzaBcDeFgHiJkLmNozzzzzzzzzz";
1042  text[14][3]="zzzaBcDeFgHiJkLmNozzzzzzzzz";
1043  text[14][4]="zzzzaBcDeFgHiJkLmNozzzzzzzz";
1044  text[14][5]="zzzzzaBcDeFgHiJkLmNozzzzzzz";
1045  text[14][6]="zzzzzzaBcDeFgHiJkLmNozzzzzz";
1046  text[14][7]="zzzzzzzaBcDeFgHiJkLmNozzzzz";
1047  text[14][8]="zzzzzzzzaBcDeFgHiJkLmNozzzz";
1048  text[14][9]="zzzzzzzzzaBcDeFgHiJkLmNozzz";
1049  text[14][10]="zzzzzzzzzzaBcDeFgHiJkLmNozz";
1050  text[14][11]="zzzzzzzzzzzaBcDeFgHiJkLmNoz";
1051  text[14][12]="zzzzzzzzzzzzaBcDeFgHiJkLmNo";
1052  text[15][0]="aBcDeFgHiJkLmNoPzzzzzzzzzzz";
1053  text[15][1]="zaBcDeFgHiJkLmNoPzzzzzzzzzz";
1054  text[15][2]="zzaBcDeFgHiJkLmNoPzzzzzzzzz";
1055  text[15][3]="zzzaBcDeFgHiJkLmNoPzzzzzzzz";
1056  text[15][4]="zzzzaBcDeFgHiJkLmNoPzzzzzzz";
1057  text[15][5]="zzzzzaBcDeFgHiJkLmNoPzzzzzz";
1058  text[15][6]="zzzzzzaBcDeFgHiJkLmNoPzzzzz";
1059  text[15][7]="zzzzzzzaBcDeFgHiJkLmNoPzzzz";
1060  text[15][8]="zzzzzzzzaBcDeFgHiJkLmNoPzzz";
1061  text[15][9]="zzzzzzzzzaBcDeFgHiJkLmNoPzz";
1062  text[15][10]="zzzzzzzzzzaBcDeFgHiJkLmNoPz";
1063  text[15][11]="zzzzzzzzzzzaBcDeFgHiJkLmNoP";
1064  text[16][0]="aBcDeFgHiJkLmNoPqzzzzzzzzzz";
1065  text[16][1]="zaBcDeFgHiJkLmNoPqzzzzzzzzz";
1066  text[16][2]="zzaBcDeFgHiJkLmNoPqzzzzzzzz";
1067  text[16][3]="zzzaBcDeFgHiJkLmNoPqzzzzzzz";
1068  text[16][4]="zzzzaBcDeFgHiJkLmNoPqzzzzzz";
1069  text[16][5]="zzzzzaBcDeFgHiJkLmNoPqzzzzz";
1070  text[16][6]="zzzzzzaBcDeFgHiJkLmNoPqzzzz";
1071  text[16][7]="zzzzzzzaBcDeFgHiJkLmNoPqzzz";
1072  text[16][8]="zzzzzzzzaBcDeFgHiJkLmNoPqzz";
1073  text[16][9]="zzzzzzzzzaBcDeFgHiJkLmNoPqz";
1074  text[16][10]="zzzzzzzzzzaBcDeFgHiJkLmNoPq";
1075  text[17][0]="aBcDeFgHiJkLmNoPqRzzzzzzzzz";
1076  text[17][1]="zaBcDeFgHiJkLmNoPqRzzzzzzzz";
1077  text[17][2]="zzaBcDeFgHiJkLmNoPqRzzzzzzz";
1078  text[17][3]="zzzaBcDeFgHiJkLmNoPqRzzzzzz";
1079  text[17][4]="zzzzaBcDeFgHiJkLmNoPqRzzzzz";
1080  text[17][5]="zzzzzaBcDeFgHiJkLmNoPqRzzzz";
1081  text[17][6]="zzzzzzaBcDeFgHiJkLmNoPqRzzz";
1082  text[17][7]="zzzzzzzaBcDeFgHiJkLmNoPqRzz";
1083  text[17][8]="zzzzzzzzaBcDeFgHiJkLmNoPqRz";
1084  text[17][9]="zzzzzzzzzaBcDeFgHiJkLmNoPqR";
1085  text[18][0]="aBcDeFgHiJkLmNoPqRszzzzzzzz";
1086  text[18][1]="zaBcDeFgHiJkLmNoPqRszzzzzzz";
1087  text[18][2]="zzaBcDeFgHiJkLmNoPqRszzzzzz";
1088  text[18][3]="zzzaBcDeFgHiJkLmNoPqRszzzzz";
1089  text[18][4]="zzzzaBcDeFgHiJkLmNoPqRszzzz";
1090  text[18][5]="zzzzzaBcDeFgHiJkLmNoPqRszzz";
1091  text[18][6]="zzzzzzaBcDeFgHiJkLmNoPqRszz";
1092  text[18][7]="zzzzzzzaBcDeFgHiJkLmNoPqRsz";
1093  text[18][8]="zzzzzzzzaBcDeFgHiJkLmNoPqRs";
1094  text[19][0]="aBcDeFgHiJkLmNoPqRsTzzzzzzz";
1095  text[19][1]="zaBcDeFgHiJkLmNoPqRsTzzzzzz";
1096  text[19][2]="zzaBcDeFgHiJkLmNoPqRsTzzzzz";
1097  text[19][3]="zzzaBcDeFgHiJkLmNoPqRsTzzzz";
1098  text[19][4]="zzzzaBcDeFgHiJkLmNoPqRsTzzz";
1099  text[19][5]="zzzzzaBcDeFgHiJkLmNoPqRsTzz";
1100  text[19][6]="zzzzzzaBcDeFgHiJkLmNoPqRsTz";
1101  text[19][7]="zzzzzzzaBcDeFgHiJkLmNoPqRsT";
1102  text[20][0]="aBcDeFgHiJkLmNoPqRsTuzzzzzz";
1103  text[20][1]="zaBcDeFgHiJkLmNoPqRsTuzzzzz";
1104  text[20][2]="zzaBcDeFgHiJkLmNoPqRsTuzzzz";
1105  text[20][3]="zzzaBcDeFgHiJkLmNoPqRsTuzzz";
1106  text[20][4]="zzzzaBcDeFgHiJkLmNoPqRsTuzz";
1107  text[20][5]="zzzzzaBcDeFgHiJkLmNoPqRsTuz";
1108  text[20][6]="zzzzzzaBcDeFgHiJkLmNoPqRsTu";
1109  text[21][0]="aBcDeFgHiJkLmNoPqRsTuVzzzzz";
1110  text[21][1]="zaBcDeFgHiJkLmNoPqRsTuVzzzz";
1111  text[21][2]="zzaBcDeFgHiJkLmNoPqRsTuVzzz";
1112  text[21][3]="zzzaBcDeFgHiJkLmNoPqRsTuVzz";
1113  text[21][4]="zzzzaBcDeFgHiJkLmNoPqRsTuVz";
1114  text[21][5]="zzzzzaBcDeFgHiJkLmNoPqRsTuV";
1115  text[22][0]="aBcDeFgHiJkLmNoPqRsTuVwzzzz";
1116  text[22][1]="zaBcDeFgHiJkLmNoPqRsTuVwzzz";
1117  text[22][2]="zzaBcDeFgHiJkLmNoPqRsTuVwzz";
1118  text[22][3]="zzzaBcDeFgHiJkLmNoPqRsTuVwz";
1119  text[22][4]="zzzzaBcDeFgHiJkLmNoPqRsTuVw";
1120  text[23][0]="aBcDeFgHiJkLmNoPqRsTuVwXzzz";
1121  text[23][1]="zaBcDeFgHiJkLmNoPqRsTuVwXzz";
1122  text[23][2]="zzaBcDeFgHiJkLmNoPqRsTuVwXz";
1123  text[23][3]="zzzaBcDeFgHiJkLmNoPqRsTuVwX";
1124  text[24][0]="aBcDeFgHiJkLmNoPqRsTuVwXyzz";
1125  text[24][1]="zaBcDeFgHiJkLmNoPqRsTuVwXyz";
1126  text[24][2]="zzaBcDeFgHiJkLmNoPqRsTuVwXy";
1127  text[25][0]="aBcDeFgHiJkLmNoPqRsTuVwXyZz";
1128  text[25][1]="zaBcDeFgHiJkLmNoPqRsTuVwXyZ";
1129 
1130  const char *needle[26];
1131  needle[0]="a";
1132  needle[1]="aB";
1133  needle[2]="aBc";
1134  needle[3]="aBcD";
1135  needle[4]="aBcDe";
1136  needle[5]="aBcDeF";
1137  needle[6]="aBcDeFg";
1138  needle[7]="aBcDeFgH";
1139  needle[8]="aBcDeFgHi";
1140  needle[9]="aBcDeFgHiJ";
1141  needle[10]="aBcDeFgHiJk";
1142  needle[11]="aBcDeFgHiJkL";
1143  needle[12]="aBcDeFgHiJkLm";
1144  needle[13]="aBcDeFgHiJkLmN";
1145  needle[14]="aBcDeFgHiJkLmNo";
1146  needle[15]="aBcDeFgHiJkLmNoP";
1147  needle[16]="aBcDeFgHiJkLmNoPq";
1148  needle[17]="aBcDeFgHiJkLmNoPqR";
1149  needle[18]="aBcDeFgHiJkLmNoPqRs";
1150  needle[19]="aBcDeFgHiJkLmNoPqRsT";
1151  needle[20]="aBcDeFgHiJkLmNoPqRsTu";
1152  needle[21]="aBcDeFgHiJkLmNoPqRsTuV";
1153  needle[22]="aBcDeFgHiJkLmNoPqRsTuVw";
1154  needle[23]="aBcDeFgHiJkLmNoPqRsTuVwX";
1155  needle[24]="aBcDeFgHiJkLmNoPqRsTuVwXy";
1156  needle[25]="aBcDeFgHiJkLmNoPqRsTuVwXyZ";
1157 
1158  int i, j;
1159  uint8_t *found = NULL;
1160  for (i = 0; i < 26; i++) {
1161  for (j = 0; j <= (26 - i); j++) {
1162  found = BasicSearchWrapper((uint8_t *)text[i][j], (uint8_t *)needle[i], 1);
1163  if (found == 0) {
1164  printf("Error1 searching for %s in text %s\n", needle[i], text[i][j]);
1165  return 0;
1166  }
1167  found = Bs2bmWrapper((uint8_t *)text[i][j], (uint8_t *)needle[i], 1);
1168  if (found == 0) {
1169  printf("Error2 searching for %s in text %s\n", needle[i], text[i][j]);
1170  return 0;
1171  }
1172  found = BoyerMooreWrapper((uint8_t *)text[i][j], (uint8_t *)needle[i], 1);
1173  if (found == 0) {
1174  printf("Error3 searching for %s in text %s\n", needle[i], text[i][j]);
1175  return 0;
1176  }
1177  }
1178  }
1179  return 1;
1180 }
1181 
1182 /**
1183  * \test Check that all the algorithms (no case) work at any offset and any pattern length
1184  */
1185 static int UtilSpmSearchOffsetsNocaseTest01(void)
1186 {
1187  const char *text[26][27];
1188  text[0][0]="azzzzzzzzzzzzzzzzzzzzzzzzzz";
1189  text[0][1]="zazzzzzzzzzzzzzzzzzzzzzzzzz";
1190  text[0][2]="zzazzzzzzzzzzzzzzzzzzzzzzzz";
1191  text[0][3]="zzzazzzzzzzzzzzzzzzzzzzzzzz";
1192  text[0][4]="zzzzazzzzzzzzzzzzzzzzzzzzzz";
1193  text[0][5]="zzzzzazzzzzzzzzzzzzzzzzzzzz";
1194  text[0][6]="zzzzzzazzzzzzzzzzzzzzzzzzzz";
1195  text[0][7]="zzzzzzzazzzzzzzzzzzzzzzzzzz";
1196  text[0][8]="zzzzzzzzazzzzzzzzzzzzzzzzzz";
1197  text[0][9]="zzzzzzzzzazzzzzzzzzzzzzzzzz";
1198  text[0][10]="zzzzzzzzzzazzzzzzzzzzzzzzzz";
1199  text[0][11]="zzzzzzzzzzzazzzzzzzzzzzzzzz";
1200  text[0][12]="zzzzzzzzzzzzazzzzzzzzzzzzzz";
1201  text[0][13]="zzzzzzzzzzzzzazzzzzzzzzzzzz";
1202  text[0][14]="zzzzzzzzzzzzzzazzzzzzzzzzzz";
1203  text[0][15]="zzzzzzzzzzzzzzzazzzzzzzzzzz";
1204  text[0][16]="zzzzzzzzzzzzzzzzazzzzzzzzzz";
1205  text[0][17]="zzzzzzzzzzzzzzzzzazzzzzzzzz";
1206  text[0][18]="zzzzzzzzzzzzzzzzzzazzzzzzzz";
1207  text[0][19]="zzzzzzzzzzzzzzzzzzzazzzzzzz";
1208  text[0][20]="zzzzzzzzzzzzzzzzzzzzazzzzzz";
1209  text[0][21]="zzzzzzzzzzzzzzzzzzzzzazzzzz";
1210  text[0][22]="zzzzzzzzzzzzzzzzzzzzzzazzzz";
1211  text[0][23]="zzzzzzzzzzzzzzzzzzzzzzzazzz";
1212  text[0][24]="zzzzzzzzzzzzzzzzzzzzzzzzazz";
1213  text[0][25]="zzzzzzzzzzzzzzzzzzzzzzzzzaz";
1214  text[0][26]="zzzzzzzzzzzzzzzzzzzzzzzzzza";
1215  text[1][0]="aBzzzzzzzzzzzzzzzzzzzzzzzzz";
1216  text[1][1]="zaBzzzzzzzzzzzzzzzzzzzzzzzz";
1217  text[1][2]="zzaBzzzzzzzzzzzzzzzzzzzzzzz";
1218  text[1][3]="zzzaBzzzzzzzzzzzzzzzzzzzzzz";
1219  text[1][4]="zzzzaBzzzzzzzzzzzzzzzzzzzzz";
1220  text[1][5]="zzzzzaBzzzzzzzzzzzzzzzzzzzz";
1221  text[1][6]="zzzzzzaBzzzzzzzzzzzzzzzzzzz";
1222  text[1][7]="zzzzzzzaBzzzzzzzzzzzzzzzzzz";
1223  text[1][8]="zzzzzzzzaBzzzzzzzzzzzzzzzzz";
1224  text[1][9]="zzzzzzzzzaBzzzzzzzzzzzzzzzz";
1225  text[1][10]="zzzzzzzzzzaBzzzzzzzzzzzzzzz";
1226  text[1][11]="zzzzzzzzzzzaBzzzzzzzzzzzzzz";
1227  text[1][12]="zzzzzzzzzzzzaBzzzzzzzzzzzzz";
1228  text[1][13]="zzzzzzzzzzzzzaBzzzzzzzzzzzz";
1229  text[1][14]="zzzzzzzzzzzzzzaBzzzzzzzzzzz";
1230  text[1][15]="zzzzzzzzzzzzzzzaBzzzzzzzzzz";
1231  text[1][16]="zzzzzzzzzzzzzzzzaBzzzzzzzzz";
1232  text[1][17]="zzzzzzzzzzzzzzzzzaBzzzzzzzz";
1233  text[1][18]="zzzzzzzzzzzzzzzzzzaBzzzzzzz";
1234  text[1][19]="zzzzzzzzzzzzzzzzzzzaBzzzzzz";
1235  text[1][20]="zzzzzzzzzzzzzzzzzzzzaBzzzzz";
1236  text[1][21]="zzzzzzzzzzzzzzzzzzzzzaBzzzz";
1237  text[1][22]="zzzzzzzzzzzzzzzzzzzzzzaBzzz";
1238  text[1][23]="zzzzzzzzzzzzzzzzzzzzzzzaBzz";
1239  text[1][24]="zzzzzzzzzzzzzzzzzzzzzzzzaBz";
1240  text[1][25]="zzzzzzzzzzzzzzzzzzzzzzzzzaB";
1241  text[2][0]="aBczzzzzzzzzzzzzzzzzzzzzzzz";
1242  text[2][1]="zaBczzzzzzzzzzzzzzzzzzzzzzz";
1243  text[2][2]="zzaBczzzzzzzzzzzzzzzzzzzzzz";
1244  text[2][3]="zzzaBczzzzzzzzzzzzzzzzzzzzz";
1245  text[2][4]="zzzzaBczzzzzzzzzzzzzzzzzzzz";
1246  text[2][5]="zzzzzaBczzzzzzzzzzzzzzzzzzz";
1247  text[2][6]="zzzzzzaBczzzzzzzzzzzzzzzzzz";
1248  text[2][7]="zzzzzzzaBczzzzzzzzzzzzzzzzz";
1249  text[2][8]="zzzzzzzzaBczzzzzzzzzzzzzzzz";
1250  text[2][9]="zzzzzzzzzaBczzzzzzzzzzzzzzz";
1251  text[2][10]="zzzzzzzzzzaBczzzzzzzzzzzzzz";
1252  text[2][11]="zzzzzzzzzzzaBczzzzzzzzzzzzz";
1253  text[2][12]="zzzzzzzzzzzzaBczzzzzzzzzzzz";
1254  text[2][13]="zzzzzzzzzzzzzaBczzzzzzzzzzz";
1255  text[2][14]="zzzzzzzzzzzzzzaBczzzzzzzzzz";
1256  text[2][15]="zzzzzzzzzzzzzzzaBczzzzzzzzz";
1257  text[2][16]="zzzzzzzzzzzzzzzzaBczzzzzzzz";
1258  text[2][17]="zzzzzzzzzzzzzzzzzaBczzzzzzz";
1259  text[2][18]="zzzzzzzzzzzzzzzzzzaBczzzzzz";
1260  text[2][19]="zzzzzzzzzzzzzzzzzzzaBczzzzz";
1261  text[2][20]="zzzzzzzzzzzzzzzzzzzzaBczzzz";
1262  text[2][21]="zzzzzzzzzzzzzzzzzzzzzaBczzz";
1263  text[2][22]="zzzzzzzzzzzzzzzzzzzzzzaBczz";
1264  text[2][23]="zzzzzzzzzzzzzzzzzzzzzzzaBcz";
1265  text[2][24]="zzzzzzzzzzzzzzzzzzzzzzzzaBc";
1266  text[3][0]="aBcDzzzzzzzzzzzzzzzzzzzzzzz";
1267  text[3][1]="zaBcDzzzzzzzzzzzzzzzzzzzzzz";
1268  text[3][2]="zzaBcDzzzzzzzzzzzzzzzzzzzzz";
1269  text[3][3]="zzzaBcDzzzzzzzzzzzzzzzzzzzz";
1270  text[3][4]="zzzzaBcDzzzzzzzzzzzzzzzzzzz";
1271  text[3][5]="zzzzzaBcDzzzzzzzzzzzzzzzzzz";
1272  text[3][6]="zzzzzzaBcDzzzzzzzzzzzzzzzzz";
1273  text[3][7]="zzzzzzzaBcDzzzzzzzzzzzzzzzz";
1274  text[3][8]="zzzzzzzzaBcDzzzzzzzzzzzzzzz";
1275  text[3][9]="zzzzzzzzzaBcDzzzzzzzzzzzzzz";
1276  text[3][10]="zzzzzzzzzzaBcDzzzzzzzzzzzzz";
1277  text[3][11]="zzzzzzzzzzzaBcDzzzzzzzzzzzz";
1278  text[3][12]="zzzzzzzzzzzzaBcDzzzzzzzzzzz";
1279  text[3][13]="zzzzzzzzzzzzzaBcDzzzzzzzzzz";
1280  text[3][14]="zzzzzzzzzzzzzzaBcDzzzzzzzzz";
1281  text[3][15]="zzzzzzzzzzzzzzzaBcDzzzzzzzz";
1282  text[3][16]="zzzzzzzzzzzzzzzzaBcDzzzzzzz";
1283  text[3][17]="zzzzzzzzzzzzzzzzzaBcDzzzzzz";
1284  text[3][18]="zzzzzzzzzzzzzzzzzzaBcDzzzzz";
1285  text[3][19]="zzzzzzzzzzzzzzzzzzzaBcDzzzz";
1286  text[3][20]="zzzzzzzzzzzzzzzzzzzzaBcDzzz";
1287  text[3][21]="zzzzzzzzzzzzzzzzzzzzzaBcDzz";
1288  text[3][22]="zzzzzzzzzzzzzzzzzzzzzzaBcDz";
1289  text[3][23]="zzzzzzzzzzzzzzzzzzzzzzzaBcD";
1290  text[4][0]="aBcDezzzzzzzzzzzzzzzzzzzzzz";
1291  text[4][1]="zaBcDezzzzzzzzzzzzzzzzzzzzz";
1292  text[4][2]="zzaBcDezzzzzzzzzzzzzzzzzzzz";
1293  text[4][3]="zzzaBcDezzzzzzzzzzzzzzzzzzz";
1294  text[4][4]="zzzzaBcDezzzzzzzzzzzzzzzzzz";
1295  text[4][5]="zzzzzaBcDezzzzzzzzzzzzzzzzz";
1296  text[4][6]="zzzzzzaBcDezzzzzzzzzzzzzzzz";
1297  text[4][7]="zzzzzzzaBcDezzzzzzzzzzzzzzz";
1298  text[4][8]="zzzzzzzzaBcDezzzzzzzzzzzzzz";
1299  text[4][9]="zzzzzzzzzaBcDezzzzzzzzzzzzz";
1300  text[4][10]="zzzzzzzzzzaBcDezzzzzzzzzzzz";
1301  text[4][11]="zzzzzzzzzzzaBcDezzzzzzzzzzz";
1302  text[4][12]="zzzzzzzzzzzzaBcDezzzzzzzzzz";
1303  text[4][13]="zzzzzzzzzzzzzaBcDezzzzzzzzz";
1304  text[4][14]="zzzzzzzzzzzzzzaBcDezzzzzzzz";
1305  text[4][15]="zzzzzzzzzzzzzzzaBcDezzzzzzz";
1306  text[4][16]="zzzzzzzzzzzzzzzzaBcDezzzzzz";
1307  text[4][17]="zzzzzzzzzzzzzzzzzaBcDezzzzz";
1308  text[4][18]="zzzzzzzzzzzzzzzzzzaBcDezzzz";
1309  text[4][19]="zzzzzzzzzzzzzzzzzzzaBcDezzz";
1310  text[4][20]="zzzzzzzzzzzzzzzzzzzzaBcDezz";
1311  text[4][21]="zzzzzzzzzzzzzzzzzzzzzaBcDez";
1312  text[4][22]="zzzzzzzzzzzzzzzzzzzzzzaBcDe";
1313  text[5][0]="aBcDeFzzzzzzzzzzzzzzzzzzzzz";
1314  text[5][1]="zaBcDeFzzzzzzzzzzzzzzzzzzzz";
1315  text[5][2]="zzaBcDeFzzzzzzzzzzzzzzzzzzz";
1316  text[5][3]="zzzaBcDeFzzzzzzzzzzzzzzzzzz";
1317  text[5][4]="zzzzaBcDeFzzzzzzzzzzzzzzzzz";
1318  text[5][5]="zzzzzaBcDeFzzzzzzzzzzzzzzzz";
1319  text[5][6]="zzzzzzaBcDeFzzzzzzzzzzzzzzz";
1320  text[5][7]="zzzzzzzaBcDeFzzzzzzzzzzzzzz";
1321  text[5][8]="zzzzzzzzaBcDeFzzzzzzzzzzzzz";
1322  text[5][9]="zzzzzzzzzaBcDeFzzzzzzzzzzzz";
1323  text[5][10]="zzzzzzzzzzaBcDeFzzzzzzzzzzz";
1324  text[5][11]="zzzzzzzzzzzaBcDeFzzzzzzzzzz";
1325  text[5][12]="zzzzzzzzzzzzaBcDeFzzzzzzzzz";
1326  text[5][13]="zzzzzzzzzzzzzaBcDeFzzzzzzzz";
1327  text[5][14]="zzzzzzzzzzzzzzaBcDeFzzzzzzz";
1328  text[5][15]="zzzzzzzzzzzzzzzaBcDeFzzzzzz";
1329  text[5][16]="zzzzzzzzzzzzzzzzaBcDeFzzzzz";
1330  text[5][17]="zzzzzzzzzzzzzzzzzaBcDeFzzzz";
1331  text[5][18]="zzzzzzzzzzzzzzzzzzaBcDeFzzz";
1332  text[5][19]="zzzzzzzzzzzzzzzzzzzaBcDeFzz";
1333  text[5][20]="zzzzzzzzzzzzzzzzzzzzaBcDeFz";
1334  text[5][21]="zzzzzzzzzzzzzzzzzzzzzaBcDeF";
1335  text[6][0]="aBcDeFgzzzzzzzzzzzzzzzzzzzz";
1336  text[6][1]="zaBcDeFgzzzzzzzzzzzzzzzzzzz";
1337  text[6][2]="zzaBcDeFgzzzzzzzzzzzzzzzzzz";
1338  text[6][3]="zzzaBcDeFgzzzzzzzzzzzzzzzzz";
1339  text[6][4]="zzzzaBcDeFgzzzzzzzzzzzzzzzz";
1340  text[6][5]="zzzzzaBcDeFgzzzzzzzzzzzzzzz";
1341  text[6][6]="zzzzzzaBcDeFgzzzzzzzzzzzzzz";
1342  text[6][7]="zzzzzzzaBcDeFgzzzzzzzzzzzzz";
1343  text[6][8]="zzzzzzzzaBcDeFgzzzzzzzzzzzz";
1344  text[6][9]="zzzzzzzzzaBcDeFgzzzzzzzzzzz";
1345  text[6][10]="zzzzzzzzzzaBcDeFgzzzzzzzzzz";
1346  text[6][11]="zzzzzzzzzzzaBcDeFgzzzzzzzzz";
1347  text[6][12]="zzzzzzzzzzzzaBcDeFgzzzzzzzz";
1348  text[6][13]="zzzzzzzzzzzzzaBcDeFgzzzzzzz";
1349  text[6][14]="zzzzzzzzzzzzzzaBcDeFgzzzzzz";
1350  text[6][15]="zzzzzzzzzzzzzzzaBcDeFgzzzzz";
1351  text[6][16]="zzzzzzzzzzzzzzzzaBcDeFgzzzz";
1352  text[6][17]="zzzzzzzzzzzzzzzzzaBcDeFgzzz";
1353  text[6][18]="zzzzzzzzzzzzzzzzzzaBcDeFgzz";
1354  text[6][19]="zzzzzzzzzzzzzzzzzzzaBcDeFgz";
1355  text[6][20]="zzzzzzzzzzzzzzzzzzzzaBcDeFg";
1356  text[7][0]="aBcDeFgHzzzzzzzzzzzzzzzzzzz";
1357  text[7][1]="zaBcDeFgHzzzzzzzzzzzzzzzzzz";
1358  text[7][2]="zzaBcDeFgHzzzzzzzzzzzzzzzzz";
1359  text[7][3]="zzzaBcDeFgHzzzzzzzzzzzzzzzz";
1360  text[7][4]="zzzzaBcDeFgHzzzzzzzzzzzzzzz";
1361  text[7][5]="zzzzzaBcDeFgHzzzzzzzzzzzzzz";
1362  text[7][6]="zzzzzzaBcDeFgHzzzzzzzzzzzzz";
1363  text[7][7]="zzzzzzzaBcDeFgHzzzzzzzzzzzz";
1364  text[7][8]="zzzzzzzzaBcDeFgHzzzzzzzzzzz";
1365  text[7][9]="zzzzzzzzzaBcDeFgHzzzzzzzzzz";
1366  text[7][10]="zzzzzzzzzzaBcDeFgHzzzzzzzzz";
1367  text[7][11]="zzzzzzzzzzzaBcDeFgHzzzzzzzz";
1368  text[7][12]="zzzzzzzzzzzzaBcDeFgHzzzzzzz";
1369  text[7][13]="zzzzzzzzzzzzzaBcDeFgHzzzzzz";
1370  text[7][14]="zzzzzzzzzzzzzzaBcDeFgHzzzzz";
1371  text[7][15]="zzzzzzzzzzzzzzzaBcDeFgHzzzz";
1372  text[7][16]="zzzzzzzzzzzzzzzzaBcDeFgHzzz";
1373  text[7][17]="zzzzzzzzzzzzzzzzzaBcDeFgHzz";
1374  text[7][18]="zzzzzzzzzzzzzzzzzzaBcDeFgHz";
1375  text[7][19]="zzzzzzzzzzzzzzzzzzzaBcDeFgH";
1376  text[8][0]="aBcDeFgHizzzzzzzzzzzzzzzzzz";
1377  text[8][1]="zaBcDeFgHizzzzzzzzzzzzzzzzz";
1378  text[8][2]="zzaBcDeFgHizzzzzzzzzzzzzzzz";
1379  text[8][3]="zzzaBcDeFgHizzzzzzzzzzzzzzz";
1380  text[8][4]="zzzzaBcDeFgHizzzzzzzzzzzzzz";
1381  text[8][5]="zzzzzaBcDeFgHizzzzzzzzzzzzz";
1382  text[8][6]="zzzzzzaBcDeFgHizzzzzzzzzzzz";
1383  text[8][7]="zzzzzzzaBcDeFgHizzzzzzzzzzz";
1384  text[8][8]="zzzzzzzzaBcDeFgHizzzzzzzzzz";
1385  text[8][9]="zzzzzzzzzaBcDeFgHizzzzzzzzz";
1386  text[8][10]="zzzzzzzzzzaBcDeFgHizzzzzzzz";
1387  text[8][11]="zzzzzzzzzzzaBcDeFgHizzzzzzz";
1388  text[8][12]="zzzzzzzzzzzzaBcDeFgHizzzzzz";
1389  text[8][13]="zzzzzzzzzzzzzaBcDeFgHizzzzz";
1390  text[8][14]="zzzzzzzzzzzzzzaBcDeFgHizzzz";
1391  text[8][15]="zzzzzzzzzzzzzzzaBcDeFgHizzz";
1392  text[8][16]="zzzzzzzzzzzzzzzzaBcDeFgHizz";
1393  text[8][17]="zzzzzzzzzzzzzzzzzaBcDeFgHiz";
1394  text[8][18]="zzzzzzzzzzzzzzzzzzaBcDeFgHi";
1395  text[9][0]="aBcDeFgHiJzzzzzzzzzzzzzzzzz";
1396  text[9][1]="zaBcDeFgHiJzzzzzzzzzzzzzzzz";
1397  text[9][2]="zzaBcDeFgHiJzzzzzzzzzzzzzzz";
1398  text[9][3]="zzzaBcDeFgHiJzzzzzzzzzzzzzz";
1399  text[9][4]="zzzzaBcDeFgHiJzzzzzzzzzzzzz";
1400  text[9][5]="zzzzzaBcDeFgHiJzzzzzzzzzzzz";
1401  text[9][6]="zzzzzzaBcDeFgHiJzzzzzzzzzzz";
1402  text[9][7]="zzzzzzzaBcDeFgHiJzzzzzzzzzz";
1403  text[9][8]="zzzzzzzzaBcDeFgHiJzzzzzzzzz";
1404  text[9][9]="zzzzzzzzzaBcDeFgHiJzzzzzzzz";
1405  text[9][10]="zzzzzzzzzzaBcDeFgHiJzzzzzzz";
1406  text[9][11]="zzzzzzzzzzzaBcDeFgHiJzzzzzz";
1407  text[9][12]="zzzzzzzzzzzzaBcDeFgHiJzzzzz";
1408  text[9][13]="zzzzzzzzzzzzzaBcDeFgHiJzzzz";
1409  text[9][14]="zzzzzzzzzzzzzzaBcDeFgHiJzzz";
1410  text[9][15]="zzzzzzzzzzzzzzzaBcDeFgHiJzz";
1411  text[9][16]="zzzzzzzzzzzzzzzzaBcDeFgHiJz";
1412  text[9][17]="zzzzzzzzzzzzzzzzzaBcDeFgHiJ";
1413  text[10][0]="aBcDeFgHiJkzzzzzzzzzzzzzzzz";
1414  text[10][1]="zaBcDeFgHiJkzzzzzzzzzzzzzzz";
1415  text[10][2]="zzaBcDeFgHiJkzzzzzzzzzzzzzz";
1416  text[10][3]="zzzaBcDeFgHiJkzzzzzzzzzzzzz";
1417  text[10][4]="zzzzaBcDeFgHiJkzzzzzzzzzzzz";
1418  text[10][5]="zzzzzaBcDeFgHiJkzzzzzzzzzzz";
1419  text[10][6]="zzzzzzaBcDeFgHiJkzzzzzzzzzz";
1420  text[10][7]="zzzzzzzaBcDeFgHiJkzzzzzzzzz";
1421  text[10][8]="zzzzzzzzaBcDeFgHiJkzzzzzzzz";
1422  text[10][9]="zzzzzzzzzaBcDeFgHiJkzzzzzzz";
1423  text[10][10]="zzzzzzzzzzaBcDeFgHiJkzzzzzz";
1424  text[10][11]="zzzzzzzzzzzaBcDeFgHiJkzzzzz";
1425  text[10][12]="zzzzzzzzzzzzaBcDeFgHiJkzzzz";
1426  text[10][13]="zzzzzzzzzzzzzaBcDeFgHiJkzzz";
1427  text[10][14]="zzzzzzzzzzzzzzaBcDeFgHiJkzz";
1428  text[10][15]="zzzzzzzzzzzzzzzaBcDeFgHiJkz";
1429  text[10][16]="zzzzzzzzzzzzzzzzaBcDeFgHiJk";
1430  text[11][0]="aBcDeFgHiJkLzzzzzzzzzzzzzzz";
1431  text[11][1]="zaBcDeFgHiJkLzzzzzzzzzzzzzz";
1432  text[11][2]="zzaBcDeFgHiJkLzzzzzzzzzzzzz";
1433  text[11][3]="zzzaBcDeFgHiJkLzzzzzzzzzzzz";
1434  text[11][4]="zzzzaBcDeFgHiJkLzzzzzzzzzzz";
1435  text[11][5]="zzzzzaBcDeFgHiJkLzzzzzzzzzz";
1436  text[11][6]="zzzzzzaBcDeFgHiJkLzzzzzzzzz";
1437  text[11][7]="zzzzzzzaBcDeFgHiJkLzzzzzzzz";
1438  text[11][8]="zzzzzzzzaBcDeFgHiJkLzzzzzzz";
1439  text[11][9]="zzzzzzzzzaBcDeFgHiJkLzzzzzz";
1440  text[11][10]="zzzzzzzzzzaBcDeFgHiJkLzzzzz";
1441  text[11][11]="zzzzzzzzzzzaBcDeFgHiJkLzzzz";
1442  text[11][12]="zzzzzzzzzzzzaBcDeFgHiJkLzzz";
1443  text[11][13]="zzzzzzzzzzzzzaBcDeFgHiJkLzz";
1444  text[11][14]="zzzzzzzzzzzzzzaBcDeFgHiJkLz";
1445  text[11][15]="zzzzzzzzzzzzzzzaBcDeFgHiJkL";
1446  text[12][0]="aBcDeFgHiJkLmzzzzzzzzzzzzzz";
1447  text[12][1]="zaBcDeFgHiJkLmzzzzzzzzzzzzz";
1448  text[12][2]="zzaBcDeFgHiJkLmzzzzzzzzzzzz";
1449  text[12][3]="zzzaBcDeFgHiJkLmzzzzzzzzzzz";
1450  text[12][4]="zzzzaBcDeFgHiJkLmzzzzzzzzzz";
1451  text[12][5]="zzzzzaBcDeFgHiJkLmzzzzzzzzz";
1452  text[12][6]="zzzzzzaBcDeFgHiJkLmzzzzzzzz";
1453  text[12][7]="zzzzzzzaBcDeFgHiJkLmzzzzzzz";
1454  text[12][8]="zzzzzzzzaBcDeFgHiJkLmzzzzzz";
1455  text[12][9]="zzzzzzzzzaBcDeFgHiJkLmzzzzz";
1456  text[12][10]="zzzzzzzzzzaBcDeFgHiJkLmzzzz";
1457  text[12][11]="zzzzzzzzzzzaBcDeFgHiJkLmzzz";
1458  text[12][12]="zzzzzzzzzzzzaBcDeFgHiJkLmzz";
1459  text[12][13]="zzzzzzzzzzzzzaBcDeFgHiJkLmz";
1460  text[12][14]="zzzzzzzzzzzzzzaBcDeFgHiJkLm";
1461  text[13][0]="aBcDeFgHiJkLmNzzzzzzzzzzzzz";
1462  text[13][1]="zaBcDeFgHiJkLmNzzzzzzzzzzzz";
1463  text[13][2]="zzaBcDeFgHiJkLmNzzzzzzzzzzz";
1464  text[13][3]="zzzaBcDeFgHiJkLmNzzzzzzzzzz";
1465  text[13][4]="zzzzaBcDeFgHiJkLmNzzzzzzzzz";
1466  text[13][5]="zzzzzaBcDeFgHiJkLmNzzzzzzzz";
1467  text[13][6]="zzzzzzaBcDeFgHiJkLmNzzzzzzz";
1468  text[13][7]="zzzzzzzaBcDeFgHiJkLmNzzzzzz";
1469  text[13][8]="zzzzzzzzaBcDeFgHiJkLmNzzzzz";
1470  text[13][9]="zzzzzzzzzaBcDeFgHiJkLmNzzzz";
1471  text[13][10]="zzzzzzzzzzaBcDeFgHiJkLmNzzz";
1472  text[13][11]="zzzzzzzzzzzaBcDeFgHiJkLmNzz";
1473  text[13][12]="zzzzzzzzzzzzaBcDeFgHiJkLmNz";
1474  text[13][13]="zzzzzzzzzzzzzaBcDeFgHiJkLmN";
1475  text[14][0]="aBcDeFgHiJkLmNozzzzzzzzzzzz";
1476  text[14][1]="zaBcDeFgHiJkLmNozzzzzzzzzzz";
1477  text[14][2]="zzaBcDeFgHiJkLmNozzzzzzzzzz";
1478  text[14][3]="zzzaBcDeFgHiJkLmNozzzzzzzzz";
1479  text[14][4]="zzzzaBcDeFgHiJkLmNozzzzzzzz";
1480  text[14][5]="zzzzzaBcDeFgHiJkLmNozzzzzzz";
1481  text[14][6]="zzzzzzaBcDeFgHiJkLmNozzzzzz";
1482  text[14][7]="zzzzzzzaBcDeFgHiJkLmNozzzzz";
1483  text[14][8]="zzzzzzzzaBcDeFgHiJkLmNozzzz";
1484  text[14][9]="zzzzzzzzzaBcDeFgHiJkLmNozzz";
1485  text[14][10]="zzzzzzzzzzaBcDeFgHiJkLmNozz";
1486  text[14][11]="zzzzzzzzzzzaBcDeFgHiJkLmNoz";
1487  text[14][12]="zzzzzzzzzzzzaBcDeFgHiJkLmNo";
1488  text[15][0]="aBcDeFgHiJkLmNoPzzzzzzzzzzz";
1489  text[15][1]="zaBcDeFgHiJkLmNoPzzzzzzzzzz";
1490  text[15][2]="zzaBcDeFgHiJkLmNoPzzzzzzzzz";
1491  text[15][3]="zzzaBcDeFgHiJkLmNoPzzzzzzzz";
1492  text[15][4]="zzzzaBcDeFgHiJkLmNoPzzzzzzz";
1493  text[15][5]="zzzzzaBcDeFgHiJkLmNoPzzzzzz";
1494  text[15][6]="zzzzzzaBcDeFgHiJkLmNoPzzzzz";
1495  text[15][7]="zzzzzzzaBcDeFgHiJkLmNoPzzzz";
1496  text[15][8]="zzzzzzzzaBcDeFgHiJkLmNoPzzz";
1497  text[15][9]="zzzzzzzzzaBcDeFgHiJkLmNoPzz";
1498  text[15][10]="zzzzzzzzzzaBcDeFgHiJkLmNoPz";
1499  text[15][11]="zzzzzzzzzzzaBcDeFgHiJkLmNoP";
1500  text[16][0]="aBcDeFgHiJkLmNoPqzzzzzzzzzz";
1501  text[16][1]="zaBcDeFgHiJkLmNoPqzzzzzzzzz";
1502  text[16][2]="zzaBcDeFgHiJkLmNoPqzzzzzzzz";
1503  text[16][3]="zzzaBcDeFgHiJkLmNoPqzzzzzzz";
1504  text[16][4]="zzzzaBcDeFgHiJkLmNoPqzzzzzz";
1505  text[16][5]="zzzzzaBcDeFgHiJkLmNoPqzzzzz";
1506  text[16][6]="zzzzzzaBcDeFgHiJkLmNoPqzzzz";
1507  text[16][7]="zzzzzzzaBcDeFgHiJkLmNoPqzzz";
1508  text[16][8]="zzzzzzzzaBcDeFgHiJkLmNoPqzz";
1509  text[16][9]="zzzzzzzzzaBcDeFgHiJkLmNoPqz";
1510  text[16][10]="zzzzzzzzzzaBcDeFgHiJkLmNoPq";
1511  text[17][0]="aBcDeFgHiJkLmNoPqRzzzzzzzzz";
1512  text[17][1]="zaBcDeFgHiJkLmNoPqRzzzzzzzz";
1513  text[17][2]="zzaBcDeFgHiJkLmNoPqRzzzzzzz";
1514  text[17][3]="zzzaBcDeFgHiJkLmNoPqRzzzzzz";
1515  text[17][4]="zzzzaBcDeFgHiJkLmNoPqRzzzzz";
1516  text[17][5]="zzzzzaBcDeFgHiJkLmNoPqRzzzz";
1517  text[17][6]="zzzzzzaBcDeFgHiJkLmNoPqRzzz";
1518  text[17][7]="zzzzzzzaBcDeFgHiJkLmNoPqRzz";
1519  text[17][8]="zzzzzzzzaBcDeFgHiJkLmNoPqRz";
1520  text[17][9]="zzzzzzzzzaBcDeFgHiJkLmNoPqR";
1521  text[18][0]="aBcDeFgHiJkLmNoPqRszzzzzzzz";
1522  text[18][1]="zaBcDeFgHiJkLmNoPqRszzzzzzz";
1523  text[18][2]="zzaBcDeFgHiJkLmNoPqRszzzzzz";
1524  text[18][3]="zzzaBcDeFgHiJkLmNoPqRszzzzz";
1525  text[18][4]="zzzzaBcDeFgHiJkLmNoPqRszzzz";
1526  text[18][5]="zzzzzaBcDeFgHiJkLmNoPqRszzz";
1527  text[18][6]="zzzzzzaBcDeFgHiJkLmNoPqRszz";
1528  text[18][7]="zzzzzzzaBcDeFgHiJkLmNoPqRsz";
1529  text[18][8]="zzzzzzzzaBcDeFgHiJkLmNoPqRs";
1530  text[19][0]="aBcDeFgHiJkLmNoPqRsTzzzzzzz";
1531  text[19][1]="zaBcDeFgHiJkLmNoPqRsTzzzzzz";
1532  text[19][2]="zzaBcDeFgHiJkLmNoPqRsTzzzzz";
1533  text[19][3]="zzzaBcDeFgHiJkLmNoPqRsTzzzz";
1534  text[19][4]="zzzzaBcDeFgHiJkLmNoPqRsTzzz";
1535  text[19][5]="zzzzzaBcDeFgHiJkLmNoPqRsTzz";
1536  text[19][6]="zzzzzzaBcDeFgHiJkLmNoPqRsTz";
1537  text[19][7]="zzzzzzzaBcDeFgHiJkLmNoPqRsT";
1538  text[20][0]="aBcDeFgHiJkLmNoPqRsTuzzzzzz";
1539  text[20][1]="zaBcDeFgHiJkLmNoPqRsTuzzzzz";
1540  text[20][2]="zzaBcDeFgHiJkLmNoPqRsTuzzzz";
1541  text[20][3]="zzzaBcDeFgHiJkLmNoPqRsTuzzz";
1542  text[20][4]="zzzzaBcDeFgHiJkLmNoPqRsTuzz";
1543  text[20][5]="zzzzzaBcDeFgHiJkLmNoPqRsTuz";
1544  text[20][6]="zzzzzzaBcDeFgHiJkLmNoPqRsTu";
1545  text[21][0]="aBcDeFgHiJkLmNoPqRsTuVzzzzz";
1546  text[21][1]="zaBcDeFgHiJkLmNoPqRsTuVzzzz";
1547  text[21][2]="zzaBcDeFgHiJkLmNoPqRsTuVzzz";
1548  text[21][3]="zzzaBcDeFgHiJkLmNoPqRsTuVzz";
1549  text[21][4]="zzzzaBcDeFgHiJkLmNoPqRsTuVz";
1550  text[21][5]="zzzzzaBcDeFgHiJkLmNoPqRsTuV";
1551  text[22][0]="aBcDeFgHiJkLmNoPqRsTuVwzzzz";
1552  text[22][1]="zaBcDeFgHiJkLmNoPqRsTuVwzzz";
1553  text[22][2]="zzaBcDeFgHiJkLmNoPqRsTuVwzz";
1554  text[22][3]="zzzaBcDeFgHiJkLmNoPqRsTuVwz";
1555  text[22][4]="zzzzaBcDeFgHiJkLmNoPqRsTuVw";
1556  text[23][0]="aBcDeFgHiJkLmNoPqRsTuVwXzzz";
1557  text[23][1]="zaBcDeFgHiJkLmNoPqRsTuVwXzz";
1558  text[23][2]="zzaBcDeFgHiJkLmNoPqRsTuVwXz";
1559  text[23][3]="zzzaBcDeFgHiJkLmNoPqRsTuVwX";
1560  text[24][0]="aBcDeFgHiJkLmNoPqRsTuVwXyzz";
1561  text[24][1]="zaBcDeFgHiJkLmNoPqRsTuVwXyz";
1562  text[24][2]="zzaBcDeFgHiJkLmNoPqRsTuVwXy";
1563  text[25][0]="aBcDeFgHiJkLmNoPqRsTuVwXyZz";
1564  text[25][1]="zaBcDeFgHiJkLmNoPqRsTuVwXyZ";
1565 
1566  const char *needle[26];
1567  needle[0]="A";
1568  needle[1]="Ab";
1569  needle[2]="AbC";
1570  needle[3]="AbCd";
1571  needle[4]="AbCdE";
1572  needle[5]="AbCdEf";
1573  needle[6]="AbCdEfG";
1574  needle[7]="AbCdEfGh";
1575  needle[8]="AbCdEfGhI";
1576  needle[9]="AbCdEfGhIJ";
1577  needle[10]="AbCdEfGhIjK";
1578  needle[11]="AbCdEfGhIjKl";
1579  needle[12]="AbCdEfGhIjKlM";
1580  needle[13]="AbCdEfGhIjKlMn";
1581  needle[14]="AbCdEfGhIjKlMnO";
1582  needle[15]="AbCdEfGhIjKlMnOp";
1583  needle[16]="AbCdEfGhIjKlMnOpQ";
1584  needle[17]="AbCdEfGhIjKlMnOpQr";
1585  needle[18]="AbCdEfGhIjKlMnOpQrS";
1586  needle[19]="AbCdEfGhIjKlMnOpQrSt";
1587  needle[20]="AbCdEfGhIjKlMnOpQrStU";
1588  needle[21]="AbCdEfGhIjKlMnOpQrStUv";
1589  needle[22]="AbCdEfGhIjKlMnOpQrStUvW";
1590  needle[23]="AbCdEfGhIjKlMnOpQrStUvWx";
1591  needle[24]="AbCdEfGhIjKlMnOpQrStUvWxY";
1592  needle[25]="AbCdEfGhIjKlMnOpQrStUvWxYZ";
1593 
1594  int i, j;
1595  uint8_t *found = NULL;
1596  for (i = 0; i < 26; i++) {
1597  for (j = 0; j <= (26-i); j++) {
1598  found = BasicSearchNocaseWrapper((uint8_t *)text[i][j], (uint8_t *)needle[i], 1);
1599  if (found == 0) {
1600  printf("Error1 searching for %s in text %s\n", needle[i], text[i][j]);
1601  return 0;
1602  }
1603  found = Bs2bmNocaseWrapper((uint8_t *)text[i][j], (uint8_t *)needle[i], 1);
1604  if (found == 0) {
1605  printf("Error2 searching for %s in text %s\n", needle[i], text[i][j]);
1606  return 0;
1607  }
1608  found = BoyerMooreNocaseWrapper((uint8_t *)text[i][j], (uint8_t *)needle[i], 1);
1609  if (found == 0) {
1610  printf("Error3 searching for %s in text %s\n", needle[i], text[i][j]);
1611  return 0;
1612  }
1613  }
1614  }
1615  return 1;
1616 }
1617 
1618 #ifdef ENABLE_SEARCH_STATS
1619 /**
1620  * \test Give some stats
1621  */
1622 static int UtilSpmSearchStatsTest01(void)
1623 {
1624  char *text[16];
1625  text[0]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzza";
1626  text[1]="aaaaaaaaazaaaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaazaaaaaaaaazaaaaaaaaaazaaaaaaaaaaaaazaaaaaaaaazaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaazaaaaaaaaazaaaaaaaaaazaaaaaraaaaazaaaaaaazaaaaaaaaaaaaaazaaaaaaaazaaaaaaaaazaaaaaaaaaaaaB";
1627  text[2]="aBaBaBaBaBaBaBaBazaBaBaBaBaBaBazaBaBaBaBaBaBaBaBaBzBaBaBaBaBaBaBaBazaBaBaBaBaBaBaBzBaBaBaBaBaBaBzBaBaBaBaBzBaBaBaBaBaBzBaBaBaBaBaBzBaBaBaBaBaBaBaBazaBaBaBaBaBaBaBaBaBaBaBaBazaBaBaBaBaBaBaBaBaBzBaBaBaBaBaBaBaBzBaBaBaBaBaBaBaBaBaBzBaBaBaBaBaBaBaBaBaBaBazaBaBaBaBaBaBaBazaBaBaBaBaBc";
1628  text[3]="aBcaBcaBcaBcaBczBcaBcaBzaBcaBcaBcaBcaBcaBcaBcaBcazcaBcaBcaBcaBcaBcaBcaBzaBcaBcaBcaBcaBcaBczBcaBcaBcaBcaBcaBzaBcaBcaBcaBcaBcaBcaBcazcaBcaBcaBcaBcaBcaBcaBcaBczBcaBcaBcaBcaBcaBcaBczBcaBcaBcaBcaBzaBcaBcaBcaBcaBcaBcaBcazcaBcaBcaBcaBcaBcazcaBcaBcaBcaBcaBcaBzaBcaBcaBcazcaBcaBcaBcaBcaBcD";
1629  text[4]="aBcDaBcDaBcDaBczaBcDaBcDaBcDaBcDaBczaBcDaBcDaBcDaBcDzBcDaBcDaBcDaBcDzBcDaBcDaBczaBcDaBcDaBczaBcDaBcDaBcDaBcDaBzDaBcDaBcDaBcDaBcDaBcDaBcDaBcDaBczaBcDaBcDaBcDaBcDaBcDaBzDaBcDaBcDaBcDaBzDaBcDaBcDaBzDaBcDaBcDaBcDaBcDaBcDaBczaBcDaBcDaBcDaBcDazcDaBcDaBcDaBcDaBcDzBcDaBcDaBcDaBcDaBcDaBcDe";
1630  text[5]="aBcDeaBcDeaBcDeazcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDezBcDeaBcDeaBcDzaBcDeaBcDeaBcDeazcDzaBcDeaBcDezBcDeaBzDeaBcDeaBcDeazcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBczeaBcDeaBcDeaBzDeaBcDeaBcDezBcDeaBcDzaBcDeaBcDezBcDeaBcDezBcDeaBczeaBcDeaBcDeaBzDeaBcDezBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDezzzaBcDeF";
1631  text[6]="aBcDeaBcDeaBcDeazcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBzDeaBcDeaBcDeaBcDzaBcDzaBcDeaBcDeaBcDeaBcDzaBzDeaBcDeaBcDeaBczzaBcDeaBcDeaBcDzazcDeaBcDeaBcDeaBcDzaBzDeaBcDeaBcDeaBcDeazcDeaBcDeaBcDeaBcDeaBczeaBcDeaBcDeaBcDeaBczeaBcDezzzaBcDeFg";
1632  text[7]="aBcDeaBczeaBcDzaBcDezBcDeaBcDeaBcDeaBcDzaBzDeaBcDeaBcDeaBzDzaBcDeaBcDeazcDeaBcDzaBcDeaBczeaBcDeaBcDeaBzDzaBcDeaBcDeaBcDezBcDzaBcDeaBzDeaBcDeaBcDezBcDzaBcDeaBcDeaBzDeaBcDeaBcDeaBzDeaBcDeaBcDezBcDeaBcDeaBcDeazcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBrDeaBcDeaBcDezzzaBcDeFgH";
1633  text[8]="aBcDeaBcDeaBczzaBcDeazcDeaBcDezBcDeaBcDzaBcDeaBcDeaBcDeaBczzaBcDeaBcDeaBczeaBcDeaBcDzzBcDeaBcDeaBcDzaBczeaBcDeaBcDzaBcDeaBczeaBcDeaBcDeaBzDeaBcDeaBcDeaBzDeaBcDeaBcDzaBcDeaBcDeazcDeaBcDeaBcDzaBcDeaBcDeaBcDeazcDeaBcDeaBcDeaBcDeazcDeaBcDeaBcDeaBczeaBcDeaBzDeaBcDeaBcDeaBcDeaBcDezzzaBcDeFgHi";
1634  text[9]="aBcDeaBcDzaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDeazcDeaBcDeaBcDzzBcDeaBcDeaBczeaBcDzaBcDezBcDeaBczeaBcDzaBcDezBcDeaBcDzaBczeaBcDeaBcDzaBcDeazcDeaBcDeaBcDzaBczeaBcDeaBcDzaBzDeaBcDeaBczeaBcDeaBcDzaBcDeaBcDeaBzDeaBcDeaBcDeaBczeaBcDeaBcDeaBcDeaBzDeaBcDeaBcDeazcDeaBcDeaBcDeaBcDeaBcDezzzaBcDeFgHiJ";
1635  text[10]="aBcDeaBcDeaBczeaBcDzaBczeaBcDeaBczeaBcDeaBcDzaBcDeaBcDeazcDeaBcDeaBcDeaBzDzaBcDeazcDeaBcDeazcDeaBcDzaBcDeazcDeaBcDeaBczzaBcDeaBcDeaBzDeaBcDeaBcDzaBczeaBcDeaBcDeaBcDeaBczeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDezBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDezBcDeaBcDeaBcDeaBzDeaBcDeaBcDezzzaBcDeFgHiJk";
1636  text[11]="aBcDeaBcDeaBcDeaBcDeaBzDeaBcDeaBcDzaBcDzaBcDeaBcDeaBcDeaBcDeazcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDzaBcDzaBcDeaBcDeaBcDeaBcDzzBcDeaBcDeaBcDeaBcDzaBcDzaBcDeaBzDeaBcDeaBcDezBcDeaBcDeazcDeaBcDeaBcDezBcDeaBcDeaBcDeazcDeaBcDeaBzDeaBcDeaBczeaBcDeazcDeaBcDezBcDeaBcDeaBcDeaBcDeaBcDezzzaBcDeFgHiJkL";
1637  text[12]="aBcDeaBcDeaBcDeaBcDeaBzDeaBcDeaBzDeaBcDeaBcDezBcDeaBcDeazcDeaBcDeaBcDeazcDeaBcDeaBczeaBcDeaBcDeaBcDezBcDeaBcDzaBcDeaBcDzaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDeaBcDeaBcDezzzaBcDeFgHiJkLm";
1638  text[13]="aBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDezzzaBcDeFgHiJkLmN";
1639  text[14]="aBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDezzzaBcDeFgHiJkLmNo";
1640  text[15]="aBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDeaBcDeaBcDezzzaBcDeFgHiJkLmNoP";
1641 
1642  char *needle[16];
1643  needle[0]="a";
1644  needle[1]="aB";
1645  needle[2]="aBc";
1646  needle[3]="aBcD";
1647  needle[4]="aBcDe";
1648  needle[5]="aBcDeF";
1649  needle[6]="aBcDeFg";
1650  needle[7]="aBcDeFgH";
1651  needle[8]="aBcDeFgHi";
1652  needle[9]="aBcDeFgHiJ";
1653  needle[10]="aBcDeFgHiJk";
1654  needle[11]="aBcDeFgHiJkL";
1655  needle[12]="aBcDeFgHiJkLm";
1656  needle[13]="aBcDeFgHiJkLmN";
1657  needle[14]="aBcDeFgHiJkLmNo";
1658  needle[15]="aBcDeFgHiJkLmNoP";
1659 
1660  int i;
1661  uint8_t *found = NULL;
1662  printf("\nStats for text of greater length (text with a lot of partial matches, worst case for a basic search):\n");
1663  for (i = 0; i < 16; i++) {
1664  printf("Pattern length %d with BasicSearch:", i+1);
1665  found = BasicSearchWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1666  if (found == 0) {
1667  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
1668  return 0;
1669  }
1670  printf("Pattern length %d with Bs2BmSearch:", i+1);
1671  found = Bs2bmWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1672  if (found == 0) {
1673  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
1674  return 0;
1675  }
1676  printf("Pattern length %d with BoyerMooreSearch:", i+1);
1677  found = BoyerMooreWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1678  if (found == 0) {
1679  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
1680  return 0;
1681  }
1682  printf("\n");
1683  }
1684  return 1;
1685 }
1686 
1687 /**
1688  * \test Give some stats for
1689  */
1690 static int UtilSpmSearchStatsTest02(void)
1691 {
1692  char *text[16];
1693  text[0]="zzzzzzzzzzzzzzzzzza";
1694  text[1]="zzzzzzzzzzzzzzzzzzaB";
1695  text[2]="zzzzzzzzzzzzzzzzzzaBc";
1696  text[3]="zzzzzzzzzzzzzzzzzzaBcD";
1697  text[4]="zzzzzzzzzzzzzzzzzzaBcDe";
1698  text[5]="zzzzzzzzzzzzzzzzzzzzaBcDeF";
1699  text[6]="zzzzzzzzzzzzzzzzzzzzaBcDeFg";
1700  text[7]="zzzzzzzzzzzzzzzzzzzzaBcDeFgH";
1701  text[8]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHi";
1702  text[9]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJ";
1703  text[10]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJk";
1704  text[11]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkL";
1705  text[12]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLm";
1706  text[13]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmN";
1707  text[14]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmNo";
1708  text[15]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmNoP";
1709 
1710  char *needle[16];
1711  needle[0]="a";
1712  needle[1]="aB";
1713  needle[2]="aBc";
1714  needle[3]="aBcD";
1715  needle[4]="aBcDe";
1716  needle[5]="aBcDeF";
1717  needle[6]="aBcDeFg";
1718  needle[7]="aBcDeFgH";
1719  needle[8]="aBcDeFgHi";
1720  needle[9]="aBcDeFgHiJ";
1721  needle[10]="aBcDeFgHiJk";
1722  needle[11]="aBcDeFgHiJkL";
1723  needle[12]="aBcDeFgHiJkLm";
1724  needle[13]="aBcDeFgHiJkLmN";
1725  needle[14]="aBcDeFgHiJkLmNo";
1726  needle[15]="aBcDeFgHiJkLmNoP";
1727 
1728  int i;
1729  uint8_t *found = NULL;
1730  printf("\nStats for text of lower length:\n");
1731  for (i = 0; i < 16; i++) {
1732  printf("Pattern length %d with BasicSearch:", i+1);
1733  found = BasicSearchWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1734  if (found == 0) {
1735  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
1736  return 0;
1737  }
1738  printf("Pattern length %d with Bs2BmSearch:", i+1);
1739  found = Bs2bmWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1740  if (found == 0) {
1741  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
1742  return 0;
1743  }
1744  printf("Pattern length %d with BoyerMooreSearch:", i+1);
1745  found = BoyerMooreWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1746  if (found == 0) {
1747  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
1748  return 0;
1749  }
1750  printf("\n");
1751  }
1752  return 1;
1753 }
1754 
1755 
1756 static int UtilSpmSearchStatsTest03(void)
1757 {
1758  char *text[16];
1759  text[0]="zzzzzza";
1760  text[1]="zzzzzzaB";
1761  text[2]="zzzzzzaBc";
1762  text[3]="zzzzzzaBcD";
1763  text[4]="zzzzzzaBcDe";
1764  text[5]="zzzzzzzzaBcDeF";
1765  text[6]="zzzzzzzzaBcDeFg";
1766  text[7]="zzzzzzzzaBcDeFgH";
1767  text[8]="zzzzzzzzaBcDeFgHi";
1768  text[9]="zzzzzzzzaBcDeFgHiJ";
1769  text[10]="zzzzzzzzaBcDeFgHiJk";
1770  text[11]="zzzzzzzzaBcDeFgHiJkL";
1771  text[12]="zzzzzzzzaBcDeFgHiJkLm";
1772  text[13]="zzzzzzzzaBcDeFgHiJkLmN";
1773  text[14]="zzzzzzzzaBcDeFgHiJkLmNo";
1774  text[15]="zzzzzzzzaBcDeFgHiJkLmNoP";
1775 
1776  char *needle[16];
1777  needle[0]="a";
1778  needle[1]="aB";
1779  needle[2]="aBc";
1780  needle[3]="aBcD";
1781  needle[4]="aBcDe";
1782  needle[5]="aBcDeF";
1783  needle[6]="aBcDeFg";
1784  needle[7]="aBcDeFgH";
1785  needle[8]="aBcDeFgHi";
1786  needle[9]="aBcDeFgHiJ";
1787  needle[10]="aBcDeFgHiJk";
1788  needle[11]="aBcDeFgHiJkL";
1789  needle[12]="aBcDeFgHiJkLm";
1790  needle[13]="aBcDeFgHiJkLmN";
1791  needle[14]="aBcDeFgHiJkLmNo";
1792  needle[15]="aBcDeFgHiJkLmNoP";
1793 
1794  int i;
1795  uint8_t *found = NULL;
1796  printf("\nStats for text of lower length (badcase for):\n");
1797  for (i = 0; i < 16; i++) {
1798  printf("Pattern length %d with BasicSearch:", i+1);
1799  found = BasicSearchWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1800  if (found == 0) {
1801  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
1802  return 0;
1803  }
1804  printf("Pattern length %d with Bs2BmSearch:", i+1);
1805  found = Bs2bmWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1806  if (found == 0) {
1807  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
1808  return 0;
1809  }
1810  printf("Pattern length %d with BoyerMooreSearch:", i+1);
1811  found = BoyerMooreWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1812  if (found == 0) {
1813  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
1814  return 0;
1815  }
1816  printf("\n");
1817  }
1818  return 1;
1819 }
1820 
1821 /**
1822  * \test Give some stats
1823  */
1824 static int UtilSpmSearchStatsTest04(void)
1825 {
1826  char *text[16];
1827  text[0]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzza";
1828  text[1]="aaaaaaaaazaaaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaazaaaaaaaaazaaaaaaaaaazaaaaaaaaaaaaazaaaaaaaaazaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaazaaaaaaaaazaaaaaaaaaazaaaaaraaaaazaaaaaaazaaaaaaaaaaaaaazaaaaaaaazaaaaaaaaazaaaaaaaaaaaaB";
1829  text[2]="aBaBaBaBaBaBaBaBazaBaBaBaBaBaBazaBaBaBaBaBaBaBaBaBzBaBaBaBaBaBaBaBazaBaBaBaBaBaBaBzBaBaBaBaBaBaBzBaBaBaBaBzBaBaBaBaBaBzBaBaBaBaBaBzBaBaBaBaBaBaBaBazaBaBaBaBaBaBaBaBaBaBaBaBazaBaBaBaBaBaBaBaBaBzBaBaBaBaBaBaBaBzBaBaBaBaBaBaBaBaBaBzBaBaBaBaBaBaBaBaBaBaBazaBaBaBaBaBaBaBazaBaBaBaBaBc";
1830  text[3]="aBcaBcaBcaBcaBczBcaBcaBzaBcaBcaBcaBcaBcaBcaBcaBcazcaBcaBcaBcaBcaBcaBcaBzaBcaBcaBcaBcaBcaBczBcaBcaBcaBcaBcaBzaBcaBcaBcaBcaBcaBcaBcazcaBcaBcaBcaBcaBcaBcaBcaBczBcaBcaBcaBcaBcaBcaBczBcaBcaBcaBcaBzaBcaBcaBcaBcaBcaBcaBcazcaBcaBcaBcaBcaBcazcaBcaBcaBcaBcaBcaBzaBcaBcaBcazcaBcaBcaBcaBcaBcD";
1831  text[4]="aBcDaBcDaBcDaBczaBcDaBcDaBcDaBcDaBczaBcDaBcDaBcDaBcDzBcDaBcDaBcDaBcDzBcDaBcDaBczaBcDaBcDaBczaBcDaBcDaBcDaBcDaBzDaBcDaBcDaBcDaBcDaBcDaBcDaBcDaBczaBcDaBcDaBcDaBcDaBcDaBzDaBcDaBcDaBcDaBzDaBcDaBcDaBzDaBcDaBcDaBcDaBcDaBcDaBczaBcDaBcDaBcDaBcDazcDaBcDaBcDaBcDaBcDzBcDaBcDaBcDaBcDaBcDaBcDe";
1832  text[5]="aBcDeaBcDeaBcDeazcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDezBcDeaBcDeaBcDzaBcDeaBcDeaBcDeazcDzaBcDeaBcDezBcDeaBzDeaBcDeaBcDeazcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBczeaBcDeaBcDeaBzDeaBcDeaBcDezBcDeaBcDzaBcDeaBcDezBcDeaBcDezBcDeaBczeaBcDeaBcDeaBzDeaBcDezBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDezzzaBcDeF";
1833  text[6]="aBcDeaBcDeaBcDeazcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBzDeaBcDeaBcDeaBcDzaBcDzaBcDeaBcDeaBcDeaBcDzaBzDeaBcDeaBcDeaBczzaBcDeaBcDeaBcDzazcDeaBcDeaBcDeaBcDzaBzDeaBcDeaBcDeaBcDeazcDeaBcDeaBcDeaBcDeaBczeaBcDeaBcDeaBcDeaBczeaBcDezzzaBcDeFg";
1834  text[7]="aBcDeaBczeaBcDzaBcDezBcDeaBcDeaBcDeaBcDzaBzDeaBcDeaBcDeaBzDzaBcDeaBcDeazcDeaBcDzaBcDeaBczeaBcDeaBcDeaBzDzaBcDeaBcDeaBcDezBcDzaBcDeaBzDeaBcDeaBcDezBcDzaBcDeaBcDeaBzDeaBcDeaBcDeaBzDeaBcDeaBcDezBcDeaBcDeaBcDeazcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBrDeaBcDeaBcDezzzaBcDeFgH";
1835  text[8]="aBcDeaBcDeaBczzaBcDeazcDeaBcDezBcDeaBcDzaBcDeaBcDeaBcDeaBczzaBcDeaBcDeaBczeaBcDeaBcDzzBcDeaBcDeaBcDzaBczeaBcDeaBcDzaBcDeaBczeaBcDeaBcDeaBzDeaBcDeaBcDeaBzDeaBcDeaBcDzaBcDeaBcDeazcDeaBcDeaBcDzaBcDeaBcDeaBcDeazcDeaBcDeaBcDeaBcDeazcDeaBcDeaBcDeaBczeaBcDeaBzDeaBcDeaBcDeaBcDeaBcDezzzaBcDeFgHi";
1836  text[9]="aBcDeaBcDzaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDeazcDeaBcDeaBcDzzBcDeaBcDeaBczeaBcDzaBcDezBcDeaBczeaBcDzaBcDezBcDeaBcDzaBczeaBcDeaBcDzaBcDeazcDeaBcDeaBcDzaBczeaBcDeaBcDzaBzDeaBcDeaBczeaBcDeaBcDzaBcDeaBcDeaBzDeaBcDeaBcDeaBczeaBcDeaBcDeaBcDeaBzDeaBcDeaBcDeazcDeaBcDeaBcDeaBcDeaBcDezzzaBcDeFgHiJ";
1837  text[10]="aBcDeaBcDeaBczeaBcDzaBczeaBcDeaBczeaBcDeaBcDzaBcDeaBcDeazcDeaBcDeaBcDeaBzDzaBcDeazcDeaBcDeazcDeaBcDzaBcDeazcDeaBcDeaBczzaBcDeaBcDeaBzDeaBcDeaBcDzaBczeaBcDeaBcDeaBcDeaBczeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDezBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDezBcDeaBcDeaBcDeaBzDeaBcDeaBcDezzzaBcDeFgHiJk";
1838  text[11]="aBcDeaBcDeaBcDeaBcDeaBzDeaBcDeaBcDzaBcDzaBcDeaBcDeaBcDeaBcDeazcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDzaBcDzaBcDeaBcDeaBcDeaBcDzzBcDeaBcDeaBcDeaBcDzaBcDzaBcDeaBzDeaBcDeaBcDezBcDeaBcDeazcDeaBcDeaBcDezBcDeaBcDeaBcDeazcDeaBcDeaBzDeaBcDeaBczeaBcDeazcDeaBcDezBcDeaBcDeaBcDeaBcDeaBcDezzzaBcDeFgHiJkL";
1839  text[12]="aBcDeaBcDeaBcDeaBcDeaBzDeaBcDeaBzDeaBcDeaBcDezBcDeaBcDeazcDeaBcDeaBcDeazcDeaBcDeaBczeaBcDeaBcDeaBcDezBcDeaBcDzaBcDeaBcDzaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDeaBcDeaBcDezzzaBcDeFgHiJkLm";
1840  text[13]="aBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDeaBcDezzzaBcDeFgHiJkLmN";
1841  text[14]="aBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDezzzaBcDeFgHiJkLmNo";
1842  text[15]="aBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDeaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDzaBcDeaBcDeaBcDeaBcDezzzaBcDeFgHiJkLmNoP";
1843 
1844 
1845  char *needle[16];
1846  needle[0]="a";
1847  needle[1]="aB";
1848  needle[2]="aBc";
1849  needle[3]="aBcD";
1850  needle[4]="aBcDe";
1851  needle[5]="aBcDeF";
1852  needle[6]="aBcDeFg";
1853  needle[7]="aBcDeFgH";
1854  needle[8]="aBcDeFgHi";
1855  needle[9]="aBcDeFgHiJ";
1856  needle[10]="aBcDeFgHiJk";
1857  needle[11]="aBcDeFgHiJkL";
1858  needle[12]="aBcDeFgHiJkLm";
1859  needle[13]="aBcDeFgHiJkLmN";
1860  needle[14]="aBcDeFgHiJkLmNo";
1861  needle[15]="aBcDeFgHiJkLmNoP";
1862 
1863  int i;
1864  uint8_t *found = NULL;
1865  printf("\nStats for text of greater length:\n");
1866  for (i = 0; i < 16; i++) {
1867  printf("Pattern length %d with BasicSearch (Building Context):", i + 1);
1868  found = BasicSearchCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1869  if (found == 0) {
1870  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
1871  return 0;
1872  }
1873  printf("Pattern length %d with Bs2BmSearch (Building Context):", i + 1);
1874  found = Bs2bmCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1875  if (found == 0) {
1876  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
1877  return 0;
1878  }
1879  printf("Pattern length %d with BoyerMooreSearch (Building Context):", i + 1);
1880  found = BoyerMooreCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1881  if (found == 0) {
1882  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
1883  return 0;
1884  }
1885  printf("Pattern length %d with SpmSearch (Building Context):", i + 1);
1886  found = RawCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1887  if (found == 0) {
1888  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
1889  return 0;
1890  }
1891  printf("\n");
1892  }
1893  return 1;
1894 }
1895 
1896 /**
1897  * \test Give some stats for
1898  */
1899 static int UtilSpmSearchStatsTest05(void)
1900 {
1901  char *text[16];
1902  text[0]="zzzzzzzzzzzzzzzzzza";
1903  text[1]="zzzzzzzzzzzzzzzzzzaB";
1904  text[2]="zzzzzzzzzzzzzzzzzzaBc";
1905  text[3]="zzzzzzzzzzzzzzzzzzaBcD";
1906  text[4]="zzzzzzzzzzzzzzzzzzaBcDe";
1907  text[5]="zzzzzzzzzzzzzzzzzzzzaBcDeF";
1908  text[6]="zzzzzzzzzzzzzzzzzzzzaBcDeFg";
1909  text[7]="zzzzzzzzzzzzzzzzzzzzaBcDeFgH";
1910  text[8]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHi";
1911  text[9]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJ";
1912  text[10]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJk";
1913  text[11]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkL";
1914  text[12]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLm";
1915  text[13]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmN";
1916  text[14]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmNo";
1917  text[15]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmNoP";
1918 
1919  char *needle[16];
1920  needle[0]="a";
1921  needle[1]="aB";
1922  needle[2]="aBc";
1923  needle[3]="aBcD";
1924  needle[4]="aBcDe";
1925  needle[5]="aBcDeF";
1926  needle[6]="aBcDeFg";
1927  needle[7]="aBcDeFgH";
1928  needle[8]="aBcDeFgHi";
1929  needle[9]="aBcDeFgHiJ";
1930  needle[10]="aBcDeFgHiJk";
1931  needle[11]="aBcDeFgHiJkL";
1932  needle[12]="aBcDeFgHiJkLm";
1933  needle[13]="aBcDeFgHiJkLmN";
1934  needle[14]="aBcDeFgHiJkLmNo";
1935  needle[15]="aBcDeFgHiJkLmNoP";
1936 
1937  int i;
1938  uint8_t *found = NULL;
1939  printf("\nStats for text of lower length:\n");
1940  for (i = 0; i < 16; i++) {
1941  printf("Pattern length %d with BasicSearch (Building Context):", i+1);
1942  found = BasicSearchCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1943  if (found == 0) {
1944  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
1945  return 0;
1946  }
1947  printf("Pattern length %d with Bs2BmSearch (Building Context):", i+1);
1948  found = Bs2bmCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1949  if (found == 0) {
1950  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
1951  return 0;
1952  }
1953  printf("Pattern length %d with BoyerMooreSearch (Building Context):", i+1);
1954  found = BoyerMooreCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1955  if (found == 0) {
1956  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
1957  return 0;
1958  }
1959  printf("\n");
1960  }
1961  return 1;
1962 }
1963 
1964 
1965 static int UtilSpmSearchStatsTest06(void)
1966 {
1967  char *text[16];
1968  text[0]="zzzzkzzzzzzzkzzzzzza";
1969  text[1]="BBBBkBBBBBBBkBBBBBaB";
1970  text[2]="BcBckcBcBcBckcBcBcaBc";
1971  text[3]="BcDBkDBcDBcDkcDBcDaBcD";
1972  text[4]="BcDekcDeBcDekcDezzaBcDe";
1973 
1974  char *needle[16];
1975  needle[0]="a";
1976  needle[1]="aB";
1977  needle[2]="aBc";
1978  needle[3]="aBcD";
1979  needle[4]="aBcDe";
1980 
1981  int i;
1982  uint8_t *found = NULL;
1983  printf("\nStats for text of lower length (badcase for):\n");
1984  for (i = 0; i < 5; i++) {
1985  printf("Pattern length %d with BasicSearch (Building Context):", i+1);
1986  found = BasicSearchCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1987  if (found == 0) {
1988  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
1989  return 0;
1990  }
1991  printf("Pattern length %d with Bs2BmSearch (Building Context):", i+1);
1992  found = Bs2bmCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1993  if (found == 0) {
1994  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
1995  return 0;
1996  }
1997  printf("Pattern length %d with BoyerMooreSearch (Building Context):", i+1);
1998  found = BoyerMooreCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
1999  if (found == 0) {
2000  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
2001  return 0;
2002  }
2003  printf("\n");
2004  }
2005  return 1;
2006 }
2007 
2008 static int UtilSpmSearchStatsTest07(void)
2009 {
2010  char *text[16];
2011  text[0]="zzzza";
2012  text[1]="BBBaB";
2013  text[2]="bbaBc";
2014  text[3]="aaBcD";
2015  text[4]="aBcDe";
2016 
2017  char *needle[16];
2018  needle[0]="a";
2019  needle[1]="aB";
2020  needle[2]="aBc";
2021  needle[3]="aBcD";
2022  needle[4]="aBcDe";
2023 
2024  int i;
2025  uint8_t *found = NULL;
2026  printf("\nStats for text of real lower length (badcase for):\n");
2027  for (i = 0; i < 5; i++) {
2028  printf("Pattern length %d with BasicSearch (Building Context):", i+1);
2029  found = BasicSearchCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2030  if (found == 0) {
2031  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
2032  return 0;
2033  }
2034  printf("Pattern length %d with Bs2BmSearch (Building Context):", i+1);
2035  found = Bs2bmCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2036  if (found == 0) {
2037  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
2038  return 0;
2039  }
2040  printf("Pattern length %d with BoyerMooreSearch (Building Context):", i+1);
2041  found = BoyerMooreCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2042  if (found == 0) {
2043  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
2044  return 0;
2045  }
2046  printf("\n");
2047  }
2048  return 1;
2049 }
2050 
2051 /**
2052  * \test Give some stats for no case algorithms
2053  */
2054 static int UtilSpmNocaseSearchStatsTest01(void)
2055 {
2056  char *text[16];
2057  text[0]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzza";
2058  text[1]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaB";
2059  text[2]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBc";
2060  text[3]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcD";
2061  text[4]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDe";
2062  text[5]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeF";
2063  text[6]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFg";
2064  text[7]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgH";
2065  text[8]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHi";
2066  text[9]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJ";
2067  text[10]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJk";
2068  text[11]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkL";
2069  text[12]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLm";
2070  text[13]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmN";
2071  text[14]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmNo";
2072  text[15]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmNoP";
2073 
2074  char *needle[16];
2075  needle[0]="a";
2076  needle[1]="aB";
2077  needle[2]="aBc";
2078  needle[3]="aBcD";
2079  needle[4]="aBcDe";
2080  needle[5]="aBcDeF";
2081  needle[6]="aBcDeFg";
2082  needle[7]="aBcDeFgH";
2083  needle[8]="aBcDeFgHi";
2084  needle[9]="aBcDeFgHiJ";
2085  needle[10]="aBcDeFgHiJk";
2086  needle[11]="aBcDeFgHiJkL";
2087  needle[12]="aBcDeFgHiJkLm";
2088  needle[13]="aBcDeFgHiJkLmN";
2089  needle[14]="aBcDeFgHiJkLmNo";
2090  needle[15]="aBcDeFgHiJkLmNoP";
2091 
2092  int i;
2093  uint8_t *found = NULL;
2094  printf("\nStats for text of greater length:\n");
2095  for (i = 0; i < 16; i++) {
2096  printf("Pattern length %d with BasicSearch:", i+1);
2097  found = BasicSearchNocaseWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2098  if (found == 0) {
2099  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
2100  return 0;
2101  }
2102  printf("Pattern length %d with Bs2BmSearch:", i+1);
2103  found = Bs2bmNocaseWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2104  if (found == 0) {
2105  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
2106  return 0;
2107  }
2108  printf("Pattern length %d with BoyerMooreSearch:", i+1);
2109  found = BoyerMooreNocaseWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2110  if (found == 0) {
2111  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
2112  return 0;
2113  }
2114  printf("\n");
2115  }
2116  return 1;
2117 }
2118 
2119 static int UtilSpmNocaseSearchStatsTest02(void)
2120 {
2121  char *text[16];
2122  text[0]="zzzzzzzzzzzzzzzzzza";
2123  text[1]="zzzzzzzzzzzzzzzzzzaB";
2124  text[2]="zzzzzzzzzzzzzzzzzzaBc";
2125  text[3]="zzzzzzzzzzzzzzzzzzaBcD";
2126  text[4]="zzzzzzzzzzzzzzzzzzaBcDe";
2127  text[5]="zzzzzzzzzzzzzzzzzzzzaBcDeF";
2128  text[6]="zzzzzzzzzzzzzzzzzzzzaBcDeFg";
2129  text[7]="zzzzzzzzzzzzzzzzzzzzaBcDeFgH";
2130  text[8]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHi";
2131  text[9]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJ";
2132  text[10]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJk";
2133  text[11]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkL";
2134  text[12]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLm";
2135  text[13]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmN";
2136  text[14]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmNo";
2137  text[15]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmNoP";
2138 
2139  char *needle[16];
2140  needle[0]="a";
2141  needle[1]="aB";
2142  needle[2]="aBc";
2143  needle[3]="aBcD";
2144  needle[4]="aBcDe";
2145  needle[5]="aBcDeF";
2146  needle[6]="aBcDeFg";
2147  needle[7]="aBcDeFgH";
2148  needle[8]="aBcDeFgHi";
2149  needle[9]="aBcDeFgHiJ";
2150  needle[10]="aBcDeFgHiJk";
2151  needle[11]="aBcDeFgHiJkL";
2152  needle[12]="aBcDeFgHiJkLm";
2153  needle[13]="aBcDeFgHiJkLmN";
2154  needle[14]="aBcDeFgHiJkLmNo";
2155  needle[15]="aBcDeFgHiJkLmNoP";
2156 
2157  int i;
2158  uint8_t *found = NULL;
2159  printf("\nStats for text of lower length:\n");
2160  for (i = 0; i < 16; i++) {
2161  printf("Pattern length %d with BasicSearch:", i+1);
2162  found = BasicSearchNocaseWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2163  if (found == 0) {
2164  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
2165  return 0;
2166  }
2167  printf("Pattern length %d with Bs2BmSearch:", i+1);
2168  found = Bs2bmNocaseWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2169  if (found == 0) {
2170  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
2171  return 0;
2172  }
2173  printf("Pattern length %d with BoyerMooreSearch:", i+1);
2174  found = BoyerMooreNocaseWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2175  if (found == 0) {
2176  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
2177  return 0;
2178  }
2179  printf("\n");
2180  }
2181  return 1;
2182 }
2183 
2184 
2185 static int UtilSpmNocaseSearchStatsTest03(void)
2186 {
2187  char *text[16];
2188  text[0]="zzzzkzzzzzzzkzzzzzza";
2189  text[1]="BBBBkBBBBBBBkBBBBBaB";
2190  text[2]="BcBckcBcBcBckcBcBcaBc";
2191  text[3]="BcDBkDBcDBcDkcDBcDaBcD";
2192  text[4]="BcDekcDeBcDekcDezzaBcDe";
2193 
2194  char *needle[16];
2195  needle[0]="a";
2196  needle[1]="aB";
2197  needle[2]="aBc";
2198  needle[3]="aBcD";
2199  needle[4]="aBcDe";
2200 
2201  int i;
2202  uint8_t *found = NULL;
2203  printf("\nStats for text of lower length (badcase for):\n");
2204  for (i = 0; i < 5; i++) {
2205  printf("Pattern length %d with BasicSearch:", i+1);
2206  found = BasicSearchNocaseWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2207  if (found == 0) {
2208  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
2209  return 0;
2210  }
2211  printf("Pattern length %d with Bs2BmSearch:", i+1);
2212  found = Bs2bmNocaseWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2213  if (found == 0) {
2214  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
2215  return 0;
2216  }
2217  printf("Pattern length %d with BoyerMooreSearch:", i+1);
2218  found = BoyerMooreNocaseWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2219  if (found == 0) {
2220  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
2221  return 0;
2222  }
2223  printf("\n");
2224  }
2225  return 1;
2226 }
2227 
2228 /**
2229  * \test Give some stats for no case algorithms
2230  */
2231 static int UtilSpmNocaseSearchStatsTest04(void)
2232 {
2233  char *text[16];
2234  text[0]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzza";
2235  text[1]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaB";
2236  text[2]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBc";
2237  text[3]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcD";
2238  text[4]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDe";
2239  text[5]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeF";
2240  text[6]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFg";
2241  text[7]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgH";
2242  text[8]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHi";
2243  text[9]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJ";
2244  text[10]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJk";
2245  text[11]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkL";
2246  text[12]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLm";
2247  text[13]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmN";
2248  text[14]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmNo";
2249  text[15]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmNoP";
2250 
2251  char *needle[16];
2252  needle[0]="a";
2253  needle[1]="aB";
2254  needle[2]="aBc";
2255  needle[3]="aBcD";
2256  needle[4]="aBcDe";
2257  needle[5]="aBcDeF";
2258  needle[6]="aBcDeFg";
2259  needle[7]="aBcDeFgH";
2260  needle[8]="aBcDeFgHi";
2261  needle[9]="aBcDeFgHiJ";
2262  needle[10]="aBcDeFgHiJk";
2263  needle[11]="aBcDeFgHiJkL";
2264  needle[12]="aBcDeFgHiJkLm";
2265  needle[13]="aBcDeFgHiJkLmN";
2266  needle[14]="aBcDeFgHiJkLmNo";
2267  needle[15]="aBcDeFgHiJkLmNoP";
2268 
2269  int i;
2270  uint8_t *found = NULL;
2271  printf("\nStats for text of greater length:\n");
2272  for (i = 0; i < 16; i++) {
2273  printf("Pattern length %d with BasicSearch (Building Context):", i+1);
2274  found = BasicSearchNocaseCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2275  if (found == 0) {
2276  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
2277  return 0;
2278  }
2279  printf("Pattern length %d with Bs2BmSearch (Building Context):", i+1);
2280  found = Bs2bmNocaseCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2281  if (found == 0) {
2282  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
2283  return 0;
2284  }
2285  printf("Pattern length %d with BoyerMooreSearch (Building Context):", i+1);
2286  found = BoyerMooreNocaseCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2287  if (found == 0) {
2288  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
2289  return 0;
2290  }
2291  printf("\n");
2292  }
2293  return 1;
2294 }
2295 
2296 static int UtilSpmNocaseSearchStatsTest05(void)
2297 {
2298  char *text[16];
2299  text[0]="zzzzzzzzzzzzzzzzzza";
2300  text[1]="zzzzzzzzzzzzzzzzzzaB";
2301  text[2]="zzzzzzzzzzzzzzzzzzaBc";
2302  text[3]="zzzzzzzzzzzzzzzzzzaBcD";
2303  text[4]="zzzzzzzzzzzzzzzzzzaBcDe";
2304  text[5]="zzzzzzzzzzzzzzzzzzzzaBcDeF";
2305  text[6]="zzzzzzzzzzzzzzzzzzzzaBcDeFg";
2306  text[7]="zzzzzzzzzzzzzzzzzzzzaBcDeFgH";
2307  text[8]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHi";
2308  text[9]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJ";
2309  text[10]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJk";
2310  text[11]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkL";
2311  text[12]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLm";
2312  text[13]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmN";
2313  text[14]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmNo";
2314  text[15]="zzzzzzzzzzzzzzzzzzzzaBcDeFgHiJkLmNoP";
2315 
2316  char *needle[16];
2317  needle[0]="a";
2318  needle[1]="aB";
2319  needle[2]="aBc";
2320  needle[3]="aBcD";
2321  needle[4]="aBcDe";
2322  needle[5]="aBcDeF";
2323  needle[6]="aBcDeFg";
2324  needle[7]="aBcDeFgH";
2325  needle[8]="aBcDeFgHi";
2326  needle[9]="aBcDeFgHiJ";
2327  needle[10]="aBcDeFgHiJk";
2328  needle[11]="aBcDeFgHiJkL";
2329  needle[12]="aBcDeFgHiJkLm";
2330  needle[13]="aBcDeFgHiJkLmN";
2331  needle[14]="aBcDeFgHiJkLmNo";
2332  needle[15]="aBcDeFgHiJkLmNoP";
2333 
2334  int i;
2335  uint8_t *found = NULL;
2336  printf("\nStats for text of lower length:\n");
2337  for (i = 0; i < 16; i++) {
2338  printf("Pattern length %d with BasicSearch (Building Context):", i+1);
2339  found = BasicSearchNocaseCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2340  if (found == 0) {
2341  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
2342  return 0;
2343  }
2344  printf("Pattern length %d with Bs2BmSearch (Building Context):", i+1);
2345  found = Bs2bmNocaseCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2346  if (found == 0) {
2347  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
2348  return 0;
2349  }
2350  printf("Pattern length %d with BoyerMooreSearch (Building Context):", i+1);
2351  found = BoyerMooreNocaseCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2352  if (found == 0) {
2353  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
2354  return 0;
2355  }
2356  printf("\n");
2357  }
2358  return 1;
2359 }
2360 
2361 
2362 static int UtilSpmNocaseSearchStatsTest06(void)
2363 {
2364  char *text[16];
2365  text[0]="zzzzkzzzzzzzkzzzzzza";
2366  text[1]="BBBBkBBBBBBBkBBBBBaB";
2367  text[2]="BcBckcBcBcBckcBcBcaBc";
2368  text[3]="BcDBkDBcDBcDkcDBcDaBcD";
2369  text[4]="BcDekcDeBcDekcDezzaBcDe";
2370 
2371  char *needle[16];
2372  needle[0]="a";
2373  needle[1]="aB";
2374  needle[2]="aBc";
2375  needle[3]="aBcD";
2376  needle[4]="aBcDe";
2377 
2378  int i;
2379  uint8_t *found = NULL;
2380  printf("\nStats for text of lower length (badcase for):\n");
2381  for (i = 0; i < 5; i++) {
2382  printf("Pattern length %d with BasicSearch (Building Context):", i+1);
2383  found = BasicSearchNocaseCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2384  if (found == 0) {
2385  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
2386  return 0;
2387  }
2388  printf("Pattern length %d with Bs2BmSearch (Building Context):", i+1);
2389  found = Bs2bmNocaseCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2390  if (found == 0) {
2391  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
2392  return 0;
2393  }
2394  printf("Pattern length %d with BoyerMooreSearch (Building Context):", i+1);
2395  found = BoyerMooreNocaseCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2396  if (found == 0) {
2397  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
2398  return 0;
2399  }
2400  printf("\n");
2401  }
2402  return 1;
2403 }
2404 
2405 static int UtilSpmNocaseSearchStatsTest07(void)
2406 {
2407  char *text[16];
2408  text[0]="zzzza";
2409  text[1]="bbbAb";
2410  text[2]="bbAbC";
2411  text[3]="bAbCd";
2412  text[4]="AbCdE";
2413 
2414  char *needle[16];
2415  needle[0]="a";
2416  needle[1]="aB";
2417  needle[2]="aBc";
2418  needle[3]="aBcD";
2419  needle[4]="aBcDe";
2420 
2421  int i;
2422  uint8_t *found = NULL;
2423  printf("\nStats for text of real lower length (badcase for):\n");
2424  for (i = 0; i < 5; i++) {
2425  printf("Pattern length %d with BasicSearch (Building Context):", i+1);
2426  found = BasicSearchNocaseCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2427  if (found == 0) {
2428  printf("Error1 searching for %s in text %s\n", needle[i], text[i]);
2429  return 0;
2430  }
2431  printf("Pattern length %d with Bs2BmSearch (Building Context):", i+1);
2432  found = Bs2bmNocaseCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2433  if (found == 0) {
2434  printf("Error2 searching for %s in text %s\n", needle[i], text[i]);
2435  return 0;
2436  }
2437  printf("Pattern length %d with BoyerMooreSearch (Building Context):", i+1);
2438  found = BoyerMooreNocaseCtxWrapper((uint8_t *)text[i], (uint8_t *)needle[i], STATS_TIMES);
2439  if (found == 0) {
2440  printf("Error3 searching for %s in text %s\n", needle[i], text[i]);
2441  return 0;
2442  }
2443  printf("\n");
2444  }
2445  return 1;
2446 }
2447 #endif
2448 
2449 /* Unit tests for new SPM API. */
2450 
2451 #define SPM_NO_MATCH UINT32_MAX
2453 /* Helper structure describing a particular search. */
2454 typedef struct SpmTestData_ {
2455  const char *needle;
2456  uint16_t needle_len;
2457  const char *haystack;
2458  uint16_t haystack_len;
2459  int nocase;
2460  uint32_t match_offset; /* offset in haystack, or SPM_NO_MATCH. */
2462 
2463 /* Helper function to conduct a search with a particular SPM matcher. */
2464 static int SpmTestSearch(const SpmTestData *d, uint8_t matcher)
2465 {
2466  int ret = 1;
2467  SpmGlobalThreadCtx *global_thread_ctx = NULL;
2468  SpmThreadCtx *thread_ctx = NULL;
2469  SpmCtx *ctx = NULL;
2470  uint8_t *found = NULL;
2471 
2472  global_thread_ctx = SpmInitGlobalThreadCtx(matcher);
2473  if (global_thread_ctx == NULL) {
2474  ret = 0;
2475  goto exit;
2476  }
2477 
2478  ctx = SpmInitCtx((const uint8_t *)d->needle, d->needle_len, d->nocase,
2479  global_thread_ctx);
2480  if (ctx == NULL) {
2481  ret = 0;
2482  goto exit;
2483  }
2484 
2485  thread_ctx = SpmMakeThreadCtx(global_thread_ctx);
2486  if (thread_ctx == NULL) {
2487  ret = 0;
2488  goto exit;
2489  }
2490 
2491  found = SpmScan(ctx, thread_ctx, (const uint8_t *)d->haystack,
2492  d->haystack_len);
2493  if (found == NULL) {
2494  if (d->match_offset != SPM_NO_MATCH) {
2495  printf(" should have matched at %" PRIu32 " but didn't\n",
2496  d->match_offset);
2497  ret = 0;
2498  }
2499  } else {
2500  uint32_t offset = (uint32_t)(found - (const uint8_t *)d->haystack);
2501  if (offset != d->match_offset) {
2502  printf(" should have matched at %" PRIu32
2503  " but matched at %" PRIu32 "\n",
2504  d->match_offset, offset);
2505  ret = 0;
2506  }
2507  }
2508 
2509 exit:
2510  SpmDestroyCtx(ctx);
2511  SpmDestroyThreadCtx(thread_ctx);
2512  SpmDestroyGlobalThreadCtx(global_thread_ctx);
2513  return ret;
2514 }
2515 
2516 static int SpmSearchTest01(void) {
2517  SpmTableSetup();
2518  printf("\n");
2519 
2520  /* Each of the following tests will be run against every registered SPM
2521  * algorithm. */
2522 
2523  static const SpmTestData data[] = {
2524  /* Some trivial single-character case/nocase tests */
2525  {"a", 1, "a", 1, 0, 0},
2526  {"a", 1, "A", 1, 1, 0},
2527  {"A", 1, "A", 1, 0, 0},
2528  {"A", 1, "a", 1, 1, 0},
2529  {"a", 1, "A", 1, 0, SPM_NO_MATCH},
2530  {"A", 1, "a", 1, 0, SPM_NO_MATCH},
2531  /* Nulls and odd characters */
2532  {"\x00", 1, "test\x00test", 9, 0, 4},
2533  {"\x00", 1, "testtest", 8, 0, SPM_NO_MATCH},
2534  {"\n", 1, "new line\n", 9, 0, 8},
2535  {"\n", 1, "new line\x00\n", 10, 0, 9},
2536  {"\xff", 1, "abcdef\xff", 7, 0, 6},
2537  {"\xff", 1, "abcdef\xff", 7, 1, 6},
2538  {"$", 1, "dollar$", 7, 0, 6},
2539  {"^", 1, "caret^", 6, 0, 5},
2540  /* Longer literals */
2541  {"Suricata", 8, "This is a Suricata test", 23, 0, 10},
2542  {"Suricata", 8, "This is a suricata test", 23, 1, 10},
2543  {"Suricata", 8, "This is a suriCATA test", 23, 1, 10},
2544  {"suricata", 8, "This is a Suricata test", 23, 0, SPM_NO_MATCH},
2545  {"Suricata", 8, "This is a Suricat_ test", 23, 0, SPM_NO_MATCH},
2546  {"Suricata", 8, "This is a _uricata test", 23, 0, SPM_NO_MATCH},
2547  /* First occurrence with the correct case should match */
2548  {"foo", 3, "foofoofoo", 9, 0, 0},
2549  {"foo", 3, "_foofoofoo", 9, 0, 1},
2550  {"FOO", 3, "foofoofoo", 9, 1, 0},
2551  {"FOO", 3, "_foofoofoo", 9, 1, 1},
2552  {"FOO", 3, "foo Foo FOo fOo foO FOO", 23, 0, 20},
2553  {"foo", 3, "Foo FOo fOo foO FOO foo", 23, 0, 20},
2554  };
2555 
2556  int ret = 1;
2557 
2558  uint8_t matcher;
2559  for (matcher = 0; matcher < SPM_TABLE_SIZE; matcher++) {
2560  const SpmTableElmt *m = &spm_table[matcher];
2561  if (m->name == NULL) {
2562  continue;
2563  }
2564  printf("matcher: %s\n", m->name);
2565 
2566  uint32_t i;
2567  for (i = 0; i < sizeof(data)/sizeof(data[0]); i++) {
2568  const SpmTestData *d = &data[i];
2569  if (SpmTestSearch(d, matcher) == 0) {
2570  printf(" test %" PRIu32 ": fail\n", i);
2571  ret = 0;
2572  }
2573  }
2574  printf(" %" PRIu32 " tests passed\n", i);
2575  }
2576 
2577  return ret;
2578 }
2579 
2580 static int SpmSearchTest02(void) {
2581  SpmTableSetup();
2582  printf("\n");
2583 
2584  /* Test that we can find needles of various lengths at various alignments
2585  * in the haystack. Note that these are passed to strlen. */
2586 
2587  static const char* needles[] = {
2588  /* Single bytes */
2589  "a", "b", "c", ":", "/", "\x7f", "\xff",
2590  /* Repeats */
2591  "aa", "aaa", "aaaaaaaaaaaaaaaaaaaaaaa",
2592  /* Longer literals */
2593  "suricata", "meerkat", "aardvark", "raptor", "marmot", "lemming",
2594  /* Mixed case */
2595  "Suricata", "CAPS LOCK", "mIxEd cAsE",
2596  };
2597 
2598  int ret = 1;
2599 
2600  uint8_t matcher;
2601  for (matcher = 0; matcher < SPM_TABLE_SIZE; matcher++) {
2602  const SpmTableElmt *m = &spm_table[matcher];
2603  if (m->name == NULL) {
2604  continue;
2605  }
2606  printf("matcher: %s\n", m->name);
2607 
2608  SpmTestData d;
2609 
2610  uint32_t i;
2611  for (i = 0; i < sizeof(needles) / sizeof(needles[0]); i++) {
2612  const char *needle = needles[i];
2613  uint16_t prefix;
2614  for (prefix = 0; prefix < 32; prefix++) {
2615  d.needle = needle;
2616  d.needle_len = (uint16_t)strlen(needle);
2617  uint16_t haystack_len = prefix + d.needle_len;
2618  char *haystack = SCMalloc(haystack_len);
2619  if (haystack == NULL) {
2620  printf("alloc failure\n");
2621  return 0;
2622  }
2623  memset(haystack, ' ', haystack_len);
2624  memcpy(haystack + prefix, d.needle, d.needle_len);
2625  d.haystack = haystack;
2626  d.haystack_len = haystack_len;
2627  d.nocase = 0;
2628  d.match_offset = prefix;
2629 
2630  /* Case-sensitive scan */
2631  if (SpmTestSearch(&d, matcher) == 0) {
2632  printf(" test %" PRIu32 ": fail (case-sensitive)\n", i);
2633  ret = 0;
2634  }
2635 
2636  /* Case-insensitive scan */
2637  d.nocase = 1;
2638  uint16_t j;
2639  for (j = 0; j < haystack_len; j++) {
2640  haystack[j] = u8_toupper(haystack[j]);
2641  }
2642  if (SpmTestSearch(&d, matcher) == 0) {
2643  printf(" test %" PRIu32 ": fail (case-insensitive)\n", i);
2644  ret = 0;
2645  }
2646 
2647  SCFree(haystack);
2648  }
2649  }
2650  printf(" %" PRIu32 " tests passed\n", i);
2651  }
2652 
2653  return ret;
2654 }
2655 
2656 /* Register unittests */
2658 {
2659  /* Generic tests */
2660  UtRegisterTest("UtilSpmBasicSearchTest01", UtilSpmBasicSearchTest01);
2661  UtRegisterTest("UtilSpmBasicSearchNocaseTest01",
2662  UtilSpmBasicSearchNocaseTest01);
2663 
2664  UtRegisterTest("UtilSpmBs2bmSearchTest01", UtilSpmBs2bmSearchTest01);
2665  UtRegisterTest("UtilSpmBs2bmSearchNocaseTest01",
2666  UtilSpmBs2bmSearchNocaseTest01);
2667 
2668  UtRegisterTest("UtilSpmBoyerMooreSearchTest01",
2669  UtilSpmBoyerMooreSearchTest01);
2670  UtRegisterTest("UtilSpmBoyerMooreSearchNocaseTest01",
2671  UtilSpmBoyerMooreSearchNocaseTest01);
2672  UtRegisterTest("UtilSpmBoyerMooreSearchNocaseTestIssue130",
2673  UtilSpmBoyerMooreSearchNocaseTestIssue130);
2674 
2675  UtRegisterTest("UtilSpmBs2bmSearchTest02", UtilSpmBs2bmSearchTest02);
2676  UtRegisterTest("UtilSpmBs2bmSearchNocaseTest02",
2677  UtilSpmBs2bmSearchNocaseTest02);
2678 
2679  UtRegisterTest("UtilSpmBasicSearchTest02", UtilSpmBasicSearchTest02);
2680  UtRegisterTest("UtilSpmBasicSearchNocaseTest02",
2681  UtilSpmBasicSearchNocaseTest02);
2682 
2683  UtRegisterTest("UtilSpmBoyerMooreSearchTest02",
2684  UtilSpmBoyerMooreSearchTest02);
2685  UtRegisterTest("UtilSpmBoyerMooreSearchNocaseTest02",
2686  UtilSpmBoyerMooreSearchNocaseTest02);
2687 
2688  /* test matches at any offset */
2689  UtRegisterTest("UtilSpmSearchOffsetsTest01", UtilSpmSearchOffsetsTest01);
2690  UtRegisterTest("UtilSpmSearchOffsetsNocaseTest01",
2691  UtilSpmSearchOffsetsNocaseTest01);
2692 
2693  /* new SPM API */
2694  UtRegisterTest("SpmSearchTest01", SpmSearchTest01);
2695  UtRegisterTest("SpmSearchTest02", SpmSearchTest02);
2696 
2697 #ifdef ENABLE_SEARCH_STATS
2698  /* Give some stats searching given a prepared context (look at the wrappers) */
2699  UtRegisterTest("UtilSpmSearchStatsTest01", UtilSpmSearchStatsTest01);
2700  UtRegisterTest("UtilSpmSearchStatsTest02", UtilSpmSearchStatsTest02);
2701  UtRegisterTest("UtilSpmSearchStatsTest03", UtilSpmSearchStatsTest03);
2702 
2703  UtRegisterTest("UtilSpmNocaseSearchStatsTest01",
2704  UtilSpmNocaseSearchStatsTest01);
2705  UtRegisterTest("UtilSpmNocaseSearchStatsTest02",
2706  UtilSpmNocaseSearchStatsTest02);
2707  UtRegisterTest("UtilSpmNocaseSearchStatsTest03",
2708  UtilSpmNocaseSearchStatsTest03);
2709 
2710  /* Stats building context and searching */
2711  UtRegisterTest("UtilSpmSearchStatsTest04", UtilSpmSearchStatsTest04);
2712  UtRegisterTest("UtilSpmSearchStatsTest05", UtilSpmSearchStatsTest05);
2713  UtRegisterTest("UtilSpmSearchStatsTest06", UtilSpmSearchStatsTest06);
2714  UtRegisterTest("UtilSpmSearchStatsTest07", UtilSpmSearchStatsTest07);
2715 
2716  UtRegisterTest("UtilSpmNocaseSearchStatsTest04",
2717  UtilSpmNocaseSearchStatsTest04);
2718  UtRegisterTest("UtilSpmNocaseSearchStatsTest05",
2719  UtilSpmNocaseSearchStatsTest05);
2720  UtRegisterTest("UtilSpmNocaseSearchStatsTest06",
2721  UtilSpmNocaseSearchStatsTest06);
2722  UtRegisterTest("UtilSpmNocaseSearchStatsTest07",
2723  UtilSpmNocaseSearchStatsTest07);
2724 
2725 #endif
2726 }
2727 #endif
Bs2BmBadchars
void Bs2BmBadchars(const uint8_t *needle, uint16_t needle_len, uint8_t *badchars)
Array setup function for Bs2Bm of bad characters index (not found at the needle)
Definition: util-spm-bs2bm.c:43
CLOCK_END
#define CLOCK_END
Definition: util-clock.h:34
offset
uint64_t offset
Definition: util-streaming-buffer.h:0
SinglePatternMatchDefaultMatcher
uint8_t SinglePatternMatchDefaultMatcher(void)
Returns the single pattern matcher algorithm to be used, based on the spm-algo setting in yaml.
Definition: util-spm.c:68
SpmTestData
struct SpmTestData_ SpmTestData
BoyerMooreCtxInit
BmCtx * BoyerMooreCtxInit(const uint8_t *needle, uint16_t needle_len)
Setup a Boyer Moore context.
Definition: util-spm-bm.c:78
UtRegisterTest
void UtRegisterTest(const char *name, int(*TestFn)(void))
Register unit test.
Definition: util-unittest.c:103
SpmTableElmt_::Scan
uint8_t *(* Scan)(const SpmCtx *ctx, SpmThreadCtx *thread_ctx, const uint8_t *haystack, uint32_t haystack_len)
Definition: util-spm.h:68
CLOCK_INIT
#define CLOCK_INIT
Definition: util-clock.h:31
SpmTestData_::haystack
const char * haystack
Definition: util-spm.c:2457
u8_toupper
#define u8_toupper(c)
Definition: suricata-common.h:437
SpmBMRegister
void SpmBMRegister(void)
Definition: util-spm-bm.c:475
SpmTableElmt_::InitCtx
SpmCtx *(* InitCtx)(const uint8_t *needle, uint16_t needle_len, int nocase, SpmGlobalThreadCtx *g_thread_ctx)
Definition: util-spm.h:65
ctx
struct Thresholds ctx
BoyerMooreNocase
uint8_t * BoyerMooreNocase(const uint8_t *x, const uint16_t m, const uint8_t *y, const uint32_t n, const BmCtx *bm_ctx)
Boyer Moore search algorithm Is better as the pattern length increases and for big buffers to search ...
Definition: util-spm-bm.c:338
SpmTableElmt_::MakeThreadCtx
SpmThreadCtx *(* MakeThreadCtx)(const SpmGlobalThreadCtx *g_thread_ctx)
Definition: util-spm.h:63
BoyerMooreSearch
uint8_t * BoyerMooreSearch(const uint8_t *text, uint32_t textlen, const uint8_t *needle, uint16_t needlelen)
Search a pattern in the text using Boyer Moore algorithm (build a bad character shifts array and good...
Definition: util-spm.c:232
SPM_TABLE_SIZE
@ SPM_TABLE_SIZE
Definition: util-spm.h:33
m
SCMutex m
Definition: flow-hash.h:6
SpmTestData_::nocase
int nocase
Definition: util-spm.c:2459
ALPHABET_SIZE
#define ALPHABET_SIZE
Definition: util-spm-bm.h:30
util-spm-bs.h
Bs2bmSearch
uint8_t * Bs2bmSearch(const uint8_t *text, uint32_t textlen, const uint8_t *needle, uint16_t needlelen)
Search a pattern in the text using the Bs2Bm algorithm (build a bad characters array)
Definition: util-spm.c:214
util-unittest.h
SPM_BM
@ SPM_BM
Definition: util-spm.h:30
UtilSpmSearchRegistertests
void UtilSpmSearchRegistertests(void)
Definition: util-spm.c:2657
SpmTestData_::needle
const char * needle
Definition: util-spm.c:2455
ConfGet
int ConfGet(const char *name, const char **vptr)
Retrieve the value of a configuration node.
Definition: conf.c:335
CLOCK_START
#define CLOCK_START
Definition: util-clock.h:32
util-debug.h
SpmInitGlobalThreadCtx
SpmGlobalThreadCtx * SpmInitGlobalThreadCtx(uint8_t matcher)
Definition: util-spm.c:138
BasicSearchNocase
uint8_t * BasicSearchNocase(const uint8_t *haystack, uint32_t haystack_len, const uint8_t *needle, uint16_t needle_len)
Basic search case less.
Definition: util-spm-bs.c:101
BoyerMoore
uint8_t * BoyerMoore(const uint8_t *x, const uint16_t m, const uint8_t *y, const uint32_t n, const BmCtx *bm_ctx)
Boyer Moore search algorithm Is better as the pattern length increases and for big buffers to search ...
Definition: util-spm-bm.c:300
SpmTableSetup
void SpmTableSetup(void)
Definition: util-spm.c:122
BmCtx_
Definition: util-spm-bm.h:33
BUG_ON
#define BUG_ON(x)
Definition: suricata-common.h:300
SpmTableElmt_::InitGlobalThreadCtx
SpmGlobalThreadCtx *(* InitGlobalThreadCtx)(void)
Definition: util-spm.h:61
BasicSearch
uint8_t * BasicSearch(const uint8_t *haystack, uint32_t haystack_len, const uint8_t *needle, uint16_t needle_len)
Basic search improved. Limits are better handled, so it doesn't start searches that wont fit in the r...
Definition: util-spm-bs.c:47
SpmScan
uint8_t * SpmScan(const SpmCtx *ctx, SpmThreadCtx *thread_ctx, const uint8_t *haystack, uint32_t haystack_len)
Definition: util-spm.c:193
Bs2Bm
uint8_t * Bs2Bm(const uint8_t *haystack, uint32_t haystack_len, const uint8_t *needle, uint16_t needle_len, const uint8_t badchars[])
Basic search with a bad characters array. The array badchars contains flags at character's ascii inde...
Definition: util-spm-bs2bm.c:69
conf.h
SpmMakeThreadCtx
SpmThreadCtx * SpmMakeThreadCtx(const SpmGlobalThreadCtx *global_thread_ctx)
Definition: util-spm.c:153
util-clock.h
BoyerMooreNocaseSearch
uint8_t * BoyerMooreNocaseSearch(const uint8_t *text, uint32_t textlen, uint8_t *needle, uint16_t needlelen)
Search a pattern in the text using Boyer Moore nocase algorithm (build a bad character shifts array a...
Definition: util-spm.c:252
SCLogInfo
#define SCLogInfo(...)
Macro used to log INFORMATIONAL messages.
Definition: util-debug.h:224
SpmDestroyGlobalThreadCtx
void SpmDestroyGlobalThreadCtx(SpmGlobalThreadCtx *global_thread_ctx)
Definition: util-spm.c:144
SpmGlobalThreadCtx_::matcher
uint8_t matcher
Definition: util-spm.h:48
SpmCtx_
Definition: util-spm.h:40
SPM_NO_MATCH
#define SPM_NO_MATCH
Definition: util-spm.c:2451
SpmDestroyThreadCtx
void SpmDestroyThreadCtx(SpmThreadCtx *thread_ctx)
Definition: util-spm.c:163
suricata-common.h
CLOCK_PRINT_SEC
#define CLOCK_PRINT_SEC
Definition: util-clock.h:36
SpmTableElmt_::DestroyCtx
void(* DestroyCtx)(SpmCtx *)
Definition: util-spm.h:67
util-spm.h
util-spm-bm.h
FatalError
#define FatalError(...)
Definition: util-debug.h:502
SpmTestData_
Definition: util-spm.c:2454
Bs2BmNocase
uint8_t * Bs2BmNocase(const uint8_t *haystack, uint32_t haystack_len, const uint8_t *needle, uint16_t needle_len, const uint8_t badchars[])
Basic search case less with a bad characters array. The array badchars contains flags at character's ...
Definition: util-spm-bs2bm.c:119
util-spm-hs.h
SpmGlobalThreadCtx_
Definition: util-spm.h:47
SCMalloc
#define SCMalloc(sz)
Definition: util-mem.h:47
SCLogError
#define SCLogError(...)
Macro used to log ERROR messages.
Definition: util-debug.h:261
SCFree
#define SCFree(p)
Definition: util-mem.h:61
util-spm-bs2bm.h
SpmTestData_::haystack_len
uint16_t haystack_len
Definition: util-spm.c:2458
SPM_HS
@ SPM_HS
Definition: util-spm.h:31
spm_table
SpmTableElmt spm_table[SPM_TABLE_SIZE]
Definition: util-spm.c:62
SpmTableElmt_
Definition: util-spm.h:59
SpmTestData_::needle_len
uint16_t needle_len
Definition: util-spm.c:2456
SpmTestData_::match_offset
uint32_t match_offset
Definition: util-spm.c:2460
SpmSearch
#define SpmSearch(text, textlen, needle, needlelen)
Definition: util-spm.h:99
SpmHSRegister
void SpmHSRegister(void)
SpmThreadCtx_::matcher
uint8_t matcher
Definition: util-spm.h:55
SpmDestroyCtx
void SpmDestroyCtx(SpmCtx *ctx)
Definition: util-spm.c:183
BoyerMooreNocaseCtxInit
BmCtx * BoyerMooreNocaseCtxInit(uint8_t *needle, uint16_t needle_len)
Setup a Boyer Moore context for nocase search.
Definition: util-spm-bm.c:105
SpmInitCtx
SpmCtx * SpmInitCtx(const uint8_t *needle, uint16_t needle_len, int nocase, SpmGlobalThreadCtx *global_thread_ctx)
Definition: util-spm.c:173
SpmTableElmt_::DestroyThreadCtx
void(* DestroyThreadCtx)(SpmThreadCtx *thread_ctx)
Definition: util-spm.h:64
BoyerMooreCtxDeInit
void BoyerMooreCtxDeInit(BmCtx *bmctx)
Free the memory allocated to Boyer Moore context.
Definition: util-spm-bm.c:119
SpmTableElmt_::DestroyGlobalThreadCtx
void(* DestroyGlobalThreadCtx)(SpmGlobalThreadCtx *g_thread_ctx)
Definition: util-spm.h:62
SpmThreadCtx_
Definition: util-spm.h:54