Strtok_r для MinGW
strtok_r является реентерабельным вариантом strtok. Это POSIX-совместимый. Тем не менее, он отсутствует в MinGW, и я пытаюсь скомпилировать программу, которая ее использует.
Можно ли добавить стандартную реализацию этой функции, возможно, в собственный код проекта или в стандартные функции библиотеки MinGW?
Ответы
Ответ 1
Так как есть некоторые вопросы о лицензировании кода из другого ответа, здесь есть явно открытый домен:
/*
* public domain strtok_r() by Charlie Gordon
*
* from comp.lang.c 9/14/2007
*
* http://groups.google.com/group/comp.lang.c/msg/2ab1ecbb86646684
*
* (Declaration that it public domain):
* http://groups.google.com/group/comp.lang.c/msg/7c7b39328fefab9c
*/
char* strtok_r(
char *str,
const char *delim,
char **nextp)
{
char *ret;
if (str == NULL)
{
str = *nextp;
}
str += strspn(str, delim);
if (*str == '\0')
{
return NULL;
}
ret = str;
str += strcspn(str, delim);
if (*str)
{
*str++ = '\0';
}
*nextp = str;
return ret;
}
Ответ 2
Здесь исходный код, который вы можете просто добавить в свою собственную библиотеку/функцию в своем проекте:
char *strtok_r(char *str, const char *delim, char **save)
{
char *res, *last;
if( !save )
return strtok(str, delim);
if( !str && !(str = *save) )
return NULL;
last = str + strlen(str);
if( (*save = res = strtok(str, delim)) )
{
*save += strlen(res);
if( *save < last )
(*save)++;
else
*save = NULL;
}
return res;
}
Ответ 3
Используется ли реализация FreeBSD?
Его лицензированная лицензия, но ее интеграция может иметь некоторые требования к вашей проектной документации (добавление подтверждения того, что код был включен).
Ответ 4
MINGW не имеет реализации strtok_r
. Однако вы можете найти поточно-безопасную реализацию в ссылке ниже:
http://www.raspberryginger.com/jbailey/minix/html/strtok__r_8c-source.html