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