1*d080635bScgyurgyik //===-- Implementation of strstr ------------------------------------------===//
2*d080635bScgyurgyik //
3*d080635bScgyurgyik // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*d080635bScgyurgyik // See https://llvm.org/LICENSE.txt for license information.
5*d080635bScgyurgyik // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*d080635bScgyurgyik //
7*d080635bScgyurgyik //===----------------------------------------------------------------------===//
8*d080635bScgyurgyik 
9*d080635bScgyurgyik #include "src/string/strstr.h"
10*d080635bScgyurgyik 
11*d080635bScgyurgyik #include "src/__support/common.h"
12*d080635bScgyurgyik #include <stddef.h>
13*d080635bScgyurgyik 
14*d080635bScgyurgyik namespace __llvm_libc {
15*d080635bScgyurgyik 
16*d080635bScgyurgyik // TODO: This is a simple brute force implementation. This can be
17*d080635bScgyurgyik // improved upon using well known string matching algorithms.
18*d080635bScgyurgyik char *LLVM_LIBC_ENTRYPOINT(strstr)(const char *haystack, const char *needle) {
19*d080635bScgyurgyik   for (size_t i = 0; haystack[i]; ++i) {
20*d080635bScgyurgyik     size_t j;
21*d080635bScgyurgyik     for (j = 0; haystack[i + j] && haystack[i + j] == needle[j]; ++j)
22*d080635bScgyurgyik       ;
23*d080635bScgyurgyik     if (!needle[j])
24*d080635bScgyurgyik       return const_cast<char *>(haystack + i);
25*d080635bScgyurgyik   }
26*d080635bScgyurgyik   return nullptr;
27*d080635bScgyurgyik }
28*d080635bScgyurgyik 
29*d080635bScgyurgyik } // namespace __llvm_libc
30