strtok_r для MinGW

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

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

Ответы на вопрос(4)

Реализация FreeBSD какая-нибудь польза для вас?

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

Решение Вопроса

а, здесь 'это тот, которыйс явным общественным достоянием:

/* 
 * 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's 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;
}

s исходный код, который вы можете просто добавить в свою собственную библиотеку / функцию в вашем проекте:

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;
}
 Claudix19 окт. 2012 г., 15:28
Эта реализация неЭто потокобезопасно, не так ли?
 simonc19 окт. 2012 г., 15:58
Это ваша собственная локальная реализация или это проект с открытым исходным кодом? Если это последнее, есть ли лицензия, связанная с его использованием?
 P.P.19 окт. 2012 г., 15:35
Это стандартная реализация strtok_r. Еслиstr это в куче, то это потокобезопасно.
 P.P.19 окт. 2012 г., 16:05
Исходный код libc. Это очень просто. Любой может реализовать, даже не глядя на источник. Я нене думаю, что тамЛюбая лицензия, связанная с этим.
 P.P.19 окт. 2012 г., 15:42
да, если вы хотите потокобезопасности.
 sashoalm19 окт. 2012 г., 15:41
Разумно ли ожидать, что str будет в куче? То есть требование является частью спецификации?
 Claudix19 окт. 2012 г., 20:14
(Продолжить) На самом деле, реализация, которую я разместил в своем ответе, не используетstrtok, На самом деле,strtok это частный случайstrtok_r который использует статически размещенный указатель, который я прокомментировал.
 simonc19 окт. 2012 г., 16:10
Извините если яЯ тусклый, но есть ли у вас ссылка на источник? Мне кажется маловероятным, что этобудет выпущен без какой-либо лицензии, но я ожидаю, что яБуду ошибаться :-)
 Claudix19 окт. 2012 г., 20:13
насколько мне известноstrtok хранит статически размещенный указатель на текущий токен. Каждый раз, когда вы звонитеstrtok прохождение ненулевогоdelim вы инициализируете этот указатель, так что вы можете повлиять на другой поток, который может использоватьstrtok в то же время ... Из спецификации OpenGroup: "Функция strtok () не обязательно должна быть реентерабельной. Функция, которая не требует повторного входа, не обязательно должна быть поточно-ориентированной. "(pubs.opengroup.org/onlinepubs/009695399/functions/strtok_r.html). Извините, если яЯ не прав.

strtok_r, Однако вы можете найти поточно-ориентированную реализацию по ссылке ниже:

http://www.raspberryginger.com/jbailey/minix/html/strtok__r_8c-source.html

Ваш ответ на вопрос