From ca913e8190a32d6e96dededdb0a6f8d5ce72bf63 Mon Sep 17 00:00:00 2001 From: havoc Date: Thu, 4 Dec 2003 09:47:38 +0000 Subject: [PATCH] console parsing now behaves like qwcl, thanks to Fuh for pointing out the problems with the winquake COM_ParseToken (it treated : as a single character keyword, thus breaking connect commands involving a port, for example), so I added COM_ParseTokenConsole for the console parsing git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@3686 d7cf8633-e32d-0410-b094-e92efae38249 --- cmd.c | 2 +- common.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ common.h | 1 + 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/cmd.c b/cmd.c index b6436b38..d2b0b115 100644 --- a/cmd.c +++ b/cmd.c @@ -552,7 +552,7 @@ static void Cmd_TokenizeString (const char *text) if (cmd_argc == 1) cmd_args = text; - if (!COM_ParseToken(&text, false)) + if (!COM_ParseTokenConsole(&text)) return; if (cmd_argc < MAX_ARGS) diff --git a/common.c b/common.c index c94ef453..518ad5b9 100644 --- a/common.c +++ b/common.c @@ -598,6 +598,81 @@ skipwhite: return true; } +/* +============== +COM_ParseTokenConsole + +Parse a token out of a string, behaving like the qwcl console +============== +*/ +int COM_ParseTokenConsole(const char **datapointer) +{ + int c; + int len; + const char *data = *datapointer; + + len = 0; + com_token[0] = 0; + + if (!data) + { + *datapointer = NULL; + return false; + } + +// skip whitespace +skipwhite: + while ((c = *data) <= ' ') + { + if (c == 0) + { + // end of file + *datapointer = NULL; + return false; + } + data++; + } + + // skip // comments + if (c == '/' && data[1] == '/') + { + while (*data && *data != '\n') + data++; + goto skipwhite; + } + +// handle quoted strings specially + if (c == '\"') + { + data++; + while (1) + { + c = *data++; + if (c == '\"' || !c) + { + com_token[len] = 0; + *datapointer = data; + return true; + } + com_token[len] = c; + len++; + } + } + +// parse a regular word + do + { + com_token[len] = c; + data++; + len++; + c = *data; + } while (c>32); + + com_token[len] = 0; + *datapointer = data; + return true; +} + /* ================ diff --git a/common.h b/common.h index e30c1403..1ba72a8a 100644 --- a/common.h +++ b/common.h @@ -143,6 +143,7 @@ float MSG_ReadDPCoord (void); extern char com_token[1024]; int COM_ParseToken(const char **datapointer, int returnnewline); +int COM_ParseTokenConsole(const char **datapointer); extern int com_argc; extern const char **com_argv; -- 2.39.2