Merge branch 'c11'

This commit is contained in:
Ulrich Drepper 2012-01-03 07:54:34 -05:00
commit aff0673587
31 changed files with 825 additions and 52 deletions

View File

@ -30,8 +30,64 @@
* posix/regex_internal.c (re_string_fetch_byte_case): Remove
pure attribute.
2011-12-24 Ulrich Drepper <drepper@gmail.com>
* 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 <drepper@gmail.com>
[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.

21
NEWS
View File

@ -5,6 +5,27 @@ See the end for copying conditions.
Please send GNU C library bug reports via <http://sources.redhat.com/bugzilla/>
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:

View File

@ -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

View File

@ -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

View File

@ -33,6 +33,12 @@
#include <sys/socket.h>
#include <sys/un.h>
__BEGIN_DECLS
/* The <stdio.h> 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

View File

@ -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 <drepper@cygnus.com>, 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

View File

@ -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 <drepper@cygnus.com>, 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

View File

@ -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 <drepper@cygnus.com>, 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 <iconv/loop.c>
#include <iconv/skeleton.c>
/* 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 <iconv/loop.c>
#include <iconv/skeleton.c>
/* 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 <iconv/loop.c>
#include <iconv/skeleton.c>

View File

@ -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) && \

View File

@ -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

View File

@ -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;

View File

@ -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*

View File

@ -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 <drepper@redhat.com>, 2001.
@ -21,6 +21,11 @@
#include <stdio.h>
#include <string.h>
/* The <stdio.h> 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)
{

View File

@ -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. */

View File

@ -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 <time.h>
#include <sysdep.h>
#include <kernel-features.h>
#ifndef HAVE_CLOCK_GETTIME_VSYSCALL
# undef INTERNAL_VSYSCALL
# define INTERNAL_VSYSCALL INTERNAL_SYSCALL
#else
# include <bits/libc-vdso.h>
#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;
}

View File

@ -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"

View File

@ -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
@ -29,7 +29,8 @@ routines := offtime asctime clock ctime ctime_r difftime \
tzfile getitimer setitimer \
stime dysize timegm ftime \
getdate strptime strptime_l \
strftime wcsftime strftime_l wcsftime_l
strftime wcsftime strftime_l wcsftime_l \
timespec_get
aux := era alt_digit lc-time-cleanup
distribute := datemsk

View File

@ -62,4 +62,7 @@ libc {
GLIBC_2.3.2 {
strptime_l;
}
GLIBC_2.16 {
timespec_get;
}
}

View File

@ -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 <bits/types.h> /* 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,

40
time/timespec_get.c Normal file
View File

@ -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 <time.h>
/* 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)

View File

@ -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"

View File

@ -22,7 +22,7 @@
#
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
routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
@ -40,7 +40,8 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
wcscasecmp wcsncase wcscasecmp_l wcsncase_l \
wcsmbsload mbsrtowcs_l \
isoc99_wscanf isoc99_vwscanf isoc99_fwscanf isoc99_vfwscanf \
isoc99_swscanf isoc99_vswscanf
isoc99_swscanf isoc99_vswscanf \
mbrtoc16 c16rtomb
strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy
tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \

View File

@ -28,4 +28,7 @@ libc {
__isoc99_wscanf; __isoc99_vwscanf; __isoc99_fwscanf; __isoc99_vfwscanf;
__isoc99_swscanf; __isoc99_vswscanf;
}
GLIBC_2.16 {
mbrtoc16; c16rtomb; mbrtoc32; c32rtomb;
}
}

121
wcsmbs/c16rtomb.c Normal file
View File

@ -0,0 +1,121 @@
/* Copyright (C) 2011 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 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 <assert.h>
#include <dlfcn.h>
#include <errno.h>
#include <gconv.h>
#include <stdlib.h>
#include <uchar.h>
#include <wcsmbsload.h>
#include <sysdep.h>
#ifndef EILSEQ
# define EILSEQ EINVAL
#endif
#if __STDC__ >= 20100L
# 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;
}

122
wcsmbs/mbrtoc16.c Normal file
View File

@ -0,0 +1,122 @@
/* Copyright (C) 2011 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.org>, 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 <assert.h>
#include <dlfcn.h>
#include <errno.h>
#include <gconv.h>
#include <uchar.h>
#include <wcsmbsload.h>
#include <sysdep.h>
#ifndef EILSEQ
# define EILSEQ EINVAL
#endif
#if __STDC__ >= 20100L
# 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;
}

View File

@ -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 <drepper@gnu.org>, 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)

84
wcsmbs/uchar.h Normal file
View File

@ -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 <uchar.h>
*/
#ifndef _UCHAR_H
#define _UCHAR_H 1
#include <features.h>
#define __need_size_t
#include <stddef.h>
#define __need_mbstate_t
#include <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 __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 "<uchar.h> 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 */

View File

@ -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,

View File

@ -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 <drepper@cygnus.com>, 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)

View File

@ -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 <drepper@cygnus.com>, 1998.
@ -67,6 +67,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 =
@ -74,7 +112,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,
};
@ -191,6 +234,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.*/
@ -242,14 +291,36 @@ internal_function
__wcsmbs_named_conv (struct gconv_fcts *copy, const char *name)
{
copy->towc = __wcsmbs_getfct ("INTERNAL", name, &copy->towc_nsteps);
if (copy->towc != NULL)
if (copy->towc == NULL)
return 1;
copy->tomb = __wcsmbs_getfct (name, "INTERNAL", &copy->tomb_nsteps);
if (copy->tomb == NULL)
goto out_mb;
#if 0
copy->fromc16 = __wcsmbs_getfct (name, "UTF-16//", &copy->fromc16_nsteps);
if (copy->fromc16 == NULL)
goto out_fromc16;
copy->toc16 = __wcsmbs_getfct ("UTF-16//", name, &copy->toc16_nsteps);
if (copy->toc16 == NULL)
#else
if (0)
#endif
{
copy->tomb = __wcsmbs_getfct (name, "INTERNAL", &copy->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
@ -264,6 +335,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);
}
}

View File

@ -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 <drepper@cygnus.com>, 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. */