]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - iconv/loop.c
Fix http: URL in 'configure'
[thirdparty/glibc.git] / iconv / loop.c
index a480c0cd40ab6715c8f29ac53cadda0aaab66420..2a97b71dfeb3cef799c7bade168c4327f30a4fbc 100644 (file)
@@ -1,5 +1,5 @@
 /* Conversion loop frame work.
-   Copyright (C) 1998-2014 Free Software Foundation, Inc.
+   Copyright (C) 1998-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -15,7 +15,7 @@
 
    You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
+   <https://www.gnu.org/licenses/>.  */
 
 /* This file provides a frame for the reader loop in all conversion modules.
    The actual code must (of course) be provided in the actual module source
 
 #include <assert.h>
 #include <endian.h>
-#include <gconv.h>
+#include <iconv/gconv_int.h>
 #include <stdint.h>
 #include <string.h>
 #include <wchar.h>
 #include <sys/param.h>         /* For MIN.  */
 #define __need_size_t
 #include <stddef.h>
-
+#include <libc-diag.h>
 
 /* We have to provide support for machines which are not able to handled
    unaligned memory accesses.  Some of the character encodings have
    points.  */
 #define STANDARD_TO_LOOP_ERR_HANDLER(Incr) \
   {                                                                          \
-    struct __gconv_trans_data *trans;                                        \
-                                                                             \
     result = __GCONV_ILLEGAL_INPUT;                                          \
                                                                              \
     if (irreversible == NULL)                                                \
     UPDATE_PARAMS;                                                           \
                                                                              \
     /* First try the transliteration methods.  */                            \
-    for (trans = step_data->__trans; trans != NULL; trans = trans->__next)    \
-      {                                                                              \
-       result = DL_CALL_FCT (trans->__trans_fct,                             \
-                             (step, step_data, trans->__data, *inptrp,       \
-                              &inptr, inend, &outptr, irreversible));        \
-       if (result != __GCONV_ILLEGAL_INPUT)                                  \
-         break;                                                              \
-      }                                                                              \
+    if ((step_data->__flags & __GCONV_TRANSLIT) != 0)                        \
+      result = __gconv_transliterate                                         \
+       (step, step_data, *inptrp,                                            \
+        &inptr, inend, &outptr, irreversible);                       \
                                                                              \
     REINIT_PARAMS;                                                           \
                                                                              \
   }
 
 
+/* With GCC 7 when compiling with -Os for 32-bit s390 the compiler
+   warns that the variable 'ch', in the definition of BODY in
+   sysdeps/s390/multiarch/8bit-generic.c, may be used uninitialized in
+   the call to UNICODE_TAG_HANDLER in that macro.  This variable is
+   actually always initialized before use, in the prior loop if INDEX
+   is nonzero and in the following 'if' if INDEX is zero.  That code
+   has a comment referencing this diagnostic disabling; updates in one
+   place may require updates in the other.  */
+DIAG_PUSH_NEEDS_COMMENT;
+DIAG_IGNORE_Os_NEEDS_COMMENT (7, "-Wmaybe-uninitialized");
 /* Handling of Unicode 3.1 TAG characters.  Unicode recommends
    "If language codes are not relevant to the particular processing
     operation, then they should be ignored."  This macro is usually
        continue;                                                             \
       }                                                                              \
   }
+DIAG_POP_NEEDS_COMMENT;
 
 
 /* The function returns the status, as defined in gconv.h.  */
@@ -398,8 +403,14 @@ SINGLE(LOOPFCT) (struct __gconv_step *step,
     {
       *inptrp = inend;
 #  ifdef STORE_REST
+
+      /* Building with -O3 GCC emits a `array subscript is above array
+        bounds' warning.  GCC BZ #64739 has been opened for this.  */
+      DIAG_PUSH_NEEDS_COMMENT;
+      DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Warray-bounds");
       while (inptr < inend)
        bytebuf[inlen++] = *inptr++;
+      DIAG_POP_NEEDS_COMMENT;
 
       inptr = bytebuf;
       inptrp = &inptr;