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