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