]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - iconvdata/iso8859-1.c
Add AArch64 HWCAPs from Linux 5.0.
[thirdparty/glibc.git] / iconvdata / iso8859-1.c
index cdeb526d7a3d34ef6dd6b66325718faef3751620..e5375395886213b054684dd45254a1b9a4706379 100644 (file)
 /* Conversion to and from ISO 8859-1.
-   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1997-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-#include <gconv.h>
-#include <stdlib.h>
-#include <string.h>
-
-/* Direction of the transformation.  */
-enum direction
-{
-  illegal,
-  to_iso88591,
-  from_iso88591
-};
-
-struct iso88591_data
-{
-  enum direction dir;
-};
-
-
-int
-gconv_init (struct gconv_step *step)
-{
-  /* Determine which direction.  */
-  struct iso88591_data *new_data;
-  enum direction dir;
-  int result;
-
-  if (strcasestr (step->from_name, "ISO-8859-1") != NULL)
-    dir = from_iso88591;
-  else if (strcasestr (step->to_name, "ISO-8859-1") != NULL)
-    dir = to_iso88591;
-  else
-    dir = illegal;
-
-  result = GCONV_NOCONV;
-  if (dir != illegal
-      && ((new_data
-          = (struct iso88591_data *) malloc (sizeof (struct iso88591_data)))
-         != NULL))
-    {
-      new_data->dir = dir;
-      step->data = new_data;
-      result = GCONV_OK;
-    }
-
-  return result;
-}
-
-
-void
-gconv_end (struct gconv_step *data)
-{
-  free (data->data);
-}
-
-
-int
-gconv (struct gconv_step *step, struct gconv_step_data *data,
-       const char *inbuf, size_t *inbufsize, size_t *written, int do_flush)
-{
-  struct gconv_step *next_step = step + 1;
-  struct gconv_step_data *next_data = data + 1;
-  gconv_fct fct = next_step->fct;
-  size_t do_write;
-  int result;
-
-  /* If the function is called with no input this means we have to reset
-     to the initial state.  The possibly partly converted input is
-     dropped.  */
-  if (do_flush)
-    {
-      do_write = 0;
-
-      /* Call the steps down the chain if there are any.  */
-      if (data->is_last)
-       result = GCONV_OK;
-      else
-       {
-         struct gconv_step *next_step = step + 1;
-         struct gconv_step_data *next_data = data + 1;
-
-         result = (*fct) (next_step, next_data, NULL, 0, written, 1);
-
-         /* Clear output buffer.  */
-         data->outbufavail = 0;
-       }
-    }
-  else
-    {
-      enum direction dir = ((struct iso88591_data *) step->data)->dir;
-
-      do_write = 0;
-
-      do
-       {
-         result = GCONV_OK;
-
-         if (dir == from_iso88591)
-           {
-             size_t inchars = *inbufsize;
-             size_t outwchars = data->outbufavail;
-             char *outbuf = data->outbuf;
-             size_t cnt = 0;
-
-             while (cnt < inchars
-                    && (outwchars + sizeof (wchar_t) <= data->outbufsize))
-               {
-                 *((wchar_t *) (outbuf + outwchars)) =
-                   (unsigned char) inbuf[cnt];
-                 ++do_write;
-                 outwchars += sizeof (wchar_t);
-                 ++cnt;
-               }
-             *inbufsize -= cnt;
-             data->outbufavail = outwchars;
-           }
-         else
-           {
-             size_t inwchars = *inbufsize;
-             size_t outchars = data->outbufavail;
-             char *outbuf = data->outbuf;
-             size_t cnt = 0;
-
-             while (inwchars >= cnt + sizeof (wchar_t)
-                    && outchars < data->outbufsize)
-               {
-                 if (*((wchar_t *) (inbuf + cnt)) >= L'\0'
-                     && *((wchar_t *) (inbuf + cnt)) <= L'\377')
-                   outbuf[outchars] = *((wchar_t *) (inbuf + cnt));
-                 else
-                   /* Here is where the transliteration would enter the
-                      scene.  */
-                   break;
-
-                 ++do_write;
-                 ++outchars;
-                 cnt += sizeof (wchar_t);
-               }
-             *inbufsize -= cnt;
-             data->outbufavail = outchars;
-
-             if (outchars < data->outbufsize)
-               {
-                 /* If there is still room in the output buffer something
-                    is wrong with the input.  */
-                 if (inwchars >= cnt + sizeof (wchar_t))
-                   {
-                     /* An error occurred.  */
-                     result = GCONV_ILLEGAL_INPUT;
-                     break;
-                   }
-                 if (inwchars != cnt)
-                   {
-                     /* There are some unprocessed bytes at the end of the
-                        input buffer.  */
-                     result = GCONV_INCOMPLETE_INPUT;
-                     break;
-                   }
-               }
-           }
-
-         if (result != GCONV_OK)
-           break;
-
-         if (data->is_last)
-           {
-             /* This is the last step.  */
-             result = (*inbufsize > (dir == from_iso88591
-                                     ? 0 : sizeof (wchar_t) - 1)
-                       ? GCONV_FULL_OUTPUT : GCONV_EMPTY_INPUT);
-             break;
-           }
-
-         /* Status so far.  */
-         result = GCONV_EMPTY_INPUT;
-
-         if (data->outbufavail > 0)
-           {
-             /* Call the functions below in the chain.  */
-             size_t newavail = data->outbufavail;
-
-             result = (*fct) (next_step, next_data, data->outbuf, &newavail,
-                              written, 0);
-
-             /* Correct the output buffer.  */
-             if (newavail != data->outbufavail && newavail > 0)
-               {
-                 memmove (data->outbuf,
-                          &data->outbuf[data->outbufavail - newavail],
-                          newavail);
-                 data->outbufavail = newavail;
-               }
-           }
-       }
-      while (*inbufsize > 0 && result == GCONV_EMPTY_INPUT);
-    }
-
-  if (written != NULL && data->is_last)
-    *written = do_write;
-
-  return result;
-}
+   Lesser General Public License for more details.
+
+   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/>.  */
+
+#include <dlfcn.h>
+#include <stdint.h>
+
+/* Definitions used in the body of the `gconv' function.  */
+#define CHARSET_NAME           "ISO-8859-1//"
+#define FROM_LOOP              from_iso8859_1
+#define TO_LOOP                        to_iso8859_1
+#define DEFINE_INIT            1
+#define DEFINE_FINI            1
+#define MIN_NEEDED_FROM                1
+#define MIN_NEEDED_TO          4
+#define ONE_DIRECTION          0
+
+/* First define the conversion function from ISO 8859-1 to UCS4.  */
+#define MIN_NEEDED_INPUT       MIN_NEEDED_FROM
+#define MIN_NEEDED_OUTPUT      MIN_NEEDED_TO
+#define LOOPFCT                        FROM_LOOP
+#define BODY \
+  *((uint32_t *) outptr) = *inptr++;                                         \
+  outptr += sizeof (uint32_t);
+#define ONEBYTE_BODY \
+  {                                                                          \
+    return c;                                                                \
+  }
+#include <iconv/loop.c>
+
+
+/* Next, define the other direction.  */
+#define MIN_NEEDED_INPUT       MIN_NEEDED_TO
+#define MIN_NEEDED_OUTPUT      MIN_NEEDED_FROM
+#define LOOPFCT                        TO_LOOP
+#define BODY \
+  {                                                                          \
+    uint32_t ch = *((const uint32_t *) inptr);                               \
+    if (__glibc_unlikely (ch > 0xff))                                        \
+      {                                                                              \
+       UNICODE_TAG_HANDLER (ch, 4);                                          \
+                                                                             \
+       /* We have an illegal character.  */                                  \
+       STANDARD_TO_LOOP_ERR_HANDLER (4);                                     \
+      }                                                                              \
+    else                                                                     \
+      *outptr++ = (unsigned char) ch;                                        \
+    inptr += 4;                                                                      \
+  }
+#define LOOP_NEED_FLAGS
+#include <iconv/loop.c>
+
+
+/* Now define the toplevel functions.  */
+#include <iconv/skeleton.c>