//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information. 
//

/*++



Module Name:

    stringtls.cpp

Abstract:

    Implementation of the string functions in the C runtime library that
    are Windows specific and depend on per-thread data



--*/

#include "pal/thread.hpp"
#include "pal/dbgmsg.h"

#include <string.h>
#include <ctype.h>
#include <pthread.h>
#include <limits.h>
#include <unistd.h>

using namespace CorUnix;

SET_DEFAULT_DEBUG_CHANNEL(CRT);

/*++
Function:
   PAL_strtok

Finds the next token in a string.

Return value:

A pointer to the next token found in strToken.  Returns NULL when no more 
tokens are found.  Each call modifies strToken by substituting a NULL 
character for each delimiter that is encountered.

Parameters:
strToken        String cotaining token(s)
strDelimit      Set of delimiter characters

Remarks:
In FreeBSD, strtok is not re-entrant, strtok_r is.  It manages re-entrancy 
by using a passed-in context pointer (which will be stored in thread local
storage)  According to the strtok MSDN documentation, "Calling these functions
simultaneously from multiple threads does not have undesirable effects", so
we need to use strtok_r.
--*/
char *
__cdecl
PAL_strtok(char *strToken, const char *strDelimit)
{
    CPalThread *pThread = NULL;
    char *retval=NULL;

    PERF_ENTRY(strtok);
    ENTRY("strtok (strToken=%p (%s), strDelimit=%p (%s))\n", 
          strToken?strToken:"NULL", 
          strToken?strToken:"NULL", strDelimit?strDelimit:"NULL", strDelimit?strDelimit:"NULL");

    pThread = InternalGetCurrentThread();

    retval = strtok_r(strToken, strDelimit, &pThread->crtInfo.strtokContext);
 
    LOGEXIT("strtok returns %p (%s)\n", retval?retval:"NULL", retval?retval:"NULL");
    PERF_EXIT(strtok);
    
    return retval;
}
