From 14f22ed439f917929febff22d58e2992a091dd01 Mon Sep 17 00:00:00 2001 From: joseph Date: Wed, 4 Jan 2012 16:32:13 +0000 Subject: Merge changes between r16494 and r16524 from /fsf/trunk. git-svn-id: svn://svn.eglibc.org/trunk@16525 7b3dc134-2b1b-0410-93df-9e9f96275f8d --- libc/ChangeLog | 63 +++++++++++ libc/NEWS | 21 ++++ libc/Versions.def | 1 + libc/assert/assert.h | 9 +- libc/debug/tst-chk1.c | 6 + libc/iconv/gconv_builtin.h | 23 +++- libc/iconv/gconv_int.h | 4 +- libc/iconv/gconv_simple.c | 75 ++++++++++++- libc/iconv/loop.c | 5 +- libc/include/features.h | 30 ++++- libc/libio/stdio.h | 8 +- libc/malloc/Versions | 3 + libc/malloc/malloc.c | 2 + libc/posix/regcomp.c | 36 +++++- libc/stdio-common/tst-gets.c | 7 +- libc/stdlib/stdlib.h | 14 ++- libc/sysdeps/unix/sysv/linux/timespec_get.c | 57 ++++++++++ libc/sysdeps/unix/sysv/linux/x86_64/timespec_get.c | 10 ++ libc/time/Makefile | 5 +- libc/time/Versions | 3 + libc/time/time.h | 43 +++++--- libc/time/timespec_get.c | 40 +++++++ libc/version.h | 4 +- libc/wcsmbs/Makefile | 5 +- libc/wcsmbs/Versions | 3 + libc/wcsmbs/c16rtomb.c | 121 ++++++++++++++++++++ libc/wcsmbs/mbrtoc16.c | 122 +++++++++++++++++++++ libc/wcsmbs/mbrtowc.c | 7 +- libc/wcsmbs/uchar.h | 84 ++++++++++++++ libc/wcsmbs/wchar.h | 10 +- libc/wcsmbs/wcrtomb.c | 7 +- libc/wcsmbs/wcsmbsload.c | 90 +++++++++++++-- libc/wcsmbs/wcsmbsload.h | 7 +- ports/ChangeLog.mips | 5 + ports/sysdeps/mips/Makefile | 8 ++ 35 files changed, 880 insertions(+), 58 deletions(-) create mode 100644 libc/sysdeps/unix/sysv/linux/timespec_get.c create mode 100644 libc/sysdeps/unix/sysv/linux/x86_64/timespec_get.c create mode 100644 libc/time/timespec_get.c create mode 100644 libc/wcsmbs/c16rtomb.c create mode 100644 libc/wcsmbs/mbrtoc16.c create mode 100644 libc/wcsmbs/uchar.h diff --git a/libc/ChangeLog b/libc/ChangeLog index 737c4ba19..f31cc94f7 100644 --- a/libc/ChangeLog +++ b/libc/ChangeLog @@ -1,3 +1,10 @@ +2012-01-03 Ulrich Drepper + + * iconv/loop.c (single loop): Fix assertion in storing of + remaining bytes. + + * posix/regcomp.c (init_word_char): Optimize a bit for sane encodings. + 2012-01-01 Ulrich Drepper * posix/getconf.c: Update copyright year. @@ -26,8 +33,64 @@ * posix/regex_internal.c (re_string_fetch_byte_case): Remove pure attribute. +2011-12-24 Ulrich Drepper + + * iconv/gconv_simple.c: Add ASCII<->UTF-16 transformations. + * iconv/gconv_builtin.h: Add entries for internal ASCII<->UTF-16 + transformations. + * iconv/gconv_int.h: Likewise. + * wcsmbs/Makefile (routines): Add mbrtoc16 and c16rtomb. + * wcsmbs/Versions: Export mbrtoc16, c16rtomb, mbrtoc32, c32rtomb + from libc for GLIBC_2.16. + * wcsmbs/mbrtowc.c: Define mbrtoc32 alias. + * wcsmbs/wcrtomb.c: Define c32rtomb alias. + * wcsmbs/uchar.h: Really define mbstate_t. + * wcsmbs/wchar.h: Allow defining mbstate_t in uchar.h. + * wcsmbs/c16rtomb.c: New file. + * wcsmbs/mbrtoc16.c: New file. + * wcsmbs/wcsmbsload.c: Add static definitions for c16 conversions + for C/POSIX locale. + (__wcsmbs_load_conv): Do not fill in c16 routines yet. + * wcsmbs/wcsmbsload.h (gconv_fcts): Add entries for c16 routines. + + * wcsmbs/wchar.h: Add missing __restrict. + 2011-12-23 Ulrich Drepper + [BZ #13532] + * time/Makefile (routines): Add timespec_get. + * time/Versions: Export timespec_get from libc for GLIBC_2.16. + * time/time.h: Define TIME_UTC and declare timespec_get. Define + timespec for ISO C11. + * time/timespec_get.c: New file. + * sysdeps/unix/sysv/linux/timespec_get.c: New file. + * sysdeps/unix/sysv/linux/x86_64/timespec_get.c: New file. + + [BZ #13531] + * malloc/malloc.c: Define alias aligned_alloc for public_mEMALIGn. + * stdlib/stdlib.h: Declare aligned_alloc. + * Versions.def: Add GLIBC_2.16 for libc. + * malloc/Versions: Export aligned_alloc from libc for GLIBC_2.16. + + [BZ 13527] + * stdlib/stdlib.h: Make at_quick_exit and quick_exit available for + ISO C11. + + * include/features.h: Define __USE_ISOCXX11 when compiling ISO C++11 + code. + + [BZ #13528] + * libio/stdio.h: Do not declare gets for ISO C11 and _GNU_SOURCE. + + [BZ #13529] + * assert/assert.h (static_assert): Define. + + * version.h: Update for 2.16 development version. + + [BZ #13526] + * include/features.h: Handle __STDC_VERSION__ >= 201112 and + _ISOC11_SOURCE. + * version.h (RELEASE): Bump for 2.15 release. * include/features.h (__GLIBC_MINOR__): Bump to 15. diff --git a/libc/NEWS b/libc/NEWS index 55dba1bb7..2d7a9df3d 100644 --- a/libc/NEWS +++ b/libc/NEWS @@ -5,6 +5,27 @@ See the end for copying conditions. Please send GNU C library bug reports via using `glibc' in the "product" field. +Version 2.16 + +* The following bugs are resolved with this release: + + 13526, 13527, 13528, 13529, 13531, 13532 + +* ISO C11 support: + + + define static_assert + + + do not declare gets + + + declare at_quick_exit and quick_exit also for ISO C11 + + + aligned_alloc. NB: The code is deliberately allows the size parameter + to not be a multiple of the alignment. This is a moronic requirement + in the standard but it is only a requirement on the caller, not the + implementation. + + + timespec_get added + Version 2.15 * The following bugs are resolved with this release: diff --git a/libc/Versions.def b/libc/Versions.def index 6b05e5ba5..2b44f5e0b 100644 --- a/libc/Versions.def +++ b/libc/Versions.def @@ -32,6 +32,7 @@ libc { GLIBC_2.13 GLIBC_2.14 GLIBC_2.15 + GLIBC_2.16 HURD_CTHREADS_0.3 %ifdef EXPORT_UNWIND_FIND_FDE GCC_3.0 diff --git a/libc/assert/assert.h b/libc/assert/assert.h index 841f43597..4022e28b5 100644 --- a/libc/assert/assert.h +++ b/libc/assert/assert.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,1992,1994-2001,2003,2004,2007 +/* Copyright (C) 1991,1992,1994-2001,2003,2004,2007,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -113,3 +113,10 @@ __END_DECLS # endif #endif /* NDEBUG. */ + + +#ifdef __USE_ISOC11 +/* Static assertion. Requires support in the compiler. */ +# undef static_assert +# define static_assert _Static_assert +#endif diff --git a/libc/debug/tst-chk1.c b/libc/debug/tst-chk1.c index aa265280d..03f2ea13d 100644 --- a/libc/debug/tst-chk1.c +++ b/libc/debug/tst-chk1.c @@ -34,6 +34,12 @@ #include #include +__BEGIN_DECLS +/* The header does not include the declaration for gets + anymore when compiling with _GNU_SOURCE. Provide a copy here. */ +extern char *gets (char *__s); +__END_DECLS + #define obstack_chunk_alloc malloc #define obstack_chunk_free free diff --git a/libc/iconv/gconv_builtin.h b/libc/iconv/gconv_builtin.h index ef9ab8d7c..fd736a480 100644 --- a/libc/iconv/gconv_builtin.h +++ b/libc/iconv/gconv_builtin.h @@ -1,5 +1,5 @@ /* Builtin transformations. - Copyright (C) 1997-1999, 2000-2002, 2006 Free Software Foundation, Inc. + Copyright (C) 1997-1999, 2000-2002, 2006, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -122,3 +122,24 @@ BUILTIN_TRANSFORMATION ("INTERNAL", "UNICODEBIG//", 1, __gconv_transform_internal_ucs2reverse, NULL, 4, 4, 2, 2) #endif + + +BUILTIN_TRANSFORMATION ("ANSI_X3.4-1968//", "UTF-16//", 1, "=ascii->UTF-16", + __gconv_transform_ascii_utf16, NULL, 2, 2, 1, 1) + +BUILTIN_TRANSFORMATION ("UTF-16//", "ANSI_X3.4-1968//", 1, "=UTF-16->ascii", + __gconv_transform_utf16_ascii, NULL, 2, 2, 1, 1) + +#if BYTE_ORDER == BIG_ENDIAN +BUILTIN_TRANSFORMATION ("ANSI_X3.4-1968//", "UTF-16BE//", 1, "=ascii->UTF-16BE", + __gconv_transform_ascii_utf16, NULL, 2, 2, 1, 1) + +BUILTIN_TRANSFORMATION ("UTF-16BE//", "ANSI_X3.4-1968//", 1, "=UTF-16BE->ascii", + __gconv_transform_utf16_ascii, NULL, 2, 2, 1, 1) +#else +BUILTIN_TRANSFORMATION ("ANSI_X3.4-1968//", "UTF-16LE//", 1, "=ascii->UTF-16LE", + __gconv_transform_ascii_utf16, NULL, 2, 2, 1, 1) + +BUILTIN_TRANSFORMATION ("UTF-16LE//", "ANSI_X3.4-1968//", 1, "=UTF-16LE->ascii", + __gconv_transform_utf16_ascii, NULL, 2, 2, 1, 1) +#endif diff --git a/libc/iconv/gconv_int.h b/libc/iconv/gconv_int.h index fd112204b..80253dd5b 100644 --- a/libc/iconv/gconv_int.h +++ b/libc/iconv/gconv_int.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1997-2005, 2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1997-2005, 2006, 2007, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -303,6 +303,8 @@ __BUILTIN_TRANSFORM (__gconv_transform_internal_ucs4le); __BUILTIN_TRANSFORM (__gconv_transform_ucs4le_internal); __BUILTIN_TRANSFORM (__gconv_transform_internal_utf16); __BUILTIN_TRANSFORM (__gconv_transform_utf16_internal); +__BUILTIN_TRANSFORM (__gconv_transform_ascii_utf16); +__BUILTIN_TRANSFORM (__gconv_transform_utf16_ascii); # undef __BUITLIN_TRANSFORM /* Specialized conversion function for a single byte to INTERNAL, recognizing diff --git a/libc/iconv/gconv_simple.c b/libc/iconv/gconv_simple.c index e34f3770a..b0ef3e67b 100644 --- a/libc/iconv/gconv_simple.c +++ b/libc/iconv/gconv_simple.c @@ -1,5 +1,5 @@ /* Simple transformations functions. - Copyright (C) 1997-2005, 2007, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-2005, 2007, 2008, 2009, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -965,7 +965,7 @@ ucs4le_internal_loop_single (struct __gconv_step *step, cnt = 2; \ ch &= 0x1f; \ } \ - else if (__builtin_expect ((ch & 0xf0) == 0xe0, 1)) \ + else if (__builtin_expect ((ch & 0xf0) == 0xe0, 1)) \ { \ /* We expect three bytes. */ \ cnt = 3; \ @@ -1221,7 +1221,7 @@ ucs4le_internal_loop_single (struct __gconv_step *step, else \ { \ put16 (outptr, val); \ - outptr += sizeof (uint16_t); \ + outptr += sizeof (uint16_t); \ inptr += 4; \ } \ } @@ -1320,3 +1320,72 @@ ucs4le_internal_loop_single (struct __gconv_step *step, #define LOOP_NEED_FLAGS #include #include + + +/* Convert from ISO 646-IRV to UTF-16. */ +#define DEFINE_INIT 0 +#define DEFINE_FINI 0 +#define MIN_NEEDED_FROM 1 +#define MIN_NEEDED_TO 2 +#define FROM_DIRECTION 1 +#define FROM_LOOP ascii_utf16_loop +#define TO_LOOP ascii_utf16_loop /* This is not used. */ +#define FUNCTION_NAME __gconv_transform_ascii_utf16 +#define ONE_DIRECTION 1 + +#define MIN_NEEDED_INPUT MIN_NEEDED_FROM +#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO +#define LOOPFCT FROM_LOOP +#define BODY \ + { \ + if (__builtin_expect (*inptr > '\x7f', 0)) \ + { \ + /* The value is too large. We don't try transliteration here since \ + this is not an error because of the lack of possibilities to \ + represent the result. This is a genuine bug in the input since \ + ASCII does not allow such values. */ \ + STANDARD_FROM_LOOP_ERR_HANDLER (1); \ + } \ + else \ + { \ + /* It's an one byte sequence. */ \ + *((uint16_t *) outptr) = *inptr++; \ + outptr += sizeof (uint16_t); \ + } \ + } +#define LOOP_NEED_FLAGS +#include +#include + + +/* Convert from UTF-16 to ISO 646-IRV. */ +#define DEFINE_INIT 0 +#define DEFINE_FINI 0 +#define MIN_NEEDED_FROM 2 +#define MIN_NEEDED_TO 1 +#define FROM_DIRECTION 1 +#define FROM_LOOP utf16_ascii_loop +#define TO_LOOP utf16_ascii_loop /* This is not used. */ +#define FUNCTION_NAME __gconv_transform_utf16_ascii +#define ONE_DIRECTION 1 + +#define MIN_NEEDED_INPUT MIN_NEEDED_FROM +#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO +#define LOOPFCT FROM_LOOP +#define BODY \ + { \ + if (__builtin_expect (*((const uint16_t *) inptr) > 0x7f, 0)) \ + { \ + UNICODE_TAG_HANDLER (*((const uint16_t *) inptr), 2); \ + STANDARD_TO_LOOP_ERR_HANDLER (2); \ + } \ + else \ + { \ + /* It's an one byte sequence. */ \ + *outptr++ = *((const uint16_t *) inptr); \ + inptr += sizeof (uint16_t); \ + } \ + } +#define LOOP_NEED_FLAGS +#include +#include diff --git a/libc/iconv/loop.c b/libc/iconv/loop.c index 4f430628f..2e88b1dee 100644 --- a/libc/iconv/loop.c +++ b/libc/iconv/loop.c @@ -1,5 +1,5 @@ /* Conversion loop frame work. - Copyright (C) 1998-2003, 2005, 2008, 2011 Free Software Foundation, Inc. + Copyright (C) 1998-2003, 2005, 2008, 2011, 2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1998. @@ -390,6 +390,7 @@ SINGLE(LOOPFCT) (struct __gconv_step *step, UNPACK_BYTES #else /* Add the bytes from the state to the input buffer. */ + assert ((state->__count & 7) <= sizeof (state->__value)); for (inlen = 0; inlen < (size_t) (state->__count & 7); ++inlen) bytebuf[inlen] = state->__value.__wchb[inlen]; #endif @@ -474,7 +475,7 @@ SINGLE(LOOPFCT) (struct __gconv_step *step, /* We don't have enough input for another complete input character. */ assert (inend - inptr > (state->__count & ~7)); - assert (inend - inptr <= 7); + assert (inend - inptr <= sizeof (state->__value)); state->__count = (state->__count & ~7) | (inend - inptr); inlen = 0; while (inptr < inend) diff --git a/libc/include/features.h b/libc/include/features.h index f34dc3159..64dda86a4 100644 --- a/libc/include/features.h +++ b/libc/include/features.h @@ -25,6 +25,7 @@ __STRICT_ANSI__ ISO Standard C. _ISOC99_SOURCE Extensions to ISO C89 from ISO C99. + _ISOC11_SOURCE Extensions to ISO C99 from ISO C11. _POSIX_SOURCE IEEE Std 1003.1. _POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2; if >=199309L, add IEEE Std 1003.1b-1993; @@ -57,6 +58,7 @@ These are defined by this file and are used by the header files to decide what to declare or define: + __USE_ISOC11 Define ISO C11 things. __USE_ISOC99 Define ISO C99 things. __USE_ISOC95 Define ISO C90 AMD1 (C95) things. __USE_POSIX Define IEEE Std 1003.1 things. @@ -95,8 +97,10 @@ /* Undefine everything, so we get a clean slate. */ +#undef __USE_ISOC11 #undef __USE_ISOC99 #undef __USE_ISOC95 +#undef __USE_ISOCXX11 #undef __USE_POSIX #undef __USE_POSIX2 #undef __USE_POSIX199309 @@ -158,6 +162,8 @@ # define _ISOC95_SOURCE 1 # undef _ISOC99_SOURCE # define _ISOC99_SOURCE 1 +# undef _ISOC11_SOURCE +# define _ISOC11_SOURCE 1 # undef _POSIX_SOURCE # define _POSIX_SOURCE 1 # undef _POSIX_C_SOURCE @@ -185,21 +191,33 @@ # define _SVID_SOURCE 1 #endif -/* This is to enable the ISO C99 extension. Also recognize the old macro - which was used prior to the standard acceptance. This macro will - eventually go away and the features enabled by default once the ISO C99 - standard is widely adopted. */ -#if (defined _ISOC99_SOURCE || defined _ISOC9X_SOURCE \ +/* This is to enable the ISO C11 extension. */ +#if (defined _ISOC11_SOURCE \ + || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L)) +# define __USE_ISOC11 1 +#endif + +/* This is to enable the ISO C99 extension. */ +#if (defined _ISOC99_SOURCE || defined _ISOC11_SOURCE \ || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)) # define __USE_ISOC99 1 #endif /* This is to enable the ISO C90 Amendment 1:1995 extension. */ -#if (defined _ISOC99_SOURCE || defined _ISOC9X_SOURCE \ +#if (defined _ISOC99_SOURCE || defined _ISOC11_SOURCE \ || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199409L)) # define __USE_ISOC95 1 #endif +/* This is to enable compatibility for ISO C++11. + + So far g++ does not provide a macro. Check the temporary macro for + now, too. */ +#if ((defined __cplusplus && __cplusplus >= 201103L) \ + || defined __GXX_EXPERIMENTAL_CXX0X__) +# define __USE_ISOCXX11 1 +#endif + /* If none of the ANSI/POSIX macros are defined, use POSIX.1 and POSIX.2 (and IEEE Std 1003.1b-1993 unless _XOPEN_SOURCE is defined). */ #if ((!defined __STRICT_ANSI__ || (_XOPEN_SOURCE - 0) >= 500) && \ diff --git a/libc/libio/stdio.h b/libc/libio/stdio.h index 8e23903c2..b39202879 100644 --- a/libc/libio/stdio.h +++ b/libc/libio/stdio.h @@ -628,12 +628,18 @@ __BEGIN_NAMESPACE_STD extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) __wur; +#ifndef __USE_ISOC11 /* Get a newline-terminated string from stdin, removing the newline. DO NOT USE THIS FUNCTION!! There is no limit on how much it will read. + The function has been officially removed in ISO C11. This opportunity + is used to also remove it from the GNU feature list. It is now only + available when explicitly using an old ISO C, Unix, or POSIX standard. + This function is a possible cancellation point and therefore not marked with __THROW. */ -extern char *gets (char *__s) __wur; +extern char *gets (char *__s) __wur __attribute_deprecated__; +#endif __END_NAMESPACE_STD #ifdef __USE_GNU diff --git a/libc/malloc/Versions b/libc/malloc/Versions index cf0b1e559..7ca9bdf25 100644 --- a/libc/malloc/Versions +++ b/libc/malloc/Versions @@ -58,6 +58,9 @@ libc { GLIBC_2.10 { malloc_info; } + GLIBC_2.16 { + aligned_alloc; + } GLIBC_PRIVATE { # Internal startup hook for libpthread. __libc_malloc_pthread_startup; diff --git a/libc/malloc/malloc.c b/libc/malloc/malloc.c index 8608083ad..300e879b8 100644 --- a/libc/malloc/malloc.c +++ b/libc/malloc/malloc.c @@ -3124,6 +3124,8 @@ public_mEMALIGn(size_t alignment, size_t bytes) ar_ptr == arena_for_chunk(mem2chunk(p))); return p; } +/* For ISO C11. */ +weak_alias (public_mEMALIGn, aligned_alloc) libc_hidden_def (public_mEMALIGn) void* diff --git a/libc/posix/regcomp.c b/libc/posix/regcomp.c index a466aabce..45bed1dd0 100644 --- a/libc/posix/regcomp.c +++ b/libc/posix/regcomp.c @@ -1,5 +1,5 @@ /* Extended regular expression matching and search library. - Copyright (C) 2002-2007,2009,2010,2011 Free Software Foundation, Inc. + Copyright (C) 2002-2007,2009,2010,2011,2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Isamu Hasegawa . @@ -936,10 +936,38 @@ static void internal_function init_word_char (re_dfa_t *dfa) { - int i, j, ch; dfa->word_ops_used = 1; - for (i = 0, ch = 0; i < BITSET_WORDS; ++i) - for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch) + int i = 0; + int ch = 0; + if (BE (dfa->map_notascii == 0, 1)) + { + if (sizeof (dfa->word_char[0]) == 8) + { + dfa->word_char[0] = UINT64_C (0x03ff000000000000); + dfa->word_char[1] = UINT64_C (0x07fffffe87fffffe); + i = 2; + } + else if (sizeof (dfa->word_char[0]) == 4) + { + dfa->word_char[0] = UINT32_C (0x00000000); + dfa->word_char[1] = UINT32_C (0x03ff0000); + dfa->word_char[2] = UINT32_C (0x87fffffe); + dfa->word_char[3] = UINT32_C (0x07fffffe); + i = 4; + } + else + abort (); + ch = 128; + + if (BE (dfa->is_utf8, 1)) + { + memset (&dfa->word_char[i], '\0', (SBC_MAX - ch) / 8); + return; + } + } + + for (; i < BITSET_WORDS; ++i) + for (int j = 0; j < BITSET_WORD_BITS; ++j, ++ch) if (isalnum (ch) || ch == '_') dfa->word_char[i] |= (bitset_word_t) 1 << j; } diff --git a/libc/stdio-common/tst-gets.c b/libc/stdio-common/tst-gets.c index 87786f5b7..463f345e0 100644 --- a/libc/stdio-common/tst-gets.c +++ b/libc/stdio-common/tst-gets.c @@ -1,5 +1,5 @@ /* Tests for gets. - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2001. @@ -21,6 +21,11 @@ #include #include +/* The header does not include the declaration for gets + anymore when compiling with _GNU_SOURCE. Provide a copy here. */ +extern char *gets (char *__s); + + int main (void) { diff --git a/libc/stdlib/stdlib.h b/libc/stdlib/stdlib.h index f7d128c3d..99c34a4ee 100644 --- a/libc/stdlib/stdlib.h +++ b/libc/stdlib/stdlib.h @@ -509,6 +509,12 @@ extern int posix_memalign (void **__memptr, size_t __alignment, size_t __size) __THROW __nonnull ((1)) __wur; #endif +#ifdef __USE_ISOC11 +/* ISO C variant of aligned allocation. */ +extern void *aligned_alloc (size_t __alignment, size_t __size) + __THROW __wur __attribute__ ((__malloc__, __alloc_size__ (2))); +#endif + __BEGIN_NAMESPACE_STD /* Abort execution and generate a core-dump. */ extern void abort (void) __THROW __attribute__ ((__noreturn__)); @@ -517,9 +523,7 @@ extern void abort (void) __THROW __attribute__ ((__noreturn__)); /* Register a function to be called when `exit' is called. */ extern int atexit (void (*__func) (void)) __THROW __nonnull ((1)); -#ifdef __USE_GNU -// XXX There should be a macro to signal with C++ revision is used. -// XXX This function is in the C++1x revision. +#if defined __USE_ISOC11 || defined __USE_ISOCXX11 /* Register a function to be called when `quick_exit' is called. */ # ifdef __cplusplus extern "C++" int at_quick_exit (void (*__func) (void)) @@ -543,9 +547,7 @@ __BEGIN_NAMESPACE_STD perform stdio cleanup, and terminate program execution with STATUS. */ extern void exit (int __status) __THROW __attribute__ ((__noreturn__)); -#ifdef __USE_GNU -// XXX There should be a macro to signal with C++ revision is used. -// XXX This function is in the C++1x revision. +#if defined __USE_ISOC11 || defined __USE_ISOCXX11 /* Call all functions registered with `at_quick_exit' in the reverse of the order in which they were registered and terminate program execution with STATUS. */ diff --git a/libc/sysdeps/unix/sysv/linux/timespec_get.c b/libc/sysdeps/unix/sysv/linux/timespec_get.c new file mode 100644 index 000000000..5d5bc3ea6 --- /dev/null +++ b/libc/sysdeps/unix/sysv/linux/timespec_get.c @@ -0,0 +1,57 @@ +/* Copyright (C) 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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. + + 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. */ + +#include +#include +#include + +#ifndef HAVE_CLOCK_GETTIME_VSYSCALL +# undef INTERNAL_VSYSCALL +# define INTERNAL_VSYSCALL INTERNAL_SYSCALL +#else +# include +#endif + +#ifndef INTERNAL_GETTIME +# define INTERNAL_GETTIME(id, tp) \ + INTERNAL_VSYSCALL (clock_gettime, err, 2, id, tp) +#endif + + +/* Set TS to calendar time based in time base BASE. */ +int +timespec_get (ts, base) + struct timespec *ts; + int base; +{ + switch (base) + { + int res; + INTERNAL_SYSCALL_DECL (err); + case TIME_UTC: + res = INTERNAL_GETTIME (CLOCK_REALTIME, ts); + if (INTERNAL_SYSCALL_ERROR_P (res, err)) + return 0; + break; + + default: + return 0; + } + + return base; +} diff --git a/libc/sysdeps/unix/sysv/linux/x86_64/timespec_get.c b/libc/sysdeps/unix/sysv/linux/x86_64/timespec_get.c new file mode 100644 index 000000000..cb2606814 --- /dev/null +++ b/libc/sysdeps/unix/sysv/linux/x86_64/timespec_get.c @@ -0,0 +1,10 @@ +#include "bits/libc-vdso.h" + +#ifdef SHARED +# define INTERNAL_GETTIME(id, tp) \ + ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \ + PTR_DEMANGLE (f); \ + f (id, tp); }) +#endif + +#include "../timespec_get.c" diff --git a/libc/time/Makefile b/libc/time/Makefile index fcabaaf6d..6d91438eb 100644 --- a/libc/time/Makefile +++ b/libc/time/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991-2003, 2004, 2005, 2007 Free Software Foundation, Inc. +# Copyright (C) 1991-2003, 2004, 2005, 2007, 2011 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -31,7 +31,8 @@ routines := offtime asctime clock ctime ctime_r difftime \ tzfile getitimer setitimer \ stime dysize timegm ftime \ getdate strptime strptime_l \ - strftime strftime_l + strftime strftime_l \ + timespec_get routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \ := wcsftime wcsftime_l aux-$(OPTION_EGLIBC_LOCALE_CODE) += alt_digit era lc-time-cleanup diff --git a/libc/time/Versions b/libc/time/Versions index 273956d5f..a7c263008 100644 --- a/libc/time/Versions +++ b/libc/time/Versions @@ -62,4 +62,7 @@ libc { GLIBC_2.3.2 { strptime_l; } + GLIBC_2.16 { + timespec_get; + } } diff --git a/libc/time/time.h b/libc/time/time.h index fee8d2705..5cb19db29 100644 --- a/libc/time/time.h +++ b/libc/time/time.h @@ -107,10 +107,11 @@ typedef __timer_t timer_t; #undef __need_timer_t -#if !defined __timespec_defined && \ - ((defined _TIME_H && \ - (defined __USE_POSIX199309 || defined __USE_MISC)) || \ - defined __need_timespec) +#if (!defined __timespec_defined \ + && ((defined _TIME_H \ + && (defined __USE_POSIX199309 || defined __USE_MISC \ + || defined __USE_ISOC11)) \ + || defined __need_timespec)) # define __timespec_defined 1 # include /* This defines __time_t for us. */ @@ -142,13 +143,13 @@ struct tm int tm_yday; /* Days in year.[0-365] */ int tm_isdst; /* DST. [-1/0/1]*/ -#ifdef __USE_BSD +# ifdef __USE_BSD long int tm_gmtoff; /* Seconds east of UTC. */ __const char *tm_zone; /* Timezone abbreviation. */ -#else +# else long int __tm_gmtoff; /* Seconds east of UTC. */ __const char *__tm_zone; /* Timezone abbreviation. */ -#endif +# endif }; __END_NAMESPACE_STD #if defined __USE_XOPEN || defined __USE_POSIX || defined __USE_MISC @@ -156,7 +157,7 @@ __USING_NAMESPACE_STD(tm) #endif -#ifdef __USE_POSIX199309 +# ifdef __USE_POSIX199309 /* POSIX.1b structure for timer start values and intervals. */ struct itimerspec { @@ -167,14 +168,23 @@ struct itimerspec /* We can use a simple forward declaration. */ struct sigevent; -#endif /* POSIX.1b */ +# endif /* POSIX.1b */ -#ifdef __USE_XOPEN2K -# ifndef __pid_t_defined +# ifdef __USE_XOPEN2K +# ifndef __pid_t_defined typedef __pid_t pid_t; -# define __pid_t_defined +# define __pid_t_defined +# endif +# endif + + +# ifdef __USE_ISOC11 +/* Time base values for timespec_get. */ +enum + { + TIME_UTC = 1 + }; # endif -#endif __BEGIN_NAMESPACE_STD @@ -353,6 +363,13 @@ extern int clock_getcpuclockid (pid_t __pid, clockid_t *__clock_id) __THROW; # endif +# ifdef __USE_ISOC11 +/* Set TS to calendar time based in time base BASE. */ +extern int timespec_get (struct timespec *__ts, int __base) + __THROW __nonnull ((1)); +# endif + + /* Create new per-process timer using CLOCK_ID. */ extern int timer_create (clockid_t __clock_id, struct sigevent *__restrict __evp, diff --git a/libc/time/timespec_get.c b/libc/time/timespec_get.c new file mode 100644 index 000000000..05009ec11 --- /dev/null +++ b/libc/time/timespec_get.c @@ -0,0 +1,40 @@ +/* Copyright (C) 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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. + + 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. */ + +#include + + +/* Set TS to calendar time based in time base BASE. */ +int +timespec_get (ts, base) + struct timespec *ts; + int base; +{ + switch (base) + { + case TIME_UTC: + /* Not supported. */ + return 0; + + default: + return 0; + } + + return base; +} +stub_warning (timespec_get) diff --git a/libc/version.h b/libc/version.h index 1dac42529..f400088b3 100644 --- a/libc/version.h +++ b/libc/version.h @@ -1,4 +1,4 @@ /* This file just defines the current version number of libc. */ -#define RELEASE "stable" -#define VERSION "2.15" +#define RELEASE "development" +#define VERSION "2.15.90" diff --git a/libc/wcsmbs/Makefile b/libc/wcsmbs/Makefile index a908128c6..4c6e5135b 100644 --- a/libc/wcsmbs/Makefile +++ b/libc/wcsmbs/Makefile @@ -24,7 +24,7 @@ include ../option-groups.mak subdir := wcsmbs -headers := wchar.h bits/wchar.h bits/wchar2.h bits/wchar-ldbl.h +headers := wchar.h bits/wchar.h bits/wchar2.h bits/wchar-ldbl.h uchar.h distribute := wcwidth.h wcsmbsload.h # These functions are used by printf_fp.c, even in the plain case; see @@ -45,7 +45,8 @@ routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \ wcscoll_l wcsxfrm_l \ wcscasecmp wcsncase wcscasecmp_l wcsncase_l \ wcsmbsload mbsrtowcs_l \ - isoc99_swscanf isoc99_vswscanf + isoc99_swscanf isoc99_vswscanf \ + mbrtoc16 c16rtomb routines-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) \ += isoc99_wscanf isoc99_vwscanf isoc99_fwscanf isoc99_vfwscanf diff --git a/libc/wcsmbs/Versions b/libc/wcsmbs/Versions index b6dfa85a4..10bccc953 100644 --- a/libc/wcsmbs/Versions +++ b/libc/wcsmbs/Versions @@ -28,4 +28,7 @@ libc { __isoc99_wscanf; __isoc99_vwscanf; __isoc99_fwscanf; __isoc99_vfwscanf; __isoc99_swscanf; __isoc99_vswscanf; } + GLIBC_2.16 { + mbrtoc16; c16rtomb; mbrtoc32; c32rtomb; + } } diff --git a/libc/wcsmbs/c16rtomb.c b/libc/wcsmbs/c16rtomb.c new file mode 100644 index 000000000..c75ca3bf2 --- /dev/null +++ b/libc/wcsmbs/c16rtomb.c @@ -0,0 +1,121 @@ +/* Copyright (C) 2011, 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2011. + + 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. */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifndef EILSEQ +# define EILSEQ EINVAL +#endif + +#if __STDC__ >= 201000L +# define u(c) U##c +#else +# define u(c) L##c +#endif + + +/* This is the private state used if PS is NULL. */ +static mbstate_t state; + +size_t +c16rtomb (char *s, char16_t c16, mbstate_t *ps) +{ + char buf[MB_CUR_MAX]; + struct __gconv_step_data data; + int status; + size_t result; + size_t dummy; + const struct gconv_fcts *fcts; + + /* Set information for this step. */ + data.__invocation_counter = 0; + data.__internal_use = 1; + data.__flags = __GCONV_IS_LAST; + data.__statep = ps ?: &state; + data.__trans = NULL; + + /* A first special case is if S is NULL. This means put PS in the + initial state. */ + if (s == NULL) + { + s = buf; + c16 = u('\0'); + } + + /* Tell where we want to have the result. */ + data.__outbuf = (unsigned char *) s; + data.__outbufend = (unsigned char *) s + MB_CUR_MAX; + + /* Get the conversion functions. */ + fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE)); + __gconv_fct fct = fcts->fromc16->__fct; +#ifdef PTR_DEMANGLE + if (fcts->tomb->__shlib_handle != NULL) + PTR_DEMANGLE (fct); +#endif + + /* If C16 is the NUL character we write into the output buffer the byte + sequence necessary for PS to get into the initial state, followed + by a NUL byte. */ + if (c16 == L'\0') + { + status = DL_CALL_FCT (fct, (fcts->fromc16, &data, NULL, NULL, + NULL, &dummy, 1, 1)); + + if (status == __GCONV_OK || status == __GCONV_EMPTY_INPUT) + *data.__outbuf++ = '\0'; + } + else + { + /* Do a normal conversion. */ + const unsigned char *inbuf = (const unsigned char *) &c16; + + status = DL_CALL_FCT (fct, + (fcts->fromc16, &data, &inbuf, + inbuf + sizeof (char16_t), NULL, &dummy, 0, 1)); + } + + /* There must not be any problems with the conversion but illegal input + characters. The output buffer must be large enough, otherwise the + definition of MB_CUR_MAX is not correct. All the other possible + errors also must not happen. */ + assert (status == __GCONV_OK || status == __GCONV_EMPTY_INPUT + || status == __GCONV_ILLEGAL_INPUT + || status == __GCONV_INCOMPLETE_INPUT + || status == __GCONV_FULL_OUTPUT); + + if (status == __GCONV_OK || status == __GCONV_EMPTY_INPUT + || status == __GCONV_FULL_OUTPUT) + result = data.__outbuf - (unsigned char *) s; + else + { + result = (size_t) -1; + __set_errno (EILSEQ); + } + + return result; +} diff --git a/libc/wcsmbs/mbrtoc16.c b/libc/wcsmbs/mbrtoc16.c new file mode 100644 index 000000000..7b5822d69 --- /dev/null +++ b/libc/wcsmbs/mbrtoc16.c @@ -0,0 +1,122 @@ +/* Copyright (C) 2011, 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2011. + + 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. */ + +#include +#include +#include +#include +#include +#include + +#include + +#ifndef EILSEQ +# define EILSEQ EINVAL +#endif + +#if __STDC__ >= 201000L +# define U(c) U##c +#else +# define U(c) L##c +#endif + + +/* This is the private state used if PS is NULL. */ +static mbstate_t state; + +size_t +mbrtoc16 (char16_t *pc16, const char *s, size_t n, mbstate_t *ps) +{ + char16_t buf[1]; + struct __gconv_step_data data; + int status; + size_t result; + size_t dummy; + const unsigned char *inbuf, *endbuf; + unsigned char *outbuf = (unsigned char *) (pc16 ?: buf); + const struct gconv_fcts *fcts; + + /* Set information for this step. */ + data.__invocation_counter = 0; + data.__internal_use = 1; + data.__flags = __GCONV_IS_LAST; + data.__statep = ps ?: &state; + data.__trans = NULL; + + /* A first special case is if S is NULL. This means put PS in the + initial state. */ + if (s == NULL) + { + outbuf = (unsigned char *) buf; + s = ""; + n = 1; + } + + /* Tell where we want the result. */ + data.__outbuf = outbuf; + data.__outbufend = outbuf + sizeof (char16_t); + + /* Get the conversion functions. */ + fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE)); + + /* Do a normal conversion. */ + inbuf = (const unsigned char *) s; + endbuf = inbuf + n; + if (__builtin_expect (endbuf < inbuf, 0)) + endbuf = (const unsigned char *) ~(uintptr_t) 0; + __gconv_fct fct = fcts->toc16->__fct; +#ifdef PTR_DEMANGLE + if (fcts->toc16->__shlib_handle != NULL) + PTR_DEMANGLE (fct); +#endif + status = DL_CALL_FCT (fct, (fcts->toc16, &data, &inbuf, endbuf, + NULL, &dummy, 0, 1)); + + /* There must not be any problems with the conversion but illegal input + characters. The output buffer must be large enough, otherwise the + definition of MB_CUR_MAX is not correct. All the other possible + errors also must not happen. */ + assert (status == __GCONV_OK || status == __GCONV_EMPTY_INPUT + || status == __GCONV_ILLEGAL_INPUT + || status == __GCONV_INCOMPLETE_INPUT + || status == __GCONV_FULL_OUTPUT); + + if (status == __GCONV_OK || status == __GCONV_EMPTY_INPUT + || status == __GCONV_FULL_OUTPUT) + { + if (data.__outbuf != (unsigned char *) outbuf + && *(char16_t *) outbuf == U('\0')) + { + /* The converted character is the NUL character. */ + assert (__mbsinit (data.__statep)); + result = 0; + } + else + result = inbuf - (const unsigned char *) s; + } + else if (status == __GCONV_INCOMPLETE_INPUT) + result = (size_t) -2; + else + { + result = (size_t) -1; + __set_errno (EILSEQ); + } + + return result; +} diff --git a/libc/wcsmbs/mbrtowc.c b/libc/wcsmbs/mbrtowc.c index b53457173..03b8348d3 100644 --- a/libc/wcsmbs/mbrtowc.c +++ b/libc/wcsmbs/mbrtowc.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2004, 2005 +/* Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2004, 2005, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -117,3 +117,8 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) libc_hidden_def (__mbrtowc) weak_alias (__mbrtowc, mbrtowc) libc_hidden_weak (mbrtowc) + +/* There should be no difference between the UTF-32 handling required + by mbrtoc32 and the wchar_t handling which has long since been + implemented in mbrtowc. */ +weak_alias (__mbrtowc, mbrtoc32) diff --git a/libc/wcsmbs/uchar.h b/libc/wcsmbs/uchar.h new file mode 100644 index 000000000..bb5f3ba35 --- /dev/null +++ b/libc/wcsmbs/uchar.h @@ -0,0 +1,84 @@ +/* Copyright (C) 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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. */ + +/* + * ISO C11 Standard: 7.28 + * Unicode utilities + */ + +#ifndef _UCHAR_H +#define _UCHAR_H 1 + +#include + +#define __need_size_t +#include +#define __need_mbstate_t +#include + +#ifndef __mbstate_t_defined +__BEGIN_NAMESPACE_C99 +/* Public type. */ +typedef __mbstate_t mbstate_t; +__END_NAMESPACE_C99 +# define __mbstate_t_defined 1 +#endif + + +#ifdef __GNUC__ +/* Define the 16-bit and 32-bit character types. Use the information + provided by the compiler. */ +# if !defined __CHAR16_TYPE__ || !defined __CHAR32_TYPE__ +# if defined __STDC__ && __STDC__ < 201000L +# error " requires ISO C11 mode" +# else +# error "definitions of __CHAR16_TYPE__ and/or __CHAR32_TYPE__ missing" +# endif +# endif +typedef __CHAR16_TYPE__ char16_t; +typedef __CHAR32_TYPE__ char32_t; +#endif + + +__BEGIN_DECLS + +/* Write char16_t representation of multibyte character pointed + to by S to PC16. */ +extern size_t mbrtoc16 (char16_t *__restrict __pc16, + __const char *__restrict __s, size_t __n, + mbstate_t *__restrict __p) __THROW; + +/* Write multibyte representation of char16_t C16 to S. */ +extern size_t c16rtomb (char *__restrict __s, char16_t __c16, + mbstate_t *__restrict __ps) __THROW; + + + +/* Write char32_t representation of multibyte character pointed + to by S to PC32. */ +extern size_t mbrtoc32 (char32_t *__restrict __pc32, + __const char *__restrict __s, size_t __n, + mbstate_t *__restrict __p) __THROW; + +/* Write multibyte representation of char32_t C32 to S. */ +extern size_t c32rtomb (char *__restrict __s, char32_t __c32, + mbstate_t *__restrict __ps) __THROW; + +__END_DECLS + +#endif /* uchar.h */ diff --git a/libc/wcsmbs/wchar.h b/libc/wcsmbs/wchar.h index 80d7ae2b5..ccaaed8f4 100644 --- a/libc/wcsmbs/wchar.h +++ b/libc/wcsmbs/wchar.h @@ -77,8 +77,8 @@ __END_NAMESPACE_STD # endif #endif -#if (defined _WCHAR_H || defined __need_mbstate_t) && !defined __mbstate_t_defined -# define __mbstate_t_defined 1 +#if (defined _WCHAR_H || defined __need_mbstate_t) && !defined ____mbstate_t_defined +# define ____mbstate_t_defined 1 /* Conversion state information. */ typedef struct { @@ -101,10 +101,14 @@ typedef struct defined. */ #ifdef _WCHAR_H +# ifndef __mbstate_t_defined __BEGIN_NAMESPACE_C99 /* Public type. */ typedef __mbstate_t mbstate_t; __END_NAMESPACE_C99 +# define __mbstate_t_defined 1 +# endif + #ifdef __USE_GNU __USING_NAMESPACE_C99(mbstate_t) #endif @@ -361,7 +365,7 @@ extern int mbsinit (__const mbstate_t *__ps) __THROW __attribute_pure__; to by S to PWC. */ extern size_t mbrtowc (wchar_t *__restrict __pwc, __const char *__restrict __s, size_t __n, - mbstate_t *__p) __THROW; + mbstate_t *__restrict __p) __THROW; /* Write multibyte representation of wide character WC to S. */ extern size_t wcrtomb (char *__restrict __s, wchar_t __wc, diff --git a/libc/wcsmbs/wcrtomb.c b/libc/wcsmbs/wcrtomb.c index aa51b6891..547b05aa9 100644 --- a/libc/wcsmbs/wcrtomb.c +++ b/libc/wcsmbs/wcrtomb.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996,1997,1998,2000,2002,2005 Free Software Foundation, Inc. +/* Copyright (C) 1996-1998,2000,2002,2005,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -115,3 +115,8 @@ __wcrtomb (char *s, wchar_t wc, mbstate_t *ps) } weak_alias (__wcrtomb, wcrtomb) libc_hidden_weak (wcrtomb) + +/* There should be no difference between the UTF-32 handling required + by c32rtomb and the wchar_t handling which has long since been + implemented in wcrtomb. */ +weak_alias (__wcrtomb, c32rtomb) diff --git a/libc/wcsmbs/wcsmbsload.c b/libc/wcsmbs/wcsmbsload.c index 2c4ffa81c..190466daf 100644 --- a/libc/wcsmbs/wcsmbsload.c +++ b/libc/wcsmbs/wcsmbsload.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2002,2004,2005,2008,2010 Free Software Foundation, Inc. +/* Copyright (C) 1998-2002,2004,2005,2008,2010,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1998. @@ -68,6 +68,44 @@ static const struct __gconv_step to_mb = .__data = NULL }; +static const struct __gconv_step to_c16 = +{ + .__shlib_handle = NULL, + .__modname = NULL, + .__counter = INT_MAX, + .__from_name = (char *) "ANSI_X3.4-1968//TRANSLIT", + .__to_name = (char *) "UTF-16//", + .__fct = __gconv_transform_ascii_utf16, + .__btowc_fct = NULL, + .__init_fct = NULL, + .__end_fct = NULL, + .__min_needed_from = 1, + .__max_needed_from = 1, + .__min_needed_to = 4, + .__max_needed_to = 4, + .__stateful = 0, + .__data = NULL +}; + +static const struct __gconv_step from_c16 = +{ + .__shlib_handle = NULL, + .__modname = NULL, + .__counter = INT_MAX, + .__from_name = (char *) "UTF-16//", + .__to_name = (char *) "ANSI_X3.4-1968//TRANSLIT", + .__fct = __gconv_transform_utf16_ascii, + .__btowc_fct = NULL, + .__init_fct = NULL, + .__end_fct = NULL, + .__min_needed_from = 4, + .__max_needed_from = 4, + .__min_needed_to = 1, + .__max_needed_to = 1, + .__stateful = 0, + .__data = NULL +}; + /* For the default locale we only have to handle ANSI_X3.4-1968. */ const struct gconv_fcts __wcsmbs_gconv_fcts_c = @@ -75,7 +113,12 @@ const struct gconv_fcts __wcsmbs_gconv_fcts_c = .towc = (struct __gconv_step *) &to_wc, .towc_nsteps = 1, .tomb = (struct __gconv_step *) &to_mb, - .tomb_nsteps = 1 + .tomb_nsteps = 1, + + .toc16 = (struct __gconv_step *) &to_c16, + .toc16_nsteps = 1, + .fromc16 = (struct __gconv_step *) &from_c16, + .fromc16_nsteps = 1, }; @@ -193,6 +236,12 @@ __wcsmbs_load_conv (struct __locale_data *new_category) &new_fcts->tomb_nsteps) : NULL); + // XXX + new_fcts->toc16 = (struct __gconv_step *) &to_c16; + new_fcts->toc16_nsteps = 1; + new_fcts->fromc16 = (struct __gconv_step *) &from_c16; + new_fcts->fromc16_nsteps = 1; + /* If any of the conversion functions is not available we don't use any since this would mean we cannot convert back and forth.*/ @@ -255,14 +304,36 @@ internal_function __wcsmbs_named_conv (struct gconv_fcts *copy, const char *name) { copy->towc = __wcsmbs_getfct ("INTERNAL", name, ©->towc_nsteps); - if (copy->towc != NULL) + if (copy->towc == NULL) + return 1; + + copy->tomb = __wcsmbs_getfct (name, "INTERNAL", ©->tomb_nsteps); + if (copy->tomb == NULL) + goto out_mb; + +#if 0 + copy->fromc16 = __wcsmbs_getfct (name, "UTF-16//", ©->fromc16_nsteps); + if (copy->fromc16 == NULL) + goto out_fromc16; + + copy->toc16 = __wcsmbs_getfct ("UTF-16//", name, ©->toc16_nsteps); + if (copy->toc16 == NULL) +#else + if (0) +#endif { - copy->tomb = __wcsmbs_getfct (name, "INTERNAL", ©->tomb_nsteps); - if (copy->tomb == NULL) - __gconv_close_transform (copy->towc, copy->towc_nsteps); +#if 0 + __gconv_close_transform (copy->fromc16, copy->fromc16_nsteps); + out_fromc16: + __gconv_close_transform (copy->tomb, copy->tomb_nsteps); +#endif + out_mb: + __gconv_close_transform (copy->towc, copy->towc_nsteps); + out_wc: + return 1; } - return copy->towc == NULL || copy->tomb == NULL ? 1 : 0; + return 0; } void internal_function @@ -277,6 +348,11 @@ _nl_cleanup_ctype (struct __locale_data *locale) /* Free the old conversions. */ __gconv_close_transform (data->tomb, data->tomb_nsteps); __gconv_close_transform (data->towc, data->towc_nsteps); +#if 0 + // XXX + __gconv_close_transform (data->fromc16, data->fromc16_nsteps); + __gconv_close_transform (data->toc16, data->toc16c_nsteps); +#endif free ((char *) data); } } diff --git a/libc/wcsmbs/wcsmbsload.h b/libc/wcsmbs/wcsmbsload.h index e2b1bfa9c..064c41c82 100644 --- a/libc/wcsmbs/wcsmbsload.h +++ b/libc/wcsmbs/wcsmbsload.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2002, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1998-2002, 2010, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1998. @@ -32,6 +32,11 @@ struct gconv_fcts size_t towc_nsteps; struct __gconv_step *tomb; size_t tomb_nsteps; + + struct __gconv_step *toc16; + size_t toc16_nsteps; + struct __gconv_step *fromc16; + size_t fromc16_nsteps; }; /* Set of currently active conversion functions. */ diff --git a/ports/ChangeLog.mips b/ports/ChangeLog.mips index 4bb1a4db5..36cae0dd8 100644 --- a/ports/ChangeLog.mips +++ b/ports/ChangeLog.mips @@ -1,3 +1,8 @@ +2012-01-04 Tom de Vries + + * sysdeps/mips/Makefile: Compile initfini.c, pt-initfini.c with + -fno-unwind-tables. + 2012-01-03 Tom de Vries * sysdeps/mips/backtrace.c: New file, including ia64 backtrace.c. diff --git a/ports/sysdeps/mips/Makefile b/ports/sysdeps/mips/Makefile index 88dcb83e5..fdd2c5b50 100644 --- a/ports/sysdeps/mips/Makefile +++ b/ports/sysdeps/mips/Makefile @@ -20,4 +20,12 @@ CFLAGS-tst-backtrace5.c += -funwind-tables CFLAGS-tst-backtrace6.c += -funwind-tables endif +ifeq ($(subdir),csu) +CFLAGS-initfini.s += -fno-unwind-tables +endif + +ifeq ($(subdir),nptl) +CFLAGS-pt-initfini.s += -fno-unwind-tables +endif + ASFLAGS-.os += $(pic-ccflag) -- cgit v1.2.3