2000-02-13 19:00:53 +00:00
|
|
|
/* Conversion module for UTF-16.
|
2018-01-01 00:32:25 +00:00
|
|
|
Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
2000-02-13 19:00:53 +00:00
|
|
|
This file is part of the GNU C Library.
|
|
|
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
|
|
|
|
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
2001-07-06 04:58:11 +00:00
|
|
|
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.
|
2000-02-13 19:00:53 +00:00
|
|
|
|
|
|
|
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
|
2001-07-06 04:58:11 +00:00
|
|
|
Lesser General Public License for more details.
|
2000-02-13 19:00:53 +00:00
|
|
|
|
2001-07-06 04:58:11 +00:00
|
|
|
You should have received a copy of the GNU Lesser General Public
|
2012-02-09 23:18:22 +00:00
|
|
|
License along with the GNU C Library; if not, see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
2000-02-13 19:00:53 +00:00
|
|
|
|
|
|
|
#include <byteswap.h>
|
2000-06-12 19:47:50 +00:00
|
|
|
#include <dlfcn.h>
|
2000-02-13 19:00:53 +00:00
|
|
|
#include <gconv.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
/* This is the Byte Order Mark character (BOM). */
|
|
|
|
#define BOM 0xfeff
|
2000-03-21 20:18:34 +00:00
|
|
|
/* And in the other byte order. */
|
|
|
|
#define BOM_OE 0xfffe
|
2000-02-13 19:00:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* Definitions used in the body of the `gconv' function. */
|
|
|
|
#define FROM_LOOP from_utf16_loop
|
|
|
|
#define TO_LOOP to_utf16_loop
|
|
|
|
#define DEFINE_INIT 0
|
|
|
|
#define DEFINE_FINI 0
|
|
|
|
#define MIN_NEEDED_FROM 2
|
|
|
|
#define MAX_NEEDED_FROM 4
|
|
|
|
#define MIN_NEEDED_TO 4
|
2014-05-01 20:42:40 +00:00
|
|
|
#define ONE_DIRECTION 0
|
2000-02-13 19:00:53 +00:00
|
|
|
#define FROM_DIRECTION (dir == from_utf16)
|
|
|
|
#define PREPARE_LOOP \
|
|
|
|
enum direction dir = ((struct utf16_data *) step->__data)->dir; \
|
|
|
|
enum variant var = ((struct utf16_data *) step->__data)->var; \
|
2014-02-10 13:45:42 +00:00
|
|
|
if (__glibc_unlikely (data->__invocation_counter == 0)) \
|
2000-03-21 20:18:34 +00:00
|
|
|
{ \
|
2011-12-21 23:45:50 +00:00
|
|
|
if (var == UTF_16) \
|
2000-03-21 20:18:34 +00:00
|
|
|
{ \
|
2011-12-21 23:45:50 +00:00
|
|
|
if (FROM_DIRECTION) \
|
2000-03-21 20:18:34 +00:00
|
|
|
{ \
|
2011-12-21 23:45:50 +00:00
|
|
|
/* We have to find out which byte order the file is \
|
|
|
|
encoded in. */ \
|
|
|
|
if (inptr + 2 > inend) \
|
|
|
|
return (inptr == inend \
|
|
|
|
? __GCONV_EMPTY_INPUT : __GCONV_INCOMPLETE_INPUT); \
|
|
|
|
\
|
|
|
|
if (get16u (inptr) == BOM) \
|
|
|
|
/* Simply ignore the BOM character. */ \
|
|
|
|
*inptrp = inptr += 2; \
|
|
|
|
else if (get16u (inptr) == BOM_OE) \
|
|
|
|
{ \
|
|
|
|
data->__flags |= __GCONV_SWAP; \
|
|
|
|
*inptrp = inptr += 2; \
|
|
|
|
} \
|
2000-03-21 20:18:34 +00:00
|
|
|
} \
|
2011-12-21 23:45:50 +00:00
|
|
|
else if (!FROM_DIRECTION && !data->__internal_use) \
|
|
|
|
{ \
|
|
|
|
/* Emit the Byte Order Mark. */ \
|
2014-02-10 13:45:42 +00:00
|
|
|
if (__glibc_unlikely (outbuf + 2 > outend)) \
|
2011-12-21 23:45:50 +00:00
|
|
|
return __GCONV_FULL_OUTPUT; \
|
2000-02-13 19:00:53 +00:00
|
|
|
\
|
2011-12-21 23:45:50 +00:00
|
|
|
put16u (outbuf, BOM); \
|
|
|
|
outbuf += 2; \
|
|
|
|
} \
|
* posix/bits/unistd.h (confstr, getgroups, ttyname_r, gethostname,
getdomainname): Add __NTH.
* stdlib/bits/stdlib.h (ptsname_r, wctomb, mbstowcs, wcstombs):
Likewise.
(realpath): Likewise. Use __const instead of const. Add __restrict
keywords.
* socket/bits/socket2.h (recvfrom): Add __restrict keyword to __buf.
* wcsmbs/bits/wchar2.h (wmemcpy, wmemmove, wmempcpy, wmemset,
wcscpy, wcpcpy, wcsncpy, wcpncpy, wcscat, wcsncat, vswprintf, wcrtomb,
mbsrtowcs, wcsrtombs, mbsnrtowcs, wcsnrtombs): Add __NTH.
* string/bits/string3.h (__memset_ichk): Likewise.
(__memcpy_ichk, __memmove_ichk, __mempcpy_ichk, __strcpy_ichk,
__stpcpy_ichk, __strncpy_ichk, stpncpy, __strcat_ichk,
__strncat_ichk): Likewise. Use __const instead of const.
(__stpncpy_chk): Use __const instead of const.
(__stpncpy_alias): Use __REDIRECT_NTH instead of __REDIRECT.
2005-08-08 Ulrich Drepper <drepper@redhat.com>
Jakub Jelinek <jakub@redhat.com>
* nscd/mem.c (BLOCK_ALIGN_LOG, BLOCK_ALIGN, BLOCK_ALIGN_M1): Move
definitions to...
* nscd/nscd.h (BLOCK_ALIGN_LOG, BLOCK_ALIGN, BLOCK_ALIGN_M1): ...here.
* nscd/connections.c (usekey): New enum.
(check_use, verify_persistent_db): New functions.
(nscd_init): If persistent database is corrupted, unlink it and
recreate rather than falling back to non-persistent database.
Call verify_persistent_db. Avoid overflows in total computation.
2005-08-08 Ulrich Drepper <drepper@redhat.com>
* iconvdata/utf-16.c (PREPARE_LOOP): Minor cleanups to make code
better readable. Avoid passing var to loop function, it's not
necessary at all.
2005-08-08 19:04:11 +00:00
|
|
|
} \
|
2011-12-21 23:45:50 +00:00
|
|
|
else if ((var == UTF_16LE && BYTE_ORDER == BIG_ENDIAN) \
|
|
|
|
|| (var == UTF_16BE && BYTE_ORDER == LITTLE_ENDIAN)) \
|
|
|
|
data->__flags |= __GCONV_SWAP; \
|
2001-04-12 20:26:40 +00:00
|
|
|
} \
|
2011-12-21 23:45:50 +00:00
|
|
|
const int swap = data->__flags & __GCONV_SWAP;
|
* posix/bits/unistd.h (confstr, getgroups, ttyname_r, gethostname,
getdomainname): Add __NTH.
* stdlib/bits/stdlib.h (ptsname_r, wctomb, mbstowcs, wcstombs):
Likewise.
(realpath): Likewise. Use __const instead of const. Add __restrict
keywords.
* socket/bits/socket2.h (recvfrom): Add __restrict keyword to __buf.
* wcsmbs/bits/wchar2.h (wmemcpy, wmemmove, wmempcpy, wmemset,
wcscpy, wcpcpy, wcsncpy, wcpncpy, wcscat, wcsncat, vswprintf, wcrtomb,
mbsrtowcs, wcsrtombs, mbsnrtowcs, wcsnrtombs): Add __NTH.
* string/bits/string3.h (__memset_ichk): Likewise.
(__memcpy_ichk, __memmove_ichk, __mempcpy_ichk, __strcpy_ichk,
__stpcpy_ichk, __strncpy_ichk, stpncpy, __strcat_ichk,
__strncat_ichk): Likewise. Use __const instead of const.
(__stpncpy_chk): Use __const instead of const.
(__stpncpy_alias): Use __REDIRECT_NTH instead of __REDIRECT.
2005-08-08 Ulrich Drepper <drepper@redhat.com>
Jakub Jelinek <jakub@redhat.com>
* nscd/mem.c (BLOCK_ALIGN_LOG, BLOCK_ALIGN, BLOCK_ALIGN_M1): Move
definitions to...
* nscd/nscd.h (BLOCK_ALIGN_LOG, BLOCK_ALIGN, BLOCK_ALIGN_M1): ...here.
* nscd/connections.c (usekey): New enum.
(check_use, verify_persistent_db): New functions.
(nscd_init): If persistent database is corrupted, unlink it and
recreate rather than falling back to non-persistent database.
Call verify_persistent_db. Avoid overflows in total computation.
2005-08-08 Ulrich Drepper <drepper@redhat.com>
* iconvdata/utf-16.c (PREPARE_LOOP): Minor cleanups to make code
better readable. Avoid passing var to loop function, it's not
necessary at all.
2005-08-08 19:04:11 +00:00
|
|
|
#define EXTRA_LOOP_ARGS , swap
|
2000-02-13 19:00:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* Direction of the transformation. */
|
|
|
|
enum direction
|
|
|
|
{
|
|
|
|
illegal_dir,
|
|
|
|
to_utf16,
|
|
|
|
from_utf16
|
|
|
|
};
|
|
|
|
|
|
|
|
enum variant
|
|
|
|
{
|
|
|
|
illegal_var,
|
|
|
|
UTF_16,
|
|
|
|
UTF_16LE,
|
|
|
|
UTF_16BE
|
|
|
|
};
|
|
|
|
|
|
|
|
struct utf16_data
|
|
|
|
{
|
|
|
|
enum direction dir;
|
|
|
|
enum variant var;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2000-11-28 07:10:56 +00:00
|
|
|
extern int gconv_init (struct __gconv_step *step);
|
2000-02-13 19:00:53 +00:00
|
|
|
int
|
|
|
|
gconv_init (struct __gconv_step *step)
|
|
|
|
{
|
|
|
|
/* Determine which direction. */
|
|
|
|
struct utf16_data *new_data;
|
|
|
|
enum direction dir = illegal_dir;
|
|
|
|
enum variant var = illegal_var;
|
|
|
|
int result;
|
|
|
|
|
2000-09-18 22:41:47 +00:00
|
|
|
if (__strcasecmp (step->__from_name, "UTF-16//") == 0)
|
2000-02-13 19:00:53 +00:00
|
|
|
{
|
|
|
|
dir = from_utf16;
|
|
|
|
var = UTF_16;
|
|
|
|
}
|
2000-09-18 22:41:47 +00:00
|
|
|
else if (__strcasecmp (step->__to_name, "UTF-16//") == 0)
|
2000-02-13 19:00:53 +00:00
|
|
|
{
|
|
|
|
dir = to_utf16;
|
|
|
|
var = UTF_16;
|
|
|
|
}
|
2000-09-18 22:41:47 +00:00
|
|
|
else if (__strcasecmp (step->__from_name, "UTF-16BE//") == 0)
|
2000-02-13 19:00:53 +00:00
|
|
|
{
|
|
|
|
dir = from_utf16;
|
|
|
|
var = UTF_16BE;
|
|
|
|
}
|
2000-09-18 22:41:47 +00:00
|
|
|
else if (__strcasecmp (step->__to_name, "UTF-16BE//") == 0)
|
2000-02-13 19:00:53 +00:00
|
|
|
{
|
|
|
|
dir = to_utf16;
|
|
|
|
var = UTF_16BE;
|
|
|
|
}
|
2000-09-18 22:41:47 +00:00
|
|
|
else if (__strcasecmp (step->__from_name, "UTF-16LE//") == 0)
|
2000-02-13 19:00:53 +00:00
|
|
|
{
|
|
|
|
dir = from_utf16;
|
|
|
|
var = UTF_16LE;
|
|
|
|
}
|
2000-09-18 22:41:47 +00:00
|
|
|
else if (__strcasecmp (step->__to_name, "UTF-16LE//") == 0)
|
2000-02-13 19:00:53 +00:00
|
|
|
{
|
|
|
|
dir = to_utf16;
|
|
|
|
var = UTF_16LE;
|
|
|
|
}
|
|
|
|
|
|
|
|
result = __GCONV_NOCONV;
|
2000-06-06 22:58:45 +00:00
|
|
|
if (__builtin_expect (dir, to_utf16) != illegal_dir)
|
2000-02-13 19:00:53 +00:00
|
|
|
{
|
|
|
|
new_data = (struct utf16_data *) malloc (sizeof (struct utf16_data));
|
|
|
|
|
|
|
|
result = __GCONV_NOMEM;
|
|
|
|
if (new_data != NULL)
|
|
|
|
{
|
|
|
|
new_data->dir = dir;
|
|
|
|
new_data->var = var;
|
|
|
|
step->__data = new_data;
|
|
|
|
|
2000-03-21 08:08:35 +00:00
|
|
|
if (dir == from_utf16)
|
2000-02-13 19:00:53 +00:00
|
|
|
{
|
|
|
|
step->__min_needed_from = MIN_NEEDED_FROM;
|
2001-04-12 20:26:40 +00:00
|
|
|
step->__max_needed_from = MAX_NEEDED_FROM;
|
2000-02-13 19:00:53 +00:00
|
|
|
step->__min_needed_to = MIN_NEEDED_TO;
|
|
|
|
step->__max_needed_to = MIN_NEEDED_TO;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
step->__min_needed_from = MIN_NEEDED_TO;
|
|
|
|
step->__max_needed_from = MIN_NEEDED_TO;
|
|
|
|
step->__min_needed_to = MIN_NEEDED_FROM;
|
2001-04-12 20:26:40 +00:00
|
|
|
step->__max_needed_to = MAX_NEEDED_FROM;
|
2000-02-13 19:00:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
step->__stateful = 0;
|
|
|
|
|
|
|
|
result = __GCONV_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-11-28 07:10:56 +00:00
|
|
|
extern void gconv_end (struct __gconv_step *data);
|
2000-02-13 19:00:53 +00:00
|
|
|
void
|
|
|
|
gconv_end (struct __gconv_step *data)
|
|
|
|
{
|
|
|
|
free (data->__data);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Convert from the internal (UCS4-like) format to UTF-16. */
|
|
|
|
#define MIN_NEEDED_INPUT MIN_NEEDED_TO
|
|
|
|
#define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM
|
|
|
|
#define MAX_NEEDED_OUTPUT MAX_NEEDED_FROM
|
|
|
|
#define LOOPFCT TO_LOOP
|
|
|
|
#define BODY \
|
|
|
|
{ \
|
2000-03-28 17:33:37 +00:00
|
|
|
uint32_t c = get32 (inptr); \
|
2000-02-13 19:00:53 +00:00
|
|
|
\
|
2014-02-10 13:45:42 +00:00
|
|
|
if (__glibc_unlikely (c >= 0xd800 && c < 0xe000)) \
|
2000-09-18 22:41:47 +00:00
|
|
|
{ \
|
|
|
|
/* Surrogate characters in UCS-4 input are not valid. \
|
|
|
|
We must catch this. If we let surrogates pass through, \
|
|
|
|
attackers could make a security hole exploit by \
|
|
|
|
synthesizing any desired plane 1-16 character. */ \
|
2002-06-28 21:23:06 +00:00
|
|
|
result = __GCONV_ILLEGAL_INPUT; \
|
2000-09-18 22:41:47 +00:00
|
|
|
if (! ignore_errors_p ()) \
|
2002-06-28 21:23:06 +00:00
|
|
|
break; \
|
2000-09-18 22:41:47 +00:00
|
|
|
inptr += 4; \
|
|
|
|
++*irreversible; \
|
|
|
|
continue; \
|
|
|
|
} \
|
|
|
|
\
|
2000-03-21 20:18:34 +00:00
|
|
|
if (swap) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
2014-02-10 13:45:42 +00:00
|
|
|
if (__glibc_unlikely (c >= 0x10000)) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
2014-02-10 13:45:42 +00:00
|
|
|
if (__glibc_unlikely (c >= 0x110000)) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
2002-06-28 21:23:06 +00:00
|
|
|
STANDARD_TO_LOOP_ERR_HANDLER (4); \
|
2000-02-13 19:00:53 +00:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
/* Generate a surrogate character. */ \
|
2014-02-10 13:45:42 +00:00
|
|
|
if (__glibc_unlikely (outptr + 4 > outend)) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
|
|
|
/* Overflow in the output buffer. */ \
|
|
|
|
result = __GCONV_FULL_OUTPUT; \
|
|
|
|
break; \
|
|
|
|
} \
|
|
|
|
\
|
2000-03-28 17:33:37 +00:00
|
|
|
put16 (outptr, bswap_16 (0xd7c0 + (c >> 10))); \
|
2000-02-13 19:00:53 +00:00
|
|
|
outptr += 2; \
|
2000-03-28 17:33:37 +00:00
|
|
|
put16 (outptr, bswap_16 (0xdc00 + (c & 0x3ff))); \
|
2000-02-13 19:00:53 +00:00
|
|
|
} \
|
|
|
|
else \
|
2000-03-28 17:33:37 +00:00
|
|
|
put16 (outptr, bswap_16 (c)); \
|
2000-02-13 19:00:53 +00:00
|
|
|
} \
|
|
|
|
else \
|
|
|
|
{ \
|
2014-02-10 13:45:42 +00:00
|
|
|
if (__glibc_unlikely (c >= 0x10000)) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
2014-02-10 13:45:42 +00:00
|
|
|
if (__glibc_unlikely (c >= 0x110000)) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
2002-06-28 21:23:06 +00:00
|
|
|
STANDARD_TO_LOOP_ERR_HANDLER (4); \
|
2000-02-13 19:00:53 +00:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
/* Generate a surrogate character. */ \
|
2014-02-10 13:45:42 +00:00
|
|
|
if (__glibc_unlikely (outptr + 4 > outend)) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
|
|
|
/* Overflow in the output buffer. */ \
|
|
|
|
result = __GCONV_FULL_OUTPUT; \
|
|
|
|
break; \
|
|
|
|
} \
|
|
|
|
\
|
2000-03-28 17:33:37 +00:00
|
|
|
put16 (outptr, 0xd7c0 + (c >> 10)); \
|
2000-02-13 19:00:53 +00:00
|
|
|
outptr += 2; \
|
2000-03-28 17:33:37 +00:00
|
|
|
put16 (outptr, 0xdc00 + (c & 0x3ff)); \
|
2000-02-13 19:00:53 +00:00
|
|
|
} \
|
|
|
|
else \
|
2000-03-28 17:33:37 +00:00
|
|
|
put16 (outptr, c); \
|
2000-02-13 19:00:53 +00:00
|
|
|
} \
|
|
|
|
outptr += 2; \
|
|
|
|
inptr += 4; \
|
|
|
|
}
|
2000-06-12 19:47:50 +00:00
|
|
|
#define LOOP_NEED_FLAGS
|
2000-02-13 19:00:53 +00:00
|
|
|
#define EXTRA_LOOP_DECLS \
|
* posix/bits/unistd.h (confstr, getgroups, ttyname_r, gethostname,
getdomainname): Add __NTH.
* stdlib/bits/stdlib.h (ptsname_r, wctomb, mbstowcs, wcstombs):
Likewise.
(realpath): Likewise. Use __const instead of const. Add __restrict
keywords.
* socket/bits/socket2.h (recvfrom): Add __restrict keyword to __buf.
* wcsmbs/bits/wchar2.h (wmemcpy, wmemmove, wmempcpy, wmemset,
wcscpy, wcpcpy, wcsncpy, wcpncpy, wcscat, wcsncat, vswprintf, wcrtomb,
mbsrtowcs, wcsrtombs, mbsnrtowcs, wcsnrtombs): Add __NTH.
* string/bits/string3.h (__memset_ichk): Likewise.
(__memcpy_ichk, __memmove_ichk, __mempcpy_ichk, __strcpy_ichk,
__stpcpy_ichk, __strncpy_ichk, stpncpy, __strcat_ichk,
__strncat_ichk): Likewise. Use __const instead of const.
(__stpncpy_chk): Use __const instead of const.
(__stpncpy_alias): Use __REDIRECT_NTH instead of __REDIRECT.
2005-08-08 Ulrich Drepper <drepper@redhat.com>
Jakub Jelinek <jakub@redhat.com>
* nscd/mem.c (BLOCK_ALIGN_LOG, BLOCK_ALIGN, BLOCK_ALIGN_M1): Move
definitions to...
* nscd/nscd.h (BLOCK_ALIGN_LOG, BLOCK_ALIGN, BLOCK_ALIGN_M1): ...here.
* nscd/connections.c (usekey): New enum.
(check_use, verify_persistent_db): New functions.
(nscd_init): If persistent database is corrupted, unlink it and
recreate rather than falling back to non-persistent database.
Call verify_persistent_db. Avoid overflows in total computation.
2005-08-08 Ulrich Drepper <drepper@redhat.com>
* iconvdata/utf-16.c (PREPARE_LOOP): Minor cleanups to make code
better readable. Avoid passing var to loop function, it's not
necessary at all.
2005-08-08 19:04:11 +00:00
|
|
|
, int swap
|
2000-02-13 19:00:53 +00:00
|
|
|
#include <iconv/loop.c>
|
|
|
|
|
|
|
|
|
|
|
|
/* Convert from UTF-16 to the internal (UCS4-like) format. */
|
|
|
|
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM
|
|
|
|
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
|
|
|
|
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
|
|
|
|
#define LOOPFCT FROM_LOOP
|
|
|
|
#define BODY \
|
|
|
|
{ \
|
2000-03-28 17:33:37 +00:00
|
|
|
uint16_t u1 = get16 (inptr); \
|
2000-02-13 19:00:53 +00:00
|
|
|
\
|
2000-03-21 20:18:34 +00:00
|
|
|
if (swap) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
|
|
|
u1 = bswap_16 (u1); \
|
|
|
|
\
|
2001-08-03 22:09:42 +00:00
|
|
|
if (__builtin_expect (u1 < 0xd800, 1) || u1 > 0xdfff) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
|
|
|
/* No surrogate. */ \
|
2000-06-06 22:58:45 +00:00
|
|
|
put32 (outptr, u1); \
|
2000-02-13 19:00:53 +00:00
|
|
|
inptr += 2; \
|
|
|
|
} \
|
|
|
|
else \
|
|
|
|
{ \
|
|
|
|
uint16_t u2; \
|
|
|
|
\
|
2016-05-25 15:18:06 +00:00
|
|
|
if (__glibc_unlikely (u1 >= 0xdc00)) \
|
|
|
|
{ \
|
|
|
|
/* This is no valid first word for a surrogate. */ \
|
|
|
|
STANDARD_FROM_LOOP_ERR_HANDLER (2); \
|
|
|
|
} \
|
|
|
|
\
|
2000-02-13 19:00:53 +00:00
|
|
|
/* It's a surrogate character. At least the first word says \
|
|
|
|
it is. */ \
|
2014-02-10 13:45:42 +00:00
|
|
|
if (__glibc_unlikely (inptr + 4 > inend)) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
|
|
|
/* We don't have enough input for another complete input \
|
|
|
|
character. */ \
|
|
|
|
result = __GCONV_INCOMPLETE_INPUT; \
|
|
|
|
break; \
|
|
|
|
} \
|
|
|
|
\
|
2000-03-28 17:33:37 +00:00
|
|
|
inptr += 2; \
|
|
|
|
u2 = bswap_16 (get16 (inptr)); \
|
2001-08-03 22:09:42 +00:00
|
|
|
if (__builtin_expect (u2 < 0xdc00, 0) \
|
2003-02-19 20:36:21 +00:00
|
|
|
|| __builtin_expect (u2 > 0xdfff, 0)) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
|
|
|
/* This is no valid second word for a surrogate. */ \
|
2002-06-28 21:23:06 +00:00
|
|
|
inptr -= 2; \
|
|
|
|
STANDARD_FROM_LOOP_ERR_HANDLER (2); \
|
2000-02-13 19:00:53 +00:00
|
|
|
} \
|
|
|
|
\
|
2000-03-28 17:33:37 +00:00
|
|
|
put32 (outptr, ((u1 - 0xd7c0) << 10) + (u2 - 0xdc00)); \
|
|
|
|
inptr += 2; \
|
2000-02-13 19:00:53 +00:00
|
|
|
} \
|
|
|
|
} \
|
|
|
|
else \
|
|
|
|
{ \
|
2001-08-03 22:09:42 +00:00
|
|
|
if (__builtin_expect (u1 < 0xd800, 1) || u1 > 0xdfff) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
|
|
|
/* No surrogate. */ \
|
2000-03-28 17:33:37 +00:00
|
|
|
put32 (outptr, u1); \
|
2000-02-13 19:00:53 +00:00
|
|
|
inptr += 2; \
|
|
|
|
} \
|
|
|
|
else \
|
|
|
|
{ \
|
2016-05-25 15:18:06 +00:00
|
|
|
if (__glibc_unlikely (u1 >= 0xdc00)) \
|
|
|
|
{ \
|
|
|
|
/* This is no valid first word for a surrogate. */ \
|
|
|
|
STANDARD_FROM_LOOP_ERR_HANDLER (2); \
|
|
|
|
} \
|
|
|
|
\
|
2000-02-13 19:00:53 +00:00
|
|
|
/* It's a surrogate character. At least the first word says \
|
|
|
|
it is. */ \
|
2014-02-10 13:45:42 +00:00
|
|
|
if (__glibc_unlikely (inptr + 4 > inend)) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
|
|
|
/* We don't have enough input for another complete input \
|
|
|
|
character. */ \
|
|
|
|
result = __GCONV_INCOMPLETE_INPUT; \
|
|
|
|
break; \
|
|
|
|
} \
|
|
|
|
\
|
2000-03-28 17:33:37 +00:00
|
|
|
inptr += 2; \
|
* posix/bits/unistd.h (confstr, getgroups, ttyname_r, gethostname,
getdomainname): Add __NTH.
* stdlib/bits/stdlib.h (ptsname_r, wctomb, mbstowcs, wcstombs):
Likewise.
(realpath): Likewise. Use __const instead of const. Add __restrict
keywords.
* socket/bits/socket2.h (recvfrom): Add __restrict keyword to __buf.
* wcsmbs/bits/wchar2.h (wmemcpy, wmemmove, wmempcpy, wmemset,
wcscpy, wcpcpy, wcsncpy, wcpncpy, wcscat, wcsncat, vswprintf, wcrtomb,
mbsrtowcs, wcsrtombs, mbsnrtowcs, wcsnrtombs): Add __NTH.
* string/bits/string3.h (__memset_ichk): Likewise.
(__memcpy_ichk, __memmove_ichk, __mempcpy_ichk, __strcpy_ichk,
__stpcpy_ichk, __strncpy_ichk, stpncpy, __strcat_ichk,
__strncat_ichk): Likewise. Use __const instead of const.
(__stpncpy_chk): Use __const instead of const.
(__stpncpy_alias): Use __REDIRECT_NTH instead of __REDIRECT.
2005-08-08 Ulrich Drepper <drepper@redhat.com>
Jakub Jelinek <jakub@redhat.com>
* nscd/mem.c (BLOCK_ALIGN_LOG, BLOCK_ALIGN, BLOCK_ALIGN_M1): Move
definitions to...
* nscd/nscd.h (BLOCK_ALIGN_LOG, BLOCK_ALIGN, BLOCK_ALIGN_M1): ...here.
* nscd/connections.c (usekey): New enum.
(check_use, verify_persistent_db): New functions.
(nscd_init): If persistent database is corrupted, unlink it and
recreate rather than falling back to non-persistent database.
Call verify_persistent_db. Avoid overflows in total computation.
2005-08-08 Ulrich Drepper <drepper@redhat.com>
* iconvdata/utf-16.c (PREPARE_LOOP): Minor cleanups to make code
better readable. Avoid passing var to loop function, it's not
necessary at all.
2005-08-08 19:04:11 +00:00
|
|
|
uint16_t u2 = get16 (inptr); \
|
2001-08-03 22:09:42 +00:00
|
|
|
if (__builtin_expect (u2 < 0xdc00, 0) \
|
2003-02-19 20:36:21 +00:00
|
|
|
|| __builtin_expect (u2 > 0xdfff, 0)) \
|
2000-02-13 19:00:53 +00:00
|
|
|
{ \
|
|
|
|
/* This is no valid second word for a surrogate. */ \
|
2002-06-28 21:23:06 +00:00
|
|
|
inptr -= 2; \
|
|
|
|
STANDARD_FROM_LOOP_ERR_HANDLER (2); \
|
2000-02-13 19:00:53 +00:00
|
|
|
} \
|
|
|
|
\
|
2000-03-28 17:33:37 +00:00
|
|
|
put32 (outptr, ((u1 - 0xd7c0) << 10) + (u2 - 0xdc00)); \
|
|
|
|
inptr += 2; \
|
2000-02-13 19:00:53 +00:00
|
|
|
} \
|
|
|
|
} \
|
|
|
|
outptr += 4; \
|
|
|
|
}
|
2000-06-12 19:47:50 +00:00
|
|
|
#define LOOP_NEED_FLAGS
|
2000-02-13 19:00:53 +00:00
|
|
|
#define EXTRA_LOOP_DECLS \
|
* posix/bits/unistd.h (confstr, getgroups, ttyname_r, gethostname,
getdomainname): Add __NTH.
* stdlib/bits/stdlib.h (ptsname_r, wctomb, mbstowcs, wcstombs):
Likewise.
(realpath): Likewise. Use __const instead of const. Add __restrict
keywords.
* socket/bits/socket2.h (recvfrom): Add __restrict keyword to __buf.
* wcsmbs/bits/wchar2.h (wmemcpy, wmemmove, wmempcpy, wmemset,
wcscpy, wcpcpy, wcsncpy, wcpncpy, wcscat, wcsncat, vswprintf, wcrtomb,
mbsrtowcs, wcsrtombs, mbsnrtowcs, wcsnrtombs): Add __NTH.
* string/bits/string3.h (__memset_ichk): Likewise.
(__memcpy_ichk, __memmove_ichk, __mempcpy_ichk, __strcpy_ichk,
__stpcpy_ichk, __strncpy_ichk, stpncpy, __strcat_ichk,
__strncat_ichk): Likewise. Use __const instead of const.
(__stpncpy_chk): Use __const instead of const.
(__stpncpy_alias): Use __REDIRECT_NTH instead of __REDIRECT.
2005-08-08 Ulrich Drepper <drepper@redhat.com>
Jakub Jelinek <jakub@redhat.com>
* nscd/mem.c (BLOCK_ALIGN_LOG, BLOCK_ALIGN, BLOCK_ALIGN_M1): Move
definitions to...
* nscd/nscd.h (BLOCK_ALIGN_LOG, BLOCK_ALIGN, BLOCK_ALIGN_M1): ...here.
* nscd/connections.c (usekey): New enum.
(check_use, verify_persistent_db): New functions.
(nscd_init): If persistent database is corrupted, unlink it and
recreate rather than falling back to non-persistent database.
Call verify_persistent_db. Avoid overflows in total computation.
2005-08-08 Ulrich Drepper <drepper@redhat.com>
* iconvdata/utf-16.c (PREPARE_LOOP): Minor cleanups to make code
better readable. Avoid passing var to loop function, it's not
necessary at all.
2005-08-08 19:04:11 +00:00
|
|
|
, int swap
|
2000-02-13 19:00:53 +00:00
|
|
|
#include <iconv/loop.c>
|
|
|
|
|
|
|
|
|
|
|
|
/* Now define the toplevel functions. */
|
|
|
|
#include <iconv/skeleton.c>
|