blob: 19d9133c15e7df5b7c37a3fc45c36a992eed0d42 [file] [log] [blame]
//===-- Implementation of strtok ------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/string/strtok.h"
#include "src/__support/common.h"
#include "utils/CPP/Bitset.h"
namespace __llvm_libc {
static char *strtok_str = nullptr;
char *LLVM_LIBC_ENTRYPOINT(strtok)(char *src, const char *delimiter_string) {
cpp::Bitset<256> delimiter_set;
for (; *delimiter_string; ++delimiter_string)
delimiter_set.set(*delimiter_string);
src = src ? src : strtok_str;
for (; *src && delimiter_set.test(*src); ++src)
;
if (!*src) {
strtok_str = src;
return nullptr;
}
char *token = src;
for (; *src && !delimiter_set.test(*src); ++src)
;
strtok_str = src;
if (*strtok_str) {
*strtok_str = '\0';
++strtok_str;
}
return token;
}
} // namespace __llvm_libc