strtok_r for MinGW

后端 未结 4 1857
独厮守ぢ
独厮守ぢ 2020-12-11 16:28

strtok_r is the reentrant variant of strtok. It is POSIX-conformant. However, it is missing from MinGW, and I\'m trying to compile a program that is using it.

Is the

相关标签:
4条回答
  • 2020-12-11 16:29

    Is the FreeBSD implementation any use to you?

    Its liberally licensed but integrating it may have some requirements on your project documentation (adding an acknowledgement that the code has been included).

    0 讨论(0)
  • 2020-12-11 16:39

    MINGW has no implementation of strtok_r. However you can find a thread-safe implementation in the link below:

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

    0 讨论(0)
  • 2020-12-11 16:48

    Since there are some license questions about the code from another answer, here's one that's explicitly public domain:

    /* 
     * 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;
    }
    
    0 讨论(0)
  • 2020-12-11 16:51

    Here's the source code which you can simply add to your own library/function in your project:

    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;
    }
    
    0 讨论(0)
提交回复
热议问题