]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - prvm_edict.c
centralized GL_VENDOR/GL_RENDERER/etc printing code
[xonotic/darkplaces.git] / prvm_edict.c
index 9e85cfc7dac516f735d56f1bc77a29ae73790782..77c8f4ba1e8ece08135a332a2f1e19b39976b9e8 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
@@ -479,6 +479,11 @@ char *PRVM_UglyValueString (etype_t type, prvm_eval_t *val)
                                line[i++] = '\\';
                                line[i++] = 'r';
                        }
+                       else if (*s == '\\')
+                       {
+                               line[i++] = '\\';
+                               line[i++] = '\\';
+                       }
                        else
                                line[i++] = *s;
                        s++;
@@ -896,7 +901,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 +917,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,7 +936,7 @@ 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] && parsebackslash)
                        {
                                i++;
                                if (s[i] == 'n')
@@ -982,7 +987,12 @@ qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s)
                break;
 
        case ev_field:
-               def = PRVM_ED_FindField(s);
+               if (*s != '.')
+               {
+                       Con_DPrintf("PRVM_ED_ParseEpair: Bogus field name %s in %s\n", s, PRVM_NAME);
+                       return false;
+               }
+               def = PRVM_ED_FindField(s + 1);
                if (!def)
                {
                        Con_DPrintf("PRVM_ED_ParseEpair: Can't find field %s in %s\n", s, PRVM_NAME);
@@ -1103,7 +1113,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;
 }
@@ -1164,7 +1174,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);
@@ -1197,7 +1207,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");
        }
 
@@ -1400,6 +1410,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");
@@ -1425,6 +1436,7 @@ void PRVM_FindOffsets(void)
        prog->funcoffsets.CSQC_ConsoleCommand             = PRVM_ED_FindFunctionOffset("CSQC_ConsoleCommand");
        prog->funcoffsets.CSQC_Ent_Remove                 = PRVM_ED_FindFunctionOffset("CSQC_Ent_Remove");
        prog->funcoffsets.CSQC_Ent_Update                 = PRVM_ED_FindFunctionOffset("CSQC_Ent_Update");
+       prog->funcoffsets.CSQC_Ent_Spawn                  = PRVM_ED_FindFunctionOffset("CSQC_Ent_Spawn");
        prog->funcoffsets.CSQC_Event                      = PRVM_ED_FindFunctionOffset("CSQC_Event");
        prog->funcoffsets.CSQC_Event_Sound                = PRVM_ED_FindFunctionOffset("CSQC_Event_Sound");
        prog->funcoffsets.CSQC_Init                       = PRVM_ED_FindFunctionOffset("CSQC_Init");
@@ -2025,7 +2037,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;
 }
 
@@ -2106,10 +2118,10 @@ void _PRVM_FreeAll(const char *filename, int fileline)
 }
 
 // LordHavoc: turned PRVM_EDICT_NUM into a #define for speed reasons
-prvm_edict_t *PRVM_EDICT_NUM_ERROR(int n, char *filename, int fileline)
+unsigned int PRVM_EDICT_NUM_ERROR(unsigned int n, char *filename, int fileline)
 {
        PRVM_ERROR ("PRVM_EDICT_NUM: %s: bad number %i (called at %s:%i)", PRVM_NAME, n, filename, fileline);
-       return NULL;
+       return 0;
 }
 
 /*