all: prefer https: URLs
[gnulib.git] / tests / test-c-strstr.c
blob8f731f556b23105ede581819f91d003e419f22be
1 /* Test of searching in a string.
2 Copyright (C) 2007-2017 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17 /* Written by Bruno Haible <bruno@clisp.org>, 2007. */
19 #include <config.h>
21 #include "c-strstr.h"
23 #include <stdlib.h>
24 #include <string.h>
26 #include "macros.h"
28 int
29 main ()
32 const char input[] = "foo";
33 const char *result = c_strstr (input, "");
34 ASSERT (result == input);
38 const char input[] = "foo";
39 const char *result = c_strstr (input, "o");
40 ASSERT (result == input + 1);
44 const char input[] = "ABC ABCDAB ABCDABCDABDE";
45 const char *result = c_strstr (input, "ABCDABD");
46 ASSERT (result == input + 15);
50 const char input[] = "ABC ABCDAB ABCDABCDABDE";
51 const char *result = c_strstr (input, "ABCDABE");
52 ASSERT (result == NULL);
55 /* Check that a very long haystack is handled quickly if the needle is
56 short and occurs near the beginning. */
58 size_t repeat = 10000;
59 size_t m = 1000000;
60 const char *needle =
61 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
62 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
63 char *haystack = (char *) malloc (m + 1);
64 if (haystack != NULL)
66 memset (haystack, 'A', m);
67 haystack[0] = 'B';
68 haystack[m] = '\0';
70 for (; repeat > 0; repeat--)
72 ASSERT (c_strstr (haystack, needle) == haystack + 1);
75 free (haystack);
79 /* Check that a very long needle is discarded quickly if the haystack is
80 short. */
82 size_t repeat = 10000;
83 size_t m = 1000000;
84 const char *haystack =
85 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
86 "ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB";
87 char *needle = (char *) malloc (m + 1);
88 if (needle != NULL)
90 memset (needle, 'A', m);
91 needle[m] = '\0';
93 for (; repeat > 0; repeat--)
95 ASSERT (c_strstr (haystack, needle) == NULL);
98 free (needle);
102 /* Check that the asymptotic worst-case complexity is not quadratic. */
104 size_t m = 1000000;
105 char *haystack = (char *) malloc (2 * m + 2);
106 char *needle = (char *) malloc (m + 2);
107 if (haystack != NULL && needle != NULL)
109 const char *result;
111 memset (haystack, 'A', 2 * m);
112 haystack[2 * m] = 'B';
113 haystack[2 * m + 1] = '\0';
115 memset (needle, 'A', m);
116 needle[m] = 'B';
117 needle[m + 1] = '\0';
119 result = c_strstr (haystack, needle);
120 ASSERT (result == haystack + m);
122 free (needle);
123 free (haystack);
126 return 0;