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