Blame src/string/ntapi_tt_dec_utf16_to_uintptr.c

23d954
/********************************************************/
23d954
/*  ntapi: Native API core library                      */
23d954
/*  Copyright (C) 2013--2018  Z. Gilboa                 */
23d954
/*  Released under GPLv2 and GPLv3; see COPYING.NTAPI.  */
23d954
/********************************************************/
23d954
23d954
#include <psxtypes/psxtypes.h>
23d954
#include <ntapi/nt_status.h>
766a63
#include "ntapi_impl.h"
23d954
23d954
static int32_t __tt_dec_utf16_to_uint64(
23d954
	__in	const wchar16_t *	wch_arg,
23d954
	__in	const wchar16_t *	wch_cap,
23d954
	__out	uint64_t *		key)
23d954
{
23d954
	int32_t			status;
23d954
	uint64_t		lkey;
23d954
	uint64_t		hkey;
23d954
	const wchar16_t *	wch;
23d954
23d954
	if (wch_cap <= wch_arg)
23d954
		return NT_STATUS_INVALID_PARAMETER;
23d954
23d954
	else if (wch_cap - wch_arg > 20)
23d954
		return NT_STATUS_INVALID_PARAMETER;
23d954
23d954
	lkey = 0;
23d954
	hkey = 0;
23d954
23d954
	if (wch_cap - wch_arg == 20) {
23d954
		if ((status = __tt_dec_utf16_to_uint64(
23d954
				&wch_arg[6],wch_cap,
23d954
				&hkey)))
23d954
			return status;
23d954
23d954
		if (hkey > 18446744073709)
23d954
			return NT_STATUS_INTEGER_OVERFLOW;
23d954
23d954
		hkey   *= 1000000;
23d954
		wch_cap = &wch_arg[6];
23d954
	}
23d954
23d954
	for (wch=wch_arg; wch
23d954
		if ((*wch < '0') || (*wch > '9'))
23d954
			return NT_STATUS_INVALID_PARAMETER;
23d954
23d954
		lkey *= 10;
23d954
		lkey += *wch - '0';
23d954
	}
23d954
23d954
	*key = lkey + hkey;
23d954
23d954
	return NT_STATUS_SUCCESS;
23d954
}
23d954
23d954
int32_t __stdcall __ntapi_tt_dec_utf16_to_uint16(
23d954
	__in	const wchar16_t *	wch_arg,
23d954
	__in	const wchar16_t *	wch_cap,
23d954
	__out	uint16_t *		key)
23d954
{
23d954
	int32_t		status;
23d954
	uint64_t	skey;
23d954
	uint16_t	rkey;
23d954
23d954
	if ((status = __tt_dec_utf16_to_uint64(wch_arg,wch_cap,&skey)))
23d954
		return status;
23d954
23d954
	if ((rkey = skey) < skey)
23d954
		return NT_STATUS_INTEGER_OVERFLOW;
23d954
23d954
	*key = rkey;
23d954
23d954
	return NT_STATUS_SUCCESS;
23d954
}
23d954
23d954
int32_t __stdcall __ntapi_tt_dec_utf16_to_uint32(
23d954
	__in	const wchar16_t *	wch_arg,
23d954
	__in	const wchar16_t *	wch_cap,
23d954
	__out	uint32_t *		key)
23d954
{
23d954
	int32_t		status;
23d954
	uint64_t	skey;
23d954
	uint32_t	rkey;
23d954
23d954
	if ((status = __tt_dec_utf16_to_uint64(wch_arg,wch_cap,&skey)))
23d954
		return status;
23d954
23d954
	if ((rkey = skey) < skey)
23d954
		return NT_STATUS_INTEGER_OVERFLOW;
23d954
23d954
	*key = rkey;
23d954
23d954
	return NT_STATUS_SUCCESS;
23d954
}
23d954
23d954
23d954
23d954
int32_t __stdcall __ntapi_tt_dec_utf16_to_uint64(
23d954
	__in	const wchar16_t *	wch_arg,
23d954
	__in	const wchar16_t *	wch_cap,
23d954
	__out	uint64_t *		key)
23d954
{
23d954
	return __tt_dec_utf16_to_uint64(
23d954
		wch_arg,wch_cap,key);
23d954
}
23d954
23d954
#ifdef __NT32
23d954
int32_t __stdcall __ntapi_tt_dec_utf16_to_uintptr(
23d954
	__in	const wchar16_t *	wch_arg,
23d954
	__in	const wchar16_t *	wch_cap,
23d954
	__out	uintptr_t *		key)
23d954
{
23d954
	return __tt_dec_utf16_to_uint32(
23d954
		wch_arg,wch_cap,key);
23d954
}
23d954
#endif
23d954
23d954
#ifdef __NT64
23d954
int32_t __stdcall __ntapi_tt_dec_utf16_to_uintptr(
23d954
	__in	const wchar16_t *	wch_arg,
23d954
	__in	const wchar16_t *	wch_cap,
23d954
	__out	uintptr_t *		key)
23d954
{
23d954
	return __tt_dec_utf16_to_uint64(
23d954
		wch_arg,wch_cap,key);
23d954
}
23d954
#endif