]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - prvm_edict.c
fix stupid bug in \n and \r parsing
[xonotic/darkplaces.git] / prvm_edict.c
index 1dc7024a2d4d82374d4d04a891ce6f303b5575c2..c6d5d77c184a2a51b3ca1ede61b992632e7d3bc2 100644 (file)
@@ -29,7 +29,7 @@ static prvm_prog_t prog_list[PRVM_MAXPROGS];
 int            prvm_type_size[8] = {1,sizeof(string_t)/4,1,3,1,1,sizeof(func_t)/4,sizeof(void *)/4};
 
 ddef_t *PRVM_ED_FieldAtOfs(int ofs);
-qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s);
+qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s, qboolean parsebackslash);
 
 // LordHavoc: optional runtime bounds checking (speed drain, but worth it for security, on by default - breaks most QCCX features (used by CRMod and others))
 #ifdef PRVM_BOUNDSCHECK_CVAR
@@ -896,7 +896,7 @@ void PRVM_ED_ParseGlobals (const char *data)
                        continue;
                }
 
-               if (!PRVM_ED_ParseEpair(NULL, key, com_token))
+               if (!PRVM_ED_ParseEpair(NULL, key, com_token, true))
                        PRVM_ERROR ("PRVM_ED_ParseGlobals: parse error");
        }
 }
@@ -912,7 +912,7 @@ Can parse either fields or globals
 returns false if error
 =============
 */
-qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s)
+qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s, qboolean parsebackslash)
 {
        int i, l;
        char *new_p;
@@ -931,15 +931,15 @@ qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s)
                val->string = PRVM_AllocString(l, &new_p);
                for (i = 0;i < l;i++)
                {
-                       if (s[i] == '\\' && i < l-1)
+                       if (s[i] == '\\' && s[i+1] == 'n' && parsebackslash)
                        {
                                i++;
-                               if (s[i] == 'n')
-                                       *new_p++ = '\n';
-                               else if (s[i] == 'r')
-                                       *new_p++ = '\r';
-                               else
-                                       *new_p++ = s[i];
+                               *new_p++ = '\n';
+                       }
+                       else if (s[i] == '\\' && s[i+1] == 'r' && parsebackslash)
+                       {
+                               i++;
+                               *new_p++ = '\r';
                        }
                        else
                                *new_p++ = s[i];
@@ -1108,7 +1108,7 @@ void PRVM_ED_EdictSet_f(void)
        if((key = PRVM_ED_FindField(Cmd_Argv(3))) == 0)
                Con_Printf("Key %s not found !\n", Cmd_Argv(3));
        else
-               PRVM_ED_ParseEpair(ed, key, Cmd_Argv(4));
+               PRVM_ED_ParseEpair(ed, key, Cmd_Argv(4), true);
 
        PRVM_End;
 }
@@ -1169,7 +1169,7 @@ const char *PRVM_ED_ParseEdict (const char *data, prvm_edict_t *ent)
                }
 
        // parse value
-               if (!COM_ParseToken_Simple(&data, false, true))
+               if (!COM_ParseToken_Simple(&data, false, false))
                        PRVM_ERROR ("PRVM_ED_ParseEdict: EOF without closing brace");
                if (developer_entityparsing.integer)
                        Con_Printf(" \"%s\"\n", com_token);
@@ -1202,7 +1202,7 @@ const char *PRVM_ED_ParseEdict (const char *data, prvm_edict_t *ent)
                        sprintf (com_token, "0 %s 0", temp);
                }
 
-               if (!PRVM_ED_ParseEpair(ent, key, com_token))
+               if (!PRVM_ED_ParseEpair(ent, key, com_token, strcmp(keyname, "wad") != 0))
                        PRVM_ERROR ("PRVM_ED_ParseEdict: parse error");
        }
 
@@ -1405,6 +1405,7 @@ void PRVM_FindOffsets(void)
        prog->fieldoffsets.message                        = PRVM_ED_FindFieldOffset("message");
        prog->fieldoffsets.modelflags                     = PRVM_ED_FindFieldOffset("modelflags");
        prog->fieldoffsets.movement                       = PRVM_ED_FindFieldOffset("movement");
+       prog->fieldoffsets.movetypesteplandevent          = PRVM_ED_FindFieldOffset("movetypesteplandevent");
        prog->fieldoffsets.netaddress                     = PRVM_ED_FindFieldOffset("netaddress");
        prog->fieldoffsets.nextthink                      = PRVM_ED_FindFieldOffset("nextthink");
        prog->fieldoffsets.nodrawtoclient                 = PRVM_ED_FindFieldOffset("nodrawtoclient");
@@ -2031,7 +2032,7 @@ void PRVM_GlobalSet_f(void)
        if( !global )
                Con_Printf( "No global '%s' in %s!\n", Cmd_Argv(2), Cmd_Argv(1) );
        else
-               PRVM_ED_ParseEpair( NULL, global, Cmd_Argv(3) );
+               PRVM_ED_ParseEpair( NULL, global, Cmd_Argv(3), true );
        PRVM_End;
 }