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