summaryrefslogtreecommitdiff
path: root/imap/src/ansilib/strtok.c
diff options
context:
space:
mode:
Diffstat (limited to 'imap/src/ansilib/strtok.c')
-rw-r--r--imap/src/ansilib/strtok.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/imap/src/ansilib/strtok.c b/imap/src/ansilib/strtok.c
new file mode 100644
index 00000000..973ba4e7
--- /dev/null
+++ b/imap/src/ansilib/strtok.c
@@ -0,0 +1,67 @@
+/* ========================================================================
+ * Copyright 1988-2007 University of Washington
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *
+ * ========================================================================
+ */
+
+/*
+ * Program: String return successive tokens
+ *
+ * Author: Mark Crispin
+ * Networks and Distributed Computing
+ * Computing & Communications
+ * University of Washington
+ * Administration Building, AG-44
+ * Seattle, WA 98195
+ *
+ * Date: 11 May 1989
+ * Last Edited: 30 January 2007
+ */
+
+/* Find token in string
+ * Accepts: source pointer or NIL to use previous source
+ * vector of token delimiters pointer
+ * Returns: pointer to next token
+ */
+
+static char *state = NIL; /* string to locate tokens */
+
+char *strtok (char *s,char *ct)
+{
+ return strtok_r (s,ct,&state);/* jacket into reentrant routine */
+}
+
+
+/* Find token in string (reentrant)
+ * Accepts: source pointer or NIL to use previous source
+ * vector of token delimiters pointer
+ * returned state pointer
+ * Returns: pointer to next token
+ */
+
+char *strtok_r (char *s,char *ct,char **r)
+{
+ char *t,*ts;
+ if (!s) s = *r; /* use previous token if none specified */
+ *r = NIL; /* default to no returned state */
+ if (!(s && *s)) return NIL; /* no tokens left */
+ /* find any leading delimiters */
+ do for (t = ct, ts = NIL; *t; t++) if (*t == *s) {
+ if (*(ts = ++s)) break; /* yes, restart search if more in string */
+ return NIL; /* else no more tokens */
+ } while (ts); /* continue until no more leading delimiters */
+ /* can we find a new delimiter? */
+ for (ts = s; *ts; ts++) for (t = ct; *t; t++) if (*t == *ts) {
+ *ts++ = '\0'; /* yes, tie off token at that point */
+ *r = ts; /* save subsequent tokens for future call */
+ return s; /* return our token */
+ }
+ return s; /* return final token */
+}