1 //===-- Implementation of strtok ------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "src/string/strtok.h" 10 11 #include "src/__support/common.h" 12 #include "utils/CPP/Bitset.h" 13 14 namespace __llvm_libc { 15 16 static char *strtok_str = nullptr; 17 18 char *LLVM_LIBC_ENTRYPOINT(strtok)(char *src, const char *delimiter_string) { 19 cpp::Bitset<256> delimiter_set; 20 for (; *delimiter_string; ++delimiter_string) 21 delimiter_set.set(*delimiter_string); 22 23 src = src ? src : strtok_str; 24 for (; *src && delimiter_set.test(*src); ++src) 25 ; 26 if (!*src) { 27 strtok_str = src; 28 return nullptr; 29 } 30 char *token = src; 31 for (; *src && !delimiter_set.test(*src); ++src) 32 ; 33 34 strtok_str = src; 35 if (*strtok_str) { 36 *strtok_str = '\0'; 37 ++strtok_str; 38 } 39 return token; 40 } 41 42 } // namespace __llvm_libc 43