From 250ec6ff92c3df1936799e60307ac5cffe467899 Mon Sep 17 00:00:00 2001 From: havoc Date: Sat, 18 Aug 2007 17:50:23 +0000 Subject: [PATCH] improved COM_ParseToken functions to continue parsing after the token buffer fills up (a better behavior than aborting parsing) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7528 d7cf8633-e32d-0410-b094-e92efae38249 --- common.c | 104 +++++++++++++++++-------------------------------------- 1 file changed, 32 insertions(+), 72 deletions(-) diff --git a/common.c b/common.c index 8f532520..e0154eec 100644 --- a/common.c +++ b/common.c @@ -727,14 +727,8 @@ skipwhite: else if (*data == '\"') { // quoted string - for (data++;*data != '\"';data++) + for (data++;*data && *data != '\"';data++) { - if (!*data || len >= (int)sizeof(com_token) - 1) - { - com_token[0] = 0; - *datapointer = NULL; - return false; - } c = *data; if (*data == '\\') { @@ -745,10 +739,13 @@ skipwhite: else if (c == 't') c = '\t'; } - com_token[len++] = c; + if (len < (int)sizeof(com_token) - 1) + com_token[len++] = c; } com_token[len] = 0; - *datapointer = data+1; + if (*data == '\"') + data++; + *datapointer = data; return true; } else if (*data == '\r') @@ -771,15 +768,8 @@ skipwhite: { // regular word for (;*data > ' ';data++) - { - if (len >= (int)sizeof(com_token) - 1) - { - com_token[0] = 0; - *datapointer = NULL; - return false; - } - com_token[len++] = *data; - } + if (len < (int)sizeof(com_token) - 1) + com_token[len++] = *data; com_token[len] = 0; *datapointer = data; return true; @@ -851,14 +841,8 @@ skipwhite: { // quoted string char quote = *data; - for (data++;*data != quote;data++) + for (data++;*data && *data != quote;data++) { - if (!*data || len >= (int)sizeof(com_token) - 1) - { - com_token[0] = 0; - *datapointer = NULL; - return false; - } c = *data; if (*data == '\\') { @@ -869,10 +853,13 @@ skipwhite: else if (c == 't') c = '\t'; } - com_token[len++] = c; + if (len < (int)sizeof(com_token) - 1) + com_token[len++] = c; } com_token[len] = 0; - *datapointer = data+1; + if (*data == quote) + data++; + *datapointer = data; return true; } else if (*data == '\r') @@ -895,15 +882,8 @@ skipwhite: { // regular word for (;*data > ' ' && *data != '{' && *data != '}' && *data != ')' && *data != '(' && *data != ']' && *data != '[' && *data != ':' && *data != ',' && *data != ';';data++) - { - if (len >= (int)sizeof(com_token) - 1) - { - com_token[0] = 0; - *datapointer = NULL; - return false; - } - com_token[len++] = *data; - } + if (len < (int)sizeof(com_token) - 1) + com_token[len++] = *data; com_token[len] = 0; *datapointer = data; return true; @@ -975,14 +955,8 @@ skipwhite: { char quote = *data; // quoted string - for (data++;*data != quote;data++) + for (data++;*data && *data != quote;data++) { - if (!*data || len >= (int)sizeof(com_token) - 1) - { - com_token[0] = 0; - *datapointer = NULL; - return false; - } c = *data; if (*data == '\\') { @@ -993,10 +967,13 @@ skipwhite: else if (c == 't') c = '\t'; } - com_token[len++] = c; + if (len < (int)sizeof(com_token) - 1) + com_token[len++] = c; } com_token[len] = 0; - *datapointer = data+1; + if (*data == quote) + data++; + *datapointer = data; return true; } else if (*data == '\r') @@ -1019,15 +996,8 @@ skipwhite: { // regular word for (;*data > ' ' && *data != ',' && *data != ';' && *data != '{' && *data != '}' && *data != ')' && *data != '(' && *data != ']' && *data != '[' && *data != ':' && *data != ',' && *data != ';';data++) - { - if (len >= (int)sizeof(com_token) - 1) - { - com_token[0] = 0; - *datapointer = NULL; - return false; - } - com_token[len++] = *data; - } + if (len < (int)sizeof(com_token) - 1) + com_token[len++] = *data; com_token[len] = 0; *datapointer = data; return true; @@ -1077,35 +1047,25 @@ skipwhite: else if (*data == '\"') { // quoted string - for (data++;*data != '\"';data++) + for (data++;*data && *data != '\"';data++) { - if (!*data || len >= (int)sizeof(com_token) - 1) - { - com_token[0] = 0; - *datapointer = NULL; - return false; - } // allow escaped " and \ case if (*data == '\\' && (data[1] == '\"' || data[1] == '\\')) data++; - com_token[len++] = *data; + if (len < (int)sizeof(com_token) - 1) + com_token[len++] = *data; } com_token[len] = 0; - *datapointer = data+1; + if (*data == '\"') + data++; + *datapointer = data; } else { // regular word for (;*data > ' ';data++) - { - if (len >= (int)sizeof(com_token) - 1) - { - com_token[0] = 0; - *datapointer = NULL; - return false; - } - com_token[len++] = *data; - } + if (len < (int)sizeof(com_token) - 1) + com_token[len++] = *data; com_token[len] = 0; *datapointer = data; } -- 2.39.2