]> sourceware.org Git - glibc.git/commitdiff
Store invocation-specific data of conversion modules in __gconv_step_data
authorUlrich Drepper <drepper@gmail.com>
Wed, 21 Dec 2011 23:45:50 +0000 (18:45 -0500)
committerUlrich Drepper <drepper@gmail.com>
Wed, 21 Dec 2011 23:45:50 +0000 (18:45 -0500)
ChangeLog
NEWS
iconv/gconv.h
iconvdata/unicode.c
iconvdata/utf-16.c
iconvdata/utf-32.c

index 024ee2340b1729c3b29b4cb9667e1be4f595abdb..51f148d41e36a15c924f6ab229d8465208bce915 100644 (file)
--- 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 50c5852a67da7ba3f6dbe7335be183409cb386a2..e40ce3f809a0866116241cb95d20647c8594aa10 100644 (file)
--- 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.
index 2946335e5e30592a1e4360780180513f47706015..bc6d381aa00b9a7f17d4d798a29a9a0df8a5825f 100644 (file)
@@ -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
 };
 
 
index df452d2a1d27b18da061b484a154e6a3abcdc13a..dba4c34d64ed17ee96f0379d266effb2024b4b87 100644 (file)
@@ -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)
index 7f6c7609004ecaff2654f25f0e96ea79fcc9c01c..e34d23fdf20c3c7b6f542ca2e449defac5157e8f 100644 (file)
@@ -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.
 
 #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)
index cc02651374bd04bd76586e02c0ce1dd47f26e8d8..27ea3db6072d0c7ff3220a40c9156cb70a49a338 100644 (file)
@@ -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;                                           \
            }                                                                 \
        }                                                                     \
       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;                                                                      \
This page took 0.065235 seconds and 5 git commands to generate.