diff --git a/source/cpu_id.cc b/source/cpu_id.cc index 535c4e9e9..8ad35acb1 100644 --- a/source/cpu_id.cc +++ b/source/cpu_id.cc @@ -53,6 +53,11 @@ extern "C" { #define SAFEBUFFERS #endif +#if defined(_MSC_VER) +// MSVC provides strtok_s which is functionally equivalent to strtok_r. +#define strtok_r strtok_s +#endif + // cpu_info_ variable for SIMD instruction sets detected. LIBYUV_API int cpu_info_ = 0; @@ -330,16 +335,17 @@ LIBYUV_API SAFEBUFFERS int RiscvCpuCaps(const char* cpuinfo_name) { // supervisor-level extensions. extensions = strpbrk(isa, "zxs"); if (extensions) { + extensions_len = strlen(extensions); // Multi-letter extensions are seperated by a single underscore // as described in RISC-V User-Level ISA V2.2. - char* ext = strtok(extensions, "_"); - extensions_len = strlen(extensions); + char* saveptr = NULL; + char* ext = strtok_r(extensions, "_", &saveptr); while (ext) { // Search for the ZVFH (Vector FP16) extension. if (!strcmp(ext, "zvfh")) { flag |= kCpuHasRVVZVFH; } - ext = strtok(NULL, "_"); + ext = strtok_r(NULL, "_", &saveptr); } } std_isa_len = isa_len - extensions_len - 5;