about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2011-12-21 18:45:50 -0500
committerUlrich Drepper <drepper@gmail.com>2011-12-21 18:45:50 -0500
commitee190f67cc00b958a667af75dc68f3fc21611c9f (patch)
treeba36a28e53719d191b6e0afa9a8d55757a40c123
parent707f25dfc0a63d264e9da00368cbab5bd0f6a8c9 (diff)
downloadglibc-ee190f67cc00b958a667af75dc68f3fc21611c9f.tar.gz
glibc-ee190f67cc00b958a667af75dc68f3fc21611c9f.tar.xz
glibc-ee190f67cc00b958a667af75dc68f3fc21611c9f.zip
Store invocation-specific data of conversion modules in __gconv_step_data
-rw-r--r--ChangeLog8
-rw-r--r--NEWS4
-rw-r--r--iconv/gconv.h5
-rw-r--r--iconvdata/unicode.c8
-rw-r--r--iconvdata/utf-16.c57
-rw-r--r--iconvdata/utf-32.c21
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;								      \