]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - common.c
added support for single-quoted strings in COM_ParseTokenConsole
[xonotic/darkplaces.git] / common.c
index e3c95da46a92c47524cc6ca55e6296608e8096a6..ab5fc3195cda1864e69ccb49143cf26b2e8f1b5e 100644 (file)
--- a/common.c
+++ b/common.c
@@ -673,6 +673,7 @@ Parse a token out of a string
 int COM_ParseToken(const char **datapointer, int returnnewline)
 {
        int len;
+       int c;
        const char *data = *datapointer;
 
        len = 0;
@@ -725,15 +726,34 @@ skipwhite:
                // quoted string
                for (data++;*data != '\"';data++)
                {
-                       if (*data == '\\' && data[1] == '"' )
-                               data++;
                        if (!*data || len >= (int)sizeof(com_token) - 1)
                        {
                                com_token[0] = 0;
                                *datapointer = NULL;
                                return false;
                        }
-                       com_token[len++] = *data;
+                       c = *data;
+                       if (*data == '\\')
+                       {
+                               if (data[1] == '"')
+                               {
+                                       data++;
+                                       c = *data;
+                               }
+                               else if (data[1] == '\'')
+                               {
+                                       data++;
+                                       c = *data;
+                               }
+                               else if (data[1] == 'n')
+                               {
+                                       data++;
+                                       c = '\n';
+                               }
+                               else if (data[1] == '\\')
+                                       data++;
+                       }
+                       com_token[len++] = c;
                }
                com_token[len] = 0;
                *datapointer = data+1;
@@ -744,15 +764,34 @@ skipwhite:
                // quoted string
                for (data++;*data != '\'';data++)
                {
-                       if (*data == '\\' && data[1] == '\'' )
-                               data++;
                        if (!*data || len >= (int)sizeof(com_token) - 1)
                        {
                                com_token[0] = 0;
                                *datapointer = NULL;
                                return false;
                        }
-                       com_token[len++] = *data;
+                       c = *data;
+                       if (*data == '\\')
+                       {
+                               if (data[1] == '"')
+                               {
+                                       data++;
+                                       c = *data;
+                               }
+                               else if (data[1] == '\'')
+                               {
+                                       data++;
+                                       c = *data;
+                               }
+                               else if (data[1] == 'n')
+                               {
+                                       data++;
+                                       c = '\n';
+                               }
+                               else if (data[1] == '\\')
+                                       data++;
+                       }
+                       com_token[len++] = c;
                }
                com_token[len] = 0;
                *datapointer = data+1;
@@ -785,7 +824,28 @@ skipwhite:
                                *datapointer = NULL;
                                return false;
                        }
-                       com_token[len++] = *data;
+                       c = *data;
+                       if (*data == '\\')
+                       {
+                               if (data[1] == '"')
+                               {
+                                       data++;
+                                       c = *data;
+                               }
+                               else if (data[1] == '\'')
+                               {
+                                       data++;
+                                       c = *data;
+                               }
+                               else if (data[1] == 'n')
+                               {
+                                       data++;
+                                       c = '\n';
+                               }
+                               else if (data[1] == '\\')
+                                       data++;
+                       }
+                       com_token[len++] = c;
                }
                com_token[len] = 0;
                *datapointer = data;
@@ -849,6 +909,22 @@ skipwhite:
                com_token[len] = 0;
                *datapointer = data+1;
        }
+       else if (*data == '\'')
+       {
+               // quoted string
+               for (data++;*data != '\'';data++)
+               {
+                       if (!*data || len >= (int)sizeof(com_token) - 1)
+                       {
+                               com_token[0] = 0;
+                               *datapointer = NULL;
+                               return false;
+                       }
+                       com_token[len++] = *data;
+               }
+               com_token[len] = 0;
+               *datapointer = data+1;
+       }
        else
        {
                // regular word