114 lines
2.6 KiB
C
114 lines
2.6 KiB
C
/* wcstok( wchar_t *, const wchar_t * )
|
|
|
|
This file is part of the Public Domain C Library (PDCLib).
|
|
Permission is granted to use, modify, and / or redistribute at will.
|
|
*/
|
|
|
|
#include <wchar.h>
|
|
|
|
#ifndef REGTEST
|
|
|
|
wchar_t * wcstok( wchar_t * _PDCLIB_restrict s1,
|
|
const wchar_t * _PDCLIB_restrict s2,
|
|
wchar_t ** _PDCLIB_restrict ptr )
|
|
{
|
|
const wchar_t * p = s2;
|
|
|
|
if ( s1 != NULL )
|
|
{
|
|
/* new string */
|
|
*ptr = s1;
|
|
}
|
|
else
|
|
{
|
|
/* old string continued */
|
|
if ( *ptr == NULL )
|
|
{
|
|
/* No old string, no new string, nothing to do */
|
|
return NULL;
|
|
}
|
|
s1 = *ptr;
|
|
}
|
|
|
|
/* skipping leading s2 characters */
|
|
while ( *p && *s1 )
|
|
{
|
|
if ( *s1 == *p )
|
|
{
|
|
/* found seperator; skip and start over */
|
|
++s1;
|
|
p = s2;
|
|
continue;
|
|
}
|
|
++p;
|
|
}
|
|
|
|
if ( ! *s1 )
|
|
{
|
|
/* no more to parse */
|
|
return ( *ptr = NULL );
|
|
}
|
|
|
|
/* skipping non-s2 characters */
|
|
*ptr = s1;
|
|
while ( **ptr )
|
|
{
|
|
p = s2;
|
|
while ( *p )
|
|
{
|
|
if ( **ptr == *p++ )
|
|
{
|
|
/* found seperator; overwrite with '\0', position *ptr, return */
|
|
*(*ptr)++ = L'\0';
|
|
return s1;
|
|
}
|
|
}
|
|
++(*ptr);
|
|
}
|
|
|
|
/* parsed to end of string */
|
|
*ptr = NULL;
|
|
return s1;
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef TEST
|
|
#include "_PDCLIB_test.h"
|
|
|
|
int main( void )
|
|
{
|
|
// MinGW at least has a very nonconforming (different signature!) variety
|
|
// of wcstok
|
|
#ifndef REGTEST
|
|
wchar_t s[] = L"_a_bc__d_";
|
|
wchar_t* state = NULL;
|
|
wchar_t* tokres;
|
|
|
|
TESTCASE( ( tokres = wcstok( s, L"_", &state ) ) == &s[1] );
|
|
TESTCASE( s[1] == L'a' );
|
|
TESTCASE( s[2] == L'\0' );
|
|
TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == &s[3] );
|
|
TESTCASE( s[3] == L'b' );
|
|
TESTCASE( s[4] == L'c' );
|
|
TESTCASE( s[5] == L'\0' );
|
|
TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == &s[7] );
|
|
TESTCASE( s[6] == L'_' );
|
|
TESTCASE( s[7] == L'd' );
|
|
TESTCASE( s[8] == L'\0' );
|
|
TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == NULL );
|
|
wcscpy( s, L"ab_cd" );
|
|
TESTCASE( ( tokres = wcstok( s, L"_", &state ) ) == &s[0] );
|
|
TESTCASE( s[0] == L'a' );
|
|
TESTCASE( s[1] == L'b' );
|
|
TESTCASE( s[2] == L'\0' );
|
|
TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == &s[3] );
|
|
TESTCASE( s[3] == L'c' );
|
|
TESTCASE( s[4] == L'd' );
|
|
TESTCASE( s[5] == L'\0' );
|
|
TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == NULL );
|
|
#endif
|
|
return TEST_RESULTS;
|
|
}
|
|
#endif
|