#ifndef _NT_UNICODE_H_
#define _NT_UNICODE_H_
/**
* the conversion functions are based on the validation functions;
* each of the conversion functions passes its peer validation
* function an array of callback handlers, with each member of
* the array corresponding to the number of units making the
* current code point in utf-8, be that source or destination.
* following this logic, then, callback_fn[1] handles 1-byte
* code points [00..7F], callback_fn[2] handles 2-byte code
* points [C2..DF,80..BF], and so on. the first member of
* the array, callback_fn[0], is invoked once the null
* termination of the source stream has been reached.
**/
#include "nt_abi.h"
#include "nt_compiler.h"
typedef struct _nt_utf8_callback_args {
const unsigned char * src;
void * dst;
void * dst_cap;
uint32_t byte_count;
uint32_t code_point;
size_t bytes_written;
} nt_utf8_callback_args;
typedef struct _nt_utf16_callback_args {
const wchar16_t * src;
void * dst;
void * dst_cap;
uint32_t byte_count;
uint32_t code_point;
size_t bytes_written;
} nt_utf16_callback_args;
typedef struct _nt_unicode_conversion_params_utf8_to_utf16 {
const unsigned char * src;
size_t src_size_in_bytes;
wchar16_t * dst;
size_t dst_size_in_bytes;
size_t code_points;
size_t bytes_written;
const unsigned char * addr_failed;
uintptr_t leftover_count;
uintptr_t leftover_bytes;
} nt_unicode_conversion_params_utf8_to_utf16, nt_strconv_mbtonative;
typedef struct _nt_unicode_conversion_params_utf8_to_utf32 {
const unsigned char * src;
size_t src_size_in_bytes;
wchar32_t * dst;
size_t dst_size_in_bytes;
size_t code_points;
size_t bytes_written;
const unsigned char * addr_failed;
uintptr_t leftover_count;
uintptr_t leftover_bytes;
} nt_unicode_conversion_params_utf8_to_utf32, nt_strconv_mbtowide;
typedef struct _nt_unicode_conversion_params_utf16_to_utf8 {
const wchar16_t * src;
size_t src_size_in_bytes;
unsigned char * dst;
size_t dst_size_in_bytes;
size_t code_points;
size_t bytes_written;
const wchar16_t * addr_failed;
uintptr_t leftover_count;
uintptr_t leftover_bytes;
} nt_unicode_conversion_params_utf16_to_utf8, nt_strconv_nativetomb;
typedef struct _nt_unicode_conversion_params_utf16_to_utf32 {
const wchar16_t * src;
size_t src_size_in_bytes;
wchar32_t * dst;
size_t dst_size_in_bytes;
size_t code_points;
size_t bytes_written;
const wchar16_t * addr_failed;
uintptr_t leftover_count;
uintptr_t leftover_bytes;
} nt_unicode_conversion_params_utf16_to_utf32, nt_strconv_nativetowide;
__assert_aligned_size(nt_utf8_callback_args,__SIZEOF_POINTER__);
__assert_aligned_size(nt_utf16_callback_args,__SIZEOF_POINTER__);
__assert_aligned_size(nt_unicode_conversion_params_utf8_to_utf16,__SIZEOF_POINTER__);
__assert_aligned_size(nt_unicode_conversion_params_utf8_to_utf32,__SIZEOF_POINTER__);
__assert_aligned_size(nt_unicode_conversion_params_utf16_to_utf8,__SIZEOF_POINTER__);
__assert_aligned_size(nt_unicode_conversion_params_utf16_to_utf32,__SIZEOF_POINTER__);
typedef int32_t __fastcall ntapi_uc_utf8_callback_fn(
__in nt_utf8_callback_args * callback_args);
typedef int32_t __fastcall ntapi_uc_utf16_callback_fn(
__in nt_utf16_callback_args * callback_args);
typedef int32_t __stdcall ntapi_uc_validate_unicode_stream_utf8(
__in const unsigned char * ch,
__in size_t size_in_bytes __optional,
__out size_t * code_points __optional,
__out const unsigned char ** addr_failed __optional,
__in ntapi_uc_utf8_callback_fn ** callback_fn __optional,
__in nt_utf8_callback_args * callback_args __optional);
typedef int32_t __stdcall ntapi_uc_validate_unicode_stream_utf16(
__in const wchar16_t * wch,
__in size_t size_in_bytes __optional,
__out size_t * code_points __optional,
__out const wchar16_t ** addr_failed __optional,
__in ntapi_uc_utf16_callback_fn ** callback_fn __optional,
__in nt_utf16_callback_args * callback_args __optional);
typedef int __stdcall ntapi_uc_get_code_point_byte_count_utf8(
__in uint32_t code_point);
typedef int __stdcall ntapi_uc_get_code_point_byte_count_utf16(
__in uint32_t code_point);
typedef int32_t __stdcall ntapi_uc_convert_unicode_stream_utf8_to_utf16(
__in_out nt_unicode_conversion_params_utf8_to_utf16 * params);
typedef int32_t __stdcall ntapi_uc_convert_unicode_stream_utf8_to_utf32(
__in_out nt_unicode_conversion_params_utf8_to_utf32 * params);
typedef int32_t __stdcall ntapi_uc_convert_unicode_stream_utf16_to_utf8(
__in_out nt_unicode_conversion_params_utf16_to_utf8 * params);
typedef int32_t __stdcall ntapi_uc_convert_unicode_stream_utf16_to_utf32(
__in_out nt_unicode_conversion_params_utf16_to_utf32 * params);
#endif