1.\" Copyright (c) 2011 The FreeBSD Foundation 2.\" 3.\" This documentation was written by David Chisnall under sponsorship from 4.\" the FreeBSD Foundation. 5.\" 6.\" Redistribution and use in source and binary forms, with or without 7.\" modification, are permitted provided that the following conditions 8.\" are met: 9.\" 1. Redistributions of source code must retain the above copyright 10.\" notice, this list of conditions and the following disclaimer. 11.\" 2. Redistributions in binary form must reproduce the above copyright 12.\" notice, this list of conditions and the following disclaimer in the 13.\" documentation and/or other materials provided with the distribution. 14.\" 15.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 16.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 19.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25.\" SUCH DAMAGE. 26.\" 27.Dd September 17, 2011 28.Dt XLOCALE 3 29.Os 30.Sh NAME 31.Nm xlocale 32.Nd Thread-safe extended locale support 33.Sh LIBRARY 34.Lb libc 35.Sh SYNOPSIS 36.In xlocale.h 37.Sh DESCRIPTION 38The extended locale support includes a set of functions for setting 39thread-local locales, 40as well convenience functions for performing locale-aware 41calls with a specified locale. 42.Pp 43The core of the xlocale API is the 44.Fa locale_t 45type. 46This is an opaque type encapsulating a locale. 47Instances of this can be either set as the locale for a specific thread or 48passed directly to the 49.Fa _l 50suffixed variants of various standard C functions. 51Two special 52.Fa locale_t 53values are available: 54.Bl -bullet -offset indent 55.It 56NULL refers to the current locale for the thread, 57or to the global locale if no locale has been set for this thread. 58.It 59LC_GLOBAL_LOCALE refers to the global locale. 60.El 61.Pp 62The global locale is the locale set with the 63.Xr setlocale 3 64function. 65.Sh SEE ALSO 66.Xr duplocale 3 , 67.Xr freelocale 3 , 68.Xr localeconv 3 , 69.Xr newlocale 3 , 70.Xr querylocale 3 , 71.Xr uselocale 3 72.Sh CONVENIENCE FUNCTIONS 73The xlocale API includes a number of 74.Fa _l 75suffixed convenience functions. 76These are variants of standard C functions 77that have been modified to take an explicit 78.Fa locale_t 79parameter as the final argument or, in the case of variadic functions, 80as an additional argument directly before the format string. 81Each of these functions accepts either NULL or LC_GLOBAL_LOCALE. 82In these functions, NULL refers to the C locale, 83rather than the thread's current locale. 84If you wish to use the thread's current locale, 85then use the unsuffixed version of the function. 86.Pp 87These functions are exposed by including 88.In xlocale.h 89.Em after 90including the relevant headers for the standard variant. 91For example, the 92.Xr strtol_l 3 93function is exposed by including 94.In xlocale.h 95after 96.In stdlib.h , 97which defines 98.Xr strtol 3 . 99.Pp 100For reference, 101a complete list of the locale-aware functions that are available in this form, 102along with the headers that expose them, is provided here: 103.Bl -tag -width "<monetary.h> " 104.It In wctype.h 105.Xr iswalnum_l 3 , 106.Xr iswalpha_l 3 , 107.Xr iswcntrl_l 3 , 108.Xr iswctype_l 3 , 109.Xr iswdigit_l 3 , 110.Xr iswgraph_l 3 , 111.Xr iswlower_l 3 , 112.Xr iswprint_l 3 , 113.Xr iswpunct_l 3 , 114.Xr iswspace_l 3 , 115.Xr iswupper_l 3 , 116.Xr iswxdigit_l 3 , 117.Xr towlower_l 3 , 118.Xr towupper_l 3 , 119.Xr wctype_l 3 , 120.It In ctype.h 121.Xr digittoint_l 3 , 122.Xr isalnum_l 3 , 123.Xr isalpha_l 3 , 124.Xr isblank_l 3 , 125.Xr iscntrl_l 3 , 126.Xr isdigit_l 3 , 127.Xr isgraph_l 3 , 128.Xr ishexnumber_l 3 , 129.Xr isideogram_l 3 , 130.Xr islower_l 3 , 131.Xr isnumber_l 3 , 132.Xr isphonogram_l 3 , 133.Xr isprint_l 3 , 134.Xr ispunct_l 3 , 135.Xr isrune_l 3 , 136.Xr isspace_l 3 , 137.Xr isspecial_l 3 , 138.Xr isupper_l 3 , 139.Xr isxdigit_l 3 , 140.Xr tolower_l 3 , 141.Xr toupper_l 3 142.It In inttypes.h 143.Xr strtoimax_l 3 , 144.Xr strtoumax_l 3 , 145.Xr wcstoimax_l 3 , 146.Xr wcstoumax_l 3 147.It In langinfo.h 148.Xr nl_langinfo_l 3 149.It In monetary.h 150.Xr strfmon_l 3 151.It In stdio.h 152.Xr asprintf_l 3 , 153.Xr fprintf_l 3 , 154.Xr fscanf_l 3 , 155.Xr printf_l 3 , 156.Xr scanf_l 3 , 157.Xr snprintf_l 3 , 158.Xr sprintf_l 3 , 159.Xr sscanf_l 3 , 160.Xr vasprintf_l 3 , 161.Xr vfprintf_l 3 , 162.Xr vfscanf_l 3 , 163.Xr vprintf_l 3 , 164.Xr vscanf_l 3 , 165.Xr vsnprintf_l 3 , 166.Xr vsprintf_l 3 , 167.Xr vsscanf_l 3 168.It In stdlib.h 169.Xr atof_l 3 , 170.Xr atoi_l 3 , 171.Xr atol_l 3 , 172.Xr atoll_l 3 , 173.Xr mblen_l 3 , 174.Xr mbstowcs_l 3 , 175.Xr mbtowc_l 3 , 176.Xr strtod_l 3 , 177.Xr strtof_l 3 , 178.Xr strtol_l 3 , 179.Xr strtold_l 3 , 180.Xr strtoll_l 3 , 181.Xr strtoul_l 3 , 182.Xr strtoull_l 3 , 183.Xr wcstombs_l 3 , 184.Xr wctomb_l 3 185.It In string.h 186.Xr strcoll_l 3 , 187.Xr strxfrm_l 3 , 188.Xr strcasecmp_l 3 , 189.Xr strcasestr_l 3 , 190.Xr strncasecmp_l 3 191.It In time.h 192.Xr strftime_l 3 193.Xr strptime_l 3 194.It In wchar.h 195.Xr btowc_l 3 , 196.Xr fgetwc_l 3 , 197.Xr fgetws_l 3 , 198.Xr fputwc_l 3 , 199.Xr fputws_l 3 , 200.Xr fwprintf_l 3 , 201.Xr fwscanf_l 3 , 202.Xr getwc_l 3 , 203.Xr getwchar_l 3 , 204.Xr mbrlen_l 3 , 205.Xr mbrtowc_l 3 , 206.Xr mbsinit_l 3 , 207.Xr mbsnrtowcs_l 3 , 208.Xr mbsrtowcs_l 3 , 209.Xr putwc_l 3 , 210.Xr putwchar_l 3 , 211.Xr swprintf_l 3 , 212.Xr swscanf_l 3 , 213.Xr ungetwc_l 3 , 214.Xr vfwprintf_l 3 , 215.Xr vfwscanf_l 3 , 216.Xr vswprintf_l 3 , 217.Xr vswscanf_l 3 , 218.Xr vwprintf_l 3 , 219.Xr vwscanf_l 3 , 220.Xr wcrtomb_l 3 , 221.Xr wcscoll_l 3 , 222.Xr wcsftime_l 3 , 223.Xr wcsnrtombs_l 3 , 224.Xr wcsrtombs_l 3 , 225.Xr wcstod_l 3 , 226.Xr wcstof_l 3 , 227.Xr wcstol_l 3 , 228.Xr wcstold_l 3 , 229.Xr wcstoll_l 3 , 230.Xr wcstoul_l 3 , 231.Xr wcstoull_l 3 , 232.Xr wcswidth_l 3 , 233.Xr wcsxfrm_l 3 , 234.Xr wctob_l 3 , 235.Xr wcwidth_l 3 , 236.Xr wprintf_l 3 , 237.Xr wscanf_l 3 238.It In wctype.h 239.Xr iswblank_l 3 , 240.Xr iswhexnumber_l 3 , 241.Xr iswideogram_l 3 , 242.Xr iswnumber_l 3 , 243.Xr iswphonogram_l 3 , 244.Xr iswrune_l 3 , 245.Xr iswspecial_l 3 , 246.Xr nextwctype_l 3 , 247.Xr towctrans_l 3 , 248.Xr wctrans_l 3 249.It In xlocale.h 250.Xr localeconv_l 3 251.El 252.Sh STANDARDS 253The functions 254conform to 255.St -p1003.1-2008 . 256.Sh HISTORY 257The xlocale APIs first appeared in Darwin 8.0. 258This implementation was written by David Chisnall, 259under sponsorship from the FreeBSD Foundation and first appeared in 260.Fx 9.1 . 261.Sh CAVEATS 262The 263.Xr setlocale 3 264function, and others in the family, refer to the global locale. 265Other functions that depend on the locale, however, 266will take the thread-local locale if one has been set. 267This means that the idiom of setting the locale using 268.Xr setlocale 3 , 269calling a locale-dependent function, 270and then restoring the locale will not 271have the expected behavior if the current thread has had a locale set using 272.Xr uselocale 3 . 273You should avoid this idiom and prefer to use the 274.Fa _l 275suffixed versions instead. 276