/*1* Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 20092* The President and Fellows of Harvard College.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12* 3. Neither the name of the University nor the names of its contributors13* may be used to endorse or promote products derived from this software14* without specific prior written permission.15*16* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND17* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE18* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE19* ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE20* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL21* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS22* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)23* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT24* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY25* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF26* SUCH DAMAGE.27*/2829/*30* This file is shared between libc and the kernel, so don't put anything31* in here that won't work in both contexts.32*/3334#ifdef _KERNEL35#include <types.h>36#include <lib.h>37#else38#include <string.h>39#endif4041/*42* Standard C string function: tokenize a string splitting based on a43* list of separator characters. Reentrant version.44*45* The "context" argument should point to a "char *" that is preserved46* between calls to strtok_r that wish to operate on same string.47*/48char *49strtok_r(char *string, const char *seps, char **context)50{51char *head; /* start of word */52char *tail; /* end of word */5354/* If we're starting up, initialize context */55if (string) {56*context = string;57}5859/* Get potential start of this next word */60head = *context;61if (head == NULL) {62return NULL;63}6465/* Skip any leading separators */66while (*head && strchr(seps, *head)) {67head++;68}6970/* Did we hit the end? */71if (*head == 0) {72/* Nothing left */73*context = NULL;74return NULL;75}7677/* skip over word */78tail = head;79while (*tail && !strchr(seps, *tail)) {80tail++;81}8283/* Save head for next time in context */84if (*tail == 0) {85*context = NULL;86}87else {88*tail = 0;89tail++;90*context = tail;91}9293/* Return current word */94return head;95}969798