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