3805 lines
147 KiB
Plaintext
3805 lines
147 KiB
Plaintext
|
|
This is
|
|||
|
|
/home/xpgcust/tree/RI-2019.1/ib/p4root/Xtensa/SWConfig/../Target-libs/newlib/newlib/libc/libc.info,
|
|||
|
|
produced by makeinfo version 4.8 from
|
|||
|
|
/home/xpgcust/tree/RI-2019.1/ib/p4root/Xtensa/SWConfig/../Target-libs/newlib/newlib/libc/libc.texinfo.
|
|||
|
|
|
|||
|
|
10/2018
|
|||
|
|
|
|||
|
|
This file documents the ANSI C library, version 2.20.0 for Xtensa(R)
|
|||
|
|
Tools Version 14.2.
|
|||
|
|
|
|||
|
|
Copyright (C) 1992, 1993, 1994-2012 Red Hat, Inc. Copyright (C)
|
|||
|
|
1999-2012 Tensilica, Inc.
|
|||
|
|
|
|||
|
|
`libc' includes software developed by the University of California,
|
|||
|
|
Berkeley and its contributors.
|
|||
|
|
|
|||
|
|
libc includes software developed by Martin Jackson, Graham Haley and
|
|||
|
|
Steve Chamberlain of Tadpole Technology and released to Cygnus.
|
|||
|
|
|
|||
|
|
libc uses floating-point conversion software developed at AT&T, which
|
|||
|
|
includes this copyright information:
|
|||
|
|
|
|||
|
|
The author of this software is David M. Gay.
|
|||
|
|
|
|||
|
|
Copyright (c) 1991 by AT&T.
|
|||
|
|
|
|||
|
|
Permission to use, copy, modify, and distribute this software for any
|
|||
|
|
purpose without fee is hereby granted, provided that this entire notice
|
|||
|
|
is included in all copies of any software which is or includes a copy
|
|||
|
|
or modification of this software and in all copies of the supporting
|
|||
|
|
documentation for such software.
|
|||
|
|
|
|||
|
|
THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
|
|||
|
|
IMPLIED WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY
|
|||
|
|
REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
|
|||
|
|
OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
|
|||
|
|
|
|||
|
|
Permission is granted to make and distribute verbatim copies of this
|
|||
|
|
manual provided the copyright notice and this permission notice are
|
|||
|
|
preserved on all copies.
|
|||
|
|
|
|||
|
|
Permission is granted to copy and distribute modified versions of
|
|||
|
|
this manual under the conditions for verbatim copying, subject to the
|
|||
|
|
terms of the GNU General Public License, which includes the provision
|
|||
|
|
that the entire resulting derived work is distributed under the terms
|
|||
|
|
of a permission notice identical to this one.
|
|||
|
|
|
|||
|
|
Permission is granted to copy and distribute translations of this
|
|||
|
|
manual into another language, under the above conditions for modified
|
|||
|
|
versions.
|
|||
|
|
|
|||
|
|
This publication is provided "AS IS." Tensilica, Inc. (hereafter
|
|||
|
|
"Tensilica") does not make any warranty of any kind, either expressed
|
|||
|
|
or implied, including, but not limited to, the implied warranties of
|
|||
|
|
merchantability and fitness for a particular purpose. Information in
|
|||
|
|
this document is provided solely to enable system and software
|
|||
|
|
developers to use Tensilica(R) processors. Unless specifically set
|
|||
|
|
forth herein, there are no express or implied patent, copyright or any
|
|||
|
|
other intellectual property rights or licenses granted hereunder to
|
|||
|
|
design or fabricate Tensilica integrated circuits or integrated
|
|||
|
|
circuits based on the information in this document. Tensilica does not
|
|||
|
|
warrant that the contents of this publication, whether individually or
|
|||
|
|
as one or more groups, meets your requirements or that the publication
|
|||
|
|
is error-free. This publication could include technical inaccuracies
|
|||
|
|
or typographical errors. Changes may be made to the information
|
|||
|
|
herein, and these changes may be incorporated in new editions of this
|
|||
|
|
publication.
|
|||
|
|
|
|||
|
|
The following terms are trademarks or registered trademarks of
|
|||
|
|
Tensilica, Inc.: FLIX, OSKit, Sea of Processors, Tensilica, Vectra,
|
|||
|
|
Xplorer, XPRES, and Xtensa. All other trademarks and registered
|
|||
|
|
trademarks are the property of their respective companies.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: strrchr, Next: strsignal, Prev: strpbrk, Up: Strings
|
|||
|
|
|
|||
|
|
5.34 `strrchr'--reverse search for character in string
|
|||
|
|
======================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <string.h>
|
|||
|
|
char * strrchr(const char *STRING, int C);
|
|||
|
|
*Description*
|
|||
|
|
This function finds the last occurence of C (converted to a char) in
|
|||
|
|
the string pointed to by STRING (including the terminating null
|
|||
|
|
character).
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
Returns a pointer to the located character, or a null pointer if C does
|
|||
|
|
not occur in STRING.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`strrchr' is ANSI C.
|
|||
|
|
|
|||
|
|
`strrchr' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: strsignal, Next: strspn, Prev: strrchr, Up: Strings
|
|||
|
|
|
|||
|
|
5.35 `strsignal'--convert signal number to string
|
|||
|
|
=================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <string.h>
|
|||
|
|
char *strsignal(int SIGNAL);
|
|||
|
|
*Description*
|
|||
|
|
`strsignal' converts the signal number SIGNAL into a string. If SIGNAL
|
|||
|
|
is not a known signal number, the result will be of the form "Unknown
|
|||
|
|
signal NN" where NN is the SIGNAL is a decimal number.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
This function returns a pointer to a string. Your application must not
|
|||
|
|
modify that string.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
POSIX.1-2008 C requires `strsignal', but does not specify the strings
|
|||
|
|
used for each signal number.
|
|||
|
|
|
|||
|
|
`strsignal' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: strspn, Next: strstr, Prev: strsignal, Up: Strings
|
|||
|
|
|
|||
|
|
5.36 `strspn'--find initial match
|
|||
|
|
=================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <string.h>
|
|||
|
|
size_t strspn(const char *S1, const char *S2);
|
|||
|
|
*Description*
|
|||
|
|
This function computes the length of the initial segment of the string
|
|||
|
|
pointed to by S1 which consists entirely of characters from the string
|
|||
|
|
pointed to by S2 (excluding the terminating null character).
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`strspn' returns the length of the segment found.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`strspn' is ANSI C.
|
|||
|
|
|
|||
|
|
`strspn' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: strstr, Next: strtok, Prev: strspn, Up: Strings
|
|||
|
|
|
|||
|
|
5.37 `strstr'--find string segment
|
|||
|
|
==================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <string.h>
|
|||
|
|
char *strstr(const char *S1, const char *S2);
|
|||
|
|
*Description*
|
|||
|
|
Locates the first occurrence in the string pointed to by S1 of the
|
|||
|
|
sequence of characters in the string pointed to by S2 (excluding the
|
|||
|
|
terminating null character).
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
Returns a pointer to the located string segment, or a null pointer if
|
|||
|
|
the string S2 is not found. If S2 points to a string with zero length,
|
|||
|
|
S1 is returned.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`strstr' is ANSI C.
|
|||
|
|
|
|||
|
|
`strstr' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: strtok, Next: strupr, Prev: strstr, Up: Strings
|
|||
|
|
|
|||
|
|
5.38 `strtok', `strtok_r', `strsep'--get next token from a string
|
|||
|
|
=================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <string.h>
|
|||
|
|
char *strtok(char *SOURCE, const char *DELIMITERS)
|
|||
|
|
char *strtok_r(char *SOURCE, const char *DELIMITERS,
|
|||
|
|
char **LASTS)
|
|||
|
|
char *strsep(char **SOURCE_PTR, const char *DELIMITERS)
|
|||
|
|
*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 string, `*DELIMITERS', must
|
|||
|
|
be supplied each time and may change between calls.
|
|||
|
|
|
|||
|
|
The `strtok' function returns a pointer to the beginning of each
|
|||
|
|
subsequent token in the string, after replacing the separator character
|
|||
|
|
itself with a null character. When no more tokens remain, a null
|
|||
|
|
pointer is returned.
|
|||
|
|
|
|||
|
|
The `strtok_r' function has the same behavior as `strtok', except a
|
|||
|
|
pointer to placeholder `*LASTS' must be supplied by the caller.
|
|||
|
|
|
|||
|
|
The `strsep' function is similar in behavior to `strtok', except 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 the
|
|||
|
|
empty string is returned. Like `strtok_r' and `strtok', the
|
|||
|
|
`*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.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`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.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`strtok' is ANSI C. `strtok_r' is POSIX. `strsep' is a BSD extension.
|
|||
|
|
|
|||
|
|
`strtok', `strtok_r', and `strsep' require no supporting OS
|
|||
|
|
subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: strupr, Next: strxfrm, Prev: strtok, Up: Strings
|
|||
|
|
|
|||
|
|
5.39 `strupr'--force string to uppercase
|
|||
|
|
========================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <string.h>
|
|||
|
|
char *strupr(char *A);
|
|||
|
|
*Description*
|
|||
|
|
`strupr' converts each character in the string at A to uppercase.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`strupr' returns its argument, A.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`strupr' is not widely portable.
|
|||
|
|
|
|||
|
|
`strupr' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: strxfrm, Next: swab, Prev: strupr, Up: Strings
|
|||
|
|
|
|||
|
|
5.40 `strxfrm'--transform string
|
|||
|
|
================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <string.h>
|
|||
|
|
size_t strxfrm(char *S1, const char *S2, size_t N);
|
|||
|
|
*Description*
|
|||
|
|
This function transforms the string pointed to by S2 and places the
|
|||
|
|
resulting string into the array pointed to by S1. The transformation is
|
|||
|
|
such that if the `strcmp' function is applied to the two transformed
|
|||
|
|
strings, it returns a value greater than, equal to, or less than zero,
|
|||
|
|
correspoinding to the result of a `strcoll' function applied to the
|
|||
|
|
same two original strings.
|
|||
|
|
|
|||
|
|
No more than N characters are placed into the resulting array
|
|||
|
|
pointed to by S1, including the terminating null character. If N is
|
|||
|
|
zero, S1 may be a null pointer. If copying takes place between objects
|
|||
|
|
that overlap, the behavior is undefined.
|
|||
|
|
|
|||
|
|
With a C locale, this function just copies.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `strxfrm' function returns the length of the transformed string
|
|||
|
|
(not including the terminating null character). If the value returned
|
|||
|
|
is N or more, the contents of the array pointed to by S1 are
|
|||
|
|
indeterminate.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`strxfrm' is ANSI C.
|
|||
|
|
|
|||
|
|
`strxfrm' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: swab, Next: wcscasecmp, Prev: strxfrm, Up: Strings
|
|||
|
|
|
|||
|
|
5.41 `swab'--swap adjacent bytes
|
|||
|
|
================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <unistd.h>
|
|||
|
|
void swab(const void *IN, void *OUT, ssize_t N);
|
|||
|
|
*Description*
|
|||
|
|
This function copies N bytes from the memory region pointed to by IN to
|
|||
|
|
the memory region pointed to by OUT, exchanging adjacent even and odd
|
|||
|
|
bytes.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`swab' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcscasecmp, Next: wcsdup, Prev: swab, Up: Strings
|
|||
|
|
|
|||
|
|
5.42 `wcscasecmp'--case-insensitive wide character string compare
|
|||
|
|
=================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
int wcscasecmp(const wchar_t *A, const wchar_t *B);
|
|||
|
|
*Description*
|
|||
|
|
`wcscasecmp' compares the wide character string at A to the wide
|
|||
|
|
character string at B in a case-insensitive manner.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
If `*A' sorts lexicographically after `*B' (after both are converted to
|
|||
|
|
uppercase), `wcscasecmp' returns a number greater than zero. If the
|
|||
|
|
two strings match, `wcscasecmp' returns zero. If `*A' sorts
|
|||
|
|
lexicographically before `*B', `wcscasecmp' returns a number less than
|
|||
|
|
zero.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
POSIX-1.2008
|
|||
|
|
|
|||
|
|
`wcscasecmp' requires no supporting OS subroutines. It uses
|
|||
|
|
tolower() from elsewhere in this library.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcsdup, Next: wcsncasecmp, Prev: wcscasecmp, Up: Strings
|
|||
|
|
|
|||
|
|
5.43 `wcsdup'--wide character string duplicate
|
|||
|
|
==============================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wcsdup(const wchar_t *STR);
|
|||
|
|
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *_wcsdup_r(struct _reent *PTR, const wchar_t *STR);
|
|||
|
|
*Description*
|
|||
|
|
`wcsdup' allocates a new wide character string using `malloc', and
|
|||
|
|
copies the content of the argument STR into the newly allocated string,
|
|||
|
|
thus making a copy of STR.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`wcsdup' returns a pointer to the copy of STR if enough memory for the
|
|||
|
|
copy was available. Otherwise it returns NULL and errno is set to
|
|||
|
|
ENOMEM.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
POSIX-1.2008
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcsncasecmp, Prev: wcsdup, Up: Strings
|
|||
|
|
|
|||
|
|
5.44 `wcsncasecmp'--case-insensitive wide character string compare
|
|||
|
|
==================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
int wcsncasecmp(const wchar_t *A, const wchar_t * B, size_t LENGTH);
|
|||
|
|
*Description*
|
|||
|
|
`wcsncasecmp' compares up to LENGTH wide characters from the string at
|
|||
|
|
A to the string at B in a case-insensitive manner.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
If `*A' sorts lexicographically after `*B' (after both are converted to
|
|||
|
|
uppercase), `wcsncasecmp' returns a number greater than zero. If the
|
|||
|
|
two strings are equivalent, `wcsncasecmp' returns zero. If `*A' sorts
|
|||
|
|
lexicographically before `*B', `wcsncasecmp' returns a number less than
|
|||
|
|
zero.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
POSIX-1.2008
|
|||
|
|
|
|||
|
|
`wcsncasecmp' requires no supporting OS subroutines. It uses
|
|||
|
|
tolower() from elsewhere in this library.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Wchar strings, Next: Signals, Prev: Strings, Up: Top
|
|||
|
|
|
|||
|
|
6 Wide Character Strings (`wchar.h')
|
|||
|
|
************************************
|
|||
|
|
|
|||
|
|
This chapter describes wide-character string-handling functions and
|
|||
|
|
managing areas of memory containing wide characters. The corresponding
|
|||
|
|
declarations are in `wchar.h'.
|
|||
|
|
|
|||
|
|
* Menu:
|
|||
|
|
|
|||
|
|
* wmemchr:: Find wide character in memory
|
|||
|
|
* wmemcmp:: Compare two wide-character memory areas
|
|||
|
|
* wmemcpy:: Copy wide-character memory regions
|
|||
|
|
* wmemmove:: Move possibly overlapping wide-character memory
|
|||
|
|
* wmemset:: Set an area of memory to a specified wide character
|
|||
|
|
* wcscat:: Concatenate wide-character strings
|
|||
|
|
* wcschr:: Search for wide character in string
|
|||
|
|
* wcscmp:: Wide-character string compare
|
|||
|
|
* wcscoll:: Locale-specific wide-character string compare
|
|||
|
|
* wcscpy:: Copy wide-character string
|
|||
|
|
* wcpcpy:: Copy a wide-character string returning a pointer to its end
|
|||
|
|
* wcscspn:: Count wide characters not in string
|
|||
|
|
* wcsftime:: Convert date and time to a formatted wide-character string
|
|||
|
|
* wcslcat:: Concatenate wide-character strings to specified length
|
|||
|
|
* wcslcpy:: Copy wide-character string to specified length
|
|||
|
|
* wcslen:: Wide-character string length
|
|||
|
|
* wcsncat:: Concatenate wide-character strings
|
|||
|
|
* wcsncmp:: Wide-character string compare
|
|||
|
|
* wcsncpy:: Counted copy wide-character string
|
|||
|
|
* wcpncpy:: Copy part of a wide-character string returning a pointer to its end
|
|||
|
|
* wcsnlen:: Wide-character string length with maximum limit
|
|||
|
|
* wcspbrk:: Find wide characters in string
|
|||
|
|
* wcsrchr:: Reverse search for wide character in string
|
|||
|
|
* wcsspn:: Find initial match in wide-character string
|
|||
|
|
* wcsstr:: Find wide-character string segment
|
|||
|
|
* wcstok:: Tokenize wide-character string
|
|||
|
|
* wcswidth:: Number of column positions of a wide-character string
|
|||
|
|
* wcsxfrm:: Locale-specific wide-character string transformation
|
|||
|
|
* wcwidth:: Number of column positions of a wide-character code
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wmemchr, Next: wmemcmp, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.1 `wmemchr'--find a wide character in memory
|
|||
|
|
==============================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wmemchr(const wchar_t *S, wchar_t C, size_t N);
|
|||
|
|
*Description*
|
|||
|
|
The `wmemchr' function locates the first occurrence of C in the initial
|
|||
|
|
N wide characters of the object pointed to be S. This function is not
|
|||
|
|
affected by locale and all wchar_t values are treated identically. The
|
|||
|
|
null wide character and wchar_t values not corresponding to valid
|
|||
|
|
characters are not treated specially.
|
|||
|
|
|
|||
|
|
If N is zero, S must be a valid pointer and the function behaves as
|
|||
|
|
if no valid occurrence of C is found.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wmemchr' function returns a pointer to the located wide character,
|
|||
|
|
or a null pointer if the wide character does not occur in the object.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wmemchr' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wmemcmp, Next: wmemcpy, Prev: wmemchr, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.2 `wmemcmp'--compare wide characters in memory
|
|||
|
|
================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
int wmemcmp(const wchar_t *S1, const wchar_t *S2, size_t N);
|
|||
|
|
*Description*
|
|||
|
|
The `wmemcmp' function compares the first N wide characters of the
|
|||
|
|
object pointed to by S1 to the first N wide characters of the object
|
|||
|
|
pointed to by S2. This function is not affected by locale and all
|
|||
|
|
wchar_t values are treated identically. The null wide character and
|
|||
|
|
wchar_t values not corresponding to valid characters are not treated
|
|||
|
|
specially.
|
|||
|
|
|
|||
|
|
If N is zero, S1 and S2 must be a valid pointers and the function
|
|||
|
|
behaves as if the two objects compare equal.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wmemcmp' function returns an integer greater than, equal to, or
|
|||
|
|
less than zero, accordingly as the object pointed to by S1 is greater
|
|||
|
|
than, equal to, or less than the object pointed to by S2.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wmemcmp' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wmemcpy, Next: wmemmove, Prev: wmemcmp, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.3 `wmemcpy'--copy wide characters in memory
|
|||
|
|
=============================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wmemcpy(wchar_t *D, const wchar_t *S, size_t N);
|
|||
|
|
*Description*
|
|||
|
|
The `wmemcpy' function copies N wide characters from the object pointed
|
|||
|
|
to by S to the object pointed to be D. This function is not affected by
|
|||
|
|
locale and all wchar_t values are treated identically. The null wide
|
|||
|
|
character and wchar_t values not corresponding to valid characters are
|
|||
|
|
not treated specially.
|
|||
|
|
|
|||
|
|
If N is zero, D and S must be a valid pointers, and the function
|
|||
|
|
copies zero wide characters.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wmemcpy' function returns the value of D.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wmemcpy' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wmemmove, Next: wmemset, Prev: wmemcpy, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.4 `wmemmove'--copy wide characters in memory with overlapping areas
|
|||
|
|
=====================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wmemmove(wchar_t *D, const wchar_t *S, size_t N);
|
|||
|
|
*Description*
|
|||
|
|
The `wmemmove' function copies N wide characters from the object
|
|||
|
|
pointed to by S to the object pointed to by D. Copying takes place as
|
|||
|
|
if the N wide characters from the object pointed to by S are first
|
|||
|
|
copied into a temporary array of N wide characters that does not
|
|||
|
|
overlap the objects pointed to by D or S, and then the N wide
|
|||
|
|
characters from the temporary array are copied into the object pointed
|
|||
|
|
to by D.
|
|||
|
|
|
|||
|
|
This function is not affected by locale and all wchar_t values are
|
|||
|
|
treated identically. The null wide character and wchar_t values not
|
|||
|
|
corresponding to valid characters are not treated specially.
|
|||
|
|
|
|||
|
|
If N is zero, D and S must be a valid pointers, and the function
|
|||
|
|
copies zero wide characters.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wmemmove' function returns the value of D.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wmemmove' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wmemset, Next: wcscat, Prev: wmemmove, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.5 `wmemset'--set wide characters in memory
|
|||
|
|
============================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wmemset(wchar_t *S, wchar_t C, size_t N);
|
|||
|
|
*Description*
|
|||
|
|
The `wmemset' function copies the value of C into each of the first N
|
|||
|
|
wide characters of the object pointed to by S. This function is not
|
|||
|
|
affected by locale and all wchar_t values are treated identically. The
|
|||
|
|
null wide character and wchar_t values not corresponding to valid
|
|||
|
|
characters are not treated specially.
|
|||
|
|
|
|||
|
|
If N is zero, S must be a valid pointer and the function copies zero
|
|||
|
|
wide characters.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wmemset' function returns the value of S.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wmemset' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcscat, Next: wcschr, Prev: wmemset, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.6 `wcscat'--concatenate two wide-character strings
|
|||
|
|
====================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wcscat(wchar_t *S1, const wchar_t *S2);
|
|||
|
|
*Description*
|
|||
|
|
The `wcscat' function appends a copy of the wide-character string
|
|||
|
|
pointed to by S2 (including the terminating null wide-character code)
|
|||
|
|
to the end of the wide-character string pointed to by S1. The initial
|
|||
|
|
wide-character code of S2 overwrites the null wide-character code at
|
|||
|
|
the end of S1. If copying takes place between objects that overlap, the
|
|||
|
|
behaviour is undefined.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wcscat' function returns S1; no return value is reserved to
|
|||
|
|
indicate an error.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcscat' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcschr, Next: wcscmp, Prev: wcscat, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.7 `wcschr'--wide-character string scanning operation
|
|||
|
|
======================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wcschr(const wchar_t *S, wchar_t C);
|
|||
|
|
*Description*
|
|||
|
|
The `wcschr' function locates the first occurrence of C in the
|
|||
|
|
wide-character string pointed to by S. The value of C must be a
|
|||
|
|
character representable as a type wchar_t and must be a wide-character
|
|||
|
|
code corresponding to a valid character in the current locale. The
|
|||
|
|
terminating null wide-character string.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
Upon completion, `wcschr' returns a pointer to the wide-character code,
|
|||
|
|
or a null pointer if the wide-character code is not found.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcschr' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcscmp, Next: wcscoll, Prev: wcschr, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.8 `wcscmp'--compare two wide-character strings
|
|||
|
|
================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
int wcscmp(const wchar_t *S1, *S2);
|
|||
|
|
*Description*
|
|||
|
|
The `wcscmp' function compares the wide-character string pointed to by
|
|||
|
|
S1 to the wide-character string pointed to by S2.
|
|||
|
|
|
|||
|
|
The sign of a non-zero return value is determined by the sign of the
|
|||
|
|
difference between the values of the first pair of wide-character codes
|
|||
|
|
that differ in the objects being compared.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
Upon completion, `wcscmp' returns an integer greater than, equal to or
|
|||
|
|
less than 0, if the wide-character string pointed to by S1 is greater
|
|||
|
|
than, equal to or less than the wide-character string pointed to by S2
|
|||
|
|
respectively.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcscmp' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcscoll, Next: wcscpy, Prev: wcscmp, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.9 `wcscoll'--locale-specific wide-character string compare
|
|||
|
|
============================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
int wcscoll(const wchar_t *STRA, const wchar_t * STRB);
|
|||
|
|
*Description*
|
|||
|
|
`wcscoll' compares the wide-character string pointed to by STRA to the
|
|||
|
|
wide-character string pointed to by STRB, using an interpretation
|
|||
|
|
appropriate to the current `LC_COLLATE' state.
|
|||
|
|
|
|||
|
|
The current implementation of `wcscoll' simply uses `wcscmp' and
|
|||
|
|
does not support any language-specific sorting.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
If the first string is greater than the second string, `wcscoll'
|
|||
|
|
returns a number greater than zero. If the two strings are equivalent,
|
|||
|
|
`wcscoll' returns zero. If the first string is less than the second
|
|||
|
|
string, `wcscoll' returns a number less than zero.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcscoll' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcscpy, Next: wcpcpy, Prev: wcscoll, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.10 `wcscpy'--copy a wide-character string
|
|||
|
|
===========================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wcscpy(wchar_t *S1, const wchar_t *,S2);
|
|||
|
|
*Description*
|
|||
|
|
The `wcscpy' function copies the wide-character string pointed to by S2
|
|||
|
|
(including the terminating null wide-character code) into the array
|
|||
|
|
pointed to by S1. If copying takes place between objects that overlap,
|
|||
|
|
the behaviour is undefined.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wcscpy' function returns S1; no return value is reserved to
|
|||
|
|
indicate an error.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcscpy' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcpcpy, Next: wcscspn, Prev: wcscpy, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.11 `wcpcpy'--copy a wide-character string returning a pointer to its end
|
|||
|
|
==========================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wcpcpy(wchar_t *S1, const wchar_t *,S2);
|
|||
|
|
*Description*
|
|||
|
|
The `wcpcpy' function copies the wide-character string pointed to by S2
|
|||
|
|
(including the terminating null wide-character code) into the array
|
|||
|
|
pointed to by S1. If copying takes place between objects that overlap,
|
|||
|
|
the behaviour is undefined.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
This function returns a pointer to the end of the destination string,
|
|||
|
|
thus pointing to the trailing '\0'.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcpcpy' is a GNU extension.
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcscspn, Next: wcsftime, Prev: wcpcpy, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.12 `wcscspn'--get length of a complementary wide substring
|
|||
|
|
============================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
size_t wcscspn(const wchar_t *S, wchar_t *SET);
|
|||
|
|
*Description*
|
|||
|
|
The `wcscspn' function computes the length of the maximum initial
|
|||
|
|
segment of the wide-character string pointed to by S which consists
|
|||
|
|
entirely of wide-character codes not from the wide-character string
|
|||
|
|
pointed to by SET.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wcscspn' function returns the length of the initial substring of
|
|||
|
|
S1; no return value is reserved to indicate an error.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcscspn' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcsftime, Next: wcslcat, Prev: wcscspn, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.13 `wcsftime'-convert date and time to a formatted wide-character string
|
|||
|
|
==========================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <time.h>
|
|||
|
|
#include <wchar.h>
|
|||
|
|
size_t wcsftime(wchar_t *S, size_t MAXSIZE,
|
|||
|
|
const wchar_t *FORMAT, const struct tm *TIMP);
|
|||
|
|
*Description*
|
|||
|
|
`wcsftime' is equivalent to `strftime', except that:
|
|||
|
|
* The argument s points to the initial element of an array of wide
|
|||
|
|
characters into which the generated output is to be placed.
|
|||
|
|
|
|||
|
|
* The argument maxsize indicates the limiting number of wide
|
|||
|
|
characters.
|
|||
|
|
|
|||
|
|
* The argument format is a wide-character string and the conversion
|
|||
|
|
specifiers are replaced by corresponding sequences of wide
|
|||
|
|
characters.
|
|||
|
|
|
|||
|
|
* The return value indicates the number of wide characters.
|
|||
|
|
|
|||
|
|
(The difference in all of the above being wide characters versus
|
|||
|
|
regular characters.) See `strftime' for the details of the format
|
|||
|
|
specifiers.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
When the formatted time takes up no more than MAXSIZE wide characters,
|
|||
|
|
the result is the length of the formatted wide string. Otherwise, if
|
|||
|
|
the formatting operation was abandoned due to lack of room, the result
|
|||
|
|
is `0', and the wide-character string starting at S corresponds to just
|
|||
|
|
those parts of `*FORMAT' that could be completely filled in within the
|
|||
|
|
MAXSIZE limit.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
C99 and POSIX require `wcsftime', but do not specify the contents of
|
|||
|
|
`*S' when the formatted string would require more than MAXSIZE
|
|||
|
|
characters. Unrecognized specifiers and fields of `timp' that are out
|
|||
|
|
of range cause undefined results. Since some formats expand to 0
|
|||
|
|
bytes, it is wise to set `*S' to a nonzero value beforehand to
|
|||
|
|
distinguish between failure and an empty string. This implementation
|
|||
|
|
does not support `s' being NULL, nor overlapping `s' and `format'.
|
|||
|
|
|
|||
|
|
`wcsftime' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
*See Also*
|
|||
|
|
`strftime'
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcslcat, Next: wcslcpy, Prev: wcsftime, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.14 `wcslcat'--concatenate wide-character strings to specified length
|
|||
|
|
======================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
size_t wcslcat(wchar_t *DST, const wchar_t *SRC, size_t SIZ);
|
|||
|
|
*Description*
|
|||
|
|
The `wcslcat' function appends wide characters from SRC to end of the
|
|||
|
|
DST wide-character string so that the resultant wide-character string
|
|||
|
|
is not more than SIZ wide characters including the terminating null
|
|||
|
|
wide-character code. A terminating null wide character is always added
|
|||
|
|
unless SIZ is 0. Thus, the maximum number of wide characters that can
|
|||
|
|
be appended from SRC is SIZ - 1. If copying takes place between objects
|
|||
|
|
that overlap, the behaviour is undefined.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
Wide-character string length of initial DST plus the wide-character
|
|||
|
|
string length of SRC (does not include terminating null
|
|||
|
|
wide-characters). If the return value is greater than or equal to SIZ,
|
|||
|
|
then truncation occurred and not all wide characters from SRC were
|
|||
|
|
appended.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcslcpy, Next: wcslen, Prev: wcslcat, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.15 `wcslcpy'--copy a wide-character string to specified length
|
|||
|
|
================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
size_t wcslcpy(wchar_t *DST, const wchar_t *SRC, size_t SIZ);
|
|||
|
|
*Description*
|
|||
|
|
`wcslcpy' copies wide characters from SRC to DST such that up to SIZ -
|
|||
|
|
1 characters are copied. A terminating null is appended to the result,
|
|||
|
|
unless SIZ is zero.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`wcslcpy' returns the number of wide characters in SRC, not including
|
|||
|
|
the terminating null wide character. If the return value is greater
|
|||
|
|
than or equal to SIZ, then not all wide characters were copied from SRC
|
|||
|
|
and truncation occurred.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcslen, Next: wcsncat, Prev: wcslcpy, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.16 `wcslen'--get wide-character string length
|
|||
|
|
===============================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
size_t wcslen(const wchar_t *S);
|
|||
|
|
*Description*
|
|||
|
|
The `wcslen' function computes the number of wide-character codes in
|
|||
|
|
the wide-character string to which S points, not including the
|
|||
|
|
terminating null wide-character code.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wcslen' function returns the length of S; no return value is
|
|||
|
|
reserved to indicate an error.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcslen' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcsncat, Next: wcsncmp, Prev: wcslen, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.17 `wcsncat'--concatenate part of two wide-character strings
|
|||
|
|
==============================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wcsncat(wchar_t *S1, const wchar_t *S2, size_t N);
|
|||
|
|
*Description*
|
|||
|
|
The `wcsncat' function appends not more than N wide-character codes (a
|
|||
|
|
null wide-character code and wide-character codes that follow it are
|
|||
|
|
not appended) from the array pointed to by S2 to the end of the
|
|||
|
|
wide-character string pointed to by S1. The initial wide-character code
|
|||
|
|
of S2 overwrites the null wide-character code at the end of S1. A
|
|||
|
|
terminating null wide-character code is always appended to the result.
|
|||
|
|
If copying takes place between objects that overlap, the behaviour is
|
|||
|
|
undefined.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wcsncat' function returns S1; no return value is reserved to
|
|||
|
|
indicate an error.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcsncat' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcsncmp, Next: wcsncpy, Prev: wcsncat, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.18 `wcsncmp'--compare part of two wide-character strings
|
|||
|
|
==========================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
int wcsncmp(const wchar_t *S1, const wchar_t *S2, size_t N);
|
|||
|
|
*Description*
|
|||
|
|
The `wcsncmp' function compares not more than N wide-character codes
|
|||
|
|
(wide-character codes that follow a null wide-character code are not
|
|||
|
|
compared) from the array pointed to by S1 to the array pointed to by S2.
|
|||
|
|
|
|||
|
|
The sign of a non-zero return value is determined by the sign of the
|
|||
|
|
difference between the values of the first pair of wide-character codes
|
|||
|
|
that differ in the objects being compared.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
Upon successful completion, `wcsncmp' returns an integer greater than,
|
|||
|
|
equal to or less than 0, if the possibly null-terminated array pointed
|
|||
|
|
to by S1 is greater than, equal to or less than the possibly
|
|||
|
|
null-terminated array pointed to by S2 respectively.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcsncmp' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcsncpy, Next: wcpncpy, Prev: wcsncmp, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.19 `wcsncpy'--copy part of a wide-character string
|
|||
|
|
====================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wcsncpy(wchar_t *S1, const wchar_t *S2, size_t N);
|
|||
|
|
*Description*
|
|||
|
|
The `wcsncpy' function copies not more than N wide-character codes
|
|||
|
|
(wide-character codes that follow a null wide-character code are not
|
|||
|
|
copied) from the array pointed to by S2 to the array pointed to by S1.
|
|||
|
|
If copying takes place between objects that overlap, the behaviour is
|
|||
|
|
undefined. Note that if S1 contains more than N wide characters before
|
|||
|
|
its terminating null, the result is not null-terminated.
|
|||
|
|
|
|||
|
|
If the array pointed to by S2 is a wide-character string that is
|
|||
|
|
shorter than N wide-character codes, null wide-character codes are
|
|||
|
|
appended to the copy in the array pointed to by S1, until N
|
|||
|
|
wide-character codes in all are written.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wcsncpy' function returns S1; no return value is reserved to
|
|||
|
|
indicate an error.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ISO/IEC 9899; POSIX.1.
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcpncpy, Next: wcsnlen, Prev: wcsncpy, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.20 `wcpncpy'--copy part of a wide-character string returning a pointer to its end
|
|||
|
|
===================================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wcpncpy(wchar_t *S1, const wchar_t *S2, size_t N);
|
|||
|
|
*Description*
|
|||
|
|
The `wcpncpy' function copies not more than n wide-character codes
|
|||
|
|
(wide-character codes that follow a null wide-character code are not
|
|||
|
|
copied) from the array pointed to by S2 to the array pointed to by S1.
|
|||
|
|
If copying takes place between objects that overlap, the behaviour is
|
|||
|
|
undefined.
|
|||
|
|
|
|||
|
|
If the array pointed to by S2 is a wide-character string that is
|
|||
|
|
shorter than N wide-character codes, null wide-character codes are
|
|||
|
|
appended to the copy in the array pointed to by S1, until N
|
|||
|
|
wide-character codes in all are written.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wcpncpy' function returns S1; no return value is reserved to
|
|||
|
|
indicate an error.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcpncpy' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcsnlen, Next: wcspbrk, Prev: wcpncpy, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.21 `wcsnlen'--get fixed-size wide-character string length
|
|||
|
|
===========================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
size_t wcsnlen(const wchar_t *S, size_t MAXLEN);
|
|||
|
|
*Description*
|
|||
|
|
The `wcsnlen' function computes the number of wide-character codes in
|
|||
|
|
the wide-character string pointed to by S not including the terminating
|
|||
|
|
L'\0' wide character but at most MAXLEN wide characters.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`wcsnlen' returns the length of S if it is less then MAXLEN, or MAXLEN
|
|||
|
|
if there is no L'\0' wide character in first MAXLEN characters.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcsnlen' is a GNU extension.
|
|||
|
|
|
|||
|
|
`wcsnlen' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcspbrk, Next: wcsrchr, Prev: wcsnlen, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.22 `wcspbrk'---scan wide-character string for a wide-character code
|
|||
|
|
=====================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wcspbrk(const wchar_t *S, const wchar_t *SET);
|
|||
|
|
*Description*
|
|||
|
|
The `wcspbrk' function locates the first occurrence in the
|
|||
|
|
wide-character string pointed to by S of any wide-character code from
|
|||
|
|
the wide-character string pointed to by SET.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
Upon successful completion, `wcspbrk' returns a pointer to the
|
|||
|
|
wide-character code or a null pointer if no wide-character code from
|
|||
|
|
SET occurs in S.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcspbrk' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcsrchr, Next: wcsspn, Prev: wcspbrk, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.23 `wcsrchr'--wide-character string scanning operation
|
|||
|
|
========================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wcsrchr(const wchar_t *S, wchar_t C);
|
|||
|
|
*Description*
|
|||
|
|
The `wcsrchr' function locates the last occurrence of C in the
|
|||
|
|
wide-character string pointed to by S. The value of C must be a
|
|||
|
|
character representable as a type wchar_t and must be a wide-character
|
|||
|
|
code corresponding to a valid character in the current locale. The
|
|||
|
|
terminating null wide-character code is considered to be part of the
|
|||
|
|
wide-character string.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
Upon successful completion, `wcsrchr' returns a pointer to the
|
|||
|
|
wide-character code or a null pointer if C does not occur in the
|
|||
|
|
wide-character string.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcsrchr' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcsspn, Next: wcsstr, Prev: wcsrchr, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.24 `wcsspn'--get length of a wide substring
|
|||
|
|
=============================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
size_t wcsspn(const wchar_t *S, const wchar_t *SET);
|
|||
|
|
*Description*
|
|||
|
|
The `wcsspn' function computes the length of the maximum initial
|
|||
|
|
segment of the wide-character string pointed to by S which consists
|
|||
|
|
entirely of wide-character codes from the wide-character string pointed
|
|||
|
|
to by SET.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The wcsspn() function returns the length S1; no return value is
|
|||
|
|
reserved to indicate an error.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcsspn' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcsstr, Next: wcstok, Prev: wcsspn, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.25 `wcsstr'--find a wide-character substring
|
|||
|
|
==============================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wcsstr(const wchar_t *BIG, const wchar_t *LITTLE);
|
|||
|
|
*Description*
|
|||
|
|
The `wcsstr' function locates the first occurrence in the
|
|||
|
|
wide-character string pointed to by BIG of the sequence of wide
|
|||
|
|
characters (excluding the terminating null wide character) in the
|
|||
|
|
wide-character string pointed to by LITTLE.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
On successful completion, `wcsstr' returns a pointer to the located
|
|||
|
|
wide-character string, or a null pointer if the wide-character string
|
|||
|
|
is not found.
|
|||
|
|
|
|||
|
|
If LITTLE points to a wide-character string with zero length, the
|
|||
|
|
function returns BIG.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcsstr' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcstok, Next: wcswidth, Prev: wcsstr, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.26 `wcstok'--get next token from a string
|
|||
|
|
===========================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
wchar_t *wcstok(wchar_t *SOURCE, const wchar_t *DELIMITERS,
|
|||
|
|
wchar_t **LASTS)
|
|||
|
|
*Description*
|
|||
|
|
The `wcstok' function is the wide-character equivalent of the
|
|||
|
|
`strtok_r' function (which in turn is the same as the `strtok' function
|
|||
|
|
with an added argument to make it thread-safe).
|
|||
|
|
|
|||
|
|
The `wcstok' function is used to isolate (one at a time) sequential
|
|||
|
|
tokens in a null-terminated wide-character string, `*SOURCE'. A token
|
|||
|
|
is defined as a substring not containing any wide-characters from
|
|||
|
|
`*DELIMITERS'.
|
|||
|
|
|
|||
|
|
The first time that `wcstok' is called, `*SOURCE' should be
|
|||
|
|
specified with the wide-character string to be searched, and
|
|||
|
|
`*LASTS'-but not `lasts', which must be non-NULL-may be random;
|
|||
|
|
subsequent calls, wishing to obtain further tokens from the same
|
|||
|
|
string, should pass a null pointer for `*SOURCE' instead but must
|
|||
|
|
supply `*LASTS' unchanged from the last call. The separator
|
|||
|
|
wide-character string, `*DELIMITERS', must be supplied each time and
|
|||
|
|
may change between calls. A pointer to placeholder `*LASTS' must be
|
|||
|
|
supplied by the caller, and is set each time as needed to save the state
|
|||
|
|
by `wcstok'. Every call to `wcstok' with `*SOURCE' == `NULL'
|
|||
|
|
must pass the value of `*LASTS' as last set by `wcstok'.
|
|||
|
|
|
|||
|
|
The `wcstok' function returns a pointer to the beginning of each
|
|||
|
|
subsequent token in the string, after replacing the separator
|
|||
|
|
wide-character itself with a null wide-character. When no more tokens
|
|||
|
|
remain, a null pointer is returned.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`wcstok' returns a pointer to the first wide character of a token, or
|
|||
|
|
`NULL' if there is no token.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcstok' is C99 and POSIX.1-2001.
|
|||
|
|
|
|||
|
|
`wcstok' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcswidth, Next: wcsxfrm, Prev: wcstok, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.27 `wcswidth'--number of column positions of a wide-character string
|
|||
|
|
======================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
int wcswidth(const wchar_t *PWCS, size_t N);
|
|||
|
|
*Description*
|
|||
|
|
The `wcswidth' function shall determine the number of column positions
|
|||
|
|
required for N wide-character codes (or fewer than N wide-character
|
|||
|
|
codes if a null wide-character code is encountered before N
|
|||
|
|
wide-character codes are exhausted) in the string pointed to by PWCS.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wcswidth' function either shall return 0 (if PWCS points to a null
|
|||
|
|
wide-character code), or return the number of column positions to be
|
|||
|
|
occupied by the wide-character string pointed to by PWCS, or return -1
|
|||
|
|
(if any of the first N wide-character codes in the wide-character
|
|||
|
|
string pointed to by PWCS is not a printable wide-character code).
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcswidth' has been introduced in the Single UNIX Specification Volume
|
|||
|
|
2. `wcswidth' has been marked as an extension in the Single UNIX
|
|||
|
|
Specification Volume 3.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcsxfrm, Next: wcwidth, Prev: wcswidth, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.28 `wcsxfrm'--locale-specific wide-character string transformation
|
|||
|
|
====================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
int wcsxfrm(wchar_t *STRA, const wchar_t * STRB, size_t N);
|
|||
|
|
*Description*
|
|||
|
|
`wcsxfrm' transforms the wide-character string pointed to by STRB to
|
|||
|
|
the wide-character string pointed to by STRA, Comparing two transformed
|
|||
|
|
wide strings with `wcscmp' should return the same result as comparing
|
|||
|
|
the original strings with `wcscoll'. No more than N wide characters
|
|||
|
|
are transformed, including the trailing null character.
|
|||
|
|
|
|||
|
|
If N is 0, STRA may be a NULL pointer.
|
|||
|
|
|
|||
|
|
The current implementation of `wcsxfrm' simply uses `wcslcpy' and
|
|||
|
|
does not support any language-specific transformations.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`wcsxfrm' returns the length of the transformed wide character string.
|
|||
|
|
if the return value is greater or equal to N, the content of STRA is
|
|||
|
|
undefined.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcsxfrm' is ISO/IEC 9899/AMD1:1995 (ISO C).
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: wcwidth, Prev: wcsxfrm, Up: Wchar strings
|
|||
|
|
|
|||
|
|
6.29 `wcwidth'--number of column positions of a wide-character code
|
|||
|
|
===================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <wchar.h>
|
|||
|
|
int wcwidth(const wchar_t WC);
|
|||
|
|
*Description*
|
|||
|
|
The `wcwidth' function shall determine the number of column positions
|
|||
|
|
required for the wide character WC. The application shall ensure that
|
|||
|
|
the value of WC is a character representable as a wchar_t, and is a
|
|||
|
|
wide-character code corresponding to a valid character in the current
|
|||
|
|
locale.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The `wcwidth' function shall either return 0 (if WC is a null
|
|||
|
|
wide-character code), or return the number of column positions to be
|
|||
|
|
occupied by the wide-character code WC, or return -1 (if WC does not
|
|||
|
|
correspond to a printable wide-character code).
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`wcwidth' has been introduced in the Single UNIX Specification Volume 2.
|
|||
|
|
`wcwidth' has been marked as an extension in the Single UNIX
|
|||
|
|
Specification Volume 3.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Signals, Next: Timefns, Prev: Wchar strings, Up: Top
|
|||
|
|
|
|||
|
|
7 Signal Handling (`signal.h')
|
|||
|
|
******************************
|
|||
|
|
|
|||
|
|
A "signal" is an event that interrupts the normal flow of control in
|
|||
|
|
your program. Your operating environment normally defines the full set
|
|||
|
|
of signals available (see `sys/signal.h'), as well as the default means
|
|||
|
|
of dealing with them--typically, either printing an error message and
|
|||
|
|
aborting your program, or ignoring the signal.
|
|||
|
|
|
|||
|
|
All systems support at least the following signals:
|
|||
|
|
`SIGABRT'
|
|||
|
|
Abnormal termination of a program; raised by the <<abort>>
|
|||
|
|
function.
|
|||
|
|
|
|||
|
|
`SIGFPE'
|
|||
|
|
A domain error in arithmetic, such as overflow, or division by
|
|||
|
|
zero.
|
|||
|
|
|
|||
|
|
`SIGILL'
|
|||
|
|
Attempt to execute as a function data that is not executable.
|
|||
|
|
|
|||
|
|
`SIGINT'
|
|||
|
|
Interrupt; an interactive attention signal.
|
|||
|
|
|
|||
|
|
`SIGSEGV'
|
|||
|
|
An attempt to access a memory location that is not available.
|
|||
|
|
|
|||
|
|
`SIGTERM'
|
|||
|
|
A request that your program end execution.
|
|||
|
|
|
|||
|
|
Two functions are available for dealing with asynchronous
|
|||
|
|
signals--one to allow your program to send signals to itself (this is
|
|||
|
|
called "raising" a signal), and one to specify subroutines (called
|
|||
|
|
"handlers" to handle particular signals that you anticipate may
|
|||
|
|
occur--whether raised by your own program or the operating environment.
|
|||
|
|
|
|||
|
|
To support these functions, `signal.h' defines three macros:
|
|||
|
|
|
|||
|
|
`SIG_DFL'
|
|||
|
|
Used with the `signal' function in place of a pointer to a handler
|
|||
|
|
subroutine, to select the operating environment's default handling
|
|||
|
|
of a signal.
|
|||
|
|
|
|||
|
|
`SIG_IGN'
|
|||
|
|
Used with the `signal' function in place of a pointer to a
|
|||
|
|
handler, to ignore a particular signal.
|
|||
|
|
|
|||
|
|
`SIG_ERR'
|
|||
|
|
Returned by the `signal' function in place of a pointer to a
|
|||
|
|
handler, to indicate that your request to set up a handler could
|
|||
|
|
not be honored for some reason.
|
|||
|
|
|
|||
|
|
`signal.h' also defines an integral type, `sig_atomic_t'. This type
|
|||
|
|
is not used in any function declarations; it exists only to allow your
|
|||
|
|
signal handlers to declare a static storage location where they may
|
|||
|
|
store a signal value. (Static storage is not otherwise reliable from
|
|||
|
|
signal handlers.)
|
|||
|
|
|
|||
|
|
* Menu:
|
|||
|
|
|
|||
|
|
* psignal:: Print a signal message to standard error
|
|||
|
|
* raise:: Send a signal
|
|||
|
|
* signal:: Specify handler subroutine for a signal
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: psignal, Next: raise, Up: Signals
|
|||
|
|
|
|||
|
|
7.1 `psignal'--print a signal message on standard error
|
|||
|
|
=======================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <stdio.h>
|
|||
|
|
void psignal(int SIGNAL, const char *PREFIX);
|
|||
|
|
*Description*
|
|||
|
|
Use `psignal' to print (on standard error) a signal message
|
|||
|
|
corresponding to the value of the signal number SIGNAL. Unless you use
|
|||
|
|
`NULL' as the value of the argument PREFIX, the signal message will
|
|||
|
|
begin with the string at PREFIX, followed by a colon and a space (`:
|
|||
|
|
'). The remainder of the signal message is one of the strings described
|
|||
|
|
for `strsignal'.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`psignal' returns no result.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
POSIX.1-2008 requires `psignal', but the strings issued vary from one
|
|||
|
|
implementation to another.
|
|||
|
|
|
|||
|
|
Supporting OS subroutines required: `close', `fstat', `isatty',
|
|||
|
|
`lseek', `read', `sbrk', `write'.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: raise, Next: signal, Prev: psignal, Up: Signals
|
|||
|
|
|
|||
|
|
7.2 `raise'--send a signal
|
|||
|
|
==========================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <signal.h>
|
|||
|
|
int raise(int SIG);
|
|||
|
|
|
|||
|
|
int _raise_r(void *REENT, int SIG);
|
|||
|
|
*Description*
|
|||
|
|
Send the signal SIG (one of the macros from ``sys/signal.h''). This
|
|||
|
|
interrupts your program's normal flow of execution, and allows a signal
|
|||
|
|
handler (if you've defined one, using `signal') to take control.
|
|||
|
|
|
|||
|
|
The alternate function `_raise_r' is a reentrant version. The extra
|
|||
|
|
argument REENT is a pointer to a reentrancy structure.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The result is `0' if SIG was successfully raised, `1' otherwise.
|
|||
|
|
However, the return value (since it depends on the normal flow of
|
|||
|
|
execution) may not be visible, unless the signal handler for SIG
|
|||
|
|
terminates with a `return' or unless `SIG_IGN' is in effect for this
|
|||
|
|
signal.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `raise', but allows the full set of signal numbers to
|
|||
|
|
vary from one implementation to another.
|
|||
|
|
|
|||
|
|
Required OS subroutines: `getpid', `kill'.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: signal, Prev: raise, Up: Signals
|
|||
|
|
|
|||
|
|
7.3 `signal'--specify handler subroutine for a signal
|
|||
|
|
=====================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <signal.h>
|
|||
|
|
void (*signal(int SIG, void(*FUNC)(int))) (int);
|
|||
|
|
|
|||
|
|
void (*_signal_r(void *REENT, int SIG, void(*FUNC)(int))) (int);
|
|||
|
|
*Description*
|
|||
|
|
`signal' provides a simple signal-handling implementation for embedded
|
|||
|
|
targets.
|
|||
|
|
|
|||
|
|
`signal' allows you to request changed treatment for a particular
|
|||
|
|
signal SIG. You can use one of the predefined macros `SIG_DFL' (select
|
|||
|
|
system default handling) or `SIG_IGN' (ignore this signal) as the value
|
|||
|
|
of FUNC; otherwise, FUNC is a function pointer that identifies a
|
|||
|
|
subroutine in your program as the handler for this signal.
|
|||
|
|
|
|||
|
|
Some of the execution environment for signal handlers is
|
|||
|
|
unpredictable; notably, the only library function required to work
|
|||
|
|
correctly from within a signal handler is `signal' itself, and only
|
|||
|
|
when used to redefine the handler for the current signal value.
|
|||
|
|
|
|||
|
|
Static storage is likewise unreliable for signal handlers, with one
|
|||
|
|
exception: if you declare a static storage location as ``volatile
|
|||
|
|
sig_atomic_t'', then you may use that location in a signal handler to
|
|||
|
|
store signal values.
|
|||
|
|
|
|||
|
|
If your signal handler terminates using `return' (or implicit
|
|||
|
|
return), your program's execution continues at the point where it was
|
|||
|
|
when the signal was raised (whether by your program itself, or by an
|
|||
|
|
external event). Signal handlers can also use functions such as `exit'
|
|||
|
|
and `abort' to avoid returning.
|
|||
|
|
|
|||
|
|
The alternate function `_signal_r' is the reentrant version. The
|
|||
|
|
extra argument REENT is a pointer to a reentrancy structure.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
If your request for a signal handler cannot be honored, the result is
|
|||
|
|
`SIG_ERR'; a specific error number is also recorded in `errno'.
|
|||
|
|
|
|||
|
|
Otherwise, the result is the previous handler (a function pointer or
|
|||
|
|
one of the predefined macros).
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `signal'.
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required to link with `signal', but
|
|||
|
|
it will not have any useful effects, except for software generated
|
|||
|
|
signals, without an operating system that can actually raise exceptions.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Timefns, Next: Locale, Prev: Signals, Up: Top
|
|||
|
|
|
|||
|
|
8 Time Functions (`time.h')
|
|||
|
|
***************************
|
|||
|
|
|
|||
|
|
This chapter groups functions used either for reporting on time
|
|||
|
|
(elapsed, current, or compute time) or to perform calculations based on
|
|||
|
|
time.
|
|||
|
|
|
|||
|
|
The header file `time.h' defines three types. `clock_t' and
|
|||
|
|
`time_t' are both used for representations of time particularly
|
|||
|
|
suitable for arithmetic. (In this implementation, quantities of type
|
|||
|
|
`clock_t' have the highest resolution possible on your machine, and
|
|||
|
|
quantities of type `time_t' resolve to seconds.) `size_t' is also
|
|||
|
|
defined if necessary for quantities representing sizes.
|
|||
|
|
|
|||
|
|
`time.h' also defines the structure `tm' for the traditional
|
|||
|
|
representation of Gregorian calendar time as a series of numbers, with
|
|||
|
|
the following fields:
|
|||
|
|
|
|||
|
|
`tm_sec'
|
|||
|
|
Seconds, between 0 and 60 inclusive (60 allows for leap seconds).
|
|||
|
|
|
|||
|
|
`tm_min'
|
|||
|
|
Minutes, between 0 and 59 inclusive.
|
|||
|
|
|
|||
|
|
`tm_hour'
|
|||
|
|
Hours, between 0 and 23 inclusive.
|
|||
|
|
|
|||
|
|
`tm_mday'
|
|||
|
|
Day of the month, between 1 and 31 inclusive.
|
|||
|
|
|
|||
|
|
`tm_mon'
|
|||
|
|
Month, between 0 (January) and 11 (December).
|
|||
|
|
|
|||
|
|
`tm_year'
|
|||
|
|
Year (since 1900), can be negative for earlier years.
|
|||
|
|
|
|||
|
|
`tm_wday'
|
|||
|
|
Day of week, between 0 (Sunday) and 6 (Saturday).
|
|||
|
|
|
|||
|
|
`tm_yday'
|
|||
|
|
Number of days elapsed since last January 1, between 0 and 365
|
|||
|
|
inclusive.
|
|||
|
|
|
|||
|
|
`tm_isdst'
|
|||
|
|
Daylight Savings Time flag: positive means DST in effect, zero
|
|||
|
|
means DST not in effect, negative means no information about DST
|
|||
|
|
is available. Although for mktime(), negative means that it
|
|||
|
|
should decide if DST is in effect or not.
|
|||
|
|
|
|||
|
|
* Menu:
|
|||
|
|
|
|||
|
|
* asctime:: Format time as string
|
|||
|
|
* clock:: Cumulative processor time
|
|||
|
|
* ctime:: Convert time to local and format as string
|
|||
|
|
* difftime:: Subtract two times
|
|||
|
|
* gmtime:: Convert time to UTC (GMT) traditional representation
|
|||
|
|
* localtime:: Convert time to local representation
|
|||
|
|
* mktime:: Convert time to arithmetic representation
|
|||
|
|
* strftime:: Convert date and time to a user-formatted string
|
|||
|
|
* time:: Get current calendar time (as single number)
|
|||
|
|
* __tz_lock:: Lock time zone global variables
|
|||
|
|
* tzset:: Set timezone info
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: asctime, Next: clock, Up: Timefns
|
|||
|
|
|
|||
|
|
8.1 `asctime'--format time as string
|
|||
|
|
====================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <time.h>
|
|||
|
|
char *asctime(const struct tm *CLOCK);
|
|||
|
|
char *_asctime_r(const struct tm *CLOCK, char *BUF);
|
|||
|
|
*Description*
|
|||
|
|
Format the time value at CLOCK into a string of the form
|
|||
|
|
Wed Jun 15 11:38:07 1988\n\0
|
|||
|
|
The string is generated in a static buffer; each call to `asctime'
|
|||
|
|
overwrites the string generated by previous calls.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
A pointer to the string containing a formatted timestamp.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `asctime'.
|
|||
|
|
|
|||
|
|
`asctime' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: clock, Next: ctime, Prev: asctime, Up: Timefns
|
|||
|
|
|
|||
|
|
8.2 `clock'--cumulative processor time
|
|||
|
|
======================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <time.h>
|
|||
|
|
clock_t clock(void);
|
|||
|
|
*Description*
|
|||
|
|
Calculates the best available approximation of the cumulative amount of
|
|||
|
|
time used by your program since it started. To convert the result into
|
|||
|
|
seconds, divide by the macro `CLOCKS_PER_SEC'.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The amount of processor time used so far by your program, in units
|
|||
|
|
defined by the machine-dependent macro `CLOCKS_PER_SEC'. If no
|
|||
|
|
measurement is available, the result is (clock_t)`-1'.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `clock' and `CLOCKS_PER_SEC'.
|
|||
|
|
|
|||
|
|
Supporting OS subroutine required: `times'.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: ctime, Next: difftime, Prev: clock, Up: Timefns
|
|||
|
|
|
|||
|
|
8.3 `ctime'--convert time to local and format as string
|
|||
|
|
=======================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <time.h>
|
|||
|
|
char *ctime(const time_t *CLOCK);
|
|||
|
|
char *ctime_r(const time_t *CLOCK, char *BUF);
|
|||
|
|
*Description*
|
|||
|
|
Convert the time value at CLOCK to local time (like `localtime') and
|
|||
|
|
format it into a string of the form
|
|||
|
|
Wed Jun 15 11:38:07 1988\n\0
|
|||
|
|
(like `asctime').
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
A pointer to the string containing a formatted timestamp.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `ctime'.
|
|||
|
|
|
|||
|
|
`ctime' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: difftime, Next: gmtime, Prev: ctime, Up: Timefns
|
|||
|
|
|
|||
|
|
8.4 `difftime'--subtract two times
|
|||
|
|
==================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <time.h>
|
|||
|
|
double difftime(time_t TIM1, time_t TIM2);
|
|||
|
|
*Description*
|
|||
|
|
Subtracts the two times in the arguments: ``TIM1 - TIM2''.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
The difference (in seconds) between TIM2 and TIM1, as a `double'.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `difftime', and defines its result to be in seconds in
|
|||
|
|
all implementations.
|
|||
|
|
|
|||
|
|
`difftime' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: gmtime, Next: localtime, Prev: difftime, Up: Timefns
|
|||
|
|
|
|||
|
|
8.5 `gmtime'--convert time to UTC traditional form
|
|||
|
|
==================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <time.h>
|
|||
|
|
struct tm *gmtime(const time_t *CLOCK);
|
|||
|
|
struct tm *gmtime_r(const time_t *CLOCK, struct tm *RES);
|
|||
|
|
*Description*
|
|||
|
|
`gmtime' takes the time at CLOCK representing the number of elapsed
|
|||
|
|
seconds since 00:00:00 on January 1, 1970, Universal Coordinated Time
|
|||
|
|
(UTC, also known in some countries as GMT, Greenwich Mean time) and
|
|||
|
|
converts it to a `struct tm' representation.
|
|||
|
|
|
|||
|
|
`gmtime' constructs the traditional time representation in static
|
|||
|
|
storage; each call to `gmtime' or `localtime' will overwrite the
|
|||
|
|
information generated by previous calls to either function.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
A pointer to the traditional time representation (`struct tm').
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `gmtime'.
|
|||
|
|
|
|||
|
|
`gmtime' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: localtime, Next: mktime, Prev: gmtime, Up: Timefns
|
|||
|
|
|
|||
|
|
8.6 `localtime'--convert time to local representation
|
|||
|
|
=====================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <time.h>
|
|||
|
|
struct tm *localtime(time_t *CLOCK);
|
|||
|
|
struct tm *localtime_r(time_t *CLOCK, struct tm *RES);
|
|||
|
|
*Description*
|
|||
|
|
`localtime' converts the time at CLOCK into local time, then converts
|
|||
|
|
its representation from the arithmetic representation to the
|
|||
|
|
traditional representation defined by `struct tm'.
|
|||
|
|
|
|||
|
|
`localtime' constructs the traditional time representation in static
|
|||
|
|
storage; each call to `gmtime' or `localtime' will overwrite the
|
|||
|
|
information generated by previous calls to either function.
|
|||
|
|
|
|||
|
|
`mktime' is the inverse of `localtime'.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
A pointer to the traditional time representation (`struct tm').
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `localtime'.
|
|||
|
|
|
|||
|
|
`localtime' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: mktime, Next: strftime, Prev: localtime, Up: Timefns
|
|||
|
|
|
|||
|
|
8.7 `mktime'--convert time to arithmetic representation
|
|||
|
|
=======================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <time.h>
|
|||
|
|
time_t mktime(struct tm *TIMP);
|
|||
|
|
*Description*
|
|||
|
|
`mktime' assumes the time at TIMP is a local time, and converts its
|
|||
|
|
representation from the traditional representation defined by `struct
|
|||
|
|
tm' into a representation suitable for arithmetic.
|
|||
|
|
|
|||
|
|
`localtime' is the inverse of `mktime'.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
If the contents of the structure at TIMP do not form a valid calendar
|
|||
|
|
time representation, the result is `-1'. Otherwise, the result is the
|
|||
|
|
time, converted to a `time_t' value.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `mktime'.
|
|||
|
|
|
|||
|
|
`mktime' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: strftime, Next: time, Prev: mktime, Up: Timefns
|
|||
|
|
|
|||
|
|
8.8 `strftime'--convert date and time to a formatted string
|
|||
|
|
===========================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <time.h>
|
|||
|
|
size_t strftime(char *S, size_t MAXSIZE,
|
|||
|
|
const char *FORMAT, const struct tm *TIMP);
|
|||
|
|
*Description*
|
|||
|
|
`strftime' converts a `struct tm' representation of the time (at TIMP)
|
|||
|
|
into a null-terminated string, starting at S and occupying no more than
|
|||
|
|
MAXSIZE characters.
|
|||
|
|
|
|||
|
|
You control the format of the output using the string at FORMAT.
|
|||
|
|
`*FORMAT' can contain two kinds of specifications: text to be copied
|
|||
|
|
literally into the formatted string, and time conversion
|
|||
|
|
specifications. Time conversion specifications are two- and
|
|||
|
|
three-character sequences beginning with ``%'' (use ``%%'' to include a
|
|||
|
|
percent sign in the output). Each defined conversion specification
|
|||
|
|
selects only the specified field(s) of calendar time data from `*TIMP',
|
|||
|
|
and converts it to a string in one of the following ways:
|
|||
|
|
|
|||
|
|
`%a'
|
|||
|
|
The abbreviated weekday name according to the current locale.
|
|||
|
|
[tm_wday]
|
|||
|
|
|
|||
|
|
`%A'
|
|||
|
|
The full weekday name according to the current locale. In the
|
|||
|
|
default "C" locale, one of ``Sunday'', ``Monday'', ``Tuesday'',
|
|||
|
|
``Wednesday'', ``Thursday'', ``Friday'', ``Saturday''. [tm_wday]
|
|||
|
|
|
|||
|
|
`%b'
|
|||
|
|
The abbreviated month name according to the current locale.
|
|||
|
|
[tm_mon]
|
|||
|
|
|
|||
|
|
`%B'
|
|||
|
|
The full month name according to the current locale. In the
|
|||
|
|
default "C" locale, one of ``January'', ``February'', ``March'',
|
|||
|
|
``April'', ``May'', ``June'', ``July'', ``August'', ``September'',
|
|||
|
|
``October'', ``November'', ``December''. [tm_mon]
|
|||
|
|
|
|||
|
|
`%c'
|
|||
|
|
The preferred date and time representation for the current locale.
|
|||
|
|
[tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year, tm_wday]
|
|||
|
|
|
|||
|
|
`%C'
|
|||
|
|
The century, that is, the year divided by 100 then truncated. For
|
|||
|
|
4-digit years, the result is zero-padded and exactly two
|
|||
|
|
characters; but for other years, there may a negative sign or more
|
|||
|
|
digits. In this way, ``%C%y'' is equivalent to ``%Y''. [tm_year]
|
|||
|
|
|
|||
|
|
`%d'
|
|||
|
|
The day of the month, formatted with two digits (from ``01'' to
|
|||
|
|
``31''). [tm_mday]
|
|||
|
|
|
|||
|
|
`%D'
|
|||
|
|
A string representing the date, in the form ``"%m/%d/%y"''.
|
|||
|
|
[tm_mday, tm_mon, tm_year]
|
|||
|
|
|
|||
|
|
`%e'
|
|||
|
|
The day of the month, formatted with leading space if single digit
|
|||
|
|
(from ``1'' to ``31''). [tm_mday]
|
|||
|
|
|
|||
|
|
`%E`x''
|
|||
|
|
In some locales, the E modifier selects alternative
|
|||
|
|
representations of certain modifiers `x'. In newlib, it is
|
|||
|
|
ignored, and treated as %`x'.
|
|||
|
|
|
|||
|
|
`%F'
|
|||
|
|
A string representing the ISO 8601:2000 date format, in the form
|
|||
|
|
``"%Y-%m-%d"''. [tm_mday, tm_mon, tm_year]
|
|||
|
|
|
|||
|
|
`%g'
|
|||
|
|
The last two digits of the week-based year, see specifier %G (from
|
|||
|
|
``00'' to ``99''). [tm_year, tm_wday, tm_yday]
|
|||
|
|
|
|||
|
|
`%G'
|
|||
|
|
The week-based year. In the ISO 8601:2000 calendar, week 1 of the
|
|||
|
|
year includes January 4th, and begin on Mondays. Therefore, if
|
|||
|
|
January 1st, 2nd, or 3rd falls on a Sunday, that day and earlier
|
|||
|
|
belong to the last week of the previous year; and if December
|
|||
|
|
29th, 30th, or 31st falls on Monday, that day and later belong to
|
|||
|
|
week 1 of the next year. For consistency with %Y, it always has
|
|||
|
|
at least four characters. Example: "%G" for Saturday 2nd January
|
|||
|
|
1999 gives "1998", and for Tuesday 30th December 1997 gives
|
|||
|
|
"1998". [tm_year, tm_wday, tm_yday]
|
|||
|
|
|
|||
|
|
`%h'
|
|||
|
|
Synonym for "%b". [tm_mon]
|
|||
|
|
|
|||
|
|
`%H'
|
|||
|
|
The hour (on a 24-hour clock), formatted with two digits (from
|
|||
|
|
``00'' to ``23''). [tm_hour]
|
|||
|
|
|
|||
|
|
`%I'
|
|||
|
|
The hour (on a 12-hour clock), formatted with two digits (from
|
|||
|
|
``01'' to ``12''). [tm_hour]
|
|||
|
|
|
|||
|
|
`%j'
|
|||
|
|
The count of days in the year, formatted with three digits (from
|
|||
|
|
``001'' to ``366''). [tm_yday]
|
|||
|
|
|
|||
|
|
`%k'
|
|||
|
|
The hour (on a 24-hour clock), formatted with leading space if
|
|||
|
|
single digit (from ``0'' to ``23''). Non-POSIX extension (c.p.
|
|||
|
|
%I). [tm_hour]
|
|||
|
|
|
|||
|
|
`%l'
|
|||
|
|
The hour (on a 12-hour clock), formatted with leading space if
|
|||
|
|
single digit (from ``1'' to ``12''). Non-POSIX extension (c.p.
|
|||
|
|
%H). [tm_hour]
|
|||
|
|
|
|||
|
|
`%m'
|
|||
|
|
The month number, formatted with two digits (from ``01'' to
|
|||
|
|
``12''). [tm_mon]
|
|||
|
|
|
|||
|
|
`%M'
|
|||
|
|
The minute, formatted with two digits (from ``00'' to ``59'').
|
|||
|
|
[tm_min]
|
|||
|
|
|
|||
|
|
`%n'
|
|||
|
|
A newline character (``\n'').
|
|||
|
|
|
|||
|
|
`%O`x''
|
|||
|
|
In some locales, the O modifier selects alternative digit
|
|||
|
|
characters for certain modifiers `x'. In newlib, it is ignored,
|
|||
|
|
and treated as %`x'.
|
|||
|
|
|
|||
|
|
`%p'
|
|||
|
|
Either ``AM'' or ``PM'' as appropriate, or the corresponding
|
|||
|
|
strings for the current locale. [tm_hour]
|
|||
|
|
|
|||
|
|
`%P'
|
|||
|
|
Same as '`%p'', but in lowercase. This is a GNU extension.
|
|||
|
|
[tm_hour]
|
|||
|
|
|
|||
|
|
`%r'
|
|||
|
|
Replaced by the time in a.m. and p.m. notation. In the "C" locale
|
|||
|
|
this is equivalent to "%I:%M:%S %p". In locales which don't
|
|||
|
|
define a.m./p.m. notations, the result is an empty string.
|
|||
|
|
[tm_sec, tm_min, tm_hour]
|
|||
|
|
|
|||
|
|
`%R'
|
|||
|
|
The 24-hour time, to the minute. Equivalent to "%H:%M". [tm_min,
|
|||
|
|
tm_hour]
|
|||
|
|
|
|||
|
|
`%S'
|
|||
|
|
The second, formatted with two digits (from ``00'' to ``60''). The
|
|||
|
|
value 60 accounts for the occasional leap second. [tm_sec]
|
|||
|
|
|
|||
|
|
`%t'
|
|||
|
|
A tab character (``\t'').
|
|||
|
|
|
|||
|
|
`%T'
|
|||
|
|
The 24-hour time, to the second. Equivalent to "%H:%M:%S".
|
|||
|
|
[tm_sec, tm_min, tm_hour]
|
|||
|
|
|
|||
|
|
`%u'
|
|||
|
|
The weekday as a number, 1-based from Monday (from ``1'' to
|
|||
|
|
``7''). [tm_wday]
|
|||
|
|
|
|||
|
|
`%U'
|
|||
|
|
The week number, where weeks start on Sunday, week 1 contains the
|
|||
|
|
first Sunday in a year, and earlier days are in week 0. Formatted
|
|||
|
|
with two digits (from ``00'' to ``53''). See also `%W'. [tm_wday,
|
|||
|
|
tm_yday]
|
|||
|
|
|
|||
|
|
`%V'
|
|||
|
|
The week number, where weeks start on Monday, week 1 contains
|
|||
|
|
January 4th, and earlier days are in the previous year. Formatted
|
|||
|
|
with two digits (from ``01'' to ``53''). See also `%G'. [tm_year,
|
|||
|
|
tm_wday, tm_yday]
|
|||
|
|
|
|||
|
|
`%w'
|
|||
|
|
The weekday as a number, 0-based from Sunday (from ``0'' to ``6'').
|
|||
|
|
[tm_wday]
|
|||
|
|
|
|||
|
|
`%W'
|
|||
|
|
The week number, where weeks start on Monday, week 1 contains the
|
|||
|
|
first Monday in a year, and earlier days are in week 0. Formatted
|
|||
|
|
with two digits (from ``00'' to ``53''). [tm_wday, tm_yday]
|
|||
|
|
|
|||
|
|
`%x'
|
|||
|
|
Replaced by the preferred date representation in the current
|
|||
|
|
locale. In the "C" locale this is equivalent to "%m/%d/%y".
|
|||
|
|
[tm_mon, tm_mday, tm_year]
|
|||
|
|
|
|||
|
|
`%X'
|
|||
|
|
Replaced by the preferred time representation in the current
|
|||
|
|
locale. In the "C" locale this is equivalent to "%H:%M:%S".
|
|||
|
|
[tm_sec, tm_min, tm_hour]
|
|||
|
|
|
|||
|
|
`%y'
|
|||
|
|
The last two digits of the year (from ``00'' to ``99''). [tm_year]
|
|||
|
|
(Implementation interpretation: always positive, even for
|
|||
|
|
negative years.)
|
|||
|
|
|
|||
|
|
`%Y'
|
|||
|
|
The full year, equivalent to `%C%y'. It will always have at least
|
|||
|
|
four characters, but may have more. The year is accurate even
|
|||
|
|
when tm_year added to the offset of 1900 overflows an int.
|
|||
|
|
[tm_year]
|
|||
|
|
|
|||
|
|
`%z'
|
|||
|
|
The offset from UTC. The format consists of a sign (negative is
|
|||
|
|
west of Greewich), two characters for hour, then two characters
|
|||
|
|
for minutes (-hhmm or +hhmm). If tm_isdst is negative, the offset
|
|||
|
|
is unknown and no output is generated; if it is zero, the offset
|
|||
|
|
is the standard offset for the current time zone; and if it is
|
|||
|
|
positive, the offset is the daylight savings offset for the
|
|||
|
|
current timezone. The offset is determined from the TZ environment
|
|||
|
|
variable, as if by calling tzset(). [tm_isdst]
|
|||
|
|
|
|||
|
|
`%Z'
|
|||
|
|
The time zone name. If tm_isdst is negative, no output is
|
|||
|
|
generated. Otherwise, the time zone name is based on the TZ
|
|||
|
|
environment variable, as if by calling tzset(). [tm_isdst]
|
|||
|
|
|
|||
|
|
`%%'
|
|||
|
|
A single character, ``%''.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
When the formatted time takes up no more than MAXSIZE characters, the
|
|||
|
|
result is the length of the formatted string. Otherwise, if the
|
|||
|
|
formatting operation was abandoned due to lack of room, the result is
|
|||
|
|
`0', and the string starting at S corresponds to just those parts of
|
|||
|
|
`*FORMAT' that could be completely filled in within the MAXSIZE limit.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `strftime', but does not specify the contents of `*S'
|
|||
|
|
when the formatted string would require more than MAXSIZE characters.
|
|||
|
|
Unrecognized specifiers and fields of `timp' that are out of range
|
|||
|
|
cause undefined results. Since some formats expand to 0 bytes, it is
|
|||
|
|
wise to set `*S' to a nonzero value beforehand to distinguish between
|
|||
|
|
failure and an empty string. This implementation does not support `s'
|
|||
|
|
being NULL, nor overlapping `s' and `format'.
|
|||
|
|
|
|||
|
|
`strftime' requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
*Bugs*
|
|||
|
|
`strftime' ignores the LC_TIME category of the current locale,
|
|||
|
|
hard-coding the "C" locale settings.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: time, Next: __tz_lock, Prev: strftime, Up: Timefns
|
|||
|
|
|
|||
|
|
8.9 `time'--get current calendar time (as single number)
|
|||
|
|
========================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <time.h>
|
|||
|
|
time_t time(time_t *T);
|
|||
|
|
*Description*
|
|||
|
|
`time' looks up the best available representation of the current time
|
|||
|
|
and returns it, encoded as a `time_t'. It stores the same value at T
|
|||
|
|
unless the argument is `NULL'.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
A `-1' result means the current time is not available; otherwise the
|
|||
|
|
result represents the current time.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `time'.
|
|||
|
|
|
|||
|
|
Supporting OS subroutine required: Some implementations require
|
|||
|
|
`gettimeofday'.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: __tz_lock, Next: tzset, Prev: time, Up: Timefns
|
|||
|
|
|
|||
|
|
8.10 `__tz_lock', `__tz_unlock'--lock time zone global variables
|
|||
|
|
================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include "local.h"
|
|||
|
|
void __tz_lock (void);
|
|||
|
|
void __tz_unlock (void);
|
|||
|
|
*Description*
|
|||
|
|
The `tzset' facility functions call these functions when they need to
|
|||
|
|
ensure the values of global variables. The version of these routines
|
|||
|
|
supplied in the library use the lock API defined in sys/lock.h. If
|
|||
|
|
multiple threads of execution can call the time functions and give up
|
|||
|
|
scheduling in the middle, then you you need to define your own versions
|
|||
|
|
of these functions in order to safely lock the time zone variables
|
|||
|
|
during a call. If you do not, the results of `localtime', `mktime',
|
|||
|
|
`ctime', and `strftime' are undefined.
|
|||
|
|
|
|||
|
|
The lock `__tz_lock' may not be called recursively; that is, a call
|
|||
|
|
`__tz_lock' will always lock all subsequent `__tz_lock' calls until the
|
|||
|
|
corresponding `__tz_unlock' call on the same thread is made.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: tzset, Prev: __tz_lock, Up: Timefns
|
|||
|
|
|
|||
|
|
8.11 `tzset'--set timezone characteristics from TZ environment variable
|
|||
|
|
=======================================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <time.h>
|
|||
|
|
void tzset(void);
|
|||
|
|
void _tzset_r (struct _reent *);
|
|||
|
|
*Description*
|
|||
|
|
`tzset' examines the TZ environment variable and sets up the three
|
|||
|
|
external variables: `_timezone', `_daylight', and `tzname'. The value
|
|||
|
|
of `_timezone' shall be the offset from the current time zone to GMT.
|
|||
|
|
The value of `_daylight' shall be 0 if there is no daylight savings
|
|||
|
|
time for the current time zone, otherwise it will be non-zero. The
|
|||
|
|
`tzname' array has two entries: the first is the name of the standard
|
|||
|
|
time zone, the second is the name of the daylight-savings time zone.
|
|||
|
|
|
|||
|
|
The TZ environment variable is expected to be in the following POSIX
|
|||
|
|
format:
|
|||
|
|
|
|||
|
|
stdoffset1[dst[offset2][,start[/time1],end[/time2]]]
|
|||
|
|
|
|||
|
|
where: std is the name of the standard time-zone (minimum 3 chars)
|
|||
|
|
offset1 is the value to add to local time to arrive at Universal time
|
|||
|
|
it has the form: hh[:mm[:ss]] dst is the name of the alternate
|
|||
|
|
(daylight-savings) time-zone (min 3 chars) offset2 is the value to add
|
|||
|
|
to local time to arrive at Universal time it has the same format as the
|
|||
|
|
std offset start is the day that the alternate time-zone starts time1
|
|||
|
|
is the optional time that the alternate time-zone starts (this is in
|
|||
|
|
local time and defaults to 02:00:00 if not specified) end is the day
|
|||
|
|
that the alternate time-zone ends time2 is the time that the alternate
|
|||
|
|
time-zone ends (it is in local time and defaults to 02:00:00 if not
|
|||
|
|
specified)
|
|||
|
|
|
|||
|
|
Note that there is no white-space padding between fields. Also note
|
|||
|
|
that if TZ is null, the default is Universal GMT which has no
|
|||
|
|
daylight-savings time. If TZ is empty, the default EST5EDT is used.
|
|||
|
|
|
|||
|
|
The function `_tzset_r' is identical to `tzset' only it is reentrant
|
|||
|
|
and is used for applications that use multiple threads.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
There is no return value.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`tzset' is part of the POSIX standard.
|
|||
|
|
|
|||
|
|
Supporting OS subroutine required: None
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Locale, Next: Reentrancy, Prev: Timefns, Up: Top
|
|||
|
|
|
|||
|
|
9 Locale (`locale.h')
|
|||
|
|
*********************
|
|||
|
|
|
|||
|
|
A "locale" is the name for a collection of parameters (affecting
|
|||
|
|
collating sequences and formatting conventions) that may be different
|
|||
|
|
depending on location or culture. The `"C"' locale is the only one
|
|||
|
|
defined in the ANSI C standard.
|
|||
|
|
|
|||
|
|
This is a minimal implementation, supporting only the required `"C"'
|
|||
|
|
value for locale; strings representing other locales are not honored.
|
|||
|
|
(`""' is also accepted; it represents the default locale for an
|
|||
|
|
implementation, here equivalent to `"C"'.
|
|||
|
|
|
|||
|
|
`locale.h' defines the structure `lconv' to collect the information
|
|||
|
|
on a locale, with the following fields:
|
|||
|
|
|
|||
|
|
`char *decimal_point'
|
|||
|
|
The decimal point character used to format "ordinary" numbers (all
|
|||
|
|
numbers except those referring to amounts of money). `"."' in the
|
|||
|
|
C locale.
|
|||
|
|
|
|||
|
|
`char *thousands_sep'
|
|||
|
|
The character (if any) used to separate groups of digits, when
|
|||
|
|
formatting ordinary numbers. `""' in the C locale.
|
|||
|
|
|
|||
|
|
`char *grouping'
|
|||
|
|
Specifications for how many digits to group (if any grouping is
|
|||
|
|
done at all) when formatting ordinary numbers. The _numeric
|
|||
|
|
value_ of each character in the string represents the number of
|
|||
|
|
digits for the next group, and a value of `0' (that is, the
|
|||
|
|
string's trailing `NULL') means to continue grouping digits using
|
|||
|
|
the last value specified. Use `CHAR_MAX' to indicate that no
|
|||
|
|
further grouping is desired. `""' in the C locale.
|
|||
|
|
|
|||
|
|
`char *int_curr_symbol'
|
|||
|
|
The international currency symbol (first three characters), if
|
|||
|
|
any, and the character used to separate it from numbers. `""' in
|
|||
|
|
the C locale.
|
|||
|
|
|
|||
|
|
`char *currency_symbol'
|
|||
|
|
The local currency symbol, if any. `""' in the C locale.
|
|||
|
|
|
|||
|
|
`char *mon_decimal_point'
|
|||
|
|
The symbol used to delimit fractions in amounts of money. `""' in
|
|||
|
|
the C locale.
|
|||
|
|
|
|||
|
|
`char *mon_thousands_sep'
|
|||
|
|
Similar to `thousands_sep', but used for amounts of money. `""'
|
|||
|
|
in the C locale.
|
|||
|
|
|
|||
|
|
`char *mon_grouping'
|
|||
|
|
Similar to `grouping', but used for amounts of money. `""' in the
|
|||
|
|
C locale.
|
|||
|
|
|
|||
|
|
`char *positive_sign'
|
|||
|
|
A string to flag positive amounts of money when formatting. `""'
|
|||
|
|
in the C locale.
|
|||
|
|
|
|||
|
|
`char *negative_sign'
|
|||
|
|
A string to flag negative amounts of money when formatting. `""'
|
|||
|
|
in the C locale.
|
|||
|
|
|
|||
|
|
`char int_frac_digits'
|
|||
|
|
The number of digits to display when formatting amounts of money to
|
|||
|
|
international conventions. `CHAR_MAX' (the largest number
|
|||
|
|
representable as a `char') in the C locale.
|
|||
|
|
|
|||
|
|
`char frac_digits'
|
|||
|
|
The number of digits to display when formatting amounts of money to
|
|||
|
|
local conventions. `CHAR_MAX' in the C locale.
|
|||
|
|
|
|||
|
|
`char p_cs_precedes'
|
|||
|
|
`1' indicates the local currency symbol is used before a _positive
|
|||
|
|
or zero_ formatted amount of money; `0' indicates the currency
|
|||
|
|
symbol is placed after the formatted number. `CHAR_MAX' in the C
|
|||
|
|
locale.
|
|||
|
|
|
|||
|
|
`char p_sep_by_space'
|
|||
|
|
`1' indicates the local currency symbol must be separated from
|
|||
|
|
_positive or zero_ numbers by a space; `0' indicates that it is
|
|||
|
|
immediately adjacent to numbers. `CHAR_MAX' in the C locale.
|
|||
|
|
|
|||
|
|
`char n_cs_precedes'
|
|||
|
|
`1' indicates the local currency symbol is used before a
|
|||
|
|
_negative_ formatted amount of money; `0' indicates the currency
|
|||
|
|
symbol is placed after the formatted number. `CHAR_MAX' in the C
|
|||
|
|
locale.
|
|||
|
|
|
|||
|
|
`char n_sep_by_space'
|
|||
|
|
`1' indicates the local currency symbol must be separated from
|
|||
|
|
_negative_ numbers by a space; `0' indicates that it is
|
|||
|
|
immediately adjacent to numbers. `CHAR_MAX' in the C locale.
|
|||
|
|
|
|||
|
|
`char p_sign_posn'
|
|||
|
|
Controls the position of the _positive_ sign for numbers
|
|||
|
|
representing money. `0' means parentheses surround the number;
|
|||
|
|
`1' means the sign is placed before both the number and the
|
|||
|
|
currency symbol; `2' means the sign is placed after both the number
|
|||
|
|
and the currency symbol; `3' means the sign is placed just before
|
|||
|
|
the currency symbol; and `4' means the sign is placed just after
|
|||
|
|
the currency symbol. `CHAR_MAX' in the C locale.
|
|||
|
|
|
|||
|
|
`char n_sign_posn'
|
|||
|
|
Controls the position of the _negative_ sign for numbers
|
|||
|
|
representing money, using the same rules as `p_sign_posn'.
|
|||
|
|
`CHAR_MAX' in the C locale.
|
|||
|
|
|
|||
|
|
* Menu:
|
|||
|
|
|
|||
|
|
* setlocale:: Select or query locale
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: setlocale, Up: Locale
|
|||
|
|
|
|||
|
|
9.1 `setlocale', `localeconv'--select or query locale
|
|||
|
|
=====================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <locale.h>
|
|||
|
|
char *setlocale(int CATEGORY, const char *LOCALE);
|
|||
|
|
lconv *localeconv(void);
|
|||
|
|
|
|||
|
|
char *_setlocale_r(void *REENT,
|
|||
|
|
int CATEGORY, const char *LOCALE);
|
|||
|
|
lconv *_localeconv_r(void *REENT);
|
|||
|
|
*Description*
|
|||
|
|
`setlocale' is the facility defined by ANSI C to condition the
|
|||
|
|
execution environment for international collating and formatting
|
|||
|
|
information; `localeconv' reports on the settings of the current locale.
|
|||
|
|
|
|||
|
|
This is a minimal implementation, supporting only the required
|
|||
|
|
`"POSIX"' and `"C"' values for LOCALE; strings representing other
|
|||
|
|
locales are not honored unless _MB_CAPABLE is defined.
|
|||
|
|
|
|||
|
|
If _MB_CAPABLE is defined, POSIX locale strings are allowed,
|
|||
|
|
following the form
|
|||
|
|
|
|||
|
|
language[_TERRITORY][.charset][@modifier]
|
|||
|
|
|
|||
|
|
`"language"' is a two character string per ISO 639, or, if not
|
|||
|
|
available for a given language, a three character string per ISO 639-3.
|
|||
|
|
`"TERRITORY"' is a country code per ISO 3166. For `"charset"' and
|
|||
|
|
`"modifier"' see below.
|
|||
|
|
|
|||
|
|
Additionally to the POSIX specifier, the following extension is
|
|||
|
|
supported for backward compatibility with older implementations using
|
|||
|
|
newlib: `"C-charset"'. Instead of `"C-"', you can also specify `"C."'.
|
|||
|
|
Both variations allow to specify language neutral locales while using
|
|||
|
|
other charsets than ASCII, for instance `"C.UTF-8"', which keeps all
|
|||
|
|
settings as in the C locale, but uses the UTF-8 charset.
|
|||
|
|
|
|||
|
|
The following charsets are recognized: `"UTF-8"', `"JIS"',
|
|||
|
|
`"EUCJP"', `"SJIS"', `"KOI8-R"', `"KOI8-U"', `"GEORGIAN-PS"',
|
|||
|
|
`"PT154"', `"TIS-620"', `"ISO-8859-x"' with 1 <= x <= 16, or `"CPxxx"'
|
|||
|
|
with xxx in [437, 720, 737, 775, 850, 852, 855, 857, 858, 862, 866,
|
|||
|
|
874, 932, 1125, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258].
|
|||
|
|
|
|||
|
|
Charsets are case insensitive. For instance, `"EUCJP"' and `"eucJP"'
|
|||
|
|
are equivalent. Charset names with dashes can also be written without
|
|||
|
|
dashes, as in `"UTF8"', `"iso88591"' or `"koi8r"'. `"EUCJP"' and
|
|||
|
|
`"EUCKR"' are also recognized with dash, `"EUC-JP"' and `"EUC-KR"'.
|
|||
|
|
|
|||
|
|
Full support for all of the above charsets requires that newlib has
|
|||
|
|
been build with multibyte support and support for all ISO and Windows
|
|||
|
|
Codepage. Otherwise all singlebyte charsets are simply mapped to
|
|||
|
|
ASCII. Right now, only newlib for Cygwin is built with full charset
|
|||
|
|
support by default. Under Cygwin, this implementation additionally
|
|||
|
|
supports the charsets `"GBK"', `"GB2312"', `"eucCN"', `"eucKR"', and
|
|||
|
|
`"Big5"'. Cygwin does not support `"JIS"'.
|
|||
|
|
|
|||
|
|
Cygwin additionally supports locales from the file
|
|||
|
|
/usr/share/locale/locale.alias.
|
|||
|
|
|
|||
|
|
(`""' is also accepted; if given, the settings are read from the
|
|||
|
|
corresponding LC_* environment variables and $LANG according to POSIX
|
|||
|
|
rules.
|
|||
|
|
|
|||
|
|
This implementation also supports the modifier `"cjknarrow"', which
|
|||
|
|
affects how the functions `wcwidth' and `wcswidth' handle characters
|
|||
|
|
from the "CJK Ambiguous Width" category of characters described at
|
|||
|
|
http://www.unicode.org/reports/tr11/#Ambiguous. These characters have a
|
|||
|
|
width of 1 for singlebyte charsets and a width of 2 for multibyte
|
|||
|
|
charsets other than UTF-8. For UTF-8, their width depends on the
|
|||
|
|
language specifier: it is 2 for `"zh"' (Chinese), `"ja"' (Japanese),
|
|||
|
|
and `"ko"' (Korean), and 1 for everything else. Specifying
|
|||
|
|
`"cjknarrow"' forces a width of 1, independent of charset and language.
|
|||
|
|
|
|||
|
|
If you use `NULL' as the LOCALE argument, `setlocale' returns a
|
|||
|
|
pointer to the string representing the current locale. The acceptable
|
|||
|
|
values for CATEGORY are defined in ``locale.h'' as macros beginning
|
|||
|
|
with `"LC_"'.
|
|||
|
|
|
|||
|
|
`localeconv' returns a pointer to a structure (also defined in
|
|||
|
|
``locale.h'') describing the locale-specific conventions currently in
|
|||
|
|
effect.
|
|||
|
|
|
|||
|
|
`_localeconv_r' and `_setlocale_r' are reentrant versions of
|
|||
|
|
`localeconv' and `setlocale' respectively. The extra argument REENT is
|
|||
|
|
a pointer to a reentrancy structure.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
A successful call to `setlocale' returns a pointer to a string
|
|||
|
|
associated with the specified category for the new locale. The string
|
|||
|
|
returned by `setlocale' is such that a subsequent call using that
|
|||
|
|
string will restore that category (or all categories in case of LC_ALL),
|
|||
|
|
to that state. The application shall not modify the string returned
|
|||
|
|
which may be overwritten by a subsequent call to `setlocale'. On
|
|||
|
|
error, `setlocale' returns `NULL'.
|
|||
|
|
|
|||
|
|
`localeconv' returns a pointer to a structure of type `lconv', which
|
|||
|
|
describes the formatting and collating conventions in effect (in this
|
|||
|
|
implementation, always those of the C locale).
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `setlocale', but the only locale required across all
|
|||
|
|
implementations is the C locale.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Reentrancy, Next: Misc, Prev: Locale, Up: Top
|
|||
|
|
|
|||
|
|
10 Reentrancy
|
|||
|
|
*************
|
|||
|
|
|
|||
|
|
Reentrancy is a characteristic of functions which allows them to be
|
|||
|
|
safely called recursively or from concurrent processes. Libraries of
|
|||
|
|
reentrant functions enable multiple processes to use the same address
|
|||
|
|
space with assurance that the values stored in those spaces will remain
|
|||
|
|
constant between calls. A fully reentrant library function does not
|
|||
|
|
access any resources that could be shared with another concurrent or
|
|||
|
|
recursive invocation of that function. The reentrancy features
|
|||
|
|
described here provide a mechanism for each process to have separate
|
|||
|
|
resources.
|
|||
|
|
|
|||
|
|
A system with multiple threads may share resources such as the heap,
|
|||
|
|
environment, file pointers, writable static data, or devices. Any
|
|||
|
|
library function that deals with such shared resources cannot be fully
|
|||
|
|
reentrant. If you want to share resources across threads, you may need
|
|||
|
|
a mechanism such as locking to protect access to them and make the
|
|||
|
|
relevant functions thread-safe. See the `Xtensa Linker Support
|
|||
|
|
Packages (LSPs) Reference Manual' for more information about reentrancy
|
|||
|
|
and thread safety.
|
|||
|
|
|
|||
|
|
The Red Hat newlib implementation of the library functions ensures
|
|||
|
|
that whenever possible, these library functions are reentrant. However,
|
|||
|
|
there are some functions that can not be trivially made reentrant.
|
|||
|
|
Hooks have been provided to allow you to use these functions in a fully
|
|||
|
|
reentrant fashion.
|
|||
|
|
|
|||
|
|
These hooks use the structure `_reent' defined in `reent.h'. A
|
|||
|
|
variable defined as `struct _reent' is called a "reentrancy structure".
|
|||
|
|
All functions which must manipulate global information are available
|
|||
|
|
in two versions. The first version has the usual name, and uses a
|
|||
|
|
single global instance of the reentrancy structure. The second has a
|
|||
|
|
different name, normally formed by prepending `_' and appending `_r',
|
|||
|
|
and takes a pointer to the particular reentrancy structure to use.
|
|||
|
|
|
|||
|
|
For example, the function `fopen' takes two arguments, FILE and
|
|||
|
|
MODE, and uses the global reentrancy structure. The function
|
|||
|
|
`_fopen_r' takes the arguments, STRUCT_REENT, which is a pointer to an
|
|||
|
|
instance of the reentrancy structure, FILE and MODE.
|
|||
|
|
|
|||
|
|
There are two versions of `struct _reent', a normal one and one for
|
|||
|
|
small memory systems, controlled by the `_REENT_SMALL' definition from
|
|||
|
|
the (automatically included) `<sys/config.h>'.
|
|||
|
|
|
|||
|
|
Each function which uses the global reentrancy structure uses the
|
|||
|
|
global variable `_impure_ptr', which points to a reentrancy structure.
|
|||
|
|
|
|||
|
|
This means that you have two ways to achieve reentrancy. Both
|
|||
|
|
require that each thread of execution control initialize a unique global
|
|||
|
|
variable of type `struct _reent':
|
|||
|
|
|
|||
|
|
1. Use the reentrant versions of the library functions, after
|
|||
|
|
initializing a global reentrancy structure for each process. Use
|
|||
|
|
the pointer to this structure as the extra argument for all
|
|||
|
|
library functions.
|
|||
|
|
|
|||
|
|
2. Ensure that each thread of execution control has a pointer to its
|
|||
|
|
own unique reentrancy structure in the global variable
|
|||
|
|
`_impure_ptr', and call the standard library subroutines.
|
|||
|
|
|
|||
|
|
The following functions are provided in both reentrant and
|
|||
|
|
non-reentrant versions.
|
|||
|
|
|
|||
|
|
_Equivalent for errno variable:_
|
|||
|
|
_errno_r
|
|||
|
|
|
|||
|
|
_Locale functions:_
|
|||
|
|
_localeconv_r _setlocale_r
|
|||
|
|
|
|||
|
|
_Equivalents for stdio variables:_
|
|||
|
|
_stdin_r _stdout_r _stderr_r
|
|||
|
|
|
|||
|
|
|
|||
|
|
_Stdio functions:_
|
|||
|
|
_fdopen_r _perror_r _tempnam_r
|
|||
|
|
_fopen_r _putchar_r _tmpnam_r
|
|||
|
|
_getchar_r _puts_r _tmpfile_r
|
|||
|
|
_gets_r _remove_r _vfprintf_r
|
|||
|
|
_iprintf_r _rename_r _vsnprintf_r
|
|||
|
|
_mkstemp_r _snprintf_r _vsprintf_r
|
|||
|
|
_mktemp_t _sprintf_r
|
|||
|
|
|
|||
|
|
_Signal functions:_
|
|||
|
|
_init_signal_r _signal_r
|
|||
|
|
_kill_r __sigtramp_r
|
|||
|
|
_raise_r
|
|||
|
|
|
|||
|
|
_Stdlib functions:_
|
|||
|
|
_calloc_r _mblen_r _setenv_r
|
|||
|
|
_dtoa_r _mbstowcs_r _srand_r
|
|||
|
|
_free_r _mbtowc_r _strtod_r
|
|||
|
|
_getenv_r _memalign_r _strtol_r
|
|||
|
|
_mallinfo_r _mstats_r _strtoul_r
|
|||
|
|
_malloc_r _putenv_r _system_r
|
|||
|
|
_malloc_r _rand_r _wcstombs_r
|
|||
|
|
_malloc_stats_r _realloc_r _wctomb_r
|
|||
|
|
|
|||
|
|
_String functions:_
|
|||
|
|
_strdup_r _strtok_r
|
|||
|
|
|
|||
|
|
_System functions:_
|
|||
|
|
_close_r _link_r _unlink_r
|
|||
|
|
_execve_r _lseek_r _wait_r
|
|||
|
|
_fcntl_r _open_r _write_r
|
|||
|
|
_fork_r _read_r
|
|||
|
|
_fstat_r _sbrk_r
|
|||
|
|
_gettimeofday_r _stat_r
|
|||
|
|
_getpid_r _times_r
|
|||
|
|
|
|||
|
|
|
|||
|
|
_Time function:_
|
|||
|
|
_asctime_r
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Misc, Next: Xtensa, Prev: Reentrancy, Up: Top
|
|||
|
|
|
|||
|
|
11 Miscellaneous Macros and Functions
|
|||
|
|
*************************************
|
|||
|
|
|
|||
|
|
This chapter describes miscellaneous routines not covered elsewhere.
|
|||
|
|
|
|||
|
|
* Menu:
|
|||
|
|
|
|||
|
|
* ffs:: Return first bit set in a word
|
|||
|
|
* unctrl:: Return printable representation of a character
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: ffs, Next: unctrl, Up: Misc
|
|||
|
|
|
|||
|
|
11.1 `ffs'--find first bit set in a word
|
|||
|
|
========================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <strings.h>
|
|||
|
|
int ffs(int WORD);
|
|||
|
|
*Description*
|
|||
|
|
`ffs' returns the first bit set in a word.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`ffs' returns 0 if C is 0, 1 if C is odd, 2 if C is a multiple of 2,
|
|||
|
|
etc.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`ffs' is not ANSI C.
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
File: libc.info, Node: unctrl, Prev: ffs, Up: Misc
|
|||
|
|
|
|||
|
|
11.2 `unctrl'--get printable representation of a character
|
|||
|
|
==========================================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <unctrl.h>
|
|||
|
|
char *unctrl(int C);
|
|||
|
|
int unctrllen(int C);
|
|||
|
|
*Description*
|
|||
|
|
`unctrl' is a macro which returns the printable representation of C as
|
|||
|
|
a string. `unctrllen' is a macro which returns the length of the
|
|||
|
|
printable representation of C.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`unctrl' returns a string of the printable representation of C.
|
|||
|
|
|
|||
|
|
`unctrllen' returns the length of the string which is the printable
|
|||
|
|
representation of C.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`unctrl' and `unctrllen' are not ANSI C.
|
|||
|
|
|
|||
|
|
No supporting OS subroutines are required.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Xtensa, Next: Syscalls, Prev: Misc, Up: Top
|
|||
|
|
|
|||
|
|
12 Functions for Xtensa Processors
|
|||
|
|
**********************************
|
|||
|
|
|
|||
|
|
This chapter describes machine-dependent functions that are included in
|
|||
|
|
the C library when it is built for Xtensa processors.
|
|||
|
|
|
|||
|
|
* Menu:
|
|||
|
|
|
|||
|
|
* setjmp:: Save stack environment
|
|||
|
|
* longjmp:: Non-local goto
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: setjmp, Next: longjmp, Up: Xtensa
|
|||
|
|
|
|||
|
|
12.1 `setjmp'--save stack environment
|
|||
|
|
=====================================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <setjmp.h>
|
|||
|
|
int setjmp(jmp_buf env);
|
|||
|
|
*Description*
|
|||
|
|
`setjmp' and `longjmp' are useful for dealing with errors and
|
|||
|
|
interrupts encountered in a low-level subroutine of a program.
|
|||
|
|
`setjmp' saves the stack context/environment in `env' for later use by
|
|||
|
|
`longjmp'. The stack context will be invalidated if the function which
|
|||
|
|
called `setjmp' returns.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`setjmp' returns 0 if returning directly, and non-zero when returning
|
|||
|
|
from `longjmp' using the saved context.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`setjmp' is ANSI C and POSIX.1.
|
|||
|
|
|
|||
|
|
setjmp requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: longjmp, Prev: setjmp, Up: Xtensa
|
|||
|
|
|
|||
|
|
12.2 `longjmp'--non-local goto
|
|||
|
|
==============================
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <setjmp.h>
|
|||
|
|
void longjmp(jmp_buf env, int val);
|
|||
|
|
*Description*
|
|||
|
|
`longjmp' and `setjmp' are useful for dealing with errors and
|
|||
|
|
interrupts encountered in a low-level subroutine of a program.
|
|||
|
|
`longjmp' restores the environment saved by the last call of `setjmp'
|
|||
|
|
with the corresponding `env' argument. After `longjmp' is completed,
|
|||
|
|
program execution continues as if the corresponding call of `setjmp'
|
|||
|
|
had just returned the value `val'. `longjmp' cannot cause 0 to be
|
|||
|
|
returned. If `longjmp' is invoked with a second argument of 0, 1 will
|
|||
|
|
be returned instead.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
This function never returns.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`longjmp' is ANSI C and POSIX.1.
|
|||
|
|
|
|||
|
|
longjmp requires no supporting OS subroutines.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Syscalls, Next: Arglists, Prev: Xtensa, Up: Top
|
|||
|
|
|
|||
|
|
13 System Calls
|
|||
|
|
***************
|
|||
|
|
|
|||
|
|
The C subroutine library depends on a handful of subroutine calls for
|
|||
|
|
operating system services. If you use the C library on a system that
|
|||
|
|
complies with the POSIX.1 standard (also known as IEEE 1003.1), most of
|
|||
|
|
these subroutines are supplied with your operating system.
|
|||
|
|
|
|||
|
|
If some of these subroutines are not provided with your system--in
|
|||
|
|
the extreme case, if you are developing software for a "bare board"
|
|||
|
|
system, without an OS--you will at least need to provide do-nothing
|
|||
|
|
stubs (or subroutines with minimal functionality) to allow your
|
|||
|
|
programs to link with the subroutines in `libc.a'.
|
|||
|
|
|
|||
|
|
System routines may be provided in either reentrant or non-reentrant
|
|||
|
|
versions. The reentrant versions take an extra argument for the
|
|||
|
|
reentrancy structure and have different names, formed by prepending `_'
|
|||
|
|
and appending `_r' (e.g., `_close_r' instead of `close'). If newlib is
|
|||
|
|
configured to use reentrant system routines, the non-reentrant versions
|
|||
|
|
of the system routines are provided as cover routines. Likewise, if
|
|||
|
|
newlib is configured to use non-reentrant system routines, reentrant
|
|||
|
|
cover routines are provided that achieve reentrancy by using a reserved
|
|||
|
|
global data block. *Note Reentrancy: Reentrancy.
|
|||
|
|
|
|||
|
|
* Menu:
|
|||
|
|
|
|||
|
|
* Stubs:: Definitions for OS interface
|
|||
|
|
|
|||
|
|
* Xtensa Syscalls:: System calls in the default Xtensa runtime
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Stubs, Next: Xtensa Syscalls, Up: Syscalls
|
|||
|
|
|
|||
|
|
13.1 Definitions for OS interface
|
|||
|
|
=================================
|
|||
|
|
|
|||
|
|
This is the complete set of system definitions (primarily subroutines)
|
|||
|
|
required; the examples shown implement the minimal functionality
|
|||
|
|
required to allow `libc' to link, and fail gracefully where OS services
|
|||
|
|
are not available.
|
|||
|
|
|
|||
|
|
Graceful failure is permitted by returning an error code. If newlib
|
|||
|
|
is configured to use non-reentrant system routines, a minor
|
|||
|
|
complication arises here: the C library must be compatible with
|
|||
|
|
development environments that supply fully functional versions of these
|
|||
|
|
subroutines. Such environments usually return error codes in a global
|
|||
|
|
`errno'. However, the Red Hat newlib C library provides a _macro_
|
|||
|
|
definition for `errno' in the header file `errno.h', as part of its
|
|||
|
|
support for reentrant routines (*note Reentrancy: Reentrancy.).
|
|||
|
|
|
|||
|
|
The bridge between these two interpretations of `errno' is
|
|||
|
|
straightforward: the C library routines with OS interface calls capture
|
|||
|
|
the `errno' values returned globally, and record them in the
|
|||
|
|
appropriate field of the reentrancy structure (so that you can query
|
|||
|
|
them using the `errno' macro from `errno.h').
|
|||
|
|
|
|||
|
|
This mechanism becomes visible when you write non-reentrant stub
|
|||
|
|
routines for OS interfaces. You must include `errno.h', then disable
|
|||
|
|
the macro, like this:
|
|||
|
|
|
|||
|
|
#include <errno.h>
|
|||
|
|
#undef errno
|
|||
|
|
extern int errno;
|
|||
|
|
|
|||
|
|
The examples in this chapter include this treatment of `errno'. If you
|
|||
|
|
are writing reentrant stub routines, this issue is irrelevant because
|
|||
|
|
the error code is stored into the reentrancy structure and there is no
|
|||
|
|
need for a global variable.
|
|||
|
|
|
|||
|
|
For simplicity, only the non-reentrant versions of the system
|
|||
|
|
routines are shown here. The reentrant versions are similar except for
|
|||
|
|
the function names, the extra reentrancy structure argument, and the
|
|||
|
|
error codes being stored into the reentrancy structure instead of the
|
|||
|
|
global `errno' variable.
|
|||
|
|
|
|||
|
|
`_exit'
|
|||
|
|
Exit a program without cleaning up files. If your system doesn't
|
|||
|
|
provide this, it is best to avoid linking with subroutines that
|
|||
|
|
require it (`exit', `system'). Note that there is no separate
|
|||
|
|
reentrant version of this routine, even when newlib is configured
|
|||
|
|
to use reentrant system routines.
|
|||
|
|
|
|||
|
|
`close'
|
|||
|
|
Close a file. Minimal implementation:
|
|||
|
|
|
|||
|
|
int close(int file) {
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`environ'
|
|||
|
|
A pointer to a list of environment variables and their values.
|
|||
|
|
For a minimal environment, this empty list is adequate:
|
|||
|
|
|
|||
|
|
char *__env[1] = { 0 };
|
|||
|
|
char **environ = __env;
|
|||
|
|
|
|||
|
|
`execve'
|
|||
|
|
Transfer control to a new process. Minimal implementation (for a
|
|||
|
|
system without processes):
|
|||
|
|
|
|||
|
|
#include <errno.h>
|
|||
|
|
#undef errno
|
|||
|
|
extern int errno;
|
|||
|
|
int execve(char *name, char **argv, char **env) {
|
|||
|
|
errno = ENOMEM;
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`fcntl'
|
|||
|
|
File control commands. Minimal implementation:
|
|||
|
|
|
|||
|
|
int fcntl(int fildes, int cmd, int arg) {
|
|||
|
|
errno = EAGAIN;
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`fork'
|
|||
|
|
Create a new process. Minimal implementation (for a system
|
|||
|
|
without processes):
|
|||
|
|
|
|||
|
|
#include <errno.h>
|
|||
|
|
#undef errno
|
|||
|
|
extern int errno;
|
|||
|
|
int fork(void) {
|
|||
|
|
errno = EAGAIN;
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`fstat'
|
|||
|
|
Status of an open file. For consistency with other minimal
|
|||
|
|
implementations in these examples, all files are regarded as
|
|||
|
|
character special devices. The `sys/stat.h' header file required
|
|||
|
|
is distributed in the `include' subdirectory for this C library.
|
|||
|
|
|
|||
|
|
#include <sys/stat.h>
|
|||
|
|
int fstat(int file, struct stat *st) {
|
|||
|
|
st->st_mode = S_IFCHR;
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`getpid'
|
|||
|
|
Process-ID; this is sometimes used to generate strings unlikely to
|
|||
|
|
conflict with other processes. Minimal implementation, for a
|
|||
|
|
system without processes:
|
|||
|
|
|
|||
|
|
int getpid(void) {
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`gettimeofday'
|
|||
|
|
Get the current time. Minimal implementation:
|
|||
|
|
|
|||
|
|
#include <sys/time.h>
|
|||
|
|
int gettimeofday(struct timeval *tv,
|
|||
|
|
struct timezone *tz) {
|
|||
|
|
errno = EINVAL;
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`kill'
|
|||
|
|
Send a signal. Minimal implementation:
|
|||
|
|
|
|||
|
|
#include <errno.h>
|
|||
|
|
#undef errno
|
|||
|
|
extern int errno;
|
|||
|
|
int kill(int pid, int sig) {
|
|||
|
|
errno = EINVAL;
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`link'
|
|||
|
|
Establish a new name for an existing file. Minimal implementation:
|
|||
|
|
|
|||
|
|
#include <errno.h>
|
|||
|
|
#undef errno
|
|||
|
|
extern int errno;
|
|||
|
|
int link(char *old, char *new) {
|
|||
|
|
errno = EMLINK;
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`lseek'
|
|||
|
|
Set position in a file. Minimal implementation:
|
|||
|
|
|
|||
|
|
int lseek(int file, int ptr, int dir) {
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`open'
|
|||
|
|
Open a file. Minimal implementation:
|
|||
|
|
|
|||
|
|
int open(const char *name, int flags, int mode) {
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`read'
|
|||
|
|
Read from a file. Minimal implementation:
|
|||
|
|
|
|||
|
|
int read(int file, char *ptr, int len) {
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`_rename'
|
|||
|
|
Rename a file. For systems that do not support the `link' system
|
|||
|
|
routine, newlib can be configured to use this optional routine for
|
|||
|
|
renaming files. Note that the reentrant version of this routine is
|
|||
|
|
named `_rename_r'. Minimal implementation:
|
|||
|
|
|
|||
|
|
int _rename(char *oldpath, char *newpath) {
|
|||
|
|
errno = EINVAL;
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`sbrk'
|
|||
|
|
Increase program data space. As `malloc' and related functions
|
|||
|
|
depend on this, it is useful to have a working implementation. The
|
|||
|
|
following suffices for a standalone system; it exploits the symbol
|
|||
|
|
`_end' automatically defined by the GNU linker.
|
|||
|
|
|
|||
|
|
caddr_t sbrk(int incr) {
|
|||
|
|
extern char _end; /* Defined by the linker */
|
|||
|
|
static char *heap_end;
|
|||
|
|
char *prev_heap_end;
|
|||
|
|
|
|||
|
|
if (heap_end == 0) {
|
|||
|
|
heap_end = &_end;
|
|||
|
|
}
|
|||
|
|
prev_heap_end = heap_end;
|
|||
|
|
if (heap_end + incr > stack_ptr) {
|
|||
|
|
write (1, "Heap and stack collision\n", 25);
|
|||
|
|
abort ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
heap_end += incr;
|
|||
|
|
return (caddr_t) prev_heap_end;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`stat'
|
|||
|
|
Status of a file (by name). Minimal implementation:
|
|||
|
|
|
|||
|
|
int stat(char *file, struct stat *st) {
|
|||
|
|
st->st_mode = S_IFCHR;
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`times'
|
|||
|
|
Timing information for current process. Minimal implementation:
|
|||
|
|
|
|||
|
|
int times(struct tms *buf) {
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`unlink'
|
|||
|
|
Remove a file's directory entry. Minimal implementation:
|
|||
|
|
|
|||
|
|
#include <errno.h>
|
|||
|
|
#undef errno
|
|||
|
|
extern int errno;
|
|||
|
|
int unlink(char *name) {
|
|||
|
|
errno = ENOENT;
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`wait'
|
|||
|
|
Wait for a child process. Minimal implementation:
|
|||
|
|
#include <errno.h>
|
|||
|
|
#undef errno
|
|||
|
|
extern int errno;
|
|||
|
|
int wait(int *status) {
|
|||
|
|
errno = ECHILD;
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
`write'
|
|||
|
|
Write to a file. `libc' subroutines will use this system routine
|
|||
|
|
for output to all files, _including_ `stdout'--so if you need to
|
|||
|
|
generate any output, for example to a serial port for debugging,
|
|||
|
|
you should make your minimal `write' capable of doing this. The
|
|||
|
|
following minimal implementation is an incomplete example; it
|
|||
|
|
relies on an `outbyte' subroutine (not shown; typically, you must
|
|||
|
|
write this in assembler from examples provided by your hardware
|
|||
|
|
manufacturer) to actually perform the output.
|
|||
|
|
|
|||
|
|
int write(int file, char *ptr, int len) {
|
|||
|
|
int todo;
|
|||
|
|
|
|||
|
|
for (todo = 0; todo < len; todo++) {
|
|||
|
|
outbyte (*ptr++);
|
|||
|
|
}
|
|||
|
|
return len;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Xtensa Syscalls, Prev: Stubs, Up: Syscalls
|
|||
|
|
|
|||
|
|
13.2 Xtensa system calls
|
|||
|
|
========================
|
|||
|
|
|
|||
|
|
If you are not using an operating system, the default Xtensa runtime
|
|||
|
|
environment provides three options for system calls. The first option
|
|||
|
|
is the GNU low-level operating system support library (libgloss), which
|
|||
|
|
provides minimal stub routines, similar to those described above (*note
|
|||
|
|
Stubs::). Please refer to the `Xtensa Linker Support Packages (LSPs)
|
|||
|
|
Reference Manual' for instructions on modifying and rebuilding libgloss.
|
|||
|
|
|
|||
|
|
The second and third options both pass some system calls to a host
|
|||
|
|
machine, where they are evaluated before passing the results back to
|
|||
|
|
the target system. With this approach, your Xtensa system can access
|
|||
|
|
the file system of the host machine, which is often useful for
|
|||
|
|
development and debugging. The "sim" library uses the "semihosting"
|
|||
|
|
feature of the Xtensa instruction set simulator (ISS) to implement
|
|||
|
|
system calls that pass through to the host running the ISS. This is
|
|||
|
|
the default when running on the Xtensa ISS. The "gdbio" library uses
|
|||
|
|
the "File-I/O" remote protocol extension of the GNU debugger (GDB) to
|
|||
|
|
pass system calls via the On-Chip Debugging (OCD) interface to a host
|
|||
|
|
machine running GDB. See the `Xtensa Software Development Toolkit
|
|||
|
|
User's Guide' for information about using the gdbio library. The
|
|||
|
|
"File-I/O remote protocol extension" appendix section in the `GNU
|
|||
|
|
Debugger User's Guide' describes the details of this feature.
|
|||
|
|
|
|||
|
|
Tensilica configures newlib to use reentrant system call interfaces.
|
|||
|
|
The actual system call implementations may not all be reentrant; see
|
|||
|
|
the `Xtensa Linker Support Packages (LSPs) Reference Manual' for
|
|||
|
|
details. The system routines are listed in this section with the
|
|||
|
|
reentrant function names.
|
|||
|
|
|
|||
|
|
* Menu:
|
|||
|
|
|
|||
|
|
* Xtensa Libgloss:: The Xtensa version of libgloss.
|
|||
|
|
* Xtensa ISS Syscalls:: System calls supported by the ISS.
|
|||
|
|
* Xtensa gdbio:: System calls supported by gdbio.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Xtensa Libgloss, Next: Xtensa ISS Syscalls, Up: Xtensa Syscalls
|
|||
|
|
|
|||
|
|
13.2.1 System calls with the libgloss library
|
|||
|
|
---------------------------------------------
|
|||
|
|
|
|||
|
|
The Xtensa libgloss library implements the system routines as described
|
|||
|
|
below. Some of the routines are not implemented; programs using
|
|||
|
|
libgloss must avoid linking with functions that require those
|
|||
|
|
unimplemented routines.
|
|||
|
|
|
|||
|
|
`_exit'
|
|||
|
|
Not implemented. It is assumed that this function is provided
|
|||
|
|
elsewhere, typically in the `crt1' file.
|
|||
|
|
|
|||
|
|
`_close_r'
|
|||
|
|
Does nothing. Returns 0.
|
|||
|
|
|
|||
|
|
`environ'
|
|||
|
|
Not implemented. The default implementation in newlib is used
|
|||
|
|
unless another definition is provided elsewhere.
|
|||
|
|
|
|||
|
|
`_execve_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_fcntl_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_fork_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_fstat_r'
|
|||
|
|
Assumes terminal I/O and sets `st_mode' to `S_IFCHR'. Returns 0.
|
|||
|
|
|
|||
|
|
`_getpid_r'
|
|||
|
|
Returns 1.
|
|||
|
|
|
|||
|
|
`_gettimeofday_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_kill_r'
|
|||
|
|
Calls `_exit' if the specified process ID is 1 (as returned by
|
|||
|
|
`getpid'); otherwise, does nothing. Returns 0.
|
|||
|
|
|
|||
|
|
`_link_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_lseek_r'
|
|||
|
|
Sets `errno' to `ESPIPE'. Returns -1.
|
|||
|
|
|
|||
|
|
`_open_r'
|
|||
|
|
Sets `errno' to `EIO'. Returns -1.
|
|||
|
|
|
|||
|
|
`_read_r'
|
|||
|
|
Reads the specified number of bytes from the serial port using a
|
|||
|
|
board-specific `inbyte' function. Ignores the file descriptor
|
|||
|
|
argument. The `inbyte' function is not part of libgloss and must
|
|||
|
|
be provided elsewhere.
|
|||
|
|
|
|||
|
|
`_rename_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_sbrk_r'
|
|||
|
|
Grows the heap. If the end of the heap extends beyond the
|
|||
|
|
`_heap_sentry' symbol (set by the linker), sets `errno' to
|
|||
|
|
`ENOMEM' and returns -1. Note that unlike the ISS semihosting
|
|||
|
|
version of `_sbrk_r', this version does not currently check if the
|
|||
|
|
heap collides with the stack.
|
|||
|
|
|
|||
|
|
`_stat_r'
|
|||
|
|
Sets `errno' to `EIO' and returns -1.
|
|||
|
|
|
|||
|
|
`_times_r'
|
|||
|
|
Returns the current cycle count value if the Xtensa processor
|
|||
|
|
configuration includes the Timer Interrupt Option; otherwise, sets
|
|||
|
|
`errno' to `ENOSYS' and returns -1.
|
|||
|
|
|
|||
|
|
`_unlink_r'
|
|||
|
|
Sets `errno' to `EIO'. Returns -1.
|
|||
|
|
|
|||
|
|
`_wait_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_write_r'
|
|||
|
|
Writes the specified number of bytes to the serial port using the
|
|||
|
|
board-specific `outbyte' function. Ignores the file descriptor
|
|||
|
|
argument. The `outbyte' function is not included in libgloss and
|
|||
|
|
must be provided elsewhere.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Xtensa ISS Syscalls, Next: Xtensa gdbio, Prev: Xtensa Libgloss, Up: Xtensa Syscalls
|
|||
|
|
|
|||
|
|
13.2.2 System calls with the Xtensa ISS
|
|||
|
|
---------------------------------------
|
|||
|
|
|
|||
|
|
The Xtensa ISS semihosting library provides the following system
|
|||
|
|
routines (all the routines using ISS semihosting set `errno' and the
|
|||
|
|
return value based on the status of the host system call):
|
|||
|
|
|
|||
|
|
`_exit'
|
|||
|
|
Terminates the Xtensa ISS simulation.
|
|||
|
|
|
|||
|
|
`_close_r'
|
|||
|
|
Closes the specified host file using the ISS semihosting interface.
|
|||
|
|
|
|||
|
|
`environ'
|
|||
|
|
Not implemented. It is assumed that this is provided in the
|
|||
|
|
`crt1-sim' file.
|
|||
|
|
|
|||
|
|
`_execve_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_fcntl_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_fork_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_fstat_r'
|
|||
|
|
Assumes terminal I/O and sets `st_mode' to `S_IFCHR'. Returns 0.
|
|||
|
|
|
|||
|
|
`_getpid_r'
|
|||
|
|
Returns 1.
|
|||
|
|
|
|||
|
|
`_gettimeofday_r'
|
|||
|
|
Gets the host system's current time expressed in elapsed seconds
|
|||
|
|
and microseconds since January 1, 1970 using the ISS semihosting
|
|||
|
|
interface.
|
|||
|
|
|
|||
|
|
`_kill_r'
|
|||
|
|
Calls `_exit' if the specified process ID is 1 (as returned by
|
|||
|
|
`getpid'); otherwise, does nothing. Returns 0.
|
|||
|
|
|
|||
|
|
`_link_r'
|
|||
|
|
Adds a hard link to a host file using the ISS semihosting
|
|||
|
|
interface. (Only supported on Unix platforms.)
|
|||
|
|
|
|||
|
|
`_lseek_r'
|
|||
|
|
Seeks to the specified location in a host file using the ISS
|
|||
|
|
semihosting interface.
|
|||
|
|
|
|||
|
|
`_open_r'
|
|||
|
|
Opens the specified file on the host using the ISS semihosting
|
|||
|
|
interface. The following flags are supported: `O_RDONLY',
|
|||
|
|
`O_WRONLY', `O_RDWR', `O_APPEND', `O_CREAT', `O_TRUNC', `O_EXCL',
|
|||
|
|
`O_NDELAY', `O_NONBLOCK', `O_BINARY', and `O_TEXT'.
|
|||
|
|
|
|||
|
|
`_read_r'
|
|||
|
|
Reads from a host file using the ISS semihosting interface.
|
|||
|
|
|
|||
|
|
`_rename_r'
|
|||
|
|
Renames a host file using the ISS semihosting interface.
|
|||
|
|
|
|||
|
|
`_sbrk_r'
|
|||
|
|
Grows the heap. If the end of the heap extends beyond the
|
|||
|
|
`_heap_sentry' symbol (set by the linker) or if it collides with
|
|||
|
|
the stack, sets `errno' to `ENOMEM' and returns -1.
|
|||
|
|
|
|||
|
|
`_stat_r'
|
|||
|
|
Sets `errno' to `EIO' and returns -1.
|
|||
|
|
|
|||
|
|
`_times_r'
|
|||
|
|
Returns the Xtensa simulation cycle count.
|
|||
|
|
|
|||
|
|
`_unlink_r'
|
|||
|
|
Unlinks (i.e., removes) a host file using the ISS semihosting
|
|||
|
|
interface.
|
|||
|
|
|
|||
|
|
`_wait_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_write_r'
|
|||
|
|
Writes to a host file using the ISS semihosting interface.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Xtensa gdbio, Prev: Xtensa ISS Syscalls, Up: Xtensa Syscalls
|
|||
|
|
|
|||
|
|
13.2.3 System calls with the gdbio library
|
|||
|
|
------------------------------------------
|
|||
|
|
|
|||
|
|
The Xtensa "gdbio" library (libgdbio) implements the system routines as
|
|||
|
|
described below. Some of the routines are not implemented; programs
|
|||
|
|
using libgdbio must avoid linking with functions that require those
|
|||
|
|
unimplemented routines.
|
|||
|
|
|
|||
|
|
`_exit'
|
|||
|
|
Not implemented. It is assumed that this function is provided
|
|||
|
|
elsewhere, typically in the `crt1' file.
|
|||
|
|
|
|||
|
|
`_close_r'
|
|||
|
|
Closes the specified host file using GDB's File-I/O protocol.
|
|||
|
|
|
|||
|
|
`environ'
|
|||
|
|
Not implemented. The default implementation in newlib is used
|
|||
|
|
unless another definition is provided elsewhere.
|
|||
|
|
|
|||
|
|
`_execve_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_fcntl_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_fork_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_fstat_r'
|
|||
|
|
Gets the status of an open file using GDB's File-I/O protocol.
|
|||
|
|
|
|||
|
|
`_getpid_r'
|
|||
|
|
Returns 1.
|
|||
|
|
|
|||
|
|
`_gettimeofday_r'
|
|||
|
|
Gets the host system's current time expressed in elapsed seconds
|
|||
|
|
and microseconds since January 1, 1970 using GDB's File-I/O
|
|||
|
|
protocol.
|
|||
|
|
|
|||
|
|
`_kill_r'
|
|||
|
|
Calls _exit if the specified process ID is 1 (as returned by
|
|||
|
|
_getpid_r); otherwise, does nothing. Returns 0.
|
|||
|
|
|
|||
|
|
`_link_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_lseek_r'
|
|||
|
|
Seeks to the specified location in a host file using GDB's
|
|||
|
|
File-I/O protocol.
|
|||
|
|
|
|||
|
|
`_open_r'
|
|||
|
|
Opens the specified file on the host using GDB's File-I/O
|
|||
|
|
protocol. The following flags are supported: `O_RDONLY',
|
|||
|
|
`O_WRONLY', `O_RDWR', `O_APPEND', `O_CREAT', `O_TRUNC', and
|
|||
|
|
`O_EXCL'.
|
|||
|
|
|
|||
|
|
`_read_r'
|
|||
|
|
Reads from a host file using GDB's File-I/O protocol.
|
|||
|
|
|
|||
|
|
`_rename_r'
|
|||
|
|
Renames a host file using GDB's File-I/O protocol.
|
|||
|
|
|
|||
|
|
`_sbrk_r'
|
|||
|
|
Grows the heap. If the end of the heap extends beyond the
|
|||
|
|
_heap_sentry symbol (set by the linker), sets errno to ENOMEM and
|
|||
|
|
returns -1. Note that unlike the ISS semihosting version of
|
|||
|
|
_sbrk_r, this version does not currently check if the heap
|
|||
|
|
collides with the stack.
|
|||
|
|
|
|||
|
|
`_stat_r'
|
|||
|
|
Gets the status of the specified host file using GDB's File-I/O
|
|||
|
|
protocol.
|
|||
|
|
|
|||
|
|
`_times_r'
|
|||
|
|
Returns the current cycle count value if the Xtensa processor
|
|||
|
|
configuration includes the Timer Interrupt Option; otherwise, sets
|
|||
|
|
`errno' to `ENOSYS' and returns -1.
|
|||
|
|
|
|||
|
|
`_unlink_r'
|
|||
|
|
Unlinks (i.e., removes) a host file using GDB's File-I/O protocol.
|
|||
|
|
|
|||
|
|
`_wait_r'
|
|||
|
|
Not implemented.
|
|||
|
|
|
|||
|
|
`_write_r'
|
|||
|
|
Writes to a host file using GDB's File-I/O protocol.
|
|||
|
|
|
|||
|
|
`gdbio_system'
|
|||
|
|
This function provides access to the GDB File-I/O protocol's
|
|||
|
|
`system' function. It is renamed to avoid conflicting with
|
|||
|
|
newlib's standard `system' function. It is only supported on Unix
|
|||
|
|
platforms.
|
|||
|
|
int gdbio_system(const char *command);
|
|||
|
|
The specified command is executed on the host by running "`/bin/sh
|
|||
|
|
-c COMMAND'". The return value is -1 on error, or the exit status
|
|||
|
|
of the command otherwise. Note that this feature is disabled by
|
|||
|
|
default in GDB and must be enabled by changing the "remote
|
|||
|
|
system-call-allowed" setting to a nonzero value.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Arglists, Next: Library Index, Prev: Syscalls, Up: Top
|
|||
|
|
|
|||
|
|
14 Variable Argument Lists
|
|||
|
|
**************************
|
|||
|
|
|
|||
|
|
The `printf' family of functions is defined to accept a variable number
|
|||
|
|
of arguments, rather than a fixed argument list. You can define your
|
|||
|
|
own functions with a variable argument list, by using macro definitions
|
|||
|
|
from either `stdarg.h' (for compatibility with ANSI C) or from
|
|||
|
|
`varargs.h' (for compatibility with a popular convention prior to ANSI
|
|||
|
|
C).
|
|||
|
|
|
|||
|
|
* Menu:
|
|||
|
|
|
|||
|
|
* Stdarg::
|
|||
|
|
* Varargs::
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Stdarg, Next: Varargs, Up: Arglists
|
|||
|
|
|
|||
|
|
14.1 ANSI-standard macros, `stdarg.h'
|
|||
|
|
=====================================
|
|||
|
|
|
|||
|
|
In ANSI C, a function has a variable number of arguments when its
|
|||
|
|
parameter list ends in an ellipsis (`...'). The parameter list must
|
|||
|
|
also include at least one explicitly named argument; that argument is
|
|||
|
|
used to initialize the variable list data structure.
|
|||
|
|
|
|||
|
|
ANSI C defines three macros (`va_start', `va_arg', and `va_end') to
|
|||
|
|
operate on variable argument lists. `stdarg.h' also defines a special
|
|||
|
|
type to represent variable argument lists: this type is called
|
|||
|
|
`va_list'.
|
|||
|
|
|
|||
|
|
* Menu:
|
|||
|
|
|
|||
|
|
* va_start::
|
|||
|
|
* va_arg::
|
|||
|
|
* va_end::
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: va_start, Next: va_arg, Up: Stdarg
|
|||
|
|
|
|||
|
|
14.1.1 Initialize variable argument list
|
|||
|
|
----------------------------------------
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <stdarg.h>
|
|||
|
|
void va_start(va_list AP, RIGHTMOST);
|
|||
|
|
|
|||
|
|
*Description*
|
|||
|
|
Use `va_start' to initialize the variable argument list AP, so that
|
|||
|
|
`va_arg' can extract values from it. RIGHTMOST is the name of the last
|
|||
|
|
explicit argument in the parameter list (the argument immediately
|
|||
|
|
preceding the ellipsis `...' that flags variable arguments in an ANSI C
|
|||
|
|
function header). You can only use `va_start' in a function declared
|
|||
|
|
using this ellipsis notation (not, for example, in one of its
|
|||
|
|
subfunctions).
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`va_start' does not return a result.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `va_start'.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: va_arg, Next: va_end, Prev: va_start, Up: Stdarg
|
|||
|
|
|
|||
|
|
14.1.2 Extract a value from argument list
|
|||
|
|
-----------------------------------------
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <stdarg.h>
|
|||
|
|
TYPE va_arg(va_list AP, TYPE);
|
|||
|
|
|
|||
|
|
*Description*
|
|||
|
|
`va_arg' returns the next unprocessed value from a variable argument
|
|||
|
|
list AP (which you must previously create with VA_START). Specify the
|
|||
|
|
type for the value as the second parameter to the macro, TYPE.
|
|||
|
|
|
|||
|
|
You may pass a `va_list' object AP to a subfunction, and use
|
|||
|
|
`va_arg' from the subfunction rather than from the function actually
|
|||
|
|
declared with an ellipsis in the header; however, in that case you may
|
|||
|
|
_only_ use `va_arg' from the subfunction. ANSI C does not permit
|
|||
|
|
extracting successive values from a single variable-argument list from
|
|||
|
|
different levels of the calling stack.
|
|||
|
|
|
|||
|
|
There is no mechanism for testing whether there is actually a next
|
|||
|
|
argument available; you might instead pass an argument count (or some
|
|||
|
|
other data that implies an argument count) as one of the fixed arguments
|
|||
|
|
in your function call.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`va_arg' returns the next argument, an object of type TYPE.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `va_arg'.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: va_end, Prev: va_arg, Up: Stdarg
|
|||
|
|
|
|||
|
|
14.1.3 Abandon a variable argument list
|
|||
|
|
---------------------------------------
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <stdarg.h>
|
|||
|
|
void va_end(va_list AP);
|
|||
|
|
|
|||
|
|
*Description*
|
|||
|
|
Use `va_end' to declare that your program will not use the variable
|
|||
|
|
argument list AP any further.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`va_end' does not return a result.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
ANSI C requires `va_end'.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Varargs, Prev: Stdarg, Up: Arglists
|
|||
|
|
|
|||
|
|
14.2 Traditional macros, `varargs.h'
|
|||
|
|
====================================
|
|||
|
|
|
|||
|
|
If your C compiler predates ANSI C, you may still be able to use
|
|||
|
|
variable argument lists using the macros from the `varargs.h' header
|
|||
|
|
file. These macros resemble their ANSI counterparts, but have
|
|||
|
|
important differences in usage. In particular, since traditional C has
|
|||
|
|
no declaration mechanism for variable argument lists, two additional
|
|||
|
|
macros are provided simply for the purpose of defining functions with
|
|||
|
|
variable argument lists.
|
|||
|
|
|
|||
|
|
As with `stdarg.h', the type `va_list' is used to hold a data
|
|||
|
|
structure representing a variable argument list.
|
|||
|
|
|
|||
|
|
* Menu:
|
|||
|
|
|
|||
|
|
* va_alist::
|
|||
|
|
* va_start-trad::
|
|||
|
|
* va_arg-trad::
|
|||
|
|
* va_end-trad::
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: va_alist, Next: va_start-trad, Up: Varargs
|
|||
|
|
|
|||
|
|
14.2.1 Declare variable arguments
|
|||
|
|
---------------------------------
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <varargs.h>
|
|||
|
|
FUNCTION(va_alist)
|
|||
|
|
va_dcl
|
|||
|
|
|
|||
|
|
*Description*
|
|||
|
|
To use the `varargs.h' version of variable argument lists, you must
|
|||
|
|
declare your function with a call to the macro `va_alist' as its
|
|||
|
|
argument list, and use `va_dcl' as the declaration. _Do not use a
|
|||
|
|
semicolon after `va_dcl'._
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
These macros cannot be used in a context where a return is syntactically
|
|||
|
|
possible.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
VA_ALIST and VA_DCL were the most widespread method of declaring
|
|||
|
|
variable argument lists prior to ANSI C.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: va_start-trad, Next: va_arg-trad, Prev: va_alist, Up: Varargs
|
|||
|
|
|
|||
|
|
14.2.2 Initialize variable argument list
|
|||
|
|
----------------------------------------
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <varargs.h>
|
|||
|
|
va_list AP;
|
|||
|
|
va_start(AP);
|
|||
|
|
|
|||
|
|
*Description*
|
|||
|
|
With the `varargs.h' macros, use `va_start' to initialize a data
|
|||
|
|
structure AP to permit manipulating a variable argument list. AP must
|
|||
|
|
have the type VA_ALIST.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`va_start' does not return a result.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
`va_start' is also defined as a macro in ANSI C, but the definitions
|
|||
|
|
are incompatible; the ANSI version has another parameter besides AP.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: va_arg-trad, Next: va_end-trad, Prev: va_start-trad, Up: Varargs
|
|||
|
|
|
|||
|
|
14.2.3 Extract a value from argument list
|
|||
|
|
-----------------------------------------
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <varargs.h>
|
|||
|
|
TYPE va_arg(va_list AP, TYPE);
|
|||
|
|
|
|||
|
|
*Description*
|
|||
|
|
`va_arg' returns the next unprocessed value from a variable argument
|
|||
|
|
list AP (which you must previously create with VA_START). Specify the
|
|||
|
|
type for the value as the second parameter to the macro, TYPE.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`va_arg' returns the next argument, an object of type TYPE.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
The `va_arg' defined in `varargs.h' has the same syntax and usage as
|
|||
|
|
the ANSI C version from `stdarg.h'.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: va_end-trad, Prev: va_arg-trad, Up: Varargs
|
|||
|
|
|
|||
|
|
14.2.4 Abandon a variable argument list
|
|||
|
|
---------------------------------------
|
|||
|
|
|
|||
|
|
*Synopsis*
|
|||
|
|
#include <varargs.h>
|
|||
|
|
va_end(va_list AP);
|
|||
|
|
|
|||
|
|
*Description*
|
|||
|
|
Use `va_end' to declare that your program will not use the variable
|
|||
|
|
argument list AP any further.
|
|||
|
|
|
|||
|
|
*Returns*
|
|||
|
|
`va_end' does not return a result.
|
|||
|
|
|
|||
|
|
*Portability*
|
|||
|
|
The `va_end' defined in `varargs.h' has the same syntax and usage as
|
|||
|
|
the ANSI C version from `stdarg.h'.
|
|||
|
|
|
|||
|
|
|
|||
|
|
File: libc.info, Node: Library Index, Prev: Arglists, Up: Top
|
|||
|
|
|
|||
|
|
Index
|
|||
|
|
*****
|
|||
|
|
|
|||
|
|
|