/*
==============
-COM_ParseToken
+COM_ParseToken_Simple
Parse a token out of a string
==============
*/
-int COM_ParseToken(const char **datapointer, int returnnewline)
+int COM_ParseToken_Simple(const char **datapointer, int returnnewline)
{
int len;
int c;
data++;
while (*data && (data[0] != '*' || data[1] != '/'))
data++;
- data += 2;
+ if (*data)
+ data++;
+ if (*data)
+ data++;
goto skipwhite;
}
else if (*data == '\"')
c = *data;
if (*data == '\\')
{
- if (data[1] == '"')
- {
- data++;
- c = *data;
- }
- else if (data[1] == '\'')
- {
- data++;
- c = *data;
- }
- else if (data[1] == 'n')
- {
- data++;
+ data++;
+ c = *data;
+ if (c == 'n')
c = '\n';
- }
- else if (data[1] == '\\')
- data++;
+ else if (c == 't')
+ c = '\t';
}
com_token[len++] = c;
}
*datapointer = data+1;
return true;
}
- else if (*data == '\'')
+ else if (*data == '\r')
+ {
+ // translate Mac line ending to UNIX
+ com_token[len++] = '\n';data++;
+ com_token[len] = 0;
+ *datapointer = data;
+ return true;
+ }
+ else if (*data == '\n')
+ {
+ // single character
+ com_token[len++] = *data++;
+ com_token[len] = 0;
+ *datapointer = data;
+ return true;
+ }
+ 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;
+ }
+ com_token[len] = 0;
+ *datapointer = data;
+ return true;
+ }
+}
+
+/*
+==============
+COM_ParseToken_QuakeC
+
+Parse a token out of a string
+==============
+*/
+int COM_ParseToken_QuakeC(const char **datapointer, int returnnewline)
+{
+ int len;
+ int c;
+ const char *data = *datapointer;
+
+ len = 0;
+ com_token[0] = 0;
+
+ if (!data)
+ {
+ *datapointer = NULL;
+ return false;
+ }
+
+// skip whitespace
+skipwhite:
+ // line endings:
+ // UNIX: \n
+ // Mac: \r
+ // Windows: \r\n
+ for (;*data <= ' ' && ((*data != '\n' && *data != '\r') || !returnnewline);data++)
+ {
+ if (*data == 0)
+ {
+ // end of file
+ *datapointer = NULL;
+ return false;
+ }
+ }
+
+ // handle Windows line ending
+ if (data[0] == '\r' && data[1] == '\n')
+ data++;
+
+ if (data[0] == '/' && data[1] == '/')
+ {
+ // comment
+ while (*data && *data != '\n' && *data != '\r')
+ data++;
+ goto skipwhite;
+ }
+ else if (data[0] == '/' && data[1] == '*')
+ {
+ // comment
+ data++;
+ while (*data && (data[0] != '*' || data[1] != '/'))
+ data++;
+ if (*data)
+ data++;
+ if (*data)
+ data++;
+ goto skipwhite;
+ }
+ else if (*data == '\"' || *data == '\'')
{
// quoted string
- for (data++;*data != '\'';data++)
+ char quote = *data;
+ for (data++;*data != quote;data++)
{
if (!*data || len >= (int)sizeof(com_token) - 1)
{
c = *data;
if (*data == '\\')
{
- if (data[1] == '"')
- {
- data++;
- c = *data;
- }
- else if (data[1] == '\'')
- {
- data++;
- c = *data;
- }
- else if (data[1] == 'n')
- {
- data++;
+ data++;
+ c = *data;
+ if (c == 'n')
c = '\n';
- }
- else if (data[1] == '\\')
- data++;
+ else if (c == 't')
+ c = '\t';
}
com_token[len++] = c;
}
else if (*data == '\r')
{
// translate Mac line ending to UNIX
- com_token[len++] = '\n';
+ com_token[len++] = '\n';data++;
com_token[len] = 0;
*datapointer = data;
return true;
}
- else if (*data == '\n' || *data == '{' || *data == '}' || *data == ')' || *data == '(' || *data == ']' || *data == '[' || *data == '\'' || *data == ':' || *data == ',' || *data == ';')
+ else if (*data == '\n' || *data == '{' || *data == '}' || *data == ')' || *data == '(' || *data == ']' || *data == '[' || *data == ':' || *data == ',' || *data == ';')
{
// single character
com_token[len++] = *data++;
else
{
// regular word
- for (;*data > ' ' && *data != '{' && *data != '}' && *data != ')' && *data != '(' && *data != ']' && *data != '[' && *data != '\'' && *data != ':' && *data != ',' && *data != ';' && *data != '\'' && *data != '"';data++)
+ for (;*data > ' ' && *data != '{' && *data != '}' && *data != ')' && *data != '(' && *data != ']' && *data != '[' && *data != ':' && *data != ',' && *data != ';';data++)
{
if (len >= (int)sizeof(com_token) - 1)
{
*datapointer = NULL;
return false;
}
+ com_token[len++] = *data;
+ }
+ com_token[len] = 0;
+ *datapointer = data;
+ return true;
+ }
+}
+
+/*
+==============
+COM_ParseToken_VM_Tokenize
+
+Parse a token out of a string
+==============
+*/
+int COM_ParseToken_VM_Tokenize(const char **datapointer, int returnnewline)
+{
+ int len;
+ int c;
+ const char *data = *datapointer;
+
+ len = 0;
+ com_token[0] = 0;
+
+ if (!data)
+ {
+ *datapointer = NULL;
+ return false;
+ }
+
+// skip whitespace
+skipwhite:
+ // line endings:
+ // UNIX: \n
+ // Mac: \r
+ // Windows: \r\n
+ for (;*data <= ' ' && ((*data != '\n' && *data != '\r') || !returnnewline);data++)
+ {
+ if (*data == 0)
+ {
+ // end of file
+ *datapointer = NULL;
+ return false;
+ }
+ }
+
+ // handle Windows line ending
+ if (data[0] == '\r' && data[1] == '\n')
+ data++;
+
+ if (data[0] == '/' && data[1] == '/')
+ {
+ // comment
+ while (*data && *data != '\n' && *data != '\r')
+ data++;
+ goto skipwhite;
+ }
+ else if (data[0] == '/' && data[1] == '*')
+ {
+ // comment
+ data++;
+ while (*data && (data[0] != '*' || data[1] != '/'))
+ data++;
+ if (*data)
+ data++;
+ if (*data)
+ data++;
+ goto skipwhite;
+ }
+ else if (*data == '\"' || *data == '\'')
+ {
+ char quote = *data;
+ // quoted string
+ for (data++;*data != quote;data++)
+ {
+ if (!*data || len >= (int)sizeof(com_token) - 1)
+ {
+ com_token[0] = 0;
+ *datapointer = NULL;
+ return false;
+ }
c = *data;
if (*data == '\\')
{
- if (data[1] == '"')
- {
- data++;
- c = *data;
- }
- else if (data[1] == '\'')
- {
- data++;
- c = *data;
- }
- else if (data[1] == 'n')
- {
- data++;
+ data++;
+ c = *data;
+ if (c == 'n')
c = '\n';
- }
- else if (data[1] == '\\')
- data++;
+ else if (c == 't')
+ c = '\t';
}
com_token[len++] = c;
}
com_token[len] = 0;
+ *datapointer = data+1;
+ return true;
+ }
+ else if (*data == '\r')
+ {
+ // translate Mac line ending to UNIX
+ com_token[len++] = '\n';data++;
+ com_token[len] = 0;
+ *datapointer = data;
+ return true;
+ }
+ else if (*data == '\n' || *data == '{' || *data == '}' || *data == ')' || *data == '(' || *data == ']' || *data == '[' || *data == ':' || *data == ',' || *data == ';')
+ {
+ // single character
+ com_token[len++] = *data++;
+ com_token[len] = 0;
+ *datapointer = data;
+ return true;
+ }
+ else
+ {
+ // 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;
+ }
+ com_token[len] = 0;
*datapointer = data;
return true;
}
/*
==============
-COM_ParseTokenConsole
+COM_ParseToken_Console
Parse a token out of a string, behaving like the qwcl console
==============
*/
-int COM_ParseTokenConsole(const char **datapointer)
+int COM_ParseToken_Console(const char **datapointer)
{
int len;
const char *data = *datapointer;
*datapointer = NULL;
return false;
}
+ // allow escaped " and \ case
+ if (*data == '\\' && (data[1] == '\"' || data[1] == '\\'))
+ data++;
com_token[len++] = *data;
}
com_token[len] = 0;