3c87aa1d3d
load of _l suffixed versions of various standard library functions that use the global locale, making them take an explicit locale parameter. Also adds support for per-thread locales. This work was funded by the FreeBSD Foundation. Please test any code you have that uses the C standard locale functions! Reviewed by: das (gdtoa changes) Approved by: dim (mentor)
259 lines
9.6 KiB
C
259 lines
9.6 KiB
C
/*-
|
|
* Copyright (c) 2011 The FreeBSD Foundation
|
|
* All rights reserved.
|
|
*
|
|
* This software was developed by David Chisnall under sponsorship from
|
|
* the FreeBSD Foundation.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
#ifndef _XLOCALE_H_
|
|
#define _XLOCALE_H_
|
|
|
|
#include <locale.h>
|
|
|
|
__BEGIN_DECLS
|
|
|
|
/*
|
|
* Extended locale versions of the locale-aware functions from string.h.
|
|
*
|
|
* Include <string.h> before <xlocale.h> to expose these.
|
|
*/
|
|
#ifdef _STRING_H_
|
|
int strcoll_l(const char *, const char *, locale_t);
|
|
size_t strxfrm_l(char *, const char *, size_t, locale_t);
|
|
int strcasecmp_l(const char *, const char *, locale_t);
|
|
char *strcasestr_l(const char *, const char *, locale_t);
|
|
int strncasecmp_l(const char *, const char *, size_t, locale_t);
|
|
#endif
|
|
/*
|
|
* Extended locale versions of the locale-aware functions from inttypes.h.
|
|
*
|
|
* Include <inttypes.h> before <xlocale.h> to expose these.
|
|
*/
|
|
#ifdef _INTTYPES_H_
|
|
intmax_t
|
|
strtoimax_l(const char * __restrict, char ** __restrict, int, locale_t);
|
|
uintmax_t
|
|
strtoumax_l(const char * __restrict, char ** __restrict, int, locale_t);
|
|
intmax_t
|
|
wcstoimax_l(const wchar_t * __restrict, wchar_t ** __restrict, int , locale_t);
|
|
uintmax_t
|
|
wcstoumax_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t);
|
|
#endif
|
|
/*
|
|
* Extended locale versions of the locale-aware functions from monetary.h.
|
|
*
|
|
* Include <monetary.h> before <xlocale.h> to expose these.
|
|
*/
|
|
#ifdef _MONETARY_H_
|
|
ssize_t strfmon_l(char *, size_t, locale_t, const char *, ...)
|
|
# if __GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7
|
|
__attribute__((__format__ (__strfmon__, 4, 5)))
|
|
# endif
|
|
;
|
|
#endif
|
|
|
|
/*
|
|
* Extended locale versions of the locale-aware functions from stdlib.h.
|
|
*
|
|
* Include <stdlib.h> before <xlocale.h> to expose these.
|
|
*/
|
|
#ifdef _STDLIB_H_
|
|
double atof_l(const char *, locale_t);
|
|
int atoi_l(const char *, locale_t);
|
|
long atol_l(const char *, locale_t);
|
|
long long atoll_l(const char *, locale_t);
|
|
int mblen_l(const char *, size_t, locale_t);
|
|
size_t
|
|
mbstowcs_l(wchar_t * __restrict, const char * __restrict, size_t, locale_t);
|
|
int
|
|
mbtowc_l(wchar_t * __restrict, const char * __restrict, size_t, locale_t);
|
|
double strtod_l(const char *, char **, locale_t);
|
|
float strtof_l(const char *, char **, locale_t);
|
|
long strtol_l(const char *, char **, int, locale_t);
|
|
long double strtold_l(const char *, char **, locale_t);
|
|
long long strtoll_l(const char *, char **, int, locale_t);
|
|
unsigned long strtoul_l(const char *, char **, int, locale_t);
|
|
unsigned long long strtoull_l(const char *, char **, int, locale_t);
|
|
size_t
|
|
wcstombs_l(char * __restrict, const wchar_t * __restrict, size_t, locale_t);
|
|
int wctomb_l(char *, wchar_t, locale_t);
|
|
|
|
int ___mb_cur_max_l(locale_t);
|
|
#define MB_CUR_MAX_L(x) (___mb_cur_max_l(x))
|
|
|
|
#endif
|
|
/*
|
|
* Extended locale versions of the locale-aware functions from time.h.
|
|
*
|
|
* Include <time.h> before <xlocale.h> to expose these.
|
|
*/
|
|
#ifdef _TIME_H_
|
|
size_t
|
|
strftime_l(char * __restrict, size_t, const char * __restrict, const
|
|
struct tm * __restrict, locale_t)
|
|
# if __GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7
|
|
__attribute__((__format__ (__strftime__, 3, 0)))
|
|
# endif
|
|
;
|
|
char *
|
|
strptime_l(const char * __restrict, const char * __restrict,
|
|
struct tm * __restrict, locale_t);
|
|
#endif
|
|
#ifdef _LANGINFO_H_
|
|
char *nl_langinfo_l(nl_item, locale_t);
|
|
#endif
|
|
#ifdef _CTYPE_H_
|
|
#include <_xlocale_ctype.h>
|
|
#endif
|
|
#ifdef _WCTYPE_H_
|
|
#define XLOCALE_WCTYPES 1
|
|
#include <_xlocale_ctype.h>
|
|
#endif
|
|
|
|
#ifdef _STDIO_H_
|
|
int fprintf_l(FILE * __restrict, locale_t, const char * __restrict, ...)
|
|
__printflike(3, 4);
|
|
int fscanf_l(FILE * __restrict, locale_t, const char * __restrict, ...)
|
|
__scanflike(3, 4);
|
|
int printf_l(locale_t, const char * __restrict, ...) __printflike(2, 3);
|
|
int scanf_l(locale_t, const char * __restrict, ...) __scanflike(2, 3);
|
|
int sprintf_l(char * __restrict, locale_t, const char * __restrict, ...)
|
|
__printflike(3, 4);
|
|
int sscanf_l(const char * __restrict, locale_t, const char * __restrict, ...)
|
|
__scanflike(3, 4);
|
|
int vfprintf_l(FILE * __restrict, locale_t, const char * __restrict, __va_list)
|
|
__printflike(3, 0);
|
|
int vprintf_l(locale_t, const char * __restrict, __va_list) __printflike(2, 0);
|
|
int vsprintf_l(char * __restrict, locale_t, const char * __restrict, __va_list)
|
|
__printflike(3, 0);
|
|
|
|
int snprintf_l(char * __restrict, size_t, locale_t, const char * __restrict,
|
|
...) __printflike(4, 5);
|
|
int vfscanf_l(FILE * __restrict, locale_t, const char * __restrict, __va_list)
|
|
__scanflike(3, 0);
|
|
int vscanf_l(locale_t, const char * __restrict, __va_list) __scanflike(2, 0);
|
|
int vsnprintf_l(char * __restrict, size_t, locale_t, const char * __restrict,
|
|
va_list) __printflike(4, 0);
|
|
int vsscanf_l(const char * __restrict, locale_t, const char * __restrict,
|
|
va_list) __scanflike(3, 0);
|
|
int dprintf_l(int, locale_t, const char * __restrict, ...) __printflike(3, 4);
|
|
int vdprintf_l(int, locale_t, const char * __restrict, __va_list)
|
|
__printflike(3, 0);
|
|
int asprintf_l(char **, locale_t, const char *, ...) __printflike(3, 4);
|
|
int vasprintf_l(char **, locale_t, const char *, __va_list) __printflike(3, 0);
|
|
#endif
|
|
#ifdef _WCHAR_H_
|
|
wint_t btowc_l(int, locale_t);
|
|
wint_t fgetwc_l(FILE *, locale_t);
|
|
wchar_t *
|
|
fgetws_l(wchar_t * __restrict, int, FILE * __restrict, locale_t);
|
|
wint_t fputwc_l(wchar_t, FILE *, locale_t);
|
|
int
|
|
fputws_l(const wchar_t * __restrict, FILE * __restrict, locale_t);
|
|
int
|
|
fwprintf_l(FILE * __restrict, locale_t, const wchar_t * __restrict,
|
|
...);
|
|
int
|
|
fwscanf_l(FILE * __restrict, locale_t, const wchar_t * __restrict, ...);
|
|
wint_t getwc_l(FILE *, locale_t);
|
|
wint_t getwchar_l(locale_t);
|
|
size_t
|
|
mbrlen_l(const char * __restrict, size_t, mbstate_t * __restrict, locale_t);
|
|
size_t
|
|
mbrtowc_l(wchar_t * __restrict, const char * __restrict, size_t,
|
|
mbstate_t * __restrict, locale_t);
|
|
int mbsinit_l(const mbstate_t *, locale_t);
|
|
size_t
|
|
mbsrtowcs_l(wchar_t * __restrict, const char ** __restrict, size_t,
|
|
mbstate_t * __restrict, locale_t);
|
|
wint_t putwc_l(wchar_t, FILE *, locale_t);
|
|
wint_t putwchar_l(wchar_t, locale_t);
|
|
int
|
|
swprintf_l(wchar_t * __restrict, size_t n, locale_t,
|
|
const wchar_t * __restrict, ...);
|
|
int
|
|
swscanf_l(const wchar_t * __restrict, locale_t, const wchar_t * __restrict,
|
|
...);
|
|
wint_t ungetwc_l(wint_t, FILE *, locale_t);
|
|
int
|
|
vfwprintf_l(FILE * __restrict, locale_t, const wchar_t * __restrict,
|
|
__va_list);
|
|
int
|
|
vswprintf_l(wchar_t * __restrict, size_t n, locale_t,
|
|
const wchar_t * __restrict, __va_list);
|
|
int vwprintf_l(locale_t, const wchar_t * __restrict, __va_list);
|
|
size_t
|
|
wcrtomb_l(char * __restrict, wchar_t, mbstate_t * __restrict, locale_t);
|
|
int wcscoll_l(const wchar_t *, const wchar_t *, locale_t);
|
|
size_t
|
|
wcsftime_l(wchar_t * __restrict, size_t, const wchar_t * __restrict,
|
|
const struct tm * __restrict, locale_t);
|
|
size_t
|
|
wcsrtombs_l(char * __restrict, const wchar_t ** __restrict, size_t,
|
|
mbstate_t * __restrict, locale_t);
|
|
double wcstod_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t);
|
|
long
|
|
wcstol_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t);
|
|
unsigned long
|
|
wcstoul_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t);
|
|
int wcswidth_l(const wchar_t *, size_t, locale_t);
|
|
size_t
|
|
wcsxfrm_l(wchar_t * __restrict, const wchar_t * __restrict, size_t, locale_t);
|
|
int wctob_l(wint_t, locale_t);
|
|
int wcwidth_l(wchar_t, locale_t);
|
|
int wprintf_l(locale_t, const wchar_t * __restrict, ...);
|
|
int wscanf_l(locale_t, const wchar_t * __restrict, ...);
|
|
|
|
int
|
|
vfwscanf_l(FILE * __restrict, locale_t, const wchar_t * __restrict,
|
|
__va_list);
|
|
int vswscanf_l(const wchar_t * __restrict, locale_t,
|
|
const wchar_t *__restrict, __va_list);
|
|
int vwscanf_l(locale_t, const wchar_t * __restrict, __va_list);
|
|
float wcstof_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t);
|
|
long double
|
|
wcstold_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t);
|
|
long long
|
|
wcstoll_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t);
|
|
unsigned long long
|
|
wcstoull_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t);
|
|
size_t
|
|
mbsnrtowcs_l(wchar_t * __restrict, const char ** __restrict, size_t, size_t,
|
|
mbstate_t * __restrict, locale_t);
|
|
int wcscasecmp_l(const wchar_t *, const wchar_t *, locale_t);
|
|
int wcsncasecmp_l(const wchar_t *, const wchar_t *, size_t, locale_t);
|
|
size_t
|
|
wcsnrtombs_l(char * __restrict, const wchar_t ** __restrict, size_t, size_t,
|
|
mbstate_t * __restrict, locale_t);
|
|
|
|
#endif
|
|
|
|
struct lconv *localeconv_l(locale_t);
|
|
__END_DECLS
|
|
|
|
#endif
|