13527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner/*-
23527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * Copyright (c) 1998 Softweyr LLC.  All rights reserved.
33527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner *
43527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * strtok_r, from Berkeley strtok
53527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * Oct 13, 1998 by Wes Peters <wes@softweyr.com>
63527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner *
73527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * Copyright (c) 1988, 1993
83527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner *	The Regents of the University of California.  All rights reserved.
93527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner *
103527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * Redistribution and use in source and binary forms, with or without
113527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * modification, are permitted provided that the following conditions
123527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * are met:
133527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * 1. Redistributions of source code must retain the above copyright
143527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner *    notices, this list of conditions and the following disclaimer.
153527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * 2. Redistributions in binary form must reproduce the above copyright
163527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner *    notices, this list of conditions and the following disclaimer in the
173527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner *    documentation and/or other materials provided with the distribution.
183527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * 4. Neither the name of the University nor the names of its contributors
193527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner *    may be used to endorse or promote products derived from this software
203527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner *    without specific prior written permission.
213527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner *
223527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * THIS SOFTWARE IS PROVIDED BY SOFTWEYR LLC, THE REGENTS AND CONTRIBUTORS
233527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
243527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
253527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL SOFTWEYR LLC, THE
263527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * REGENTS, OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
273527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
283527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
293527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
303527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
313527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
323527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
333527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner */
343527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner
353527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner#include <sys/cdefs.h>
363527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner__FBSDID("$FreeBSD$");
373527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner
383527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner#include <wchar.h>
393527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner
403527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turnerwchar_t *
413527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turnerwcstok(wchar_t * __restrict s, const wchar_t * __restrict delim,
423527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner    wchar_t ** __restrict last)
433527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner{
443527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	const wchar_t *spanp;
453527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	wchar_t *tok;
463527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	wchar_t c, sc;
473527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner
483527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	if (s == NULL && (s = *last) == NULL)
493527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner		return (NULL);
503527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner
513527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	/*
523527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	 * Skip (span) leading delimiters (s += wcsspn(s, delim), sort of).
533527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	 */
543527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turnercont:
553527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	c = *s++;
563527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	for (spanp = delim; (sc = *spanp++) != L'\0';) {
573527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner		if (c == sc)
583527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner			goto cont;
593527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	}
603527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner
613527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	if (c == L'\0') {	/* no non-delimiter characters */
623527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner		*last = NULL;
633527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner		return (NULL);
643527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	}
653527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	tok = s - 1;
663527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner
673527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	/*
683527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	 * Scan token (scan for delimiters: s += wcscspn(s, delim), sort of).
693527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	 * Note that delim must have one NUL; we stop if we see that, too.
703527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	 */
713527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	for (;;) {
723527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner		c = *s++;
733527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner		spanp = delim;
743527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner		do {
753527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner			if ((sc = *spanp++) == c) {
763527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner				if (c == L'\0')
773527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner					s = NULL;
783527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner				else
793527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner					s[-1] = L'\0';
803527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner				*last = s;
813527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner				return (tok);
823527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner			}
833527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner		} while (sc != L'\0');
843527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	}
853527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner	/* NOTREACHED */
863527fd6f0df794207215790321824b7844cc712dDavid 'Digit' Turner}
87