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