summaryrefslogtreecommitdiffstats
path: root/private/crt32/string/strtok.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/string/strtok.c')
-rw-r--r--private/crt32/string/strtok.c125
1 files changed, 125 insertions, 0 deletions
diff --git a/private/crt32/string/strtok.c b/private/crt32/string/strtok.c
new file mode 100644
index 000000000..8c51d4f94
--- /dev/null
+++ b/private/crt32/string/strtok.c
@@ -0,0 +1,125 @@
+/***
+*strtok.c - tokenize a string with given delimiters
+*
+* Copyright (c) 1989-1993, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* defines strtok() - breaks string into series of token
+* via repeated calls.
+*
+*Revision History:
+* 06-01-89 JCR C version created.
+* 02-27-90 GJF Fixed calling type, #include <cruntime.h>, fixed
+* copyright.
+* 08-14-90 SBM Removed now redundant #include <stddef.h>
+* 10-02-90 GJF New-style function declarator.
+* 07-17-91 GJF Multi-thread support for Win32 [_WIN32_].
+* 10-26-91 GJF Fixed nasty bug - search for end-of-token could run
+* off the end of the string.
+* 02-17-93 GJF Changed for new _getptd().
+* 05-21-93 GJF Used unsigned char pointers to access control and
+* source strings.
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <string.h>
+#ifdef MTHREAD
+#include <os2dll.h>
+#endif
+
+/***
+*char *strtok(string, control) - tokenize string with delimiter in control
+*
+*Purpose:
+* strtok considers the string to consist of a sequence of zero or more
+* text tokens separated by spans of one or more control chars. the first
+* call, with string specified, returns a pointer to the first char of the
+* first token, and will write a null char into string immediately
+* following the returned token. subsequent calls with zero for the first
+* argument (string) will work thru the string until no tokens remain. the
+* control string may be different from call to call. when no tokens remain
+* in string a NULL pointer is returned. remember the control chars with a
+* bit map, one bit per ascii char. the null char is always a control char.
+*
+*Entry:
+* char *string - string to tokenize, or NULL to get next token
+* char *control - string of characters to use as delimiters
+*
+*Exit:
+* returns pointer to first token in string, or if string
+* was NULL, to next token
+* returns NULL when no more tokens remain.
+*
+*Uses:
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+char * _CRTAPI1 strtok (
+ char * string,
+ const char * control
+ )
+{
+ unsigned char *str = string;
+ const unsigned char *ctrl = control;
+
+ unsigned char map[32];
+ int count;
+ char *token;
+
+#ifdef MTHREAD
+ _ptiddata ptd = _getptd();
+#else
+ static char *nextoken;
+#endif
+
+ /* Clear control map */
+ for (count = 0; count < 32; count++)
+ map[count] = 0;
+
+ /* Set bits in delimiter table */
+ do {
+ map[*ctrl >> 3] |= (1 << (*ctrl & 7));
+ } while (*ctrl++);
+
+ /* If string==NULL, continue with previous string */
+ if (!str)
+
+#ifdef MTHREAD
+ str = ptd->_token;
+#else
+ str = nextoken;
+#endif
+
+ /* Find beginning of token (skip over leading delimiters). Note that
+ * there is no token iff this loop sets string to point to the terminal
+ * null (*string == '\0') */
+ while ( (map[*str >> 3] & (1 << (*str & 7))) && *str )
+ str++;
+
+ token = str;
+
+ /* Find the end of the token. If it is not the end of the string,
+ * put a null there. */
+ for ( ; *str ; str++ )
+ if ( map[*str >> 3] & (1 << (*str & 7)) ) {
+ *str++ = '\0';
+ break;
+ }
+
+ /* Update nextoken (or the corresponding field in the per-thread data
+ * structure */
+#ifdef MTHREAD
+ ptd->_token = str;
+#else
+ nextoken = str;
+#endif
+
+ /* Determine if a token has been found. */
+ if ( token == str )
+ return NULL;
+ else
+ return token;
+}