2000-02-18 03:39:52 +08:00
|
|
|
/*
|
|
|
|
FUNCTION
|
2005-10-29 05:21:08 +08:00
|
|
|
<<strtok>>, <<strtok_r>>, <<strsep>>---get next token from a string
|
2000-02-18 03:39:52 +08:00
|
|
|
|
|
|
|
INDEX
|
|
|
|
strtok
|
|
|
|
|
|
|
|
INDEX
|
|
|
|
strtok_r
|
|
|
|
|
2002-05-24 08:13:57 +08:00
|
|
|
INDEX
|
|
|
|
strsep
|
|
|
|
|
2017-11-30 16:20:06 +08:00
|
|
|
SYNOPSIS
|
2000-02-18 03:39:52 +08:00
|
|
|
#include <string.h>
|
* libc/sys/linux/include/netdb.h, libc/sys/linux/net/getaddrinfo.c,
libc/sys/linux/net/getnameinfo.c: Add restrict keyword to getnameinfo()
and getaddrinfo() to increase standards compliance and match glibc.
* libc/include/string.h, libc/string/memccpy.c, libc/string/memcpy.c,
libc/string/stpcpy.c, libc/string/stpncpy.c, libc/string/strcat.c,
libc/string/strncat.c, libc/string/strncpy.c, libc/string/strtok.c,
libc/string/strtok_r.c, libc/string/strxfrm.c
libc/machine/microblaze/strcpy.c, libc/machine/xscale/memcpy.c,
libc/machine/cris/memcpy.c: Add __restrict to prototype to
increase standards compliance.
2013-07-23 15:05:31 +08:00
|
|
|
char *strtok(char *restrict <[source]>,
|
2015-11-03 05:34:49 +08:00
|
|
|
const char *restrict <[delimiters]>);
|
* libc/sys/linux/include/netdb.h, libc/sys/linux/net/getaddrinfo.c,
libc/sys/linux/net/getnameinfo.c: Add restrict keyword to getnameinfo()
and getaddrinfo() to increase standards compliance and match glibc.
* libc/include/string.h, libc/string/memccpy.c, libc/string/memcpy.c,
libc/string/stpcpy.c, libc/string/stpncpy.c, libc/string/strcat.c,
libc/string/strncat.c, libc/string/strncpy.c, libc/string/strtok.c,
libc/string/strtok_r.c, libc/string/strxfrm.c
libc/machine/microblaze/strcpy.c, libc/machine/xscale/memcpy.c,
libc/machine/cris/memcpy.c: Add __restrict to prototype to
increase standards compliance.
2013-07-23 15:05:31 +08:00
|
|
|
char *strtok_r(char *restrict <[source]>,
|
|
|
|
const char *restrict <[delimiters]>,
|
2015-11-03 05:34:49 +08:00
|
|
|
char **<[lasts]>);
|
|
|
|
char *strsep(char **<[source_ptr]>, const char *<[delimiters]>);
|
2000-02-18 03:39:52 +08:00
|
|
|
|
|
|
|
DESCRIPTION
|
|
|
|
The <<strtok>> function is used to isolate sequential tokens in a
|
|
|
|
null-terminated string, <<*<[source]>>>. These tokens are delimited
|
|
|
|
in the string by at least one of the characters in <<*<[delimiters]>>>.
|
|
|
|
The first time that <<strtok>> is called, <<*<[source]>>> should be
|
|
|
|
specified; subsequent calls, wishing to obtain further tokens from
|
|
|
|
the same string, should pass a null pointer instead. The separator
|
2005-10-29 05:21:08 +08:00
|
|
|
string, <<*<[delimiters]>>>, must be supplied each time and may
|
2000-02-18 03:39:52 +08:00
|
|
|
change between calls.
|
|
|
|
|
|
|
|
The <<strtok>> function returns a pointer to the beginning of each
|
|
|
|
subsequent token in the string, after replacing the separator
|
2005-10-29 05:21:08 +08:00
|
|
|
character itself with a null character. When no more tokens remain,
|
2000-02-18 03:39:52 +08:00
|
|
|
a null pointer is returned.
|
|
|
|
|
|
|
|
The <<strtok_r>> function has the same behavior as <<strtok>>, except
|
2005-10-29 05:21:08 +08:00
|
|
|
a pointer to placeholder <<*<[lasts]>>> must be supplied by the caller.
|
2000-02-18 03:39:52 +08:00
|
|
|
|
2002-05-24 08:13:57 +08:00
|
|
|
The <<strsep>> function is similar in behavior to <<strtok>>, except
|
2005-10-29 05:21:08 +08:00
|
|
|
a pointer to the string pointer must be supplied <<<[source_ptr]>>> and
|
|
|
|
the function does not skip leading delimiters. When the string starts
|
|
|
|
with a delimiter, the delimiter is changed to the null character and
|
2002-05-24 08:13:57 +08:00
|
|
|
the empty string is returned. Like <<strtok_r>> and <<strtok>>, the
|
2005-10-29 05:21:08 +08:00
|
|
|
<<*<[source_ptr]>>> is updated to the next character following the
|
|
|
|
last delimiter found or NULL if the end of string is reached with
|
|
|
|
no more delimiters.
|
2002-05-24 08:13:57 +08:00
|
|
|
|
2000-02-18 03:39:52 +08:00
|
|
|
RETURNS
|
2002-05-24 08:13:57 +08:00
|
|
|
<<strtok>>, <<strtok_r>>, and <<strsep>> all return a pointer to the
|
|
|
|
next token, or <<NULL>> if no more tokens can be found. For
|
|
|
|
<<strsep>>, a token may be the empty string.
|
2000-02-18 03:39:52 +08:00
|
|
|
|
|
|
|
NOTES
|
2005-10-29 05:21:08 +08:00
|
|
|
<<strtok>> is unsafe for multi-threaded applications. <<strtok_r>>
|
|
|
|
and <<strsep>> are thread-safe and should be used instead.
|
2000-02-18 03:39:52 +08:00
|
|
|
|
|
|
|
PORTABILITY
|
|
|
|
<<strtok>> is ANSI C.
|
2002-05-24 08:13:57 +08:00
|
|
|
<<strtok_r>> is POSIX.
|
2005-10-29 05:21:08 +08:00
|
|
|
<<strsep>> is a BSD extension.
|
2000-02-18 03:39:52 +08:00
|
|
|
|
2002-05-24 08:13:57 +08:00
|
|
|
<<strtok>>, <<strtok_r>>, and <<strsep>> require no supporting OS subroutines.
|
2000-02-18 03:39:52 +08:00
|
|
|
|
|
|
|
QUICKREF
|
|
|
|
strtok ansi impure
|
|
|
|
*/
|
|
|
|
|
2001-03-03 07:16:33 +08:00
|
|
|
/* undef STRICT_ANSI so that strtok_r prototype will be defined */
|
|
|
|
#undef __STRICT_ANSI__
|
2000-02-18 03:39:52 +08:00
|
|
|
#include <string.h>
|
Add missing headers to fix implicit function defns
A few files were missing headers for memset/malloc, likely missed
because the files don't directly call the functions, rather they
come in via macros in libc/include/sys/reent.h:
#define _REENT_CHECK(var, what, type, size, init) do { \
struct _reent *_r = (var); \
if (_r->what == NULL) { \
_r->what = (type)malloc(size); \
#define _REENT_CHECK_ASCTIME_BUF(var) \
_REENT_CHECK(var, _asctime_buf, char *, _REENT_ASCTIME_SIZE, \
memset((var)->_asctime_buf, 0, _REENT_ASCTIME_SIZE))
Without these fixes, implicit function signatures are provided,
which gcc warns could cause aliasing issues down the line:
../../../../../../../newlib-2.5.0/newlib/libc/time/asctime.c:62:3: warning: type of 'memset' does not match original declaration [-Wlto-type-mismatch]
/Volumes/code/external/newlib-cygwin/newlib/libc/include/string.h:29:7: note: return value type mismatch
_PTR _EXFUN(memset,(_PTR, int, size_t));
^
/Volumes/code/external/newlib-cygwin/newlib/libc/include/string.h:29:7: note: 'memset' was previously declared here
/Volumes/code/external/newlib-cygwin/newlib/libc/include/string.h:29:7: note: code may be misoptimized unless -fno-strict-aliasing is used
../../../../../../../newlib-2.5.0/newlib/libc/time/asctime.c:62:3: warning: type of 'malloc' does not match original declaration [-Wlto-type-mismatch]
/Volumes/code/external/newlib-cygwin/newlib/libc/include/malloc.h:37:13: note: return value type mismatch
extern _PTR malloc _PARAMS ((size_t));
^
/Volumes/code/external/newlib-cygwin/newlib/libc/include/malloc.h:37:13: note: 'malloc' was previously declared here
/Volumes/code/external/newlib-cygwin/newlib/libc/include/malloc.h:37:13: note: code may be misoptimized unless -fno-strict-aliasing is used
../../../../../../../newlib-2.5.0/newlib/libc/time/lcltime.c:58:3: warning: type of 'malloc' does not match original declaration [-Wlto-type-mismatch]
/Volumes/code/external/newlib-cygwin/newlib/libc/include/malloc.h:37:13: note: return value type mismatch
extern _PTR malloc _PARAMS ((size_t));
^
/Volumes/code/external/newlib-cygwin/newlib/libc/include/malloc.h:37:13: note: 'malloc' was previously declared here
/Volumes/code/external/newlib-cygwin/newlib/libc/include/malloc.h:37:13: note: code may be misoptimized unless -fno-strict-aliasing is used
../../../../../../../newlib-2.5.0/newlib/libc/string/strsignal.c:70:3: warning: type of 'malloc' does not match original declaration [-Wlto-type-mismatch]
/Volumes/code/external/newlib-cygwin/newlib/libc/include/malloc.h:37:13: note: return value type mismatch
extern _PTR malloc _PARAMS ((size_t));
^
/Volumes/code/external/newlib-cygwin/newlib/libc/include/malloc.h:37:13: note: 'malloc' was previously declared here
/Volumes/code/external/newlib-cygwin/newlib/libc/include/malloc.h:37:13: note: code may be misoptimized unless -fno-strict-aliasing is used
Including the proper headers elminates the implicit function
signatures and these warnings.
2017-01-16 08:12:02 +08:00
|
|
|
#include <stdlib.h>
|
2000-02-18 03:39:52 +08:00
|
|
|
#include <_ansi.h>
|
|
|
|
#include <reent.h>
|
|
|
|
|
Add --enable-newlib-reent-thread-local option
By default, Newlib uses a huge object of type struct _reent to store
thread-specific data. This object is returned by __getreent() if the
__DYNAMIC_REENT__ Newlib configuration option is defined.
The reentrancy structure contains for example errno and the standard input,
output, and error file streams. This means that if an application only uses
errno it has a dependency on the file stream support even if it does not use
it. This is an issue for lower end targets and applications which need to
qualify the software according to safety standards (for example ECSS-E-ST-40C,
ECSS-Q-ST-80C, IEC 61508, ISO 26262, DO-178, DO-330, DO-333).
If the new _REENT_THREAD_LOCAL configuration option is enabled, then struct
_reent is replaced by dedicated thread-local objects for each struct _reent
member. The thread-local objects are defined in translation units which use
the corresponding object.
2022-05-16 17:51:54 +08:00
|
|
|
#ifdef _REENT_THREAD_LOCAL
|
|
|
|
_Thread_local char *_tls_strtok_last;
|
|
|
|
#endif
|
|
|
|
|
2000-02-18 03:39:52 +08:00
|
|
|
#ifndef _REENT_ONLY
|
|
|
|
|
2002-05-24 08:13:57 +08:00
|
|
|
extern char *__strtok_r (char *, const char *, char **, int);
|
|
|
|
|
2000-02-18 03:39:52 +08:00
|
|
|
char *
|
2017-12-04 11:43:30 +08:00
|
|
|
strtok (register char *__restrict s,
|
* libc/sys/linux/include/netdb.h, libc/sys/linux/net/getaddrinfo.c,
libc/sys/linux/net/getnameinfo.c: Add restrict keyword to getnameinfo()
and getaddrinfo() to increase standards compliance and match glibc.
* libc/include/string.h, libc/string/memccpy.c, libc/string/memcpy.c,
libc/string/stpcpy.c, libc/string/stpncpy.c, libc/string/strcat.c,
libc/string/strncat.c, libc/string/strncpy.c, libc/string/strtok.c,
libc/string/strtok_r.c, libc/string/strxfrm.c
libc/machine/microblaze/strcpy.c, libc/machine/xscale/memcpy.c,
libc/machine/cris/memcpy.c: Add __restrict to prototype to
increase standards compliance.
2013-07-23 15:05:31 +08:00
|
|
|
register const char *__restrict delim)
|
2000-02-18 03:39:52 +08:00
|
|
|
{
|
2013-04-30 05:06:23 +08:00
|
|
|
struct _reent *reent = _REENT;
|
|
|
|
|
|
|
|
_REENT_CHECK_MISC(reent);
|
|
|
|
return __strtok_r (s, delim, &(_REENT_STRTOK_LAST(reent)), 1);
|
2000-02-18 03:39:52 +08:00
|
|
|
}
|
|
|
|
#endif
|