Подтвердить что ты не робот

Strtok_r для MinGW

strtok_r является реентерабельным вариантом strtok. Это POSIX-совместимый. Тем не менее, он отсутствует в MinGW, и я пытаюсь скомпилировать программу, которая ее использует.

Можно ли добавить стандартную реализацию этой функции, возможно, в собственный код проекта или в стандартные функции библиотеки MinGW?

4b9b3361

Ответ 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?

Его лицензированная лицензия, но ее интеграция может иметь некоторые требования к вашей проектной документации (добавление подтверждения того, что код был включен).