/* 7.28 <uchar.h>

   This file is part of the Public Domain C Library (PDCLib).
   Permission is granted to use, modify, and / or redistribute at will.
*/


#ifndef _PDCLIB_UCHAR_H
#define _PDCLIB_UCHAR_H
#include <_PDCLIB_int.h>
_PDCLIB_BEGIN_EXTERN_C

/* This is mostly a placeholder. for now. This header will be completed by the
 * release of 0.6, but at present merely exposes types needed by the rest of the
 * library
 */

#ifndef _PDCLIB_SIZE_T_DEFINED
#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED
typedef _PDCLIB_size_t size_t;
#endif

#ifndef _PDCLIB_MBSTATE_T_DEFINED
#define _PDCLIB_MBSTATE_T_DEFINED _PDCLIB_MBSTATE_T_DEFINED
typedef _PDCLIB_mbstate_t mbstate_t;
#endif

#ifndef __cplusplus
#ifndef _PDCLIB_CHAR16_T_DEFINED
#define _PDCLIB_CHAR16_T_DEFINED _PDCLIB_CHAR16_T_DEFINED
typedef _PDCLIB_char16_t char16_t;
#endif

#ifndef _PDCLIB_CHAR32_T_DEFINED
#define _PDCLIB_CHAR32_T_DEFINED _PDCLIB_CHAR32_T_DEFINED
typedef _PDCLIB_char32_t char32_t;
#endif
#endif

size_t mbrtoc16(
    char16_t    *_PDCLIB_restrict   pc16,
    const char  *_PDCLIB_restrict   s, 
    size_t                          n,
    mbstate_t   *_PDCLIB_restrict   ps);

size_t c16rtomb(
    char        *_PDCLIB_restrict   s, 
    char16_t                        c16, 
    mbstate_t   *_PDCLIB_restrict   ps);

size_t mbrtoc32(
    char32_t    *_PDCLIB_restrict   pc32,
    const char  *_PDCLIB_restrict   s, 
    size_t                          n,
    mbstate_t   *_PDCLIB_restrict   ps);

size_t c32rtomb(
    char        *_PDCLIB_restrict   s, 
    char32_t                        c32,
    mbstate_t   *_PDCLIB_restrict   ps);

#if defined(_PDCLIB_EXTENSIONS)
/* Analogous to strlen/wcslen */
size_t _PDCLIB_c16slen(const char16_t * str);
size_t _PDCLIB_c32slen(const char32_t * str);

/* String generalizations of the above functions */
size_t _PDCLIB_mbsrtoc16s(
    char16_t    *_PDCLIB_restrict   dst, 
    const char **_PDCLIB_restrict   src, 
    size_t                          len, 
    mbstate_t   *_PDCLIB_restrict   ps);

size_t _PDCLIB_mbsrtoc32s(
    char32_t        *_PDCLIB_restrict   dst, 
    const char     **_PDCLIB_restrict   src, 
    size_t                              len, 
    mbstate_t       *_PDCLIB_restrict   ps);

size_t _PDCLIB_c16srtombs(
    char            *_PDCLIB_restrict   dst, 
    const char16_t **_PDCLIB_restrict   src, 
    size_t                              len, 
    mbstate_t       *_PDCLIB_restrict   ps);

size_t _PDCLIB_c32srtombs(
    char            *_PDCLIB_restrict   dst, 
    const char32_t **_PDCLIB_restrict   src, 
    size_t                              len, 
    mbstate_t       *_PDCLIB_restrict   ps);
#endif

#endif
