aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc
diff options
context:
space:
mode:
authorThomas Fitzsimmons <fitzsim@redhat.com>2002-08-23 01:56:05 +0000
committerThomas Fitzsimmons <fitzsim@redhat.com>2002-08-23 01:56:05 +0000
commit8d9112f2f3ac7c0aa656ceb8da7b4248df228833 (patch)
tree237c3983e83fb5bd0ccbfff91a30844b7906afd3 /newlib/libc
parent1c5dcf3b0a42efcc8a7fcac148e2714d9766b871 (diff)
downloadnewlib-8d9112f2f3ac7c0aa656ceb8da7b4248df228833.zip
newlib-8d9112f2f3ac7c0aa656ceb8da7b4248df228833.tar.gz
newlib-8d9112f2f3ac7c0aa656ceb8da7b4248df228833.tar.bz2
* libc/include/langinfo.h: New file.
* libc/include/wchar.h: Likewise. * libc/include/sys/syslimits.h: Likewise. * libc/locale/fix_grouping.c: Likewise. * libc/locale/ldpart.c: Likewise. * libc/locale/ldpart.h: Likewise. * libc/locale/lmessages.c: Likewise. * libc/locale/lmessages.h: Likewise. * libc/locale/lmonetary.c: Likewise. * libc/locale/lmonetary.h: Likewise. * libc/locale/lnumeric.c: Likewise. * libc/locale/lnumeric.h: Likewise. * libc/locale/nl_langinfo.3: Likewise. * libc/locale/nl_langinfo.c: Likewise. * libc/locale/timelocal.c: Likewise. * libc/locale/timelocal.h: Likewise. * libc/stdlib/btowc.c: Likewise. * libc/stdlib/mbrlen.c: Likewise. * libc/stdlib/mbrtowc.c: Likewise. * libc/stdlib/mbsinit.c: Likewise. * libc/stdlib/mbsrtowcs.c: Likewise. * libc/stdlib/wcrtomb.c: Likewise. * libc/stdlib/wcsrtombs.c: Likewise. * libc/stdlib/wctob.c: Likewise. * libc/sys/linux/prof-freq.c: Likewise. * libc/sys/linux/profile.c: Likewise. * libc/sys/linux/machine/i386/dl-procinfo.c: Likewise. * libc/sys/linux/machine/i386/dl-procinfo.h: Likewise. * libc/include/stdlib.h: Change re-entrant functions to take mbstate_t pointers. * libc/include/sys/_types.h: Define _mbstate_t. * libc/include/sys/config.h (MB_LEN_MAX): New macro. * libc/include/sys/errno.h (EILSEQ): New error code. * libc/include/sys/reent.h: Include wchar.h. Change reentrant structure to use mbstate_t. * libc/locale/Makefile.am (LIB_SOURCES): Add new files. * libc/machine/powerpc/vfprintf.c: Use mbstate_t. * libc/machine/powerpc/vfscanf.c: Likewise. * libc/stdio/getdelim.c: Reallocate buffer only when necessary. * libc/stdio/vfprintf.c: Likewise. * libc/stdio/vfscanf.c: Likewise. * libc/stdlib/Makefile.am (LIB_SOURCES): Add new files. * libc/stdlib/mblen.c: Use mbstate_t. * libc/stdlib/mblen_r.c: Likewise. * libc/stdlib/mbstowcs.c: Likewise. * libc/stdlib/mbstowcs_r.c: Likewise. * libc/stdlib/mbtowc.c: Likewise. * libc/stdlib/mbtowc_r.c: Likewise. * libc/stdlib/wcstombs.c: Likewise. * libc/stdlib/wcstombs_r.c: Likewise. * libc/stdlib/wctomb_r.c: Likewise. * libc/sys/linux/Makefile.am (LIB_SOURCES): Add prof-freq.c and profile.c. * libc/sys/linux/machine/i386/Makefile.am (LIB_SOURCES): Add dl-procinfo.c. * libc/sys/linux/sys/errno.h (EILSEQ): New error code. * libc/sys/linux/sys/types.h (off_t): Define type. * testsuite/newlib.locale/UTF-8.c: Change locale name from UTF-8 to C-UTF-8. * testsuite/newlib.locale/UTF-8.exp: Likewise.
Diffstat (limited to 'newlib/libc')
-rw-r--r--newlib/libc/include/langinfo.h140
-rw-r--r--newlib/libc/include/stdlib.h10
-rw-r--r--newlib/libc/include/sys/_types.h25
-rw-r--r--newlib/libc/include/sys/config.h4
-rw-r--r--newlib/libc/include/sys/errno.h1
-rw-r--r--newlib/libc/include/sys/reent.h32
-rw-r--r--newlib/libc/include/sys/syslimits.h65
-rw-r--r--newlib/libc/include/wchar.h30
-rw-r--r--newlib/libc/locale/Makefile.am2
-rw-r--r--newlib/libc/locale/Makefile.in11
-rw-r--r--newlib/libc/locale/fix_grouping.c82
-rw-r--r--newlib/libc/locale/ldpart.c183
-rw-r--r--newlib/libc/locale/ldpart.h35
-rw-r--r--newlib/libc/locale/lmessages.c89
-rw-r--r--newlib/libc/locale/lmessages.h42
-rw-r--r--newlib/libc/locale/lmonetary.c143
-rw-r--r--newlib/libc/locale/lmonetary.h53
-rw-r--r--newlib/libc/locale/lnumeric.c85
-rw-r--r--newlib/libc/locale/lnumeric.h41
-rw-r--r--newlib/libc/locale/nl_langinfo.390
-rw-r--r--newlib/libc/locale/nl_langinfo.c213
-rw-r--r--newlib/libc/locale/setlocale.h37
-rw-r--r--newlib/libc/locale/timelocal.c119
-rw-r--r--newlib/libc/locale/timelocal.h55
-rw-r--r--newlib/libc/machine/powerpc/vfprintf.c3
-rw-r--r--newlib/libc/machine/powerpc/vfscanf.c3
-rw-r--r--newlib/libc/machine/sh/Makefile.in4
-rw-r--r--newlib/libc/stdio/getdelim.c29
-rw-r--r--newlib/libc/stdio/vfprintf.c9
-rw-r--r--newlib/libc/stdio/vfscanf.c5
-rw-r--r--newlib/libc/stdio64/Makefile.in4
-rw-r--r--newlib/libc/stdlib/Makefile.am10
-rw-r--r--newlib/libc/stdlib/Makefile.in18
-rw-r--r--newlib/libc/stdlib/btowc.c27
-rw-r--r--newlib/libc/stdlib/mblen.c9
-rw-r--r--newlib/libc/stdlib/mblen_r.c3
-rw-r--r--newlib/libc/stdlib/mbrlen.c13
-rw-r--r--newlib/libc/stdlib/mbrtowc.c29
-rw-r--r--newlib/libc/stdlib/mbsinit.c14
-rw-r--r--newlib/libc/stdlib/mbsrtowcs.c24
-rw-r--r--newlib/libc/stdlib/mbstowcs.c4
-rw-r--r--newlib/libc/stdlib/mbstowcs_r.c5
-rw-r--r--newlib/libc/stdlib/mbtowc.c8
-rw-r--r--newlib/libc/stdlib/mbtowc_r.c35
-rw-r--r--newlib/libc/stdlib/wcrtomb.c25
-rw-r--r--newlib/libc/stdlib/wcsrtombs.c22
-rw-r--r--newlib/libc/stdlib/wcstombs.c4
-rw-r--r--newlib/libc/stdlib/wcstombs_r.c3
-rw-r--r--newlib/libc/stdlib/wctob.c25
-rw-r--r--newlib/libc/stdlib/wctomb_r.c13
-rw-r--r--newlib/libc/sys/linux/Makefile.am19
-rw-r--r--newlib/libc/sys/linux/Makefile.in29
-rw-r--r--newlib/libc/sys/linux/cmath/math_private.h2
-rw-r--r--newlib/libc/sys/linux/fpathconf.c2
-rw-r--r--newlib/libc/sys/linux/machine/i386/Makefile.am2
-rw-r--r--newlib/libc/sys/linux/machine/i386/Makefile.in8
-rw-r--r--newlib/libc/sys/linux/machine/i386/dl-procinfo.c38
-rw-r--r--newlib/libc/sys/linux/machine/i386/dl-procinfo.h132
-rw-r--r--newlib/libc/sys/linux/pathconf.c2
-rw-r--r--newlib/libc/sys/linux/prof-freq.c54
-rw-r--r--newlib/libc/sys/linux/profile.c12
-rw-r--r--newlib/libc/sys/linux/sys/errno.h1
-rw-r--r--newlib/libc/sys/linux/sys/types.h1
63 files changed, 2139 insertions, 98 deletions
diff --git a/newlib/libc/include/langinfo.h b/newlib/libc/include/langinfo.h
new file mode 100644
index 0000000..33ae8d0
--- /dev/null
+++ b/newlib/libc/include/langinfo.h
@@ -0,0 +1,140 @@
+/*-
+ * Copyright (c) 2001 Alexey Zelkin <phantom@FreeBSD.org>
+ * All rights reserved.
+ *
+ * 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: src/include/langinfo.h,v 1.5 2002/03/23 17:24:53 imp Exp $
+ */
+
+#ifndef _LANGINFO_H_
+#define _LANGINFO_H_
+
+#include <sys/cdefs.h>
+
+typedef int nl_item;
+
+/* Extract the category and item index from a constructed `nl_item' value. */
+#define _NL_ITEM_CATEGORY(item) ((int) (item) >> 16)
+#define _NL_ITEM_INDEX(item) ((int) (item) & 0xffff)
+
+#define CODESET 0 /* codeset name */
+#define D_T_FMT 1 /* string for formatting date and time */
+#define D_FMT 2 /* date format string */
+#define T_FMT 3 /* time format string */
+#define T_FMT_AMPM 4 /* a.m. or p.m. time formatting string */
+#define AM_STR 5 /* Ante Meridian affix */
+#define PM_STR 6 /* Post Meridian affix */
+
+/* week day names */
+#define DAY_1 7
+#define DAY_2 8
+#define DAY_3 9
+#define DAY_4 10
+#define DAY_5 11
+#define DAY_6 12
+#define DAY_7 13
+
+/* abbreviated week day names */
+#define ABDAY_1 14
+#define ABDAY_2 15
+#define ABDAY_3 16
+#define ABDAY_4 17
+#define ABDAY_5 18
+#define ABDAY_6 19
+#define ABDAY_7 20
+
+/* month names */
+#define MON_1 21
+#define MON_2 22
+#define MON_3 23
+#define MON_4 24
+#define MON_5 25
+#define MON_6 26
+#define MON_7 27
+#define MON_8 28
+#define MON_9 29
+#define MON_10 30
+#define MON_11 31
+#define MON_12 32
+
+/* abbreviated month names */
+#define ABMON_1 33
+#define ABMON_2 34
+#define ABMON_3 35
+#define ABMON_4 36
+#define ABMON_5 37
+#define ABMON_6 38
+#define ABMON_7 39
+#define ABMON_8 40
+#define ABMON_9 41
+#define ABMON_10 42
+#define ABMON_11 43
+#define ABMON_12 44
+
+#define ERA 45 /* era description segments */
+#define ERA_D_FMT 46 /* era date format string */
+#define ERA_D_T_FMT 47 /* era date and time format string */
+#define ERA_T_FMT 48 /* era time format string */
+#define ALT_DIGITS 49 /* alternative symbols for digits */
+
+#define RADIXCHAR 50 /* radix char */
+#define THOUSEP 51 /* separator for thousands */
+
+#define YESEXPR 52 /* affirmative response expression */
+#define NOEXPR 53 /* negative response expression */
+#define YESSTR 54 /* affirmative response for yes/no queries */
+#define NOSTR 55 /* negative response for yes/no queries */
+
+#define CRNCYSTR 56 /* currency symbol */
+
+#define D_MD_ORDER 57 /* month/day order (local extension) */
+
+#define _NL_CTYPE_TRANSLIT_TAB_SIZE 58
+#define _NL_CTYPE_TRANSLIT_FROM_IDX 59
+#define _NL_CTYPE_TRANSLIT_FROM_TBL 60
+#define _NL_CTYPE_TRANSLIT_TO_IDX 61
+#define _NL_CTYPE_TRANSLIT_TO_TBL 62
+#define _NL_CTYPE_TRANSLIT_DEFAULT_MISSING_LEN 63
+#define _NL_CTYPE_TRANSLIT_DEFAULT_MISSING 64
+#define _NL_CTYPE_TRANSLIT_IGNORE_LEN 65
+#define _NL_CTYPE_TRANSLIT_IGNORE 66
+#define _NL_CTYPE_EXTRA_MAP_1 70
+#define _NL_CTYPE_EXTRA_MAP_2 71
+#define _NL_CTYPE_EXTRA_MAP_3 72
+#define _NL_CTYPE_EXTRA_MAP_4 73
+#define _NL_CTYPE_EXTRA_MAP_5 74
+#define _NL_CTYPE_EXTRA_MAP_6 75
+#define _NL_CTYPE_EXTRA_MAP_7 76
+#define _NL_CTYPE_EXTRA_MAP_8 77
+#define _NL_CTYPE_EXTRA_MAP_9 78
+#define _NL_CTYPE_EXTRA_MAP_10 79
+#define _NL_CTYPE_EXTRA_MAP_11 80
+#define _NL_CTYPE_EXTRA_MAP_12 81
+#define _NL_CTYPE_EXTRA_MAP_13 82
+#define _NL_CTYPE_EXTRA_MAP_14 83
+
+__BEGIN_DECLS
+char *nl_langinfo(nl_item);
+__END_DECLS
+
+#endif /* !_LANGINFO_H_ */
diff --git a/newlib/libc/include/stdlib.h b/newlib/libc/include/stdlib.h
index d7401ec..d7246c3 100644
--- a/newlib/libc/include/stdlib.h
+++ b/newlib/libc/include/stdlib.h
@@ -72,15 +72,15 @@ long _EXFUN(labs,(long));
ldiv_t _EXFUN(ldiv,(long __numer, long __denom));
_PTR _EXFUN(malloc,(size_t __size));
int _EXFUN(mblen,(const char *, size_t));
-int _EXFUN(_mblen_r,(struct _reent *, const char *, size_t, int *));
+int _EXFUN(_mblen_r,(struct _reent *, const char *, size_t, _mbstate_t *));
int _EXFUN(mbtowc,(wchar_t *, const char *, size_t));
-int _EXFUN(_mbtowc_r,(struct _reent *, wchar_t *, const char *, size_t, int *));
+int _EXFUN(_mbtowc_r,(struct _reent *, wchar_t *, const char *, size_t, _mbstate_t *));
int _EXFUN(wctomb,(char *, wchar_t));
-int _EXFUN(_wctomb_r,(struct _reent *, char *, wchar_t, int *));
+int _EXFUN(_wctomb_r,(struct _reent *, char *, wchar_t, _mbstate_t *));
size_t _EXFUN(mbstowcs,(wchar_t *, const char *, size_t));
-size_t _EXFUN(_mbstowcs_r,(struct _reent *, wchar_t *, const char *, size_t, int *));
+size_t _EXFUN(_mbstowcs_r,(struct _reent *, wchar_t *, const char *, size_t, _mbstate_t *));
size_t _EXFUN(wcstombs,(char *, const wchar_t *, size_t));
-size_t _EXFUN(_wcstombs_r,(struct _reent *, char *, const wchar_t *, size_t, int *));
+size_t _EXFUN(_wcstombs_r,(struct _reent *, char *, const wchar_t *, size_t, _mbstate_t *));
#ifndef __STRICT_ANSI__
#ifndef _REENT_ONLY
int _EXFUN(mkstemp,(char *));
diff --git a/newlib/libc/include/sys/_types.h b/newlib/libc/include/sys/_types.h
index a487676..9f3b05b 100644
--- a/newlib/libc/include/sys/_types.h
+++ b/newlib/libc/include/sys/_types.h
@@ -18,4 +18,29 @@ typedef int _ssize_t;
typedef long _ssize_t;
#endif
+#define __need_wint_t
+#include <stddef.h>
+
+#ifndef _MBSTATE_T
+#define _MBSTATE_T
+/* Conversion state information. */
+typedef struct
+{
+ int __count;
+ union
+ {
+ wint_t __wch;
+ char __wchb[4];
+ } __value; /* Value so far. */
+} _mbstate_t;
+#endif /* _MBSTATE_T */
+
+#ifdef __CYGWIN__
+# ifndef MBSTATE_T
+# define MBSTATE_T
+typedef _mbstate_t mbstate_t;
+# endif /* MBSTATE_T */
+# define WEOF (0xffffffffu)
+#endif /* __CYGWIN__ */
+
#endif /* _SYS__TYPES_H */
diff --git a/newlib/libc/include/sys/config.h b/newlib/libc/include/sys/config.h
index 89abbfd..d8bdc9c 100644
--- a/newlib/libc/include/sys/config.h
+++ b/newlib/libc/include/sys/config.h
@@ -3,6 +3,10 @@
#include <machine/ieeefp.h> /* floating point macros */
+/* Length of longest possible multibyte sequence among all supported
+ locales. */
+#define MB_LEN_MAX 8
+
/* exceptions first */
#if defined(__H8300__) || defined(__H8500__) || defined (__H8300H__) || defined(__W65__) || defined (__H8300S__)
#define __SMALL_BITFIELDS
diff --git a/newlib/libc/include/sys/errno.h b/newlib/libc/include/sys/errno.h
index 17a5611..f88d563 100644
--- a/newlib/libc/include/sys/errno.h
+++ b/newlib/libc/include/sys/errno.h
@@ -146,6 +146,7 @@ extern __IMPORT int sys_nerr;
#define ENOMEDIUM 135 /* No medium (in tape drive) */
#define ENOSHARE 136 /* No such host or network path */
#define ECASECLASH 137 /* Filename exists with different case */
+#define EILSEQ 138
/* From cygwin32. */
#define EWOULDBLOCK EAGAIN /* Operation would block */
diff --git a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h
index 4b570ce..ebdf32a 100644
--- a/newlib/libc/include/sys/reent.h
+++ b/newlib/libc/include/sys/reent.h
@@ -307,9 +307,9 @@ struct _misc_reent
{
/* miscellaneous reentrant data */
char *_strtok_last;
- int _mblen_state;
- int _wctomb_state;
- int _mbtowc_state;
+ _mbstate_t _mblen_state;
+ _mbstate_t _wctomb_state;
+ _mbstate_t _mbtowc_state;
char _l64a_buf[8];
int _getdate_err;
};
@@ -463,9 +463,12 @@ struct _reent
#define _REENT_INIT_MISC(var) do { \
struct _reent *_r = (var); \
_r->_misc->_strtok_last = _NULL; \
- _r->_misc->_mblen_state = 0; \
- _r->_misc->_wctomb_state = 0; \
- _r->_misc->_mbtowc_state = 0; \
+ _r->_misc->_mblen_state.__count = 0; \
+ _r->_misc->_mblen_state.__value.__wch = 0; \
+ _r->_misc->_wctomb_state.__count = 0; \
+ _r->_misc->_wctomb_state.__value.__wch = 0; \
+ _r->_misc->_mbtowc_state.__count = 0; \
+ _r->_misc->_mbtowc_state.__value.__wch = 0; \
_r->_misc->_l64a_buf[0] = '\0'; \
_r->_misc->_getdate_err = 0; \
} while (0)
@@ -537,9 +540,9 @@ struct _reent
int _gamma_signgam;
__extension__ unsigned long long _rand_next;
struct _rand48 _r48;
- int _mblen_state;
- int _mbtowc_state;
- int _wctomb_state;
+ _mbstate_t _mblen_state;
+ _mbstate_t _mbtowc_state;
+ _mbstate_t _wctomb_state;
char _l64a_buf[8];
char _signal_buf[_REENT_SIGNAL_SIZE];
int _getdate_err;
@@ -575,7 +578,7 @@ struct _reent
{ 0,0,0,0,0,0,0,0}, 0, 1, \
{{_RAND48_SEED_0, _RAND48_SEED_1, _RAND48_SEED_2}, \
{_RAND48_MULT_0, _RAND48_MULT_1, _RAND48_MULT_2}, _RAND48_ADD}, \
- 0, 0, 0, "", "", 0} } }
+ {0, {0}}, {0, {0}}, {0, {0}}, "", "", 0} } }
#define _REENT_INIT_PTR(var) \
{ int i; \
@@ -612,9 +615,12 @@ struct _reent
var->_new._reent._r48._mult[1] = _RAND48_MULT_1; \
var->_new._reent._r48._mult[2] = _RAND48_MULT_2; \
var->_new._reent._r48._add = _RAND48_ADD; \
- var->_new._reent._mblen_state = 0; \
- var->_new._reent._mbtowc_state = 0; \
- var->_new._reent._wctomb_state = 0; \
+ var->_new._reent._mblen_state.__count = 0; \
+ var->_new._reent._mblen_state.__value.__wch = 0; \
+ var->_new._reent._mbtowc_state.__count = 0; \
+ var->_new._reent._mbtowc_state.__value.__wch = 0; \
+ var->_new._reent._wctomb_state.__count = 0; \
+ var->_new._reent._wctomb_state.__value.__wch = 0; \
var->_new._reent._l64a_buf[0] = '\0'; \
var->_new._reent._signal_buf[0] = '\0'; \
var->_new._reent._getdate_err = 0; \
diff --git a/newlib/libc/include/sys/syslimits.h b/newlib/libc/include/sys/syslimits.h
new file mode 100644
index 0000000..ba9dbd6
--- /dev/null
+++ b/newlib/libc/include/sys/syslimits.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 1988, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
+ *
+ * @(#)syslimits.h 8.1 (Berkeley) 6/2/93
+ * $FreeBSD: src/sys/sys/syslimits.h,v 1.10 2001/06/18 20:24:54 wollman Exp $
+ */
+
+#ifndef _SYS_SYSLIMITS_H_
+#define _SYS_SYSLIMITS_H_
+
+#define ARG_MAX 65536 /* max bytes for an exec function */
+#ifndef CHILD_MAX
+#define CHILD_MAX 40 /* max simultaneous processes */
+#endif
+#define LINK_MAX 32767 /* max file link count */
+#define MAX_CANON 255 /* max bytes in term canon input line */
+#define MAX_INPUT 255 /* max bytes in terminal input */
+#define NAME_MAX 255 /* max bytes in a file name */
+#define NGROUPS_MAX 16 /* max supplemental group id's */
+#ifndef OPEN_MAX
+#define OPEN_MAX 64 /* max open files per process */
+#endif
+#define PATH_MAX 1024 /* max bytes in pathname */
+#define PIPE_BUF 512 /* max bytes for atomic pipe writes */
+#define IOV_MAX 1024 /* max elements in i/o vector */
+
+#define BC_BASE_MAX 99 /* max ibase/obase values in bc(1) */
+#define BC_DIM_MAX 2048 /* max array elements in bc(1) */
+#define BC_SCALE_MAX 99 /* max scale value in bc(1) */
+#define BC_STRING_MAX 1000 /* max const string length in bc(1) */
+#define COLL_WEIGHTS_MAX 0 /* max weights for order keyword */
+#define EXPR_NEST_MAX 32 /* max expressions nested in expr(1) */
+#define LINE_MAX 2048 /* max bytes in an input line */
+#define RE_DUP_MAX 255 /* max RE's in interval notation */
+
+#endif
diff --git a/newlib/libc/include/wchar.h b/newlib/libc/include/wchar.h
new file mode 100644
index 0000000..41b8fdc
--- /dev/null
+++ b/newlib/libc/include/wchar.h
@@ -0,0 +1,30 @@
+#ifndef _WCHAR_H_
+#define _WCHAR_H_
+
+#define __need_size_t
+#define __need_wchar_t
+#define __need_wint_t
+#include <stddef.h>
+
+/* For _mbstate_t definition. */
+#include <sys/_types.h>
+
+#ifndef WEOF
+# define WEOF (0xffffffffu)
+#endif
+
+#ifndef MBSTATE_T
+#define MBSTATE_T
+typedef _mbstate_t mbstate_t;
+#endif /* MBSTATE_T */
+
+wint_t btowc (int c);
+int wctob (wint_t c);
+int mbsinit(const mbstate_t *ps);
+size_t mbrlen(const char *s, size_t n, mbstate_t *ps);
+size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps);
+size_t wcrtomb(char *s, wchar_t wc, mbstate_t *ps);
+size_t mbsrtowcs(wchar_t *dst, const char **src, size_t len, mbstate_t *ps);
+size_t wcsrtombs(char *dst, const wchar_t **src, size_t len, mbstate_t *ps);
+
+#endif /* _WCHAR_H_ */
diff --git a/newlib/libc/locale/Makefile.am b/newlib/libc/locale/Makefile.am
index 71a400a..7b7098f 100644
--- a/newlib/libc/locale/Makefile.am
+++ b/newlib/libc/locale/Makefile.am
@@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = cygnus
INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
-LIB_SOURCES = locale.c
+LIB_SOURCES = timelocal.h timelocal.c ldpart.h ldpart.c fix_grouping.c locale.c nl_langinfo.c lnumeric.h lnumeric.c lmonetary.h lmonetary.c lmessages.h lmessages.c
liblocale_la_LDFLAGS = -Xcompiler -nostdlib
diff --git a/newlib/libc/locale/Makefile.in b/newlib/libc/locale/Makefile.in
index c640e46..f314b70 100644
--- a/newlib/libc/locale/Makefile.in
+++ b/newlib/libc/locale/Makefile.in
@@ -110,7 +110,7 @@ AUTOMAKE_OPTIONS = cygnus
INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
-LIB_SOURCES = locale.c
+LIB_SOURCES = timelocal.h timelocal.c ldpart.h ldpart.c fix_grouping.c locale.c nl_langinfo.c lnumeric.h lnumeric.c lmonetary.h lmonetary.c lmessages.h lmessages.c
liblocale_la_LDFLAGS = -Xcompiler -nostdlib
@@ -139,11 +139,16 @@ DEFS = @DEFS@ -I. -I$(srcdir)
CPPFLAGS = @CPPFLAGS@
LIBS = @LIBS@
lib_a_LIBADD =
-@USE_LIBTOOL_FALSE@lib_a_OBJECTS = locale.$(OBJEXT)
+@USE_LIBTOOL_FALSE@lib_a_OBJECTS = timelocal.$(OBJEXT) ldpart.$(OBJEXT) \
+@USE_LIBTOOL_FALSE@fix_grouping.$(OBJEXT) locale.$(OBJEXT) \
+@USE_LIBTOOL_FALSE@nl_langinfo.$(OBJEXT) lnumeric.$(OBJEXT) \
+@USE_LIBTOOL_FALSE@lmonetary.$(OBJEXT) lmessages.$(OBJEXT)
LTLIBRARIES = $(noinst_LTLIBRARIES)
liblocale_la_LIBADD =
-@USE_LIBTOOL_TRUE@liblocale_la_OBJECTS = locale.lo
+@USE_LIBTOOL_TRUE@liblocale_la_OBJECTS = timelocal.lo ldpart.lo \
+@USE_LIBTOOL_TRUE@fix_grouping.lo locale.lo nl_langinfo.lo lnumeric.lo \
+@USE_LIBTOOL_TRUE@lmonetary.lo lmessages.lo
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
diff --git a/newlib/libc/locale/fix_grouping.c b/newlib/libc/locale/fix_grouping.c
new file mode 100644
index 0000000..c44fc33
--- /dev/null
+++ b/newlib/libc/locale/fix_grouping.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2001 Alexey Zelkin <phantom@FreeBSD.org>
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+
+#include <ctype.h>
+#include <limits.h>
+#include <stddef.h>
+
+static const char nogrouping[] = { CHAR_MAX, '\0' };
+
+/*
+ * "3;3;-1" -> "\003\003\177"
+ */
+
+const char *
+__fix_locale_grouping_str(const char *str) {
+
+ char *src, *dst;
+ char n;
+
+ if (str == NULL || *str == '\0') {
+ return nogrouping;
+ }
+
+ for (src = (char*)str, dst = (char*)str; *src != '\0'; src++) {
+
+ /* input string examples: "3;3", "3;2;-1" */
+ if (*src == ';')
+ continue;
+
+ if (*src == '-' && *(src+1) == '1') {
+ *dst++ = CHAR_MAX;
+ src++;
+ continue;
+ }
+
+ if (!isdigit((unsigned char)*src)) {
+ /* broken grouping string */
+ return nogrouping;
+ }
+
+ /* assume all numbers <= 99 */
+ n = *src - '0';
+ if (isdigit((unsigned char)*(src+1))) {
+ src++;
+ n *= 10;
+ n += *src - '0';
+ }
+
+ *dst = n;
+ /* NOTE: assume all input started with "0" as 'no grouping' */
+ if (*dst == '\0')
+ return (dst == (char*)str) ? nogrouping : str;
+ dst++;
+ }
+ *dst = '\0';
+ return str;
+}
diff --git a/newlib/libc/locale/ldpart.c b/newlib/libc/locale/ldpart.c
new file mode 100644
index 0000000..1721f7b
--- /dev/null
+++ b/newlib/libc/locale/ldpart.c
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/syslimits.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "setlocale.h"
+#include "ldpart.h"
+
+static int split_lines(char *, const char *);
+static void set_from_buf(const char *, int, const char **);
+
+int
+__part_load_locale(const char *name,
+ int *using_locale,
+ char *locale_buf,
+ const char *category_filename,
+ int locale_buf_size_max,
+ int locale_buf_size_min,
+ const char **dst_localebuf) {
+
+ static char locale_buf_C[] = "C";
+ static int num_lines;
+
+ int fd;
+ char *lbuf;
+ char *p;
+ const char *plim;
+ char filename[PATH_MAX];
+ struct stat st;
+ size_t namesize;
+ size_t bufsize;
+ int save_using_locale;
+ char *nptr;
+
+ save_using_locale = *using_locale;
+ *using_locale = 0;
+
+ if (name == NULL)
+ goto no_locale;
+
+ if (!strcmp(name, "C") || !strcmp(name, "POSIX"))
+ return 0;
+
+ /*
+ * If the locale name is the same as our cache, use the cache.
+ */
+ lbuf = locale_buf;
+ if (lbuf != NULL && strcmp(name, lbuf) == 0) {
+ set_from_buf(lbuf, num_lines, dst_localebuf);
+ *using_locale = 1;
+ return 0;
+ }
+
+ /*
+ * Slurp the locale file into the cache.
+ */
+ namesize = strlen(name) + 1;
+
+ if (!_PathLocale)
+ goto no_locale;
+ /* Range checking not needed, 'name' size is limited */
+ strcpy(filename, _PathLocale);
+ strcat(filename, "/");
+ strcat(filename, name);
+ strcat(filename, "/");
+ strcat(filename, category_filename);
+ fd = open(filename, O_RDONLY);
+ if (fd < 0)
+ goto no_locale;
+ if (fstat(fd, &st) != 0)
+ goto bad_locale;
+ if (st.st_size <= 0)
+ goto bad_locale;
+ bufsize = namesize + st.st_size;
+ locale_buf = NULL;
+
+ if (lbuf == NULL || lbuf == locale_buf_C)
+ {
+ lbuf = malloc(bufsize);
+ }
+ else
+ {
+ nptr = realloc(lbuf, bufsize);
+ if (!nptr && lbuf)
+ free (lbuf);
+ lbuf = nptr;
+ }
+
+ if (lbuf == NULL)
+ goto bad_locale;
+ (void) strcpy(lbuf, name);
+ p = lbuf + namesize;
+ plim = p + st.st_size;
+ if (read(fd, p, (size_t) st.st_size) != st.st_size)
+ goto bad_lbuf;
+ if (close(fd) != 0)
+ goto bad_lbuf;
+ /*
+ * Parse the locale file into localebuf.
+ */
+ if (plim[-1] != '\n')
+ goto bad_lbuf;
+ num_lines = split_lines(p, plim);
+ if (num_lines >= locale_buf_size_max)
+ num_lines = locale_buf_size_max;
+ else if (num_lines >= locale_buf_size_min)
+ num_lines = locale_buf_size_min;
+ else
+ goto reset_locale;
+ set_from_buf(lbuf, num_lines, dst_localebuf);
+ /*
+ * Record the successful parse in the cache.
+ */
+ locale_buf = lbuf;
+
+ *using_locale = 1;
+ return 0;
+
+reset_locale:
+ locale_buf = locale_buf_C;
+ save_using_locale = 0;
+bad_lbuf:
+ free(lbuf);
+bad_locale:
+ (void)close(fd);
+no_locale:
+ *using_locale = save_using_locale;
+ return -1;
+}
+
+static int
+split_lines(char *p, const char *plim) {
+
+ int i;
+
+ for (i = 0; p < plim; i++) {
+ p = strchr(p, '\n');
+ *p++ = '\0';
+ }
+ return i;
+}
+
+static void
+set_from_buf(const char *p, int num_lines, const char **dst_localebuf) {
+
+ const char **ap;
+ int i;
+
+ for (ap = dst_localebuf, i = 0; i < num_lines; ++ap, ++i)
+ *ap = p += strlen(p) + 1;
+}
+
diff --git a/newlib/libc/locale/ldpart.h b/newlib/libc/locale/ldpart.h
new file mode 100644
index 0000000..86031fd
--- /dev/null
+++ b/newlib/libc/locale/ldpart.h
@@ -0,0 +1,35 @@
+/*-
+ * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
+ * All rights reserved.
+ *
+ * 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: src/lib/libc/locale/ldpart.h,v 1.4 2001/12/20 18:28:52 phantom Exp $
+ */
+
+#ifndef _LDPART_H_
+#define _LDPART_H_
+
+int __part_load_locale(const char *, int*, char *, const char *,
+ int, int, const char **);
+
+#endif /* !_LDPART_H_ */
diff --git a/newlib/libc/locale/lmessages.c b/newlib/libc/locale/lmessages.c
new file mode 100644
index 0000000..9a4bb79
--- /dev/null
+++ b/newlib/libc/locale/lmessages.c
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2001 Alexey Zelkin <phantom@FreeBSD.org>
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+
+#include <stddef.h>
+
+#include "lmessages.h"
+#include "ldpart.h"
+
+#define LCMESSAGES_SIZE_FULL (sizeof(struct lc_messages_T) / sizeof(char *))
+#define LCMESSAGES_SIZE_MIN \
+ (offsetof(struct lc_messages_T, yesstr) / sizeof(char *))
+
+static char empty[] = "";
+
+static const struct lc_messages_T _C_messages_locale = {
+ "^[yY]" , /* yesexpr */
+ "^[nN]" , /* noexpr */
+ "yes" , /* yesstr */
+ "no" /* nostr */
+};
+
+static struct lc_messages_T _messages_locale;
+static int _messages_using_locale;
+static char *_messages_locale_buf;
+
+int
+__messages_load_locale(const char *name) {
+
+ /*
+ * Propose that we can have incomplete locale file (w/o "{yes,no}str").
+ * Initialize them before loading. In case of complete locale, they'll
+ * be initialized to loaded value, otherwise they'll not be touched.
+ */
+ _messages_locale.yesstr = empty;
+ _messages_locale.nostr = empty;
+
+ return __part_load_locale(name, &_messages_using_locale,
+ _messages_locale_buf, "LC_MESSAGES",
+ LCMESSAGES_SIZE_FULL, LCMESSAGES_SIZE_MIN,
+ (const char **)&_messages_locale);
+}
+
+struct lc_messages_T *
+__get_current_messages_locale(void) {
+
+ return (_messages_using_locale
+ ? &_messages_locale
+ : (struct lc_messages_T *)&_C_messages_locale);
+}
+
+#ifdef LOCALE_DEBUG
+void
+msgdebug() {
+printf( "yesexpr = %s\n"
+ "noexpr = %s\n"
+ "yesstr = %s\n"
+ "nostr = %s\n",
+ _messages_locale.yesexpr,
+ _messages_locale.noexpr,
+ _messages_locale.yesstr,
+ _messages_locale.nostr
+);
+}
+#endif /* LOCALE_DEBUG */
diff --git a/newlib/libc/locale/lmessages.h b/newlib/libc/locale/lmessages.h
new file mode 100644
index 0000000..ee690ae
--- /dev/null
+++ b/newlib/libc/locale/lmessages.h
@@ -0,0 +1,42 @@
+/*-
+ * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
+ * All rights reserved.
+ *
+ * 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: src/lib/libc/locale/lmessages.h,v 1.3 2001/12/20 18:28:52 phantom Exp $
+ */
+
+#ifndef _LMESSAGES_H_
+#define _LMESSAGES_H_
+
+struct lc_messages_T {
+ const char *yesexpr;
+ const char *noexpr;
+ const char *yesstr;
+ const char *nostr;
+};
+
+struct lc_messages_T *__get_current_messages_locale(void);
+int __messages_load_locale(const char *);
+
+#endif /* !_LMESSAGES_H_ */
diff --git a/newlib/libc/locale/lmonetary.c b/newlib/libc/locale/lmonetary.c
new file mode 100644
index 0000000..d31e88c
--- /dev/null
+++ b/newlib/libc/locale/lmonetary.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include "lmonetary.h"
+#include "ldpart.h"
+
+extern int __mlocale_changed;
+extern const char * __fix_locale_grouping_str(const char *);
+
+#define LCMONETARY_SIZE (sizeof(struct lc_monetary_T) / sizeof(char *))
+
+static char empty[] = "";
+static char numempty[] = { CHAR_MAX, '\0'};
+
+static const struct lc_monetary_T _C_monetary_locale = {
+ empty, /* int_curr_symbol */
+ empty, /* currency_symbol */
+ empty, /* mon_decimal_point */
+ empty, /* mon_thousands_sep */
+ numempty, /* mon_grouping */
+ empty, /* positive_sign */
+ empty, /* negative_sign */
+ numempty, /* int_frac_digits */
+ numempty, /* frac_digits */
+ numempty, /* p_cs_precedes */
+ numempty, /* p_sep_by_space */
+ numempty, /* n_cs_precedes */
+ numempty, /* n_sep_by_space */
+ numempty, /* p_sign_posn */
+ numempty /* n_sign_posn */
+};
+
+static struct lc_monetary_T _monetary_locale;
+static int _monetary_using_locale;
+static char *_monetary_locale_buf;
+
+static char
+cnv(const char *str) {
+ int i = strtol(str, NULL, 10);
+ if (i == -1)
+ i = CHAR_MAX;
+ return (char)i;
+}
+
+int
+__monetary_load_locale(const char *name) {
+
+ int ret;
+ __mlocale_changed = 1;
+ ret = __part_load_locale(name, &_monetary_using_locale,
+ _monetary_locale_buf, "LC_MONETARY",
+ LCMONETARY_SIZE, LCMONETARY_SIZE,
+ (const char **)&_monetary_locale);
+ if (ret == 0 && _monetary_using_locale) {
+ _monetary_locale.mon_grouping =
+ __fix_locale_grouping_str(_monetary_locale.mon_grouping);
+
+#define M_ASSIGN_CHAR(NAME) (((char *)_monetary_locale.NAME)[0] = \
+ cnv(_monetary_locale.NAME))
+
+ M_ASSIGN_CHAR(int_frac_digits);
+ M_ASSIGN_CHAR(frac_digits);
+ M_ASSIGN_CHAR(p_cs_precedes);
+ M_ASSIGN_CHAR(p_sep_by_space);
+ M_ASSIGN_CHAR(n_cs_precedes);
+ M_ASSIGN_CHAR(n_sep_by_space);
+ M_ASSIGN_CHAR(p_sign_posn);
+ M_ASSIGN_CHAR(n_sign_posn);
+ }
+ return ret;
+}
+
+struct lc_monetary_T *
+__get_current_monetary_locale(void) {
+
+ return (_monetary_using_locale
+ ? &_monetary_locale
+ : (struct lc_monetary_T *)&_C_monetary_locale);
+}
+
+#ifdef LOCALE_DEBUG
+void
+monetdebug() {
+printf( "int_curr_symbol = %s\n"
+ "currency_symbol = %s\n"
+ "mon_decimal_point = %s\n"
+ "mon_thousands_sep = %s\n"
+ "mon_grouping = %s\n"
+ "positive_sign = %s\n"
+ "negative_sign = %s\n"
+ "int_frac_digits = %d\n"
+ "frac_digits = %d\n"
+ "p_cs_precedes = %d\n"
+ "p_sep_by_space = %d\n"
+ "n_cs_precedes = %d\n"
+ "n_sep_by_space = %d\n"
+ "p_sign_posn = %d\n"
+ "n_sign_posn = %d\n",
+ _monetary_locale.int_curr_symbol,
+ _monetary_locale.currency_symbol,
+ _monetary_locale.mon_decimal_point,
+ _monetary_locale.mon_thousands_sep,
+ _monetary_locale.mon_grouping,
+ _monetary_locale.positive_sign,
+ _monetary_locale.negative_sign,
+ _monetary_locale.int_frac_digits[0],
+ _monetary_locale.frac_digits[0],
+ _monetary_locale.p_cs_precedes[0],
+ _monetary_locale.p_sep_by_space[0],
+ _monetary_locale.n_cs_precedes[0],
+ _monetary_locale.n_sep_by_space[0],
+ _monetary_locale.p_sign_posn[0],
+ _monetary_locale.n_sign_posn[0]
+);
+}
+#endif /* LOCALE_DEBUG */
diff --git a/newlib/libc/locale/lmonetary.h b/newlib/libc/locale/lmonetary.h
new file mode 100644
index 0000000..bbe77db
--- /dev/null
+++ b/newlib/libc/locale/lmonetary.h
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
+ * All rights reserved.
+ *
+ * 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: src/lib/libc/locale/lmonetary.h,v 1.3 2001/12/20 18:28:52 phantom Exp $
+ */
+
+#ifndef _LMONETARY_H_
+#define _LMONETARY_H_
+
+struct lc_monetary_T {
+ const char *int_curr_symbol;
+ const char *currency_symbol;
+ const char *mon_decimal_point;
+ const char *mon_thousands_sep;
+ const char *mon_grouping;
+ const char *positive_sign;
+ const char *negative_sign;
+ const char *int_frac_digits;
+ const char *frac_digits;
+ const char *p_cs_precedes;
+ const char *p_sep_by_space;
+ const char *n_cs_precedes;
+ const char *n_sep_by_space;
+ const char *p_sign_posn;
+ const char *n_sign_posn;
+};
+
+struct lc_monetary_T *__get_current_monetary_locale(void);
+int __monetary_load_locale(const char *);
+
+#endif /* !_LMONETARY_H_ */
diff --git a/newlib/libc/locale/lnumeric.c b/newlib/libc/locale/lnumeric.c
new file mode 100644
index 0000000..90b404c
--- /dev/null
+++ b/newlib/libc/locale/lnumeric.c
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+
+#include <limits.h>
+#include "lnumeric.h"
+#include "ldpart.h"
+
+extern int __nlocale_changed;
+extern const char *__fix_locale_grouping_str(const char *);
+
+#define LCNUMERIC_SIZE (sizeof(struct lc_numeric_T) / sizeof(char *))
+
+static char numempty[] = { CHAR_MAX, '\0' };
+
+static const struct lc_numeric_T _C_numeric_locale = {
+ ".", /* decimal_point */
+ "", /* thousands_sep */
+ numempty /* grouping */
+};
+
+static struct lc_numeric_T _numeric_locale;
+static int _numeric_using_locale;
+static char *_numeric_locale_buf;
+
+int
+__numeric_load_locale(const char *name) {
+
+ int ret;
+
+ __nlocale_changed = 1;
+ ret = __part_load_locale(name, &_numeric_using_locale,
+ _numeric_locale_buf, "LC_NUMERIC",
+ LCNUMERIC_SIZE, LCNUMERIC_SIZE,
+ (const char **)&_numeric_locale);
+ if (ret == 0 && _numeric_using_locale)
+ _numeric_locale.grouping =
+ __fix_locale_grouping_str(_numeric_locale.grouping);
+ return ret;
+}
+
+struct lc_numeric_T *
+__get_current_numeric_locale(void) {
+
+ return (_numeric_using_locale
+ ? &_numeric_locale
+ : (struct lc_numeric_T *)&_C_numeric_locale);
+}
+
+#ifdef LOCALE_DEBUG
+void
+numericdebug(void) {
+printf( "decimal_point = %s\n"
+ "thousands_sep = %s\n"
+ "grouping = %s\n",
+ _numeric_locale.decimal_point,
+ _numeric_locale.thousands_sep,
+ _numeric_locale.grouping
+);
+}
+#endif /* LOCALE_DEBUG */
diff --git a/newlib/libc/locale/lnumeric.h b/newlib/libc/locale/lnumeric.h
new file mode 100644
index 0000000..9678c1f
--- /dev/null
+++ b/newlib/libc/locale/lnumeric.h
@@ -0,0 +1,41 @@
+/*-
+ * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
+ * All rights reserved.
+ *
+ * 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: src/lib/libc/locale/lnumeric.h,v 1.3 2001/12/20 18:28:52 phantom Exp $
+ */
+
+#ifndef _LNUMERIC_H_
+#define _LNUMERIC_H_
+
+struct lc_numeric_T {
+ const char *decimal_point;
+ const char *thousands_sep;
+ const char *grouping;
+};
+
+struct lc_numeric_T *__get_current_numeric_locale(void);
+int __numeric_load_locale(const char *);
+
+#endif /* !_LNUMERIC_H_ */
diff --git a/newlib/libc/locale/nl_langinfo.3 b/newlib/libc/locale/nl_langinfo.3
new file mode 100644
index 0000000..96819e1
--- /dev/null
+++ b/newlib/libc/locale/nl_langinfo.3
@@ -0,0 +1,90 @@
+.\" Copyright (c) 2001 Alexey Zelkin <phantom@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" 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 REGENTS 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: src/lib/libc/locale/nl_langinfo.3,v 1.4 2002/04/13 04:25:56 dd Exp $
+.\"
+.Dd May 3, 2001
+.Dt NL_LANGINFO 3
+.Os
+.Sh NAME
+.Nm nl_langinfo
+.Nd language information
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In langinfo.h
+.Ft char *
+.Fn nl_langinfo "nl_item item"
+.Sh DESCRIPTION
+The
+.Fn nl_langinfo
+function returns a pointer to a string containing information relevant to
+the particular language or cultural area defined in the program's locale.
+The manifest constant names and values of
+.Fa item
+are defined in
+.Aq Pa langinfo.h .
+.Pp
+Calls to
+.Fn setlocale
+with a category corresponding to the category of
+.Fa item ,
+or to the
+category
+.Dv LC_ALL ,
+may overwrite buffer pointed by the return value.
+.Sh EXAMPLES
+For example:
+.Pp
+.Dl nl_langinfo(ABDAY_1)
+.Pp
+would return a pointer to the string
+.Qq Li Dom
+if the identified language was
+Portuguese, and
+.Qq Li Sun
+if the identified language was English.
+.Sh RETURN VALUES
+In a locale where langinfo data is not defined,
+.Fn nl_langinfo
+returns a pointer to the corresponding string in the
+.Tn POSIX
+locale.
+In all locales,
+.Fn nl_langinfo
+returns a pointer to an empty string if
+.Fa item
+contains an invalid setting.
+.Sh SEE ALSO
+.Xr setlocale 3
+.Sh STANDARDS
+The
+.Fn nl_langinfo
+function conforms to
+.St -susv2 .
+.Sh HISTORY
+The
+.Fn nl_langinfo
+function first appeared in
+.Fx 4.6 .
diff --git a/newlib/libc/locale/nl_langinfo.c b/newlib/libc/locale/nl_langinfo.c
new file mode 100644
index 0000000..e762799
--- /dev/null
+++ b/newlib/libc/locale/nl_langinfo.c
@@ -0,0 +1,213 @@
+/*-
+ * Copyright (c) 2001 Alexey Zelkin <phantom@FreeBSD.org>
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+
+#include <locale.h>
+#include <langinfo.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "timelocal.h"
+#include "lnumeric.h"
+#include "lmonetary.h"
+#include "lmessages.h"
+
+#define TRANSITION_PERIOD_HACK
+
+#define _REL(BASE) ((int)item-BASE)
+
+char *
+nl_langinfo(nl_item item) {
+
+ char *ret, *s, *cs;
+ static char *csym = NULL;
+#ifdef TRANSITION_PERIOD_HACK
+ static char *cset = NULL;
+#endif /* TRANSITION_PERIOD_HACK */
+ char *nptr;
+
+ switch (item) {
+ case CODESET:
+ ret = "";
+ if ((s = setlocale(LC_CTYPE, NULL)) != NULL) {
+ if ((cs = strchr(s, '.')) != NULL) {
+ ret = cs + 1;
+#ifdef TRANSITION_PERIOD_HACK
+ if (strncmp(ret, "ISO_", 4) == 0) {
+ int slen = strlen(ret);
+
+ nptr = realloc(cset, slen);
+
+ if (!nptr && cset)
+ free (cset);
+
+ cset = nptr;
+ if (cset != NULL) {
+ strcpy(cset, "ISO");
+ strcat(cset, ret + 4);
+ ret = cset;
+ } else
+ ret = "";
+ } else if (strcmp(ret, "EUC") == 0) {
+ if (strncmp(s, "ja_JP", 5) == 0)
+ ret = "eucJP";
+ else if (strncmp(s, "ko_KR", 5) == 0)
+ ret = "eucKR";
+ else if (strncmp(s, "zh_CN", 5) == 0)
+ ret = "eucCN";
+ } else if (strcmp(ret, "ASCII") == 0)
+ ret = "US-ASCII";
+#endif /* TRANSITION_PERIOD_HACK */
+ } else if (strcmp(s, "C") == 0 ||
+ strcmp(s, "POSIX") == 0
+#ifdef TRANSITION_PERIOD_HACK
+ || strstr(s, "ASCII") != NULL
+#endif /* TRANSITION_PERIOD_HACK */
+ )
+ ret = "US-ASCII";
+ }
+ break;
+ case D_T_FMT:
+ ret = (char *) __get_current_time_locale()->c_fmt;
+ break;
+ case D_FMT:
+ ret = (char *) __get_current_time_locale()->x_fmt;
+ break;
+ case T_FMT:
+ ret = (char *) __get_current_time_locale()->X_fmt;
+ break;
+ case T_FMT_AMPM:
+ ret = (char *) __get_current_time_locale()->ampm_fmt;
+ break;
+ case AM_STR:
+ ret = (char *) __get_current_time_locale()->am;
+ break;
+ case PM_STR:
+ ret = (char *) __get_current_time_locale()->pm;
+ break;
+ case DAY_1: case DAY_2: case DAY_3:
+ case DAY_4: case DAY_5: case DAY_6: case DAY_7:
+ ret = (char*) __get_current_time_locale()->weekday[_REL(DAY_1)];
+ break;
+ case ABDAY_1: case ABDAY_2: case ABDAY_3:
+ case ABDAY_4: case ABDAY_5: case ABDAY_6: case ABDAY_7:
+ ret = (char*) __get_current_time_locale()->wday[_REL(ABDAY_1)];
+ break;
+ case MON_1: case MON_2: case MON_3: case MON_4:
+ case MON_5: case MON_6: case MON_7: case MON_8:
+ case MON_9: case MON_10: case MON_11: case MON_12:
+ ret = (char*) __get_current_time_locale()->month[_REL(MON_1)];
+ break;
+ case ABMON_1: case ABMON_2: case ABMON_3: case ABMON_4:
+ case ABMON_5: case ABMON_6: case ABMON_7: case ABMON_8:
+ case ABMON_9: case ABMON_10: case ABMON_11: case ABMON_12:
+ ret = (char*) __get_current_time_locale()->mon[_REL(ABMON_1)];
+ break;
+ case ERA:
+ /* XXX: need to be implemented */
+ ret = "";
+ break;
+ case ERA_D_FMT:
+ /* XXX: need to be implemented */
+ ret = "";
+ break;
+ case ERA_D_T_FMT:
+ /* XXX: need to be implemented */
+ ret = "";
+ break;
+ case ERA_T_FMT:
+ /* XXX: need to be implemented */
+ ret = "";
+ break;
+ case ALT_DIGITS:
+ /* XXX: need to be implemented */
+ ret = "";
+ break;
+ case RADIXCHAR:
+ ret = (char*) __get_current_numeric_locale()->decimal_point;
+ break;
+ case THOUSEP:
+ ret = (char*) __get_current_numeric_locale()->thousands_sep;
+ break;
+ case YESEXPR:
+ ret = (char*) __get_current_messages_locale()->yesexpr;
+ break;
+ case NOEXPR:
+ ret = (char*) __get_current_messages_locale()->noexpr;
+ break;
+ /*
+ * All items marked with LEGACY are available, but not recomended
+ * by SUSv2 to be used in portable applications since they're subject
+ * to remove in future specification editions
+ */
+ case YESSTR: /* LEGACY */
+ ret = (char*) __get_current_messages_locale()->yesstr;
+ break;
+ case NOSTR: /* LEGACY */
+ ret = (char*) __get_current_messages_locale()->nostr;
+ break;
+ case CRNCYSTR:
+ ret = "";
+ cs = (char*) __get_current_monetary_locale()->currency_symbol;
+ if (*cs != '\0') {
+ char pos = localeconv()->p_cs_precedes;
+
+ if (pos == localeconv()->n_cs_precedes) {
+ char psn = '\0';
+
+ if (pos == CHAR_MAX) {
+ if (strcmp(cs, __get_current_monetary_locale()->mon_decimal_point) == 0)
+ psn = '.';
+ } else
+ psn = pos ? '-' : '+';
+ if (psn != '\0') {
+ int clen = strlen(cs);
+
+ nptr = realloc(csym, clen + 2);
+ if (!nptr && csym)
+ free (csym);
+
+ csym = nptr;
+
+ if (csym != NULL) {
+ *csym = psn;
+ strcpy(csym + 1, cs);
+ ret = csym;
+ }
+ }
+ }
+ }
+ break;
+ case D_MD_ORDER: /* local extension */
+ ret = (char *) __get_current_time_locale()->md_order;
+ break;
+ default:
+ ret = "";
+ }
+ return (ret);
+}
diff --git a/newlib/libc/locale/setlocale.h b/newlib/libc/locale/setlocale.h
new file mode 100644
index 0000000..3eb7698
--- /dev/null
+++ b/newlib/libc/locale/setlocale.h
@@ -0,0 +1,37 @@
+/*-
+ * Copyright (C) 1997 by Andrey A. Chernov, Moscow, Russia.
+ * All rights reserved.
+ *
+ * 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 ``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 REGENTS 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: src/lib/libc/locale/setlocale.h,v 1.4 2001/12/20 18:28:52 phantom Exp $
+ */
+
+#ifndef _SETLOCALE_H_
+#define _SETLOCALE_H_
+
+#define ENCODING_LEN 31
+#define CATEGORY_LEN 11
+
+extern char *_PathLocale;
+
+#endif /* !_SETLOCALE_H_ */
diff --git a/newlib/libc/locale/timelocal.c b/newlib/libc/locale/timelocal.c
new file mode 100644
index 0000000..5b097ad
--- /dev/null
+++ b/newlib/libc/locale/timelocal.c
@@ -0,0 +1,119 @@
+/*-
+ * Copyright (c) 2001 Alexey Zelkin <phantom@FreeBSD.org>
+ * Copyright (c) 1997 FreeBSD Inc.
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+
+#include <stddef.h>
+
+#include "ldpart.h"
+#include "timelocal.h"
+
+static struct lc_time_T _time_locale;
+static int _time_using_locale;
+static char *time_locale_buf;
+
+#define LCTIME_SIZE (sizeof(struct lc_time_T) / sizeof(char *))
+
+static const struct lc_time_T _C_time_locale = {
+ {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ }, {
+ "January", "February", "March", "April", "May", "June",
+ "July", "August", "September", "October", "November", "December"
+ }, {
+ "Sun", "Mon", "Tue", "Wed",
+ "Thu", "Fri", "Sat"
+ }, {
+ "Sunday", "Monday", "Tuesday", "Wednesday",
+ "Thursday", "Friday", "Saturday"
+ },
+
+ /* X_fmt */
+ "%H:%M:%S",
+
+ /*
+ * x_fmt
+ * Since the C language standard calls for
+ * "date, using locale's date format," anything goes.
+ * Using just numbers (as here) makes Quakers happier;
+ * it's also compatible with SVR4.
+ */
+ "%m/%d/%y",
+
+ /*
+ * c_fmt
+ */
+ "%a %b %e %H:%M:%S %Y",
+
+ /* am */
+ "AM",
+
+ /* pm */
+ "PM",
+
+ /* date_fmt */
+ "%a %b %e %H:%M:%S %Z %Y",
+
+ /* alt_month
+ * Standalone months forms for %OB
+ */
+ {
+ "January", "February", "March", "April", "May", "June",
+ "July", "August", "September", "October", "November", "December"
+ },
+
+ /* md_order
+ * Month / day order in dates
+ */
+ "md",
+
+ /* ampm_fmt
+ * To determine 12-hour clock format time (empty, if N/A)
+ */
+ "%I:%M:%S %p"
+};
+
+struct lc_time_T *
+__get_current_time_locale(void) {
+ return (_time_using_locale
+ ? &_time_locale
+ : (struct lc_time_T *)&_C_time_locale);
+}
+
+int
+__time_load_locale(const char *name) {
+
+ int ret;
+
+ ret = __part_load_locale(name, &_time_using_locale,
+ time_locale_buf, "LC_TIME",
+ LCTIME_SIZE, LCTIME_SIZE,
+ (const char **)&_time_locale);
+
+ return (ret);
+}
diff --git a/newlib/libc/locale/timelocal.h b/newlib/libc/locale/timelocal.h
new file mode 100644
index 0000000..0b0a59a
--- /dev/null
+++ b/newlib/libc/locale/timelocal.h
@@ -0,0 +1,55 @@
+/*-
+ * Copyright (c) 1997-2002 FreeBSD Project.
+ * All rights reserved.
+ *
+ * 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: src/lib/libc/stdtime/timelocal.h,v 1.11 2002/01/24 15:07:44 phantom Exp $
+ */
+
+#ifndef _TIMELOCAL_H_
+#define _TIMELOCAL_H_
+
+/*
+ * Private header file for the strftime and strptime localization
+ * stuff.
+ */
+struct lc_time_T {
+ const char *mon[12];
+ const char *month[12];
+ const char *wday[7];
+ const char *weekday[7];
+ const char *X_fmt;
+ const char *x_fmt;
+ const char *c_fmt;
+ const char *am;
+ const char *pm;
+ const char *date_fmt;
+ const char *alt_month[12];
+ const char *md_order;
+ const char *ampm_fmt;
+};
+
+struct lc_time_T *__get_current_time_locale(void);
+int __time_load_locale(const char *);
+
+#endif /* !_TIMELOCAL_H_ */
diff --git a/newlib/libc/machine/powerpc/vfprintf.c b/newlib/libc/machine/powerpc/vfprintf.c
index 8204617..ff3a4f6 100644
--- a/newlib/libc/machine/powerpc/vfprintf.c
+++ b/newlib/libc/machine/powerpc/vfprintf.c
@@ -166,6 +166,7 @@ static char *rcsid = "$Id$";
#include <stdlib.h>
#include <string.h>
#include <reent.h>
+#include <wchar.h>
#include <string.h>
#ifdef __ALTIVEC__
#include <altivec.h>
@@ -388,7 +389,7 @@ _DEFUN (_VFPRINTF_R, (data, fp, fmt0, ap),
int vec_print_count; /* number of vector chunks remaining */
vec_16_byte_union vec_tmp;
#endif /* __ALTIVEC__ */
- int state; /* mbtowc calls from library must not change state */
+ mbstate_t state; /* mbtowc calls from library must not change state */
/*
* Choose PADSIZE to trade efficiency vs. size. If larger printf
diff --git a/newlib/libc/machine/powerpc/vfscanf.c b/newlib/libc/machine/powerpc/vfscanf.c
index 323a438..f4481ef 100644
--- a/newlib/libc/machine/powerpc/vfscanf.c
+++ b/newlib/libc/machine/powerpc/vfscanf.c
@@ -107,6 +107,7 @@ Supporting OS subroutines required:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
+#include <wchar.h>
#include <string.h>
#ifdef _HAVE_STDC
#include <stdarg.h>
@@ -278,7 +279,7 @@ __svfscanf_r (rptr, fp, fmt0, ap)
vec_union vec_buf;
char *lptr; /* literal pointer */
#ifdef MB_CAPABLE
- int state; /* value to keep track of multibyte state */
+ mbstate_t state; /* value to keep track of multibyte state */
#endif
char *ch_dest;
diff --git a/newlib/libc/machine/sh/Makefile.in b/newlib/libc/machine/sh/Makefile.in
index d6dc919..5fe7080 100644
--- a/newlib/libc/machine/sh/Makefile.in
+++ b/newlib/libc/machine/sh/Makefile.in
@@ -1,6 +1,6 @@
-# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
-# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
diff --git a/newlib/libc/stdio/getdelim.c b/newlib/libc/stdio/getdelim.c
index 8ec9d40..64f60ee 100644
--- a/newlib/libc/stdio/getdelim.c
+++ b/newlib/libc/stdio/getdelim.c
@@ -109,21 +109,24 @@ __getdelim (bufptr, n, delim, fp)
}
}
- /* Buffer is too small so reallocate a larger buffer. */
- pos = ptr - buf;
- newsize = (*n << 1);
- buf = realloc (buf, newsize);
- if (buf == NULL)
+ if (cont)
{
- cont = 0;
- break;
- }
+ /* Buffer is too small so reallocate a larger buffer. */
+ pos = ptr - buf;
+ newsize = (*n << 1);
+ buf = realloc (buf, newsize);
+ if (buf == NULL)
+ {
+ cont = 0;
+ break;
+ }
- /* After reallocating, continue in new buffer */
- *bufptr = buf;
- *n = newsize;
- ptr = buf + pos;
- numbytes = newsize - pos;
+ /* After reallocating, continue in new buffer */
+ *bufptr = buf;
+ *n = newsize;
+ ptr = buf + pos;
+ numbytes = newsize - pos;
+ }
}
_funlockfile (fp);
diff --git a/newlib/libc/stdio/vfprintf.c b/newlib/libc/stdio/vfprintf.c
index 8e1efd7..3fa2349 100644
--- a/newlib/libc/stdio/vfprintf.c
+++ b/newlib/libc/stdio/vfprintf.c
@@ -184,6 +184,8 @@ static char *rcsid = "$Id$";
#include <stdlib.h>
#include <string.h>
#include <reent.h>
+#include <wchar.h>
+#include <string.h>
#ifdef _HAVE_STDC
#include <stdarg.h>
@@ -426,7 +428,7 @@ _DEFUN (_VFPRINTF_R, (data, fp, fmt0, ap),
struct __siov iov[NIOV];/* ... and individual io vectors */
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */
char ox[2]; /* space for 0x hex-prefix */
- int state = 0; /* mbtowc calls from library must not change state */
+ mbstate_t state; /* mbtowc calls from library must not change state */
/*
* Choose PADSIZE to trade efficiency vs. size. If larger printf
@@ -439,6 +441,7 @@ _DEFUN (_VFPRINTF_R, (data, fp, fmt0, ap),
static _CONST char zeroes[PADSIZE] =
{'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
+ memset (&state, '\0', sizeof (state));
/*
* BEWARE, these `goto error' on error, and PAD uses `n'.
*/
@@ -1367,7 +1370,7 @@ get_arg (int n, char *fmt, va_list *ap, int *numargs_p, union arg_val *args,
STATE state, next_state;
ACTION action;
int pos, last_arg;
- int wc_state = 0;
+ mbstate_t wc_state;
int max_pos_arg = n;
enum types { INT, LONG_INT, SHORT_INT, QUAD_INT, CHAR, CHAR_PTR, DOUBLE, LONG_DOUBLE };
@@ -1375,6 +1378,8 @@ get_arg (int n, char *fmt, va_list *ap, int *numargs_p, union arg_val *args,
if (*last_fmt != NULL)
fmt = *last_fmt;
+ memset (&wc_state, '\0', sizeof (wc_state));
+
/* we need to process either to end of fmt string or until we have actually
read the desired parameter from the vararg list. */
while (*fmt && n >= numargs)
diff --git a/newlib/libc/stdio/vfscanf.c b/newlib/libc/stdio/vfscanf.c
index f6c3c93..61a901e 100644
--- a/newlib/libc/stdio/vfscanf.c
+++ b/newlib/libc/stdio/vfscanf.c
@@ -107,6 +107,8 @@ Supporting OS subroutines required:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
+#include <wchar.h>
+#include <string.h>
#ifdef _HAVE_STDC
#include <stdarg.h>
#else
@@ -257,7 +259,7 @@ __svfscanf_r (rptr, fp, fmt0, ap)
char buf[BUF]; /* buffer for numeric conversions */
char *lptr; /* literal pointer */
#ifdef MB_CAPABLE
- int state = 0; /* value to keep track of multibyte state */
+ mbstate_t state; /* value to keep track of multibyte state */
#endif
short *sp;
@@ -283,6 +285,7 @@ __svfscanf_r (rptr, fp, fmt0, ap)
#ifndef MB_CAPABLE
wc = *fmt;
#else
+ memset (&state, '\0', sizeof (state));
nbytes = _mbtowc_r (rptr, &wc, fmt, MB_CUR_MAX, &state);
#endif
fmt += nbytes;
diff --git a/newlib/libc/stdio64/Makefile.in b/newlib/libc/stdio64/Makefile.in
index 78c72c1..d403afa 100644
--- a/newlib/libc/stdio64/Makefile.in
+++ b/newlib/libc/stdio64/Makefile.in
@@ -1,6 +1,6 @@
-# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
-# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
diff --git a/newlib/libc/stdlib/Makefile.am b/newlib/libc/stdlib/Makefile.am
index 13608ea..baf3de9 100644
--- a/newlib/libc/stdlib/Makefile.am
+++ b/newlib/libc/stdlib/Makefile.am
@@ -79,7 +79,15 @@ LIB_SOURCES = \
wcstombs.c \
wcstombs_r.c \
wctomb.c \
- wctomb_r.c
+ wctomb_r.c \
+ btowc.c \
+ mbrlen.c \
+ mbrtowc.c \
+ mbsinit.c \
+ mbsrtowcs.c \
+ wcrtomb.c \
+ wcsrtombs.c \
+ wctob.c
# Because of how libtool moves objects around, mallocr must be built last.
LIBADD_OBJS = freer.$(oext) reallocr.$(oext) callocr.$(oext) cfreer.$(oext) malignr.$(oext) \
diff --git a/newlib/libc/stdlib/Makefile.in b/newlib/libc/stdlib/Makefile.in
index 98b64b8..6f7cd98 100644
--- a/newlib/libc/stdlib/Makefile.in
+++ b/newlib/libc/stdlib/Makefile.in
@@ -185,7 +185,15 @@ LIB_SOURCES = \
wcstombs.c \
wcstombs_r.c \
wctomb.c \
- wctomb_r.c
+ wctomb_r.c \
+ btowc.c \
+ mbrlen.c \
+ mbrtowc.c \
+ mbsinit.c \
+ mbsrtowcs.c \
+ wcrtomb.c \
+ wcsrtombs.c \
+ wctob.c
# Because of how libtool moves objects around, mallocr must be built last.
@@ -294,7 +302,10 @@ LIBS = @LIBS@
@USE_LIBTOOL_FALSE@strtoull_r.$(OBJEXT) system.$(OBJEXT) \
@USE_LIBTOOL_FALSE@valloc.$(OBJEXT) wcstombs.$(OBJEXT) \
@USE_LIBTOOL_FALSE@wcstombs_r.$(OBJEXT) wctomb.$(OBJEXT) \
-@USE_LIBTOOL_FALSE@wctomb_r.$(OBJEXT)
+@USE_LIBTOOL_FALSE@wctomb_r.$(OBJEXT) btowc.$(OBJEXT) mbrlen.$(OBJEXT) \
+@USE_LIBTOOL_FALSE@mbrtowc.$(OBJEXT) mbsinit.$(OBJEXT) \
+@USE_LIBTOOL_FALSE@mbsrtowcs.$(OBJEXT) wcrtomb.$(OBJEXT) \
+@USE_LIBTOOL_FALSE@wcsrtombs.$(OBJEXT) wctob.$(OBJEXT)
LTLIBRARIES = $(noinst_LTLIBRARIES)
@USE_LIBTOOL_TRUE@libstdlib_la_DEPENDENCIES = freer.$(oext) \
@@ -318,7 +329,8 @@ LTLIBRARIES = $(noinst_LTLIBRARIES)
@USE_LIBTOOL_TRUE@strtod.lo strtol.lo strtoll.lo strtoll_r.lo \
@USE_LIBTOOL_TRUE@strtoul.lo strtoull.lo strtoull_r.lo system.lo \
@USE_LIBTOOL_TRUE@valloc.lo wcstombs.lo wcstombs_r.lo wctomb.lo \
-@USE_LIBTOOL_TRUE@wctomb_r.lo
+@USE_LIBTOOL_TRUE@wctomb_r.lo btowc.lo mbrlen.lo mbrtowc.lo mbsinit.lo \
+@USE_LIBTOOL_TRUE@mbsrtowcs.lo wcrtomb.lo wcsrtombs.lo wctob.lo
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
diff --git a/newlib/libc/stdlib/btowc.c b/newlib/libc/stdlib/btowc.c
new file mode 100644
index 0000000..a1ea920
--- /dev/null
+++ b/newlib/libc/stdlib/btowc.c
@@ -0,0 +1,27 @@
+#include <wchar.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <reent.h>
+
+wint_t
+btowc (int c)
+{
+ mbstate_t mbs;
+ int retval = 0;
+ wchar_t pwc;
+ unsigned char b;
+
+ b = (unsigned char)c;
+
+ /* Put mbs in initial state. */
+ memset (&mbs, '\0', sizeof (mbs));
+
+ _REENT_CHECK_MISC(_REENT);
+
+ retval = _mbtowc_r (_REENT, &pwc, &b, 1, &mbs);
+
+ if (c == EOF || retval != 1)
+ return WEOF;
+ else
+ return (wint_t)pwc;
+}
diff --git a/newlib/libc/stdlib/mblen.c b/newlib/libc/stdlib/mblen.c
index c85a6a7..a0ed29a 100644
--- a/newlib/libc/stdlib/mblen.c
+++ b/newlib/libc/stdlib/mblen.c
@@ -44,6 +44,7 @@ effects vary with the locale.
#ifndef _REENT_ONLY
#include <stdlib.h>
+#include <wchar.h>
int
_DEFUN (mblen, (s, n),
@@ -51,9 +52,15 @@ _DEFUN (mblen, (s, n),
size_t n)
{
#ifdef MB_CAPABLE
+ int retval = 0;
_REENT_CHECK_MISC(_REENT);
- return _mbtowc_r (_REENT, NULL, s, n, &(_REENT_MBLEN_STATE(_REENT)));
+ retval = _mbtowc_r (_REENT, NULL, s, n, &(_REENT_MBLEN_STATE(_REENT)));
+ if (retval < 0)
+ return -1;
+ else
+ return retval;
+
#else /* not MB_CAPABLE */
if (s == NULL || *s == '\0')
return 0;
diff --git a/newlib/libc/stdlib/mblen_r.c b/newlib/libc/stdlib/mblen_r.c
index 22d1d40..cff7395 100644
--- a/newlib/libc/stdlib/mblen_r.c
+++ b/newlib/libc/stdlib/mblen_r.c
@@ -44,13 +44,14 @@ effects vary with the locale.
*/
#include <stdlib.h>
+#include <wchar.h>
int
_DEFUN (_mblen_r, (r, s, n, state),
struct _reent *r _AND
const char *s _AND
size_t n _AND
- int *state)
+ mbstate_t *state)
{
#ifdef MB_CAPABLE
diff --git a/newlib/libc/stdlib/mbrlen.c b/newlib/libc/stdlib/mbrlen.c
new file mode 100644
index 0000000..8f0c648
--- /dev/null
+++ b/newlib/libc/stdlib/mbrlen.c
@@ -0,0 +1,13 @@
+#include <wchar.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <reent.h>
+#include <errno.h>
+
+size_t
+mbrlen(const char *s, size_t n, mbstate_t *ps)
+{
+ mbstate_t internal;
+
+ return mbrtowc(NULL, s, n, ps != NULL ? ps : &internal);
+}
diff --git a/newlib/libc/stdlib/mbrtowc.c b/newlib/libc/stdlib/mbrtowc.c
new file mode 100644
index 0000000..7934ca1
--- /dev/null
+++ b/newlib/libc/stdlib/mbrtowc.c
@@ -0,0 +1,29 @@
+#include <wchar.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <reent.h>
+#include <errno.h>
+#include <string.h>
+
+size_t
+mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
+{
+ int retval = 0;
+ _REENT_CHECK_MISC(_REENT);
+
+ if (s == NULL)
+ retval = _mbtowc_r (_REENT, pwc, "", 1, ps);
+ else
+ retval = _mbtowc_r (_REENT, pwc, s, n, ps);
+
+ if (*pwc == NULL)
+ memset (ps, '\0', sizeof (mbstate_t));
+
+ if (retval == -1)
+ {
+ _REENT->_errno = EILSEQ;
+ return (size_t)(-1);
+ }
+ else
+ return (size_t)retval;
+}
diff --git a/newlib/libc/stdlib/mbsinit.c b/newlib/libc/stdlib/mbsinit.c
new file mode 100644
index 0000000..a353cb1
--- /dev/null
+++ b/newlib/libc/stdlib/mbsinit.c
@@ -0,0 +1,14 @@
+#include <wchar.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <reent.h>
+#include <errno.h>
+
+int
+mbsinit(const mbstate_t *ps)
+{
+ if (ps == NULL || ps->__count == 0)
+ return 1;
+ else
+ return 0;
+}
diff --git a/newlib/libc/stdlib/mbsrtowcs.c b/newlib/libc/stdlib/mbsrtowcs.c
new file mode 100644
index 0000000..256ab0d
--- /dev/null
+++ b/newlib/libc/stdlib/mbsrtowcs.c
@@ -0,0 +1,24 @@
+#include <wchar.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <reent.h>
+#include <errno.h>
+
+size_t
+mbsrtowcs(wchar_t *dst, const char **src, size_t len, mbstate_t *ps)
+{
+ int retval = 0;
+ mbstate_t internal;
+
+ _REENT_CHECK_MISC(_REENT);
+
+ retval = _mbstowcs_r (_REENT, dst, *src, len, ps != NULL ? ps : &internal);
+
+ if (retval == -1)
+ {
+ _REENT->_errno = EILSEQ;
+ return (size_t)(-1);
+ }
+ else
+ return (size_t)retval;
+}
diff --git a/newlib/libc/stdlib/mbstowcs.c b/newlib/libc/stdlib/mbstowcs.c
index fee621a..eb0ccd7 100644
--- a/newlib/libc/stdlib/mbstowcs.c
+++ b/newlib/libc/stdlib/mbstowcs.c
@@ -50,6 +50,7 @@ effects vary with the locale.
#ifndef _REENT_ONLY
#include <stdlib.h>
+#include <wchar.h>
size_t
_DEFUN (mbstowcs, (pwcs, s, n),
@@ -58,7 +59,8 @@ _DEFUN (mbstowcs, (pwcs, s, n),
size_t n)
{
#ifdef MB_CAPABLE
- int state = 0;
+ mbstate_t state;
+ state.__count = 0;
return _mbstowcs_r (_REENT, pwcs, s, n, &state);
#else /* not MB_CAPABLE */
diff --git a/newlib/libc/stdlib/mbstowcs_r.c b/newlib/libc/stdlib/mbstowcs_r.c
index 5478849..89cda03 100644
--- a/newlib/libc/stdlib/mbstowcs_r.c
+++ b/newlib/libc/stdlib/mbstowcs_r.c
@@ -1,4 +1,5 @@
#include <stdlib.h>
+#include <wchar.h>
size_t
_DEFUN (_mbstowcs_r, (reent, pwcs, s, n, state),
@@ -6,7 +7,7 @@ _DEFUN (_mbstowcs_r, (reent, pwcs, s, n, state),
wchar_t *pwcs _AND
const char *s _AND
size_t n _AND
- int *state)
+ mbstate_t *state)
{
wchar_t *ptr = pwcs;
size_t max = n;
@@ -16,7 +17,7 @@ _DEFUN (_mbstowcs_r, (reent, pwcs, s, n, state),
while (n > 0)
{
bytes = _mbtowc_r (r, ptr, t, MB_CUR_MAX, state);
- if (bytes == -1)
+ if (bytes < 0)
return -1;
else if (bytes == 0)
return ptr - pwcs;
diff --git a/newlib/libc/stdlib/mbtowc.c b/newlib/libc/stdlib/mbtowc.c
index 0d16f0d..6da735a 100644
--- a/newlib/libc/stdlib/mbtowc.c
+++ b/newlib/libc/stdlib/mbtowc.c
@@ -60,9 +60,15 @@ _DEFUN (mbtowc, (pwc, s, n),
size_t n)
{
#ifdef MB_CAPABLE
+ int retval = 0;
_REENT_CHECK_MISC(_REENT);
- return _mbtowc_r (_REENT, pwc, s, n, &(_REENT_MBTOWC_STATE(_REENT)));
+ retval = _mbtowc_r (_REENT, pwc, s, n, &(_REENT_MBTOWC_STATE(_REENT)));
+
+ if (retval < 0)
+ return -1;
+ else
+ return retval;
#else /* not MB_CAPABLE */
if (s == NULL)
return 0;
diff --git a/newlib/libc/stdlib/mbtowc_r.c b/newlib/libc/stdlib/mbtowc_r.c
index 866789f..b7909d3 100644
--- a/newlib/libc/stdlib/mbtowc_r.c
+++ b/newlib/libc/stdlib/mbtowc_r.c
@@ -1,6 +1,8 @@
#include <stdlib.h>
#include <locale.h>
#include "mbctype.h"
+#include <wchar.h>
+#include <string.h>
#ifdef MB_CAPABLE
typedef enum { ESCAPE, DOLLAR, BRACKET, AT, B, J,
@@ -51,7 +53,7 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
wchar_t *pwc _AND
const char *s _AND
size_t n _AND
- int *state)
+ mbstate_t *state)
{
wchar_t dummy;
unsigned char *t = (unsigned char *)s;
@@ -60,13 +62,13 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
pwc = &dummy;
if (s != NULL && n == 0)
- return -1;
+ return -2;
#ifdef MB_CAPABLE
if (r->_current_locale == NULL ||
(strlen (r->_current_locale) <= 1))
{ /* fall-through */ }
- else if (!strcmp (r->_current_locale, "UTF-8"))
+ else if (!strcmp (r->_current_locale, "C-UTF-8"))
{
wchar_t char1 = 0;
@@ -139,7 +141,7 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
return 3;
}
else
- return -1;
+ return -2;
}
else if (char1 >= 0xf0 && char1 <= 0xf7)
{
@@ -172,7 +174,7 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
return 4;
}
else
- return -1;
+ return -2;
}
else if (char1 >= 0xf8 && char1 <= 0xfb)
{
@@ -208,7 +210,7 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
return 5;
}
else
- return -1;
+ return -2;
}
else if (char1 >= 0xfc && char1 <= 0xfd)
{
@@ -248,7 +250,7 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
return 6;
}
else
- return -1;
+ return -2;
}
else
return -1;
@@ -263,7 +265,7 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
{
int char2 = t[1];
if (n <= 1)
- return -1;
+ return -2;
if (_issjis2 (char2))
{
*pwc = (((wchar_t)*t) << 8) + (wchar_t)(*(t+1));
@@ -283,7 +285,7 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
{
int char2 = t[1];
if (n <= 1)
- return -1;
+ return -2;
if (_iseucjp (char2))
{
*pwc = (((wchar_t)*t) << 8) + (wchar_t)(*(t+1));
@@ -303,11 +305,11 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
if (s == NULL)
{
- *state = 0;
+ state->__count = 0;
return 1; /* state-dependent */
}
- curr_state = (*state == 0 ? ASCII : JIS);
+ curr_state = (state->__count == 0 ? ASCII : JIS);
ptr = t;
for (i = 0; i < n; ++i)
@@ -351,19 +353,19 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
case NOOP:
break;
case EMPTY:
- *state = 0;
+ state->__count = 0;
*pwc = (wchar_t)0;
return i;
case COPY_A:
- *state = 0;
+ state->__count = 0;
*pwc = (wchar_t)*ptr;
return (i + 1);
case COPY_J:
- *state = 0;
+ state->__count = 0;
*pwc = (((wchar_t)*ptr) << 8) + (wchar_t)(*(ptr+1));
return (i + 1);
case COPY_J2:
- *state = 1;
+ state->__count = 1;
*pwc = (((wchar_t)*ptr) << 8) + (wchar_t)(*(ptr+1));
return (ptr - t) + 2;
case MAKE_A:
@@ -377,7 +379,7 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
}
- return -1; /* n < bytes needed */
+ return -2; /* n < bytes needed */
}
#endif /* MB_CAPABLE */
@@ -392,4 +394,3 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
return 1;
}
-
diff --git a/newlib/libc/stdlib/wcrtomb.c b/newlib/libc/stdlib/wcrtomb.c
new file mode 100644
index 0000000..f68533c
--- /dev/null
+++ b/newlib/libc/stdlib/wcrtomb.c
@@ -0,0 +1,25 @@
+#include <wchar.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <reent.h>
+#include <errno.h>
+
+size_t
+wcrtomb(char *s, wchar_t wc, mbstate_t *ps)
+{
+ int retval = 0;
+ _REENT_CHECK_MISC(_REENT);
+
+ if (s == NULL)
+ retval = _wctomb_r (_REENT, "", wc, ps);
+ else
+ retval = _wctomb_r (_REENT, s, wc, ps);
+
+ if (retval == -1)
+ {
+ _REENT->_errno = EILSEQ;
+ return (size_t)(-1);
+ }
+ else
+ return (size_t)retval;
+}
diff --git a/newlib/libc/stdlib/wcsrtombs.c b/newlib/libc/stdlib/wcsrtombs.c
new file mode 100644
index 0000000..22512c0
--- /dev/null
+++ b/newlib/libc/stdlib/wcsrtombs.c
@@ -0,0 +1,22 @@
+#include <wchar.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <reent.h>
+#include <errno.h>
+
+size_t
+wcsrtombs (char *dst, const wchar_t **src, size_t len, mbstate_t *ps)
+{
+ int retval = 0;
+ _REENT_CHECK_MISC(_REENT);
+
+ retval = _wcstombs_r (_REENT, dst, *src, len, ps);
+
+ if (retval == -1)
+ {
+ _REENT->_errno = EILSEQ;
+ return (size_t)(-1);
+ }
+ else
+ return (size_t)retval;
+}
diff --git a/newlib/libc/stdlib/wcstombs.c b/newlib/libc/stdlib/wcstombs.c
index ca99f2e..c984746 100644
--- a/newlib/libc/stdlib/wcstombs.c
+++ b/newlib/libc/stdlib/wcstombs.c
@@ -51,6 +51,7 @@ effects vary with the locale.
#ifndef _REENT_ONLY
#include <stdlib.h>
+#include <wchar.h>
size_t
_DEFUN (wcstombs, (s, pwcs, n),
@@ -59,7 +60,8 @@ _DEFUN (wcstombs, (s, pwcs, n),
size_t n)
{
#ifdef MB_CAPABLE
- int state = 0;
+ mbstate_t state;
+ state.__count = 0;
return _wcstombs_r (_REENT, s, pwcs, n, &state);
#else /* not MB_CAPABLE */
diff --git a/newlib/libc/stdlib/wcstombs_r.c b/newlib/libc/stdlib/wcstombs_r.c
index 69c82d4..70f680a 100644
--- a/newlib/libc/stdlib/wcstombs_r.c
+++ b/newlib/libc/stdlib/wcstombs_r.c
@@ -1,4 +1,5 @@
#include <stdlib.h>
+#include <wchar.h>
size_t
_DEFUN (_wcstombs_r, (reent, s, pwcs, n, state),
@@ -6,7 +7,7 @@ _DEFUN (_wcstombs_r, (reent, s, pwcs, n, state),
char *s _AND
const wchar_t *pwcs _AND
size_t n _AND
- int *state)
+ mbstate_t *state)
{
char *ptr = s;
size_t max = n;
diff --git a/newlib/libc/stdlib/wctob.c b/newlib/libc/stdlib/wctob.c
new file mode 100644
index 0000000..4288c54
--- /dev/null
+++ b/newlib/libc/stdlib/wctob.c
@@ -0,0 +1,25 @@
+#include <wchar.h>
+#include <wchar.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <reent.h>
+
+int
+wctob (wint_t c)
+{
+ mbstate_t mbs;
+ int retval = 0;
+ unsigned char pwc;
+
+ /* Put mbs in initial state. */
+ memset (&mbs, '\0', sizeof (mbs));
+
+ _REENT_CHECK_MISC(_REENT);
+
+ retval = _wctomb_r (_REENT, &pwc, c, &mbs);
+
+ if (c == EOF || retval != 1)
+ return WEOF;
+ else
+ return (int)pwc;
+}
diff --git a/newlib/libc/stdlib/wctomb_r.c b/newlib/libc/stdlib/wctomb_r.c
index 991e0a6..7cd84b6 100644
--- a/newlib/libc/stdlib/wctomb_r.c
+++ b/newlib/libc/stdlib/wctomb_r.c
@@ -1,5 +1,6 @@
#include <stdlib.h>
#include <string.h>
+#include <wchar.h>
#include <locale.h>
#include "mbctype.h"
@@ -8,11 +9,11 @@ _DEFUN (_wctomb_r, (r, s, wchar, state),
struct _reent *r _AND
char *s _AND
wchar_t wchar _AND
- int *state)
+ mbstate_t *state)
{
if (strlen (r->_current_locale) <= 1)
{ /* fall-through */ }
- else if (!strcmp (r->_current_locale, "UTF-8"))
+ else if (!strcmp (r->_current_locale, "C-UTF-8"))
{
if (s == NULL)
return 0; /* UTF-8 encoding is not state-dependent */
@@ -125,10 +126,10 @@ _DEFUN (_wctomb_r, (r, s, wchar, state),
/* first byte is non-zero..validate multi-byte char */
if (_isjis (char1) && _isjis (char2))
{
- if (*state == 0)
+ if (state->__count == 0)
{
/* must switch from ASCII to JIS state */
- *state = 1;
+ state->__count = 1;
*s++ = ESC_CHAR;
*s++ = '$';
*s++ = 'B';
@@ -143,10 +144,10 @@ _DEFUN (_wctomb_r, (r, s, wchar, state),
}
else
{
- if (*state != 0)
+ if (state->__count != 0)
{
/* must switch from JIS to ASCII state */
- *state = 0;
+ state->__count = 0;
*s++ = ESC_CHAR;
*s++ = '(';
*s++ = 'B';
diff --git a/newlib/libc/sys/linux/Makefile.am b/newlib/libc/sys/linux/Makefile.am
index 7e967f0..55845d4 100644
--- a/newlib/libc/sys/linux/Makefile.am
+++ b/newlib/libc/sys/linux/Makefile.am
@@ -2,7 +2,7 @@
AUTOMAKE_OPTIONS = cygnus
-INCLUDES = -I$(srcdir)/include $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
+INCLUDES = -I$(srcdir)/include $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) $(INCLTDL)
SUBDIRS = machine \
cmath \
@@ -76,6 +76,8 @@ LIB_SOURCES = \
pread.c \
pread64.c \
process.c \
+ prof-freq.c \
+ profile.c \
psignal.c \
pvallocr.c \
pwrite.c \
@@ -165,8 +167,19 @@ lib.a: $(ADD_OBJS) $(lib_a_OBJECTS)
endif # USE_LIBTOOL
-
-include $(srcdir)/../../../Makefile.shared
+objectlist.awk.in: $(noinst_LTLIBRARIES) $(SUBLIBS)
+ -rm -f objectlist.awk.in
+ for i in `ls *.lo` ; \
+ do \
+ echo $$i `pwd`/$$i >> objectlist.awk.in ; \
+ done
+ for j in $(SUBLIBS) ; \
+ do \
+ export i=`echo $$j | sed -e 's,\(.*\)\/[^\/]*$$,\1,'`; \
+ if test $$i != "." && test -f $$i/objectlist.awk.in; then \
+ cat $$i/objectlist.awk.in >> objectlist.awk.in ; \
+ fi; \
+ done
all: crt0.o crt1.o
diff --git a/newlib/libc/sys/linux/Makefile.in b/newlib/libc/sys/linux/Makefile.in
index 701cf27..33eb704 100644
--- a/newlib/libc/sys/linux/Makefile.in
+++ b/newlib/libc/sys/linux/Makefile.in
@@ -11,7 +11,6 @@
# PARTICULAR PURPOSE.
-
SHELL = @SHELL@
srcdir = @srcdir@
@@ -97,7 +96,7 @@ sys_dir = @sys_dir@
AUTOMAKE_OPTIONS = cygnus
-INCLUDES = -I$(srcdir)/include $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
+INCLUDES = -I$(srcdir)/include $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) $(INCLTDL)
SUBDIRS = machine \
cmath \
@@ -173,6 +172,8 @@ LIB_SOURCES = \
pread.c \
pread64.c \
process.c \
+ prof-freq.c \
+ profile.c \
psignal.c \
pvallocr.c \
pwrite.c \
@@ -287,6 +288,7 @@ LIBS = @LIBS@
@USE_LIBTOOL_FALSE@mstats.$(OBJEXT) mtrim.$(OBJEXT) mtrimr.$(OBJEXT) \
@USE_LIBTOOL_FALSE@ntp_gettime.$(OBJEXT) pathconf.$(OBJEXT) \
@USE_LIBTOOL_FALSE@pread.$(OBJEXT) pread64.$(OBJEXT) process.$(OBJEXT) \
+@USE_LIBTOOL_FALSE@prof-freq.$(OBJEXT) profile.$(OBJEXT) \
@USE_LIBTOOL_FALSE@psignal.$(OBJEXT) pvallocr.$(OBJEXT) \
@USE_LIBTOOL_FALSE@pwrite.$(OBJEXT) pwrite64.$(OBJEXT) raise.$(OBJEXT) \
@USE_LIBTOOL_FALSE@readdir64.$(OBJEXT) realloc.$(OBJEXT) \
@@ -325,10 +327,10 @@ LTLIBRARIES = $(noinst_LTLIBRARIES)
@USE_LIBTOOL_TRUE@mq_open.lo mq_receive.lo mq_send.lo mq_setattr.lo \
@USE_LIBTOOL_TRUE@mq_unlink.lo msize.lo msizer.lo mstats.lo mtrim.lo \
@USE_LIBTOOL_TRUE@mtrimr.lo ntp_gettime.lo pathconf.lo pread.lo \
-@USE_LIBTOOL_TRUE@pread64.lo process.lo psignal.lo pvallocr.lo \
-@USE_LIBTOOL_TRUE@pwrite.lo pwrite64.lo raise.lo readdir64.lo \
-@USE_LIBTOOL_TRUE@realloc.lo reallocr.lo realpath.lo rename.lo \
-@USE_LIBTOOL_TRUE@resource.lo scandir64.lo sched.lo select.lo \
+@USE_LIBTOOL_TRUE@pread64.lo process.lo prof-freq.lo profile.lo \
+@USE_LIBTOOL_TRUE@psignal.lo pvallocr.lo pwrite.lo pwrite64.lo raise.lo \
+@USE_LIBTOOL_TRUE@readdir64.lo realloc.lo reallocr.lo realpath.lo \
+@USE_LIBTOOL_TRUE@rename.lo resource.lo scandir64.lo sched.lo select.lo \
@USE_LIBTOOL_TRUE@seteuid.lo sethostname.lo setrlimit64.lo shm_open.lo \
@USE_LIBTOOL_TRUE@shm_unlink.lo sig.lo sigaction.lo sigqueue.lo \
@USE_LIBTOOL_TRUE@signal.lo siglongjmp.lo sigset.lo sigwait.lo \
@@ -357,7 +359,7 @@ OBJECTS = $(lib_a_OBJECTS) $(liblinux_la_OBJECTS)
all: all-redirect
.SUFFIXES:
.SUFFIXES: .S .c .lo .o .obj .s
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) $(srcdir)/../../../Makefile.shared
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@@ -688,11 +690,18 @@ maintainer-clean
@USE_LIBTOOL_FALSE@ $(RANLIB) $@
@USE_LIBTOOL_FALSE@ rm -rf tmp
-objectlist.awk.in: $(noinst_LTLIBRARIES)
+objectlist.awk.in: $(noinst_LTLIBRARIES) $(SUBLIBS)
-rm -f objectlist.awk.in
for i in `ls *.lo` ; \
- do \
- echo $$i `pwd`/$$i >> objectlist.awk.in ; \
+ do \
+ echo $$i `pwd`/$$i >> objectlist.awk.in ; \
+ done
+ for j in $(SUBLIBS) ; \
+ do \
+ export i=`echo $$j | sed -e 's,\(.*\)\/[^\/]*$$,\1,'`; \
+ if test $$i != "." && test -f $$i/objectlist.awk.in; then \
+ cat $$i/objectlist.awk.in >> objectlist.awk.in ; \
+ fi; \
done
all: crt0.o crt1.o
diff --git a/newlib/libc/sys/linux/cmath/math_private.h b/newlib/libc/sys/linux/cmath/math_private.h
index 48258ec..6c4a472 100644
--- a/newlib/libc/sys/linux/cmath/math_private.h
+++ b/newlib/libc/sys/linux/cmath/math_private.h
@@ -200,6 +200,8 @@ extern int32_t __ieee754_rem_pio2 (double,double*);
extern double __ieee754_scalb (double,double);
#endif
+/* This is necessary because the hardware accelerated version of libm
+ does not provide the __ieee754 functions. */
#define __ieee754_sinh sinh
#define __ieee754_hypot hypot
#define __ieee754_hypotf hypotf
diff --git a/newlib/libc/sys/linux/fpathconf.c b/newlib/libc/sys/linux/fpathconf.c
index dc7aaec..6d006a1 100644
--- a/newlib/libc/sys/linux/fpathconf.c
+++ b/newlib/libc/sys/linux/fpathconf.c
@@ -215,7 +215,7 @@ posix_fpathconf (fd, name)
/* AIO is only allowed on regular files and block devices. */
struct stat64 st;
- if (__fxstat64 (_STAT_VER, fd, &st) < 0
+ if (fstat64 (fd, &st) < 0
|| (! S_ISREG (st.st_mode) && ! S_ISBLK (st.st_mode)))
return -1;
else
diff --git a/newlib/libc/sys/linux/machine/i386/Makefile.am b/newlib/libc/sys/linux/machine/i386/Makefile.am
index c72644d..4a49d8f 100644
--- a/newlib/libc/sys/linux/machine/i386/Makefile.am
+++ b/newlib/libc/sys/linux/machine/i386/Makefile.am
@@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = cygnus
INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
-LIB_SOURCES = get_clockfreq.c getpagesize.c hp-timing.c setjmp.S sigaction.c
+LIB_SOURCES = get_clockfreq.c getpagesize.c hp-timing.c setjmp.S sigaction.c dl-procinfo.c
liblinuxi386_la_LDFLAGS = -Xcompiler -nostdlib
diff --git a/newlib/libc/sys/linux/machine/i386/Makefile.in b/newlib/libc/sys/linux/machine/i386/Makefile.in
index a898350..980544f 100644
--- a/newlib/libc/sys/linux/machine/i386/Makefile.in
+++ b/newlib/libc/sys/linux/machine/i386/Makefile.in
@@ -98,7 +98,7 @@ AUTOMAKE_OPTIONS = cygnus
INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
-LIB_SOURCES = get_clockfreq.c getpagesize.c hp-timing.c setjmp.S sigaction.c
+LIB_SOURCES = get_clockfreq.c getpagesize.c hp-timing.c setjmp.S sigaction.c dl-procinfo.c
liblinuxi386_la_LDFLAGS = -Xcompiler -nostdlib
@@ -124,12 +124,14 @@ LIBS = @LIBS@
lib_a_LIBADD =
@USE_LIBTOOL_FALSE@lib_a_OBJECTS = get_clockfreq.$(OBJEXT) \
@USE_LIBTOOL_FALSE@getpagesize.$(OBJEXT) hp-timing.$(OBJEXT) \
-@USE_LIBTOOL_FALSE@setjmp.$(OBJEXT) sigaction.$(OBJEXT)
+@USE_LIBTOOL_FALSE@setjmp.$(OBJEXT) sigaction.$(OBJEXT) \
+@USE_LIBTOOL_FALSE@dl-procinfo.$(OBJEXT)
LTLIBRARIES = $(noinst_LTLIBRARIES)
liblinuxi386_la_LIBADD =
@USE_LIBTOOL_TRUE@liblinuxi386_la_OBJECTS = get_clockfreq.lo \
-@USE_LIBTOOL_TRUE@getpagesize.lo hp-timing.lo setjmp.lo sigaction.lo
+@USE_LIBTOOL_TRUE@getpagesize.lo hp-timing.lo setjmp.lo sigaction.lo \
+@USE_LIBTOOL_TRUE@dl-procinfo.lo
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
diff --git a/newlib/libc/sys/linux/machine/i386/dl-procinfo.c b/newlib/libc/sys/linux/machine/i386/dl-procinfo.c
new file mode 100644
index 0000000..75732b4
--- /dev/null
+++ b/newlib/libc/sys/linux/machine/i386/dl-procinfo.c
@@ -0,0 +1,38 @@
+/* Data for Linux/i386 version of processor capability information.
+ Copyright (C) 2001 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 2001.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* This information must be kept in sync with the _DL_HWCAP_COUNT and
+ _DL_PLATFORM_COUNT definitions in procinfo.h. */
+
+
+/* If anything should be added here check whether the size of each string
+ is still ok with the given array size. */
+const char _dl_x86_cap_flags[][7] =
+ {
+ "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",
+ "cx8", "apic", "10", "sep", "mtrr", "pge", "mca", "cmov",
+ "pat", "pse36", "psn", "19", "20", "21", "22", "mmx",
+ "osfxsr", "xmm", "xmm2", "27", "28", "29", "30", "amd3d"
+ };
+
+const char _dl_x86_platforms[][5] =
+ {
+ "i386", "i486", "i586", "i686"
+ };
diff --git a/newlib/libc/sys/linux/machine/i386/dl-procinfo.h b/newlib/libc/sys/linux/machine/i386/dl-procinfo.h
new file mode 100644
index 0000000..d1658fa
--- /dev/null
+++ b/newlib/libc/sys/linux/machine/i386/dl-procinfo.h
@@ -0,0 +1,132 @@
+/* Linux/i386 version of processor capability information handling macros.
+ Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _DL_PROCINFO_H
+#define _DL_PROCINFO_H 1
+
+#include <ldsodefs.h>
+
+/* If anything should be added here check whether the size of each string
+ is still ok with the given array size. */
+extern const char _dl_x86_cap_flags[][7];
+#define _DL_HWCAP_COUNT 32
+
+extern const char _dl_x86_platforms[][5];
+#define _DL_PLATFORMS_COUNT 4
+
+/* Start at 48 to reserve some space. */
+#define _DL_FIRST_PLATFORM 48
+/* Mask to filter out platforms. */
+#define _DL_HWCAP_PLATFORM (7ULL << _DL_FIRST_PLATFORM)
+
+
+static inline int
+__attribute__ ((unused))
+_dl_procinfo (int word)
+{
+ /* This table should match the information from arch/i386/kernel/setup.c
+ in the kernel sources. */
+ int i;
+
+ _dl_printf ("AT_HWCAP: ");
+
+ for (i = 0; i < _DL_HWCAP_COUNT; ++i)
+ if (word & (1 << i))
+ _dl_printf (" %s", _dl_x86_cap_flags[i]);
+
+ _dl_printf ("\n");
+
+ return 0;
+}
+
+static inline const char *
+__attribute__ ((unused))
+_dl_hwcap_string (int idx)
+{
+ return _dl_x86_cap_flags[idx];
+};
+
+static inline const char *
+__attribute__ ((unused))
+_dl_platform_string (int idx)
+{
+ return _dl_x86_platforms [idx - _DL_FIRST_PLATFORM];
+};
+
+enum
+{
+ HWCAP_I386_FPU = 1 << 0,
+ HWCAP_I386_VME = 1 << 1,
+ HWCAP_I386_DE = 1 << 2,
+ HWCAP_I386_PSE = 1 << 3,
+ HWCAP_I386_TSC = 1 << 4,
+ HWCAP_I386_MSR = 1 << 5,
+ HWCAP_I386_PAE = 1 << 6,
+ HWCAP_I386_MCE = 1 << 7,
+ HWCAP_I386_CX8 = 1 << 8,
+ HWCAP_I386_APIC = 1 << 9,
+ HWCAP_I386_SEP = 1 << 11,
+ HWCAP_I386_MTRR = 1 << 12,
+ HWCAP_I386_PGE = 1 << 13,
+ HWCAP_I386_MCA = 1 << 14,
+ HWCAP_I386_CMOV = 1 << 15,
+ HWCAP_I386_FCMOV = 1 << 16,
+ HWCAP_I386_MMX = 1 << 23,
+ HWCAP_I386_OSFXSR = 1 << 24,
+ HWCAP_I386_XMM = 1 << 25,
+ HWCAP_I386_XMM2 = 1 << 26,
+ HWCAP_I386_AMD3D = 1 << 31,
+
+ /* XXX Which others to add here? */
+ HWCAP_IMPORTANT = (HWCAP_I386_MMX)
+
+};
+
+static inline int
+__attribute__ ((unused))
+_dl_string_hwcap (const char *str)
+{
+ int i;
+
+ for (i = 0; i < _DL_HWCAP_COUNT; i++)
+ {
+ if (strcmp (str, _dl_x86_cap_flags[i]) == 0)
+ return i;
+ }
+ return -1;
+};
+
+
+static inline int
+__attribute__ ((unused))
+_dl_string_platform (const char *str)
+{
+ int i;
+
+ if (str != NULL)
+ for (i = 0; i < _DL_PLATFORMS_COUNT; ++i)
+ {
+ if (strcmp (str, _dl_x86_platforms[i]) == 0)
+ return _DL_FIRST_PLATFORM + i;
+ }
+ return -1;
+};
+
+#endif /* dl-procinfo.h */
diff --git a/newlib/libc/sys/linux/pathconf.c b/newlib/libc/sys/linux/pathconf.c
index bbdb618..7969459 100644
--- a/newlib/libc/sys/linux/pathconf.c
+++ b/newlib/libc/sys/linux/pathconf.c
@@ -212,7 +212,7 @@ posix_pathconf (const char *path, int name)
/* AIO is only allowed on regular files and block devices. */
struct stat64 st;
- if (__xstat64 (_STAT_VER, path, &st) < 0
+ if (stat64 (path, &st) < 0
|| (! S_ISREG (st.st_mode) && ! S_ISBLK (st.st_mode)))
return -1;
else
diff --git a/newlib/libc/sys/linux/prof-freq.c b/newlib/libc/sys/linux/prof-freq.c
new file mode 100644
index 0000000..829979b
--- /dev/null
+++ b/newlib/libc/sys/linux/prof-freq.c
@@ -0,0 +1,54 @@
+/* Return frequency of ticks reported by profil. Generic version. */
+/*-
+ * Copyright (c) 1983, 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * 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.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
+ */
+
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <libc-internal.h>
+
+int
+__profile_frequency (void)
+{
+ /*
+ * Discover the tick frequency of the machine if something goes wrong,
+ * we return 0, an impossible hertz.
+ */
+ struct itimerval tim;
+
+ tim.it_interval.tv_sec = 0;
+ tim.it_interval.tv_usec = 1;
+ tim.it_value.tv_sec = 0;
+ tim.it_value.tv_usec = 0;
+ setitimer(ITIMER_REAL, &tim, 0);
+ setitimer(ITIMER_REAL, 0, &tim);
+ if (tim.it_interval.tv_usec < 2)
+ return 0;
+ return (1000000 / tim.it_interval.tv_usec);
+}
diff --git a/newlib/libc/sys/linux/profile.c b/newlib/libc/sys/linux/profile.c
new file mode 100644
index 0000000..f36e2c7
--- /dev/null
+++ b/newlib/libc/sys/linux/profile.c
@@ -0,0 +1,12 @@
+/* libc/sys/linux/profile.c - profiling system call */
+
+#include <errno.h>
+#include <sys/types.h>
+#include <machine/syscall.h>
+
+#define __NR_profil 98
+
+int profil(u_short *buf, size_t bufsiz, size_t offset,
+ u_int scale);
+
+_syscall4(int,profil,unsigned short *,buf,size_t,bufsiz,size_t,offset,unsigned int, scale)
diff --git a/newlib/libc/sys/linux/sys/errno.h b/newlib/libc/sys/linux/sys/errno.h
index aaf9d36..82c84c9 100644
--- a/newlib/libc/sys/linux/sys/errno.h
+++ b/newlib/libc/sys/linux/sys/errno.h
@@ -29,5 +29,6 @@ extern __IMPORT int _sys_nerr;
#define ENOTSUP EOPNOTSUPP
#define EFTYPE 79 /* Inappropriate file type or format */
+#define EILSEQ 84
#endif
diff --git a/newlib/libc/sys/linux/sys/types.h b/newlib/libc/sys/linux/sys/types.h
index 4287a81..5541f09 100644
--- a/newlib/libc/sys/linux/sys/types.h
+++ b/newlib/libc/sys/linux/sys/types.h
@@ -149,6 +149,7 @@ typedef __ino64_t ino64_t;
typedef __uint32_t uintptr_t;
typedef __int32_t intptr_t;
typedef __off64_t off64_t;
+typedef __off_t off_t;
#if !defined(_ANSI_SOURCE) && !defined(_POSIX_SOURCE)
typedef struct _physadr {