/* Conversions between Unicode and legacy encodings.
   Copyright (C) 2002, 2005, 2007, 2009-2020 Free Software Foundation, Inc.

   This program is free software: you can redistribute it and/or modify it
   under the terms of the GNU Lesser General Public License as published
   by the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public License
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */

#ifndef _UNICONV_H
#define _UNICONV_H

/* Get size_t.  */
#include <stddef.h>

#include "unitypes.h"

/* Get enum iconv_ilseq_handler.  */
#include "iconveh.h"

/* Get uniconv_register_autodetect() declaration.  */
#include "striconveha.h"

/* Get locale_charset() declaration.  */
#include "localcharset.h"


#ifdef __cplusplus
extern "C" {
#endif


/* Converts an entire string, possibly including NUL bytes, from one encoding
   to a Unicode encoding.
   Converts a memory region given in encoding FROMCODE.  FROMCODE is as for
   iconv_open(3).
   The input is in the memory region between SRC (inclusive) and SRC + SRCLEN
   (exclusive).
   If OFFSETS is not NULL, it should point to an array of SRCLEN integers; this
   array is filled with offsets into the result, i.e. the character starting
   at SRC[i] corresponds to the character starting at (*RESULTP)[OFFSETS[i]],
   and other offsets are set to (size_t)(-1).
   RESULTBUF and *LENGTHP should initially be a scratch buffer and its size,
   or *RESULTBUF can be NULL.
   May erase the contents of the memory at RESULTBUF.
   If successful: The resulting Unicode string (non-NULL) is returned and its
   length stored in *LENGTHP.  The resulting string is RESULTBUF if no dynamic
   memory allocation was necessary, or a freshly allocated memory block
   otherwise.
   In case of error: NULL is returned and errno is set.  Particular errno
   values: EINVAL, EILSEQ, ENOMEM.  */
extern uint8_t *
       u8_conv_from_encoding (const char *fromcode,
                              enum iconv_ilseq_handler handler,
                              const char *src, size_t srclen,
                              size_t *offsets,
                              uint8_t *resultbuf, size_t *lengthp);
extern uint16_t *
       u16_conv_from_encoding (const char *fromcode,
                               enum iconv_ilseq_handler handler,
                               const char *src, size_t srclen,
                               size_t *offsets,
                               uint16_t *resultbuf, size_t *lengthp);
extern uint32_t *
       u32_conv_from_encoding (const char *fromcode,
                               enum iconv_ilseq_handler handler,
                               const char *src, size_t srclen,
                               size_t *offsets,
                               uint32_t *resultbuf, size_t *lengthp);

/* Converts an entire Unicode string, possibly including NUL units, from a
   Unicode encoding to a given encoding.
   Converts a memory region to encoding TOCODE.  TOCODE is as for
   iconv_open(3).
   The input is in the memory region between SRC (inclusive) and SRC + SRCLEN
   (exclusive).
   If OFFSETS is not NULL, it should point to an array of SRCLEN integers; this
   array is filled with offsets into the result, i.e. the character starting
   at SRC[i] corresponds to the character starting at (*RESULTP)[OFFSETS[i]],
   and other offsets are set to (size_t)(-1).
   RESULTBUF and *LENGTHP should initially be a scratch buffer and its size,
   or RESULTBUF can be NULL.
   May erase the contents of the memory at RESULTBUF.
   If successful: The resulting string (non-NULL) is returned and its length
   stored in *LENGTHP.  The resulting string is RESULTBUF if no dynamic memory
   allocation was necessary, or a freshly allocated memory block otherwise.
   In case of error: NULL is returned and errno is set.  Particular errno
   values: EINVAL, EILSEQ, ENOMEM.  */
extern char *
       u8_conv_to_encoding (const char *tocode,
                            enum iconv_ilseq_handler handler,
                            const uint8_t *src, size_t srclen,
                            size_t *offsets,
                            char *_UC_RESTRICT resultbuf, size_t *lengthp);
extern char *
       u16_conv_to_encoding (const char *tocode,
                             enum iconv_ilseq_handler handler,
                             const uint16_t *src, size_t srclen,
                             size_t *offsets,
                             char *_UC_RESTRICT resultbuf, size_t *lengthp);
extern char *
       u32_conv_to_encoding (const char *tocode,
                             enum iconv_ilseq_handler handler,
                             const uint32_t *src, size_t srclen,
                             size_t *offsets,
                             char *_UC_RESTRICT resultbuf, size_t *lengthp);

/* Converts a NUL terminated string from a given encoding.
   The result is malloc allocated, or NULL (with errno set) in case of error.
   Particular errno values: EILSEQ, ENOMEM.  */
extern uint8_t *
       u8_strconv_from_encoding (const char *string,
                                 const char *fromcode,
                                 enum iconv_ilseq_handler handler);
extern uint16_t *
       u16_strconv_from_encoding (const char *string,
                                  const char *fromcode,
                                  enum iconv_ilseq_handler handler);
extern uint32_t *
       u32_strconv_from_encoding (const char *string,
                                  const char *fromcode,
                                  enum iconv_ilseq_handler handler);

/* Converts a NUL terminated string to a given encoding.
   The result is malloc allocated, or NULL (with errno set) in case of error.
   Particular errno values: EILSEQ, ENOMEM.  */
extern char *
       u8_strconv_to_encoding (const uint8_t *string,
                               const char *tocode,
                               enum iconv_ilseq_handler handler);
extern char *
       u16_strconv_to_encoding (const uint16_t *string,
                                const char *tocode,
                                enum iconv_ilseq_handler handler);
extern char *
       u32_strconv_to_encoding (const uint32_t *string,
                                const char *tocode,
                                enum iconv_ilseq_handler handler);

/* Converts a NUL terminated string from the locale encoding.
   The result is malloc allocated, or NULL (with errno set) in case of error.
   Particular errno values: ENOMEM.  */
extern uint8_t *
       u8_strconv_from_locale (const char *string);
extern uint16_t *
       u16_strconv_from_locale (const char *string);
extern uint32_t *
       u32_strconv_from_locale (const char *string);

/* Converts a NUL terminated string to the locale encoding.
   The result is malloc allocated, or NULL (with errno set) in case of error.
   Particular errno values: ENOMEM.  */
extern char *
       u8_strconv_to_locale (const uint8_t *string);
extern char *
       u16_strconv_to_locale (const uint16_t *string);
extern char *
       u32_strconv_to_locale (const uint32_t *string);


#ifdef __cplusplus
}
#endif

#endif /* _UNICONV_H */
