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