summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKacper Michajłow <kasper93@gmail.com>2024-03-17 18:25:51 +0100
committerKacper Michajłow <kasper93@gmail.com>2024-03-19 19:58:09 +0100
commitfc55f355fc8225328cf0472e3deb4021eba96303 (patch)
tree652da918120e94e4d926d443e479034d3d8777f6
parent3372e17d51b6ecab1695de9e41d26a9216a62a52 (diff)
downloadmpv-fc55f355fc8225328cf0472e3deb4021eba96303.tar.bz2
mpv-fc55f355fc8225328cf0472e3deb4021eba96303.tar.xz
win32: add puts/fputs wrappers
-rw-r--r--osdep/io.c35
-rw-r--r--osdep/io.h4
-rw-r--r--osdep/terminal-dummy.c7
-rw-r--r--osdep/terminal-win.c29
-rw-r--r--osdep/terminal.h3
-rw-r--r--test/test_utils.c3
6 files changed, 66 insertions, 15 deletions
diff --git a/osdep/io.c b/osdep/io.c
index 0006bb54ab..dd21314d7c 100644
--- a/osdep/io.c
+++ b/osdep/io.c
@@ -298,6 +298,31 @@ int mp_fstat(int fd, struct mp_stat *buf)
return hstat(h, buf);
}
+static inline HANDLE get_handle(FILE *stream)
+{
+ HANDLE wstream = INVALID_HANDLE_VALUE;
+
+ if (stream == stdout || stream == stderr) {
+ wstream = GetStdHandle(stream == stdout ?
+ STD_OUTPUT_HANDLE : STD_ERROR_HANDLE);
+ }
+ return wstream;
+}
+
+int mp_fputs(const char *str, FILE *stream)
+{
+ HANDLE wstream = get_handle(stream);
+ if (mp_check_console(wstream))
+ return mp_console_fputs(wstream, bstr0(str));
+
+ return fputs(str, stream);
+}
+
+int mp_puts(const char *str)
+{
+ return mp_fputs(str, stdout);
+}
+
#if HAVE_UWP
static int mp_vfprintf(FILE *stream, const char *format, va_list args)
{
@@ -307,15 +332,9 @@ static int mp_vfprintf(FILE *stream, const char *format, va_list args)
static int mp_vfprintf(FILE *stream, const char *format, va_list args)
{
- HANDLE wstream = INVALID_HANDLE_VALUE;
-
- if (stream == stdout || stream == stderr) {
- wstream = GetStdHandle(stream == stdout ?
- STD_OUTPUT_HANDLE : STD_ERROR_HANDLE);
- }
-
+ HANDLE wstream = get_handle(stream);
if (mp_check_console(wstream))
- return mp_write_console_ansi(wstream, format, args);
+ return mp_console_vfprintf(wstream, format, args);
return vfprintf(stream, format, args);
}
diff --git a/osdep/io.h b/osdep/io.h
index 5cbd54f87f..e9290b0359 100644
--- a/osdep/io.h
+++ b/osdep/io.h
@@ -106,6 +106,8 @@ char *mp_to_utf8(void *talloc_ctx, const wchar_t *s);
#include <sys/stat.h>
#include <fcntl.h>
+int mp_puts(const char *str);
+int mp_fputs(const char *str, FILE *stream);
int mp_printf(const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
int mp_fprintf(FILE *stream, const char *format, ...) PRINTF_ATTRIBUTE(2, 3);
int mp_open(const char *filename, int oflag, ...);
@@ -174,6 +176,8 @@ int mp_glob(const char *restrict pattern, int flags,
int (*errfunc)(const char*, int), mp_glob_t *restrict pglob);
void mp_globfree(mp_glob_t *pglob);
+#define puts(...) mp_puts(__VA_ARGS__)
+#define fputs(...) mp_fputs(__VA_ARGS__)
#define printf(...) mp_printf(__VA_ARGS__)
#define fprintf(...) mp_fprintf(__VA_ARGS__)
#define open(...) mp_open(__VA_ARGS__)
diff --git a/osdep/terminal-dummy.c b/osdep/terminal-dummy.c
index 0c861740e5..8ab9d6f444 100644
--- a/osdep/terminal-dummy.c
+++ b/osdep/terminal-dummy.c
@@ -27,7 +27,12 @@ void terminal_get_size2(int *rows, int *cols, int *px_width, int *px_height)
{
}
-int mp_write_console_ansi(void *wstream, const char *format, va_list args)
+int mp_console_vfprintf(void *wstream, const char *format, va_list args)
+{
+ return 0;
+}
+
+int mp_console_fputs(void *wstream, bstr str)
{
return 0;
}
diff --git a/osdep/terminal-win.c b/osdep/terminal-win.c
index 08aa878906..90f89935a0 100644
--- a/osdep/terminal-win.c
+++ b/osdep/terminal-win.c
@@ -226,15 +226,36 @@ bool terminal_in_background(void)
return false;
}
-int mp_write_console_ansi(HANDLE wstream, const char *format, va_list args)
+int mp_console_vfprintf(HANDLE wstream, const char *format, va_list args)
{
struct tmp_buffers *buffers = FlsGetValue(tmp_buffers_key);
- if (!buffers)
+ bool free_buf = false;
+ if (!buffers) {
buffers = talloc_zero(NULL, struct tmp_buffers);
+ free_buf = !FlsSetValue(tmp_buffers_key, buffers);
+ }
buffers->write_console_buf.len = 0;
bstr_xappend_vasprintf(buffers, &buffers->write_console_buf, format, args);
- int wlen = bstr_to_wchar(buffers, buffers->write_console_buf, &buffers->write_console_wbuf);
+
+ int ret = mp_console_fputs(wstream, buffers->write_console_buf);
+
+ if (free_buf)
+ talloc_free(buffers);
+
+ return ret;
+}
+
+int mp_console_fputs(HANDLE wstream, bstr str)
+{
+ struct tmp_buffers *buffers = FlsGetValue(tmp_buffers_key);
+ bool free_buf = false;
+ if (!buffers) {
+ buffers = talloc_zero(NULL, struct tmp_buffers);
+ free_buf = !FlsSetValue(tmp_buffers_key, buffers);
+ }
+
+ int wlen = bstr_to_wchar(buffers, str, &buffers->write_console_wbuf);
wchar_t *pos = buffers->write_console_wbuf;
while (*pos) {
@@ -380,7 +401,7 @@ int mp_write_console_ansi(HANDLE wstream, const char *format, va_list args)
int ret = buffers->write_console_buf.len;
- if (!FlsSetValue(tmp_buffers_key, buffers))
+ if (free_buf)
talloc_free(buffers);
return ret;
diff --git a/osdep/terminal.h b/osdep/terminal.h
index d3d0daa5db..9d60afa00a 100644
--- a/osdep/terminal.h
+++ b/osdep/terminal.h
@@ -54,7 +54,8 @@ void terminal_get_size(int *w, int *h);
void terminal_get_size2(int *rows, int *cols, int *px_width, int *px_height);
// Windows only.
-int mp_write_console_ansi(void *wstream, const char *format, va_list args);
+int mp_console_vfprintf(void *wstream, const char *format, va_list args);
+int mp_console_fputs(void *wstream, bstr str);
bool mp_check_console(void *handle);
/* Windows-only function to attach to the parent process's console */
diff --git a/test/test_utils.c b/test/test_utils.c
index 1673ef97ba..132601ac07 100644
--- a/test/test_utils.c
+++ b/test/test_utils.c
@@ -107,7 +107,8 @@ void mp_msg(struct mp_log *log, int lev, const char *format, ...) {};
int mp_msg_find_level(const char *s) {return 0;};
int mp_msg_level(struct mp_log *log) {return 0;};
void mp_msg_set_max_level(struct mp_log *log, int lev) {};
-int mp_write_console_ansi(void *wstream, const char *format, va_list args) {return 0;};
+int mp_console_vfprintf(void *wstream, const char *format, va_list args) {return 0;};
+int mp_console_fputs(void *wstream, bstr str) {return 0;};
bool mp_check_console(void *handle) { return false; };
void mp_set_avdict(AVDictionary **dict, char **kv) {};
struct mp_log *mp_log_new(void *talloc_ctx, struct mp_log *parent,