diff options
Diffstat (limited to 'iconvdata/utf-16.c')
-rw-r--r-- | iconvdata/utf-16.c | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/iconvdata/utf-16.c b/iconvdata/utf-16.c index 7f6c760900..e34d23fdf2 100644 --- a/iconvdata/utf-16.c +++ b/iconvdata/utf-16.c @@ -1,5 +1,5 @@ /* Conversion module for UTF-16. - Copyright (C) 1999, 2000-2002, 2003, 2005 Free Software Foundation, Inc. + Copyright (C) 1999, 2000-2002, 2003, 2005, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. @@ -44,35 +44,42 @@ #define PREPARE_LOOP \ enum direction dir = ((struct utf16_data *) step->__data)->dir; \ enum variant var = ((struct utf16_data *) step->__data)->var; \ - if (__builtin_expect (data->__invocation_counter == 0, 0) && var == UTF_16) \ + if (__builtin_expect (data->__invocation_counter == 0, 0)) \ { \ - if (FROM_DIRECTION) \ + if (var == UTF_16) \ { \ - /* 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) \ + if (FROM_DIRECTION) \ { \ - ((struct utf16_data *) step->__data)->swap = 1; \ - *inptrp = inptr += 2; \ + /* 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; \ + } \ } \ - } \ - else if (!FROM_DIRECTION && !data->__internal_use) \ - { \ - /* Emit the Byte Order Mark. */ \ - if (__builtin_expect (outbuf + 2 > outend, 0)) \ - return __GCONV_FULL_OUTPUT; \ + else if (!FROM_DIRECTION && !data->__internal_use) \ + { \ + /* Emit the Byte Order Mark. */ \ + if (__builtin_expect (outbuf + 2 > outend, 0)) \ + return __GCONV_FULL_OUTPUT; \ \ - put16u (outbuf, BOM); \ - outbuf += 2; \ + put16u (outbuf, BOM); \ + outbuf += 2; \ + } \ } \ + else if ((var == UTF_16LE && BYTE_ORDER == BIG_ENDIAN) \ + || (var == UTF_16BE && BYTE_ORDER == LITTLE_ENDIAN)) \ + data->__flags |= __GCONV_SWAP; \ } \ - int swap = ((struct utf16_data *) step->__data)->swap; + const int swap = data->__flags & __GCONV_SWAP; #define EXTRA_LOOP_ARGS , swap @@ -96,7 +103,6 @@ struct utf16_data { enum direction dir; enum variant var; - int swap; }; @@ -151,9 +157,6 @@ gconv_init (struct __gconv_step *step) { new_data->dir = dir; new_data->var = var; - new_data->swap = ((var == UTF_16LE && BYTE_ORDER == BIG_ENDIAN) - || (var == UTF_16BE - && BYTE_ORDER == LITTLE_ENDIAN)); step->__data = new_data; if (dir == from_utf16) |