summaryrefslogtreecommitdiffhomepage
path: root/src/argv/ntapi_tt_array_utf8.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2015-07-27 04:01:18 -0400
committermidipix <writeonce@midipix.org>2015-07-27 04:01:18 -0400
commitdd89bb8ad4fe184a34b5dbdda237e640fc82121b (patch)
tree5e80d2da35f5892f92be29f57982b2708e6bd99b /src/argv/ntapi_tt_array_utf8.c
parentdcdadc2702712fa750ed255ed1dfa354522797a0 (diff)
downloadntapi-dd89bb8ad4fe184a34b5dbdda237e640fc82121b.tar.bz2
ntapi-dd89bb8ad4fe184a34b5dbdda237e640fc82121b.tar.xz
entered advanced internal development stage.
Diffstat (limited to 'src/argv/ntapi_tt_array_utf8.c')
-rw-r--r--src/argv/ntapi_tt_array_utf8.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/argv/ntapi_tt_array_utf8.c b/src/argv/ntapi_tt_array_utf8.c
new file mode 100644
index 0000000..8d3b837
--- /dev/null
+++ b/src/argv/ntapi_tt_array_utf8.c
@@ -0,0 +1,117 @@
+/********************************************************/
+/* ntapi: Native API core library */
+/* Copyright (C) 2013,2014,2015 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */
+/********************************************************/
+
+#include <psxtypes/psxtypes.h>
+#include <pemagine/pemagine.h>
+#include <ntapi/nt_argv.h>
+#include <ntapi/ntapi.h>
+#include "ntapi_impl.h"
+
+int32_t __stdcall __ntapi_tt_array_copy_utf8(
+ __out int * argc,
+ __in const char ** argv,
+ __in const char ** envp,
+ __in const char * image_name __optional,
+ __in const char * interpreter __optional,
+ __in const char * optarg __optional,
+ __in void * base,
+ __out void * buffer,
+ __in size_t buflen,
+ __out size_t * blklen)
+{
+ const char ** parg;
+ const char * arg;
+ const char * dummy;
+ char * ch;
+ ptrdiff_t diff;
+ ptrdiff_t ptrs;
+ size_t needed;
+
+ /* fallback */
+ dummy = 0;
+ argv = argv ? argv : &dummy;
+ envp = envp ? envp : &dummy;
+
+ /* ptrs, needed */
+ ptrs = 0;
+ needed = 0;
+
+ if (image_name) {
+ ptrs++;
+ needed += sizeof(char *)
+ + __ntapi->tt_string_null_offset_multibyte(image_name)
+ + sizeof(char);
+ }
+
+ for (parg=argv; *parg; parg++)
+ needed += sizeof(char *)
+ + __ntapi->tt_string_null_offset_multibyte(*parg)
+ + sizeof(char);
+
+ ptrs += (parg - argv);
+ *argc = (int)ptrs;
+
+ for (parg=envp; *parg; parg++)
+ needed += sizeof(char *)
+ + __ntapi->tt_string_null_offset_multibyte(*parg)
+ + sizeof(char);
+
+ ptrs += (parg - envp);
+
+ ptrs += 2;
+ needed += 2*sizeof(char *);
+ blklen = blklen ? blklen : &needed;
+ *blklen = needed;
+
+ if (buflen < needed)
+ return NT_STATUS_BUFFER_TOO_SMALL;
+
+ /* init */
+ parg = (const char **)buffer;
+ ch = (char *)(parg+ptrs);
+ diff = (ptrdiff_t)base;
+
+ /* image_name */
+ if (image_name) {
+ *parg++ = ch-diff;
+ for (arg=image_name; *arg; arg++,ch++)
+ *ch = *arg;
+ *ch++ = '\0';
+ }
+
+ /* argv */
+ for (; *argv; argv++) {
+ *parg++=ch-diff;
+ for (arg=*argv; *arg; arg++,ch++)
+ *ch = *arg;
+ *ch++ = '\0';
+ }
+
+ *parg++ = 0;
+
+ /* envp */
+ for (; *envp; envp++) {
+ *parg++=ch-diff;
+ for (arg=*envp; *arg; arg++,ch++)
+ *ch = *arg;
+ *ch++ = '\0';
+ }
+
+ *parg++ = 0;
+
+ return NT_STATUS_SUCCESS;
+}
+
+int32_t __stdcall __ntapi_tt_array_convert_utf8_to_utf16(
+ __in char ** arrv,
+ __in wchar16_t ** arra,
+ __in void * base,
+ __in wchar16_t * buffer,
+ __in size_t buffer_len,
+ __out size_t * bytes_written)
+{
+ return NT_STATUS_SUCCESS;
+}