diff options
author | midipix <writeonce@midipix.org> | 2018-06-15 10:58:51 +0000 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2018-06-15 10:38:10 -0400 |
commit | 23d9540acc907b876ea1278a1113828438832ae9 (patch) | |
tree | ea950973b1c89f9f85f047980ae7d55f7df77753 /src/string | |
parent | 8ca63f397a2b4c08806de38202e443f868e6b08d (diff) | |
download | ntapi-23d9540acc907b876ea1278a1113828438832ae9.tar.bz2 ntapi-23d9540acc907b876ea1278a1113828438832ae9.tar.xz |
string helper api's: added ntapi_tt_dec_utf16_to_uint{16|32|64|ptr}().
Diffstat (limited to 'src/string')
-rw-r--r-- | src/string/ntapi_tt_dec_utf16_to_uintptr.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/string/ntapi_tt_dec_utf16_to_uintptr.c b/src/string/ntapi_tt_dec_utf16_to_uintptr.c new file mode 100644 index 0000000..93f0967 --- /dev/null +++ b/src/string/ntapi_tt_dec_utf16_to_uintptr.c @@ -0,0 +1,126 @@ +/********************************************************/ +/* ntapi: Native API core library */ +/* Copyright (C) 2013--2018 Z. Gilboa */ +/* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */ +/********************************************************/ + +#include <psxtypes/psxtypes.h> +#include <ntapi/nt_status.h> + +static int32_t __tt_dec_utf16_to_uint64( + __in const wchar16_t * wch_arg, + __in const wchar16_t * wch_cap, + __out uint64_t * key) +{ + int32_t status; + uint64_t lkey; + uint64_t hkey; + const wchar16_t * wch; + + if (wch_cap <= wch_arg) + return NT_STATUS_INVALID_PARAMETER; + + else if (wch_cap - wch_arg > 20) + return NT_STATUS_INVALID_PARAMETER; + + lkey = 0; + hkey = 0; + + if (wch_cap - wch_arg == 20) { + if ((status = __tt_dec_utf16_to_uint64( + &wch_arg[6],wch_cap, + &hkey))) + return status; + + if (hkey > 18446744073709) + return NT_STATUS_INTEGER_OVERFLOW; + + hkey *= 1000000; + wch_cap = &wch_arg[6]; + } + + for (wch=wch_arg; wch<wch_cap; wch++) { + if ((*wch < '0') || (*wch > '9')) + return NT_STATUS_INVALID_PARAMETER; + + lkey *= 10; + lkey += *wch - '0'; + } + + *key = lkey + hkey; + + return NT_STATUS_SUCCESS; +} + +int32_t __stdcall __ntapi_tt_dec_utf16_to_uint16( + __in const wchar16_t * wch_arg, + __in const wchar16_t * wch_cap, + __out uint16_t * key) +{ + int32_t status; + uint64_t skey; + uint16_t rkey; + + if ((status = __tt_dec_utf16_to_uint64(wch_arg,wch_cap,&skey))) + return status; + + if ((rkey = skey) < skey) + return NT_STATUS_INTEGER_OVERFLOW; + + *key = rkey; + + return NT_STATUS_SUCCESS; +} + +int32_t __stdcall __ntapi_tt_dec_utf16_to_uint32( + __in const wchar16_t * wch_arg, + __in const wchar16_t * wch_cap, + __out uint32_t * key) +{ + int32_t status; + uint64_t skey; + uint32_t rkey; + + if ((status = __tt_dec_utf16_to_uint64(wch_arg,wch_cap,&skey))) + return status; + + if ((rkey = skey) < skey) + return NT_STATUS_INTEGER_OVERFLOW; + + *key = rkey; + + return NT_STATUS_SUCCESS; +} + + + +int32_t __stdcall __ntapi_tt_dec_utf16_to_uint64( + __in const wchar16_t * wch_arg, + __in const wchar16_t * wch_cap, + __out uint64_t * key) +{ + return __tt_dec_utf16_to_uint64( + wch_arg,wch_cap,key); +} + +#ifdef __NT32 +int32_t __stdcall __ntapi_tt_dec_utf16_to_uintptr( + __in const wchar16_t * wch_arg, + __in const wchar16_t * wch_cap, + __out uintptr_t * key) +{ + return __tt_dec_utf16_to_uint32( + wch_arg,wch_cap,key); +} +#endif + +#ifdef __NT64 +int32_t __stdcall __ntapi_tt_dec_utf16_to_uintptr( + __in const wchar16_t * wch_arg, + __in const wchar16_t * wch_cap, + __out uintptr_t * key) +{ + return __tt_dec_utf16_to_uint64( + wch_arg,wch_cap,key); +} +#endif |