summaryrefslogtreecommitdiffhomepage
path: root/src/internal/ntux_ntaio_impl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal/ntux_ntaio_impl.c')
-rw-r--r--src/internal/ntux_ntaio_impl.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/internal/ntux_ntaio_impl.c b/src/internal/ntux_ntaio_impl.c
new file mode 100644
index 0000000..377a833
--- /dev/null
+++ b/src/internal/ntux_ntaio_impl.c
@@ -0,0 +1,114 @@
+/***********************************************************/
+/* ntux: native translation und extension */
+/* Copyright (C) 2016 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.NTUX. */
+/***********************************************************/
+
+#include <ntapi/ntapi.h>
+#include <psxabi/sys_sysapi.h>
+#include <psxabi/sys_errno.h>
+
+extern const ntapi_vtbl * ntux_ntapi;
+
+typedef struct ntux_file {
+ void * hany;
+} FILE;
+
+int ntux_fputs(const char * str, FILE * file)
+{
+ ssize_t ret;
+ size_t size;
+ size_t nbytes;
+
+ size = ntux_ntapi->tt_string_null_offset_multibyte(str);
+ nbytes = size;
+
+ while (nbytes) {
+ ret = __sys_write(
+ (int)(intptr_t)file,
+ str,nbytes);
+
+ if (ret == -EINTR)
+ (void)0;
+
+ else if (ret < 0)
+ return -1;
+
+ else {
+ str += ret;
+ nbytes -= ret;
+ }
+ }
+
+ /* all done */
+ return (int)size;
+}
+
+int ntux_fprintf(FILE * file, const char * fmt, ...)
+{
+ va_list ap;
+ char * str;
+ size_t buffer[32768/sizeof(size_t)];
+
+ ntux_ntapi->tt_aligned_block_memset(
+ buffer,0,sizeof(buffer));
+
+ str = (char *)buffer;
+
+ va_start(ap, fmt);
+ ntux_ntapi->vsnprintf(str, sizeof(buffer), fmt, ap);
+ va_end(ap);
+
+ str[sizeof(buffer)-1] = 0;
+
+ return ntux_fputs(str,file);
+}
+
+int ntux_sprintf(char * str, const char * fmt, ...)
+{
+ int ret;
+ va_list ap;
+
+ va_start(ap, fmt);
+ ret = ntux_ntapi->vsprintf(str, fmt, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+int ntux_snprintf(char * str, size_t n, const char * fmt, ...)
+{
+ int ret;
+ va_list ap;
+
+ va_start(ap, fmt);
+ ret = ntux_ntapi->vsnprintf(str, n, fmt, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+int ntux_isatty(int fildes)
+{
+ nt_runtime_data * rtdata;
+
+ if ((ntux_ntapi->tt_get_runtime_data(&rtdata,0)))
+ return 0;
+
+ if (fildes == 0)
+ return (rtdata->stdin_type == NT_FILE_TYPE_PTY);
+
+ else if (fildes == 1)
+ return (rtdata->stdout_type == NT_FILE_TYPE_PTY);
+
+ else if (fildes == 2)
+ return (rtdata->stderr_type == NT_FILE_TYPE_PTY);
+
+ else
+ return 0;
+}
+
+int ntux_fileno(void * any)
+{
+ return (int)(intptr_t)any;
+}