diff options
author | Ulrich Drepper <drepper@gmail.com> | 2011-12-21 18:45:50 -0500 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2011-12-21 18:45:50 -0500 |
commit | ee190f67cc00b958a667af75dc68f3fc21611c9f (patch) | |
tree | ba36a28e53719d191b6e0afa9a8d55757a40c123 | |
parent | 707f25dfc0a63d264e9da00368cbab5bd0f6a8c9 (diff) | |
download | glibc-ee190f67cc00b958a667af75dc68f3fc21611c9f.tar.gz glibc-ee190f67cc00b958a667af75dc68f3fc21611c9f.tar.xz glibc-ee190f67cc00b958a667af75dc68f3fc21611c9f.zip |
Store invocation-specific data of conversion modules in __gconv_step_data
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | iconv/gconv.h | 5 | ||||
-rw-r--r-- | iconvdata/unicode.c | 8 | ||||
-rw-r--r-- | iconvdata/utf-16.c | 57 | ||||
-rw-r--r-- | iconvdata/utf-32.c | 21 |
6 files changed, 56 insertions, 47 deletions
diff --git a/ChangeLog b/ChangeLog index 024ee2340b..51f148d41e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2011-12-21 Ulrich Drepper <drepper@gmail.com> + + [BZ #13439] + * iconv/gconv.h: Define __GCONV_SWAP. + * iconvdata/unicode.c: The swap bit must be stored in __flags. + * iconvdata/utf-16.c: Likewise. + * iconvdata/utf-32.c: Likewise. + 2011-12-21 Andreas Schwab <schwab@linux-m68k.org> [BZ #13524] diff --git a/NEWS b/NEWS index 50c5852a67..e40ce3f809 100644 --- a/NEWS +++ b/NEWS @@ -12,8 +12,8 @@ Version 2.15 6779, 6783, 9696, 10103, 10709, 11589, 12403, 12847, 12868, 12852, 12874, 12885, 12892, 12907, 12922, 12935, 13007, 13021, 13067, 13068, 13090, 13092, 13114, 13118, 13123, 13134, 13138, 13147, 13150, 13179, 13192, - 13268, 13276, 13291, 13335, 13337, 13344, 13358, 13367, 13446, 13472, - 13484, 13506, 13524 + 13268, 13276, 13291, 13335, 13337, 13344, 13358, 13367, 13439, 13446, + 13472, 13484, 13506, 13524 * New program pldd to list loaded object of a process Implemented by Ulrich Drepper. diff --git a/iconv/gconv.h b/iconv/gconv.h index 2946335e5e..bc6d381aa0 100644 --- a/iconv/gconv.h +++ b/iconv/gconv.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1997-1999, 2000-2002, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1997-1999, 2000-2002, 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 @@ -56,7 +56,8 @@ enum enum { __GCONV_IS_LAST = 0x0001, - __GCONV_IGNORE_ERRORS = 0x0002 + __GCONV_IGNORE_ERRORS = 0x0002, + __GCONV_SWAP = 0x0004 }; diff --git a/iconvdata/unicode.c b/iconvdata/unicode.c index df452d2a1d..dba4c34d64 100644 --- a/iconvdata/unicode.c +++ b/iconvdata/unicode.c @@ -1,5 +1,5 @@ /* Conversion module for Unicode - Copyright (C) 1999, 2000-2002 Free Software Foundation, Inc. + Copyright (C) 1999, 2000-2002, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. @@ -57,7 +57,7 @@ *inptrp = inptr += 2; \ else if (get16u (inptr) == BOM_OE) \ { \ - ((struct unicode_data *) step->__data)->swap = 1; \ + data->__flags |= __GCONV_SWAP; \ *inptrp = inptr += 2; \ } \ } \ @@ -71,7 +71,7 @@ put16u (outbuf, BOM); \ outbuf += 2; \ } \ - swap = ((struct unicode_data *) step->__data)->swap; + swap = data->__flags & __GCONV_SWAP; #define EXTRA_LOOP_ARGS , swap @@ -86,7 +86,6 @@ enum direction struct unicode_data { enum direction dir; - int swap; }; @@ -110,7 +109,6 @@ gconv_init (struct __gconv_step *step) if (new_data != NULL) { new_data->dir = dir; - new_data->swap = 0; step->__data = new_data; if (dir == from_unicode) 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) diff --git a/iconvdata/utf-32.c b/iconvdata/utf-32.c index cc02651374..27ea3db607 100644 --- a/iconvdata/utf-32.c +++ b/iconvdata/utf-32.c @@ -1,5 +1,5 @@ /* Conversion module for UTF-32. - Copyright (C) 1999, 2000-2002 Free Software Foundation, Inc. + Copyright (C) 1999, 2000-2002, 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 @@ -45,7 +45,7 @@ int swap; \ if (FROM_DIRECTION && var == UTF_32) \ { \ - if (data->__invocation_counter == 0) \ + if (__builtin_expect (data->__invocation_counter == 0, 0)) \ { \ /* We have to find out which byte order the file is encoded in. */ \ if (inptr + 4 > inend) \ @@ -57,7 +57,7 @@ *inptrp = inptr += 4; \ else if (get32u (inptr) == BOM_OE) \ { \ - ((struct utf32_data *) step->__data)->swap = 1; \ + data->__flags |= __GCONV_SWAP; \ *inptrp = inptr += 4; \ } \ } \ @@ -72,7 +72,11 @@ put32u (outbuf, BOM); \ outbuf += 4; \ } \ - swap = ((struct utf32_data *) step->__data)->swap; + else if (__builtin_expect (data->__invocation_counter == 0, 0) \ + && ((var == UTF_32LE && BYTE_ORDER == BIG_ENDIAN) \ + || (var == UTF_32BE && BYTE_ORDER == LITTLE_ENDIAN))) \ + data->__flags |= __GCONV_SWAP; \ + swap = data->__flags & __GCONV_SWAP; #define EXTRA_LOOP_ARGS , var, swap @@ -96,7 +100,6 @@ struct utf32_data { enum direction dir; enum variant var; - int swap; }; @@ -151,9 +154,6 @@ gconv_init (struct __gconv_step *step) { new_data->dir = dir; new_data->var = var; - new_data->swap = ((var == UTF_32LE && BYTE_ORDER == BIG_ENDIAN) - || (var == UTF_32BE - && BYTE_ORDER == LITTLE_ENDIAN)); step->__data = new_data; if (dir == from_utf32) @@ -216,9 +216,8 @@ gconv_end (struct __gconv_step *data) } \ \ if (swap) \ - put32 (outptr, bswap_32 (c)); \ - else \ - put32 (outptr, c); \ + c = bswap_32 (c); \ + put32 (outptr, c); \ \ outptr += 4; \ inptr += 4; \ |