summaryrefslogtreecommitdiff
path: root/src/pal/src/cruntime/stringtls.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pal/src/cruntime/stringtls.cpp')
-rw-r--r--src/pal/src/cruntime/stringtls.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/pal/src/cruntime/stringtls.cpp b/src/pal/src/cruntime/stringtls.cpp
new file mode 100644
index 0000000000..1504813f91
--- /dev/null
+++ b/src/pal/src/cruntime/stringtls.cpp
@@ -0,0 +1,78 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more 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;
+}