xref: /freebsd/lib/libc/locale/xlocale.3 (revision 96a2e036b7095e819cc536b6145950b54dffb929)
13c87aa1dSDavid Chisnall.\" Copyright (c) 2011 The FreeBSD Foundation
23c87aa1dSDavid Chisnall.\"
33c87aa1dSDavid Chisnall.\" This documentation was written by David Chisnall under sponsorship from
43c87aa1dSDavid Chisnall.\" the FreeBSD Foundation.
53c87aa1dSDavid Chisnall.\"
63c87aa1dSDavid Chisnall.\" Redistribution and use in source and binary forms, with or without
73c87aa1dSDavid Chisnall.\" modification, are permitted provided that the following conditions
83c87aa1dSDavid Chisnall.\" are met:
93c87aa1dSDavid Chisnall.\" 1. Redistributions of source code must retain the above copyright
103c87aa1dSDavid Chisnall.\"    notice, this list of conditions and the following disclaimer.
113c87aa1dSDavid Chisnall.\" 2. Redistributions in binary form must reproduce the above copyright
123c87aa1dSDavid Chisnall.\"    notice, this list of conditions and the following disclaimer in the
133c87aa1dSDavid Chisnall.\"    documentation and/or other materials provided with the distribution.
143c87aa1dSDavid Chisnall.\"
153c87aa1dSDavid Chisnall.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
163c87aa1dSDavid Chisnall.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
173c87aa1dSDavid Chisnall.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
183c87aa1dSDavid Chisnall.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
193c87aa1dSDavid Chisnall.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
203c87aa1dSDavid Chisnall.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
213c87aa1dSDavid Chisnall.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
223c87aa1dSDavid Chisnall.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
233c87aa1dSDavid Chisnall.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
243c87aa1dSDavid Chisnall.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
253c87aa1dSDavid Chisnall.\" SUCH DAMAGE.
263c87aa1dSDavid Chisnall.\"
274f79ce7bSSergey Kandaurov.Dd September 17, 2011
283c87aa1dSDavid Chisnall.Dt XLOCALE 3
293c87aa1dSDavid Chisnall.Os
303c87aa1dSDavid Chisnall.Sh NAME
313c87aa1dSDavid Chisnall.Nm xlocale
32a3fb6da9SGlen Barber.Nd Thread-safe extended locale support
333c87aa1dSDavid Chisnall.Sh LIBRARY
343c87aa1dSDavid Chisnall.Lb libc
353c87aa1dSDavid Chisnall.Sh SYNOPSIS
363c87aa1dSDavid Chisnall.In xlocale.h
373c87aa1dSDavid Chisnall.Sh DESCRIPTION
383c87aa1dSDavid ChisnallThe extended locale support includes a set of functions for setting
3984493996SDavid E. O'Brienthread-local locales,
4084493996SDavid E. O'Brienas well convenience functions for performing locale-aware
413c87aa1dSDavid Chisnallcalls with a specified locale.
423c87aa1dSDavid Chisnall.Pp
433c87aa1dSDavid ChisnallThe core of the xlocale API is the
443c87aa1dSDavid Chisnall.Fa locale_t
4584493996SDavid E. O'Brientype.
4684493996SDavid E. O'BrienThis is an opaque type encapsulating a locale.
4784493996SDavid E. O'BrienInstances of this can be either set as the locale for a specific thread or
4884493996SDavid E. O'Brienpassed directly to the
493c87aa1dSDavid Chisnall.Fa _l
5084493996SDavid E. O'Briensuffixed variants of various standard C functions.
5184493996SDavid E. O'BrienTwo special
523c87aa1dSDavid Chisnall.Fa locale_t
533c87aa1dSDavid Chisnallvalues are available:
543c87aa1dSDavid Chisnall.Bl -bullet -offset indent
553c87aa1dSDavid Chisnall.It
5684493996SDavid E. O'BrienNULL refers to the current locale for the thread,
5784493996SDavid E. O'Brienor to the global locale if no locale has been set for this thread.
583c87aa1dSDavid Chisnall.It
593c87aa1dSDavid ChisnallLC_GLOBAL_LOCALE refers to the global locale.
603c87aa1dSDavid Chisnall.El
613c87aa1dSDavid Chisnall.Pp
623c87aa1dSDavid ChisnallThe global locale is the locale set with the
633c87aa1dSDavid Chisnall.Xr setlocale 3
643c87aa1dSDavid Chisnallfunction.
653c87aa1dSDavid Chisnall.Sh SEE ALSO
663c87aa1dSDavid Chisnall.Xr duplocale 3 ,
673c87aa1dSDavid Chisnall.Xr freelocale 3 ,
683c87aa1dSDavid Chisnall.Xr localeconv 3 ,
693c87aa1dSDavid Chisnall.Xr newlocale 3 ,
703c87aa1dSDavid Chisnall.Xr querylocale 3 ,
714990a1c0SJoel Dahl.Xr uselocale 3
723c87aa1dSDavid Chisnall.Sh CONVENIENCE FUNCTIONS
733c87aa1dSDavid ChisnallThe xlocale API includes a number of
743c87aa1dSDavid Chisnall.Fa _l
7584493996SDavid E. O'Briensuffixed convenience functions.
7684493996SDavid E. O'BrienThese are variants of standard C functions
773c87aa1dSDavid Chisnallthat have been modified to take an explicit
783c87aa1dSDavid Chisnall.Fa locale_t
7984493996SDavid E. O'Brienparameter as the final argument or, in the case of variadic functions,
8084493996SDavid E. O'Brienas an additional argument directly before the format string.
8184493996SDavid E. O'BrienEach of these functions accepts either NULL or LC_GLOBAL_LOCALE.
8284493996SDavid E. O'BrienIn these functions, NULL refers to the C locale,
8384493996SDavid E. O'Brienrather than the thread's current locale.
8484493996SDavid E. O'BrienIf you wish to use the thread's current locale,
8584493996SDavid E. O'Brienthen use the unsuffixed version of the function.
863c87aa1dSDavid Chisnall.Pp
873c87aa1dSDavid ChisnallThese functions are exposed by including
883c87aa1dSDavid Chisnall.In xlocale.h
893c87aa1dSDavid Chisnall.Em after
9084493996SDavid E. O'Brienincluding the relevant headers for the standard variant.
9184493996SDavid E. O'BrienFor example, the
923c87aa1dSDavid Chisnall.Xr strtol_l 3
933c87aa1dSDavid Chisnallfunction is exposed by including
943c87aa1dSDavid Chisnall.In xlocale.h
953c87aa1dSDavid Chisnallafter
963c87aa1dSDavid Chisnall.In stdlib.h ,
973c87aa1dSDavid Chisnallwhich defines
983c87aa1dSDavid Chisnall.Xr strtol 3 .
993c87aa1dSDavid Chisnall.Pp
10084493996SDavid E. O'BrienFor reference,
10184493996SDavid E. O'Briena complete list of the locale-aware functions that are available in this form,
10284493996SDavid E. O'Brienalong with the headers that expose them, is provided here:
1033c87aa1dSDavid Chisnall.Bl -tag -width "<monetary.h> "
1043c87aa1dSDavid Chisnall.It In wctype.h
1053c87aa1dSDavid Chisnall.Xr iswalnum_l 3 ,
1063c87aa1dSDavid Chisnall.Xr iswalpha_l 3 ,
1073c87aa1dSDavid Chisnall.Xr iswcntrl_l 3 ,
1083c87aa1dSDavid Chisnall.Xr iswctype_l 3 ,
1093c87aa1dSDavid Chisnall.Xr iswdigit_l 3 ,
1103c87aa1dSDavid Chisnall.Xr iswgraph_l 3 ,
1113c87aa1dSDavid Chisnall.Xr iswlower_l 3 ,
1123c87aa1dSDavid Chisnall.Xr iswprint_l 3 ,
1133c87aa1dSDavid Chisnall.Xr iswpunct_l 3 ,
1143c87aa1dSDavid Chisnall.Xr iswspace_l 3 ,
1153c87aa1dSDavid Chisnall.Xr iswupper_l 3 ,
1163c87aa1dSDavid Chisnall.Xr iswxdigit_l 3 ,
1173c87aa1dSDavid Chisnall.Xr towlower_l 3 ,
1183c87aa1dSDavid Chisnall.Xr towupper_l 3 ,
1193c87aa1dSDavid Chisnall.Xr wctype_l 3 ,
1203c87aa1dSDavid Chisnall.It In ctype.h
1213c87aa1dSDavid Chisnall.Xr digittoint_l 3 ,
1223c87aa1dSDavid Chisnall.Xr isalnum_l 3 ,
1233c87aa1dSDavid Chisnall.Xr isalpha_l 3 ,
1243c87aa1dSDavid Chisnall.Xr isblank_l 3 ,
1253c87aa1dSDavid Chisnall.Xr iscntrl_l 3 ,
1263c87aa1dSDavid Chisnall.Xr isdigit_l 3 ,
1273c87aa1dSDavid Chisnall.Xr isgraph_l 3 ,
1283c87aa1dSDavid Chisnall.Xr ishexnumber_l 3 ,
1293c87aa1dSDavid Chisnall.Xr isideogram_l 3 ,
1303c87aa1dSDavid Chisnall.Xr islower_l 3 ,
1313c87aa1dSDavid Chisnall.Xr isnumber_l 3 ,
1323c87aa1dSDavid Chisnall.Xr isphonogram_l 3 ,
1333c87aa1dSDavid Chisnall.Xr isprint_l 3 ,
1343c87aa1dSDavid Chisnall.Xr ispunct_l 3 ,
1353c87aa1dSDavid Chisnall.Xr isrune_l 3 ,
1363c87aa1dSDavid Chisnall.Xr isspace_l 3 ,
1373c87aa1dSDavid Chisnall.Xr isspecial_l 3 ,
1383c87aa1dSDavid Chisnall.Xr isupper_l 3 ,
1393c87aa1dSDavid Chisnall.Xr isxdigit_l 3 ,
1403c87aa1dSDavid Chisnall.Xr tolower_l 3 ,
1413c87aa1dSDavid Chisnall.Xr toupper_l 3
1423c87aa1dSDavid Chisnall.It In inttypes.h
1433c87aa1dSDavid Chisnall.Xr strtoimax_l 3 ,
1443c87aa1dSDavid Chisnall.Xr strtoumax_l 3 ,
1453c87aa1dSDavid Chisnall.Xr wcstoimax_l 3 ,
1463c87aa1dSDavid Chisnall.Xr wcstoumax_l 3
1473c87aa1dSDavid Chisnall.It In langinfo.h
1483c87aa1dSDavid Chisnall.Xr nl_langinfo_l 3
1493c87aa1dSDavid Chisnall.It In monetary.h
1503c87aa1dSDavid Chisnall.Xr strfmon_l 3
1513c87aa1dSDavid Chisnall.It In stdio.h
1523c87aa1dSDavid Chisnall.Xr asprintf_l 3 ,
1533c87aa1dSDavid Chisnall.Xr fprintf_l 3 ,
1543c87aa1dSDavid Chisnall.Xr fscanf_l 3 ,
1553c87aa1dSDavid Chisnall.Xr printf_l 3 ,
1563c87aa1dSDavid Chisnall.Xr scanf_l 3 ,
1573c87aa1dSDavid Chisnall.Xr snprintf_l 3 ,
1583c87aa1dSDavid Chisnall.Xr sprintf_l 3 ,
1593c87aa1dSDavid Chisnall.Xr sscanf_l 3 ,
1603c87aa1dSDavid Chisnall.Xr vasprintf_l 3 ,
1613c87aa1dSDavid Chisnall.Xr vfprintf_l 3 ,
1623c87aa1dSDavid Chisnall.Xr vfscanf_l 3 ,
1633c87aa1dSDavid Chisnall.Xr vprintf_l 3 ,
1643c87aa1dSDavid Chisnall.Xr vscanf_l 3 ,
1653c87aa1dSDavid Chisnall.Xr vsnprintf_l 3 ,
1663c87aa1dSDavid Chisnall.Xr vsprintf_l 3 ,
1673c87aa1dSDavid Chisnall.Xr vsscanf_l 3
1683c87aa1dSDavid Chisnall.It In stdlib.h
169*96a2e036SChristopher Davidson.\".Xr atof_l 3 ,
170*96a2e036SChristopher Davidson.\".Xr atoi_l 3 ,
171*96a2e036SChristopher Davidson.\".Xr atol_l 3 ,
172*96a2e036SChristopher Davidson.\".Xr atoll_l 3 ,
1733c87aa1dSDavid Chisnall.Xr mblen_l 3 ,
1743c87aa1dSDavid Chisnall.Xr mbstowcs_l 3 ,
1753c87aa1dSDavid Chisnall.Xr mbtowc_l 3 ,
1763c87aa1dSDavid Chisnall.Xr strtod_l 3 ,
1773c87aa1dSDavid Chisnall.Xr strtof_l 3 ,
1783c87aa1dSDavid Chisnall.Xr strtol_l 3 ,
1793c87aa1dSDavid Chisnall.Xr strtold_l 3 ,
1803c87aa1dSDavid Chisnall.Xr strtoll_l 3 ,
1813c87aa1dSDavid Chisnall.Xr strtoul_l 3 ,
1823c87aa1dSDavid Chisnall.Xr strtoull_l 3 ,
1833c87aa1dSDavid Chisnall.Xr wcstombs_l 3 ,
1843c87aa1dSDavid Chisnall.Xr wctomb_l 3
1853c87aa1dSDavid Chisnall.It In string.h
1863c87aa1dSDavid Chisnall.Xr strcoll_l 3 ,
1873c87aa1dSDavid Chisnall.Xr strxfrm_l 3 ,
1883c87aa1dSDavid Chisnall.Xr strcasecmp_l 3 ,
1893c87aa1dSDavid Chisnall.Xr strcasestr_l 3 ,
1903c87aa1dSDavid Chisnall.Xr strncasecmp_l 3
1913c87aa1dSDavid Chisnall.It In time.h
1923c87aa1dSDavid Chisnall.Xr strftime_l 3
1933c87aa1dSDavid Chisnall.Xr strptime_l 3
1943c87aa1dSDavid Chisnall.It In wchar.h
1953c87aa1dSDavid Chisnall.Xr btowc_l 3 ,
1963c87aa1dSDavid Chisnall.Xr fgetwc_l 3 ,
1973c87aa1dSDavid Chisnall.Xr fgetws_l 3 ,
1983c87aa1dSDavid Chisnall.Xr fputwc_l 3 ,
1993c87aa1dSDavid Chisnall.Xr fputws_l 3 ,
2003c87aa1dSDavid Chisnall.Xr fwprintf_l 3 ,
2013c87aa1dSDavid Chisnall.Xr fwscanf_l 3 ,
2023c87aa1dSDavid Chisnall.Xr getwc_l 3 ,
2033c87aa1dSDavid Chisnall.Xr getwchar_l 3 ,
2043c87aa1dSDavid Chisnall.Xr mbrlen_l 3 ,
2053c87aa1dSDavid Chisnall.Xr mbrtowc_l 3 ,
2063c87aa1dSDavid Chisnall.Xr mbsinit_l 3 ,
2073c87aa1dSDavid Chisnall.Xr mbsnrtowcs_l 3 ,
2083c87aa1dSDavid Chisnall.Xr mbsrtowcs_l 3 ,
2093c87aa1dSDavid Chisnall.Xr putwc_l 3 ,
2103c87aa1dSDavid Chisnall.Xr putwchar_l 3 ,
2113c87aa1dSDavid Chisnall.Xr swprintf_l 3 ,
2123c87aa1dSDavid Chisnall.Xr swscanf_l 3 ,
2133c87aa1dSDavid Chisnall.Xr ungetwc_l 3 ,
2143c87aa1dSDavid Chisnall.Xr vfwprintf_l 3 ,
2153c87aa1dSDavid Chisnall.Xr vfwscanf_l 3 ,
2163c87aa1dSDavid Chisnall.Xr vswprintf_l 3 ,
2173c87aa1dSDavid Chisnall.Xr vswscanf_l 3 ,
2183c87aa1dSDavid Chisnall.Xr vwprintf_l 3 ,
2193c87aa1dSDavid Chisnall.Xr vwscanf_l 3 ,
2203c87aa1dSDavid Chisnall.Xr wcrtomb_l 3 ,
2213c87aa1dSDavid Chisnall.Xr wcscoll_l 3 ,
2223c87aa1dSDavid Chisnall.Xr wcsftime_l 3 ,
2233c87aa1dSDavid Chisnall.Xr wcsnrtombs_l 3 ,
2243c87aa1dSDavid Chisnall.Xr wcsrtombs_l 3 ,
2253c87aa1dSDavid Chisnall.Xr wcstod_l 3 ,
2263c87aa1dSDavid Chisnall.Xr wcstof_l 3 ,
2273c87aa1dSDavid Chisnall.Xr wcstol_l 3 ,
2283c87aa1dSDavid Chisnall.Xr wcstold_l 3 ,
2293c87aa1dSDavid Chisnall.Xr wcstoll_l 3 ,
2303c87aa1dSDavid Chisnall.Xr wcstoul_l 3 ,
2313c87aa1dSDavid Chisnall.Xr wcstoull_l 3 ,
2323c87aa1dSDavid Chisnall.Xr wcswidth_l 3 ,
2333c87aa1dSDavid Chisnall.Xr wcsxfrm_l 3 ,
2343c87aa1dSDavid Chisnall.Xr wctob_l 3 ,
2353c87aa1dSDavid Chisnall.Xr wcwidth_l 3 ,
2363c87aa1dSDavid Chisnall.Xr wprintf_l 3 ,
2373c87aa1dSDavid Chisnall.Xr wscanf_l 3
2383c87aa1dSDavid Chisnall.It In wctype.h
2393c87aa1dSDavid Chisnall.Xr iswblank_l 3 ,
2403c87aa1dSDavid Chisnall.Xr iswhexnumber_l 3 ,
2413c87aa1dSDavid Chisnall.Xr iswideogram_l 3 ,
2423c87aa1dSDavid Chisnall.Xr iswnumber_l 3 ,
2433c87aa1dSDavid Chisnall.Xr iswphonogram_l 3 ,
2443c87aa1dSDavid Chisnall.Xr iswrune_l 3 ,
2453c87aa1dSDavid Chisnall.Xr iswspecial_l 3 ,
2463c87aa1dSDavid Chisnall.Xr nextwctype_l 3 ,
2473c87aa1dSDavid Chisnall.Xr towctrans_l 3 ,
2483c87aa1dSDavid Chisnall.Xr wctrans_l 3
2493c87aa1dSDavid Chisnall.It In xlocale.h
2503c87aa1dSDavid Chisnall.Xr localeconv_l 3
2513c87aa1dSDavid Chisnall.El
2523c87aa1dSDavid Chisnall.Sh STANDARDS
2533c87aa1dSDavid ChisnallThe functions
2543c87aa1dSDavid Chisnallconform to
2553c87aa1dSDavid Chisnall.St -p1003.1-2008 .
2563c87aa1dSDavid Chisnall.Sh HISTORY
25784493996SDavid E. O'BrienThe xlocale APIs first appeared in Darwin 8.0.
25884493996SDavid E. O'BrienThis implementation was written by David Chisnall,
25984493996SDavid E. O'Brienunder sponsorship from the FreeBSD Foundation and first appeared in
2603c87aa1dSDavid Chisnall.Fx 9.1 .
26112afe06cSJoel Dahl.Sh CAVEATS
26212afe06cSJoel DahlThe
26312afe06cSJoel Dahl.Xr setlocale 3
26412afe06cSJoel Dahlfunction, and others in the family, refer to the global locale.
26512afe06cSJoel DahlOther functions that depend on the locale, however,
26612afe06cSJoel Dahlwill take the thread-local locale if one has been set.
26712afe06cSJoel DahlThis means that the idiom of setting the locale using
26812afe06cSJoel Dahl.Xr setlocale 3 ,
26912afe06cSJoel Dahlcalling a locale-dependent function,
27012afe06cSJoel Dahland then restoring the locale will not
27112afe06cSJoel Dahlhave the expected behavior if the current thread has had a locale set using
27212afe06cSJoel Dahl.Xr uselocale 3 .
27312afe06cSJoel DahlYou should avoid this idiom and prefer to use the
27412afe06cSJoel Dahl.Fa _l
27512afe06cSJoel Dahlsuffixed versions instead.
276