From 6ddb09ae21b379f7b921a9f1f9216d87df86ae8a Mon Sep 17 00:00:00 2001 From: bones_was_here Date: Tue, 2 Jan 2024 19:31:51 +1000 Subject: [PATCH] deduplicate Sys_ConsoleInput() Fixes multiline stdin not working in the SDL client, but working in the dedicated server. Signed-off-by: bones_was_here --- sys_sdl.c | 58 ------------------------------------------------- sys_shared.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ sys_unix.c | 61 ---------------------------------------------------- 3 files changed, 61 insertions(+), 119 deletions(-) diff --git a/sys_sdl.c b/sys_sdl.c index df25ae6a..4ce2d75e 100644 --- a/sys_sdl.c +++ b/sys_sdl.c @@ -1,6 +1,5 @@ #ifdef WIN32 #include // Include this BEFORE darkplaces.h because it uses strncpy which trips DP_STATIC_ASSERT -#include "conio.h" #else #include #include @@ -107,63 +106,6 @@ void Sys_Print(const char *text) #endif } -char *Sys_ConsoleInput(void) -{ - static char text[MAX_INPUTLINE]; - int len = 0; -#ifdef WIN32 - int c; - - // read a line out - while (_kbhit ()) - { - c = _getch (); - _putch (c); - if (c == '\r') - { - text[len] = 0; - _putch ('\n'); - len = 0; - return text; - } - if (c == 8) - { - if (len) - { - _putch (' '); - _putch (c); - len--; - text[len] = 0; - } - continue; - } - text[len] = c; - len++; - text[len] = 0; - if (len == sizeof (text)) - len = 0; - } -#else - fd_set fdset; - struct timeval timeout; - FD_ZERO(&fdset); - FD_SET(0, &fdset); // stdin - timeout.tv_sec = 0; - timeout.tv_usec = 0; - if (select (1, &fdset, NULL, NULL, &timeout) != -1 && FD_ISSET(0, &fdset)) - { - len = read (0, text, sizeof(text)); - if (len >= 1) - { - // rip off the \n and terminate - text[len-1] = 0; - return text; - } - } -#endif - return NULL; -} - char *Sys_GetClipboardData (void) { char *data = NULL; diff --git a/sys_shared.c b/sys_shared.c index 0bb69c25..7b33f3a3 100644 --- a/sys_shared.c +++ b/sys_shared.c @@ -15,6 +15,7 @@ # include # include // timeGetTime # include // localtime +# include // _kbhit, _getch, _putch #ifdef _MSC_VER #pragma comment(lib, "winmm.lib") #endif @@ -554,6 +555,66 @@ void Sys_Printf(const char *fmt, ...) Sys_Print(msg); } +char *Sys_ConsoleInput(void) +{ + static char text[MAX_INPUTLINE]; + static unsigned int len = 0; +#ifdef WIN32 + int c; + + // read a line out + while (_kbhit ()) + { + c = _getch (); + if (c == '\r') + { + text[len] = '\0'; + _putch ('\n'); + len = 0; + return text; + } + if (c == '\b') + { + if (len) + { + _putch (c); + _putch (' '); + _putch (c); + len--; + } + continue; + } + if (len < sizeof (text) - 1) + { + _putch (c); + text[len] = c; + len++; + } + } +#else + fd_set fdset; + struct timeval timeout; + FD_ZERO(&fdset); + FD_SET(0, &fdset); // stdin + timeout.tv_sec = 0; + timeout.tv_usec = 0; + if (select (1, &fdset, NULL, NULL, &timeout) != -1 && FD_ISSET(0, &fdset)) + { + len = read (0, text, sizeof(text) - 1); + if (len >= 1) + { + // rip off the \n and terminate + // div0: WHY? console code can deal with \n just fine + // this caused problems with pasting stuff into a terminal window + // so, not ripping off the \n, but STILL keeping a NUL terminator + text[len] = 0; + return text; + } + } +#endif + return NULL; +} + #ifndef WIN32 static const char *Sys_FindInPATH(const char *name, char namesep, const char *PATH, char pathsep, char *buf, size_t bufsize) { diff --git a/sys_unix.c b/sys_unix.c index 49990f1f..d7b2ad9e 100644 --- a/sys_unix.c +++ b/sys_unix.c @@ -3,7 +3,6 @@ #include #include #include -#include "conio.h" #else #include #include @@ -71,66 +70,6 @@ void Sys_Print(const char *text) //fprintf(stdout, "%s", text); } -char *Sys_ConsoleInput(void) -{ - static char text[MAX_INPUTLINE]; - static unsigned int len = 0; -#ifdef WIN32 - int c; - - // read a line out - while (_kbhit ()) - { - c = _getch (); - if (c == '\r') - { - text[len] = '\0'; - _putch ('\n'); - len = 0; - return text; - } - if (c == '\b') - { - if (len) - { - _putch (c); - _putch (' '); - _putch (c); - len--; - } - continue; - } - if (len < sizeof (text) - 1) - { - _putch (c); - text[len] = c; - len++; - } - } -#else - fd_set fdset; - struct timeval timeout; - FD_ZERO(&fdset); - FD_SET(0, &fdset); // stdin - timeout.tv_sec = 0; - timeout.tv_usec = 0; - if (select (1, &fdset, NULL, NULL, &timeout) != -1 && FD_ISSET(0, &fdset)) - { - len = read (0, text, sizeof(text) - 1); - if (len >= 1) - { - // rip off the \n and terminate - // div0: WHY? console code can deal with \n just fine - // this caused problems with pasting stuff into a terminal window - // so, not ripping off the \n, but STILL keeping a NUL terminator - text[len] = 0; - return text; - } - } -#endif - return NULL; -} - char *Sys_GetClipboardData (void) { return NULL; -- 2.39.2