]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - prvm_edict.c
strncpy -> {strlcpy,memcpy}. Replaced the "forceloop" boolean in "channel_t" by a...
[xonotic/darkplaces.git] / prvm_edict.c
index 45f17c610dbca203da877c79b7c69c187521a41d..67bc940d36d1938ef66297b4484e02320044103a 100644 (file)
@@ -383,7 +383,7 @@ char *PRVM_ValueString (etype_t type, prvm_eval_t *val)
        switch (type)
        {
        case ev_string:
-               sprintf (line, "%s", PRVM_GetString(val->string));
+               strlcpy (line, PRVM_GetString (val->string), sizeof (line));
                break;
        case ev_entity:
                n = val->edict;
@@ -470,7 +470,7 @@ char *PRVM_UglyValueString (etype_t type, prvm_eval_t *val)
                break;
        case ev_function:
                f = pr_functions + val->function;
-               snprintf (line, sizeof (line), "%s", PRVM_GetString(f->s_name));
+               strlcpy (line, PRVM_GetString (f->s_name), sizeof (line));
                break;
        case ev_field:
                def = PRVM_ED_FieldAtOfs ( val->_int );
@@ -557,7 +557,7 @@ For debugging
 */
 // LordHavoc: optimized this to print out much more quickly (tempstring)
 // LordHavoc: changed to print out every 4096 characters (incase there are a lot of fields to print)
-void PRVM_ED_Print (prvm_edict_t *ed)
+void PRVM_ED_Print(prvm_edict_t *ed)
 {
        int             l;
        ddef_t  *d;
@@ -569,7 +569,7 @@ void PRVM_ED_Print (prvm_edict_t *ed)
 
        if (ed->e->free)
        {
-               Con_Printf ("%s: FREE\n",PRVM_NAME);
+               Con_Printf("%s: FREE\n",PRVM_NAME);
                return;
        }
 
@@ -595,7 +595,7 @@ void PRVM_ED_Print (prvm_edict_t *ed)
 
                if (strlen(name) > 256)
                {
-                       strncpy(tempstring2, name, 256);
+                       memcpy (tempstring2, name, 256);
                        tempstring2[256] = tempstring2[257] = tempstring2[258] = '.';
                        tempstring2[259] = 0;
                        name = tempstring2;
@@ -608,7 +608,7 @@ void PRVM_ED_Print (prvm_edict_t *ed)
                name = PRVM_ValueString(d->type, (prvm_eval_t *)v);
                if (strlen(name) > 256)
                {
-                       strncpy(tempstring2, name, 256);
+                       memcpy (tempstring2, name, 256);
                        tempstring2[256] = tempstring2[257] = tempstring2[258] = '.';
                        tempstring2[259] = 0;
                        name = tempstring2;
@@ -617,12 +617,12 @@ void PRVM_ED_Print (prvm_edict_t *ed)
                strcat(tempstring, "\n");
                if (strlen(tempstring) >= 4096)
                {
-                       Con_Printf("%s", tempstring);
+                       Con_Print(tempstring);
                        tempstring[0] = 0;
                }
        }
        if (tempstring[0])
-               Con_Printf("%s", tempstring);
+               Con_Print(tempstring);
 }
 
 /*
@@ -640,11 +640,11 @@ void PRVM_ED_Write (qfile_t *f, prvm_edict_t *ed)
        char    *name;
        int             type;
 
-       FS_Print(f, "{\n");
+       FS_Print(f, "{\n");
 
        if (ed->e->free)
        {
-               FS_Print(f, "}\n");
+               FS_Print(f, "}\n");
                return;
        }
 
@@ -665,16 +665,16 @@ void PRVM_ED_Write (qfile_t *f, prvm_edict_t *ed)
                if (j == prvm_type_size[type])
                        continue;
 
-               FS_Printf (f,"\"%s\" ",name);
-               FS_Printf (f,"\"%s\"\n", PRVM_UglyValueString(d->type, (prvm_eval_t *)v));
+               FS_Printf(f,"\"%s\" ",name);
+               FS_Printf(f,"\"%s\"\n", PRVM_UglyValueString(d->type, (prvm_eval_t *)v));
        }
 
-       FS_Print(f, "}\n");
+       FS_Print(f, "}\n");
 }
 
 void PRVM_ED_PrintNum (int ent)
 {
-       PRVM_ED_Print (PRVM_EDICT_NUM(ent));
+       PRVM_ED_Print(PRVM_EDICT_NUM(ent));
 }
 
 /*
@@ -690,7 +690,7 @@ void PRVM_ED_PrintEdicts_f (void)
 
        if(Cmd_Argc() != 2)
        {
-               Con_Printf("prvm_edicts <program name>\n");
+               Con_Print("prvm_edicts <program name>\n");
                return;
        }
        
@@ -698,7 +698,7 @@ void PRVM_ED_PrintEdicts_f (void)
        if(!PRVM_SetProgFromString(Cmd_Argv(1)))
                return;
 
-       Con_Printf ("%s: %i entities\n", PRVM_NAME, prog->num_edicts);
+       Con_Printf("%s: %i entities\n", PRVM_NAME, prog->num_edicts);
        for (i=0 ; i<prog->num_edicts ; i++)
                PRVM_ED_PrintNum (i);
 
@@ -718,7 +718,7 @@ void PRVM_ED_PrintEdict_f (void)
 
        if(Cmd_Argc() != 3)
        {
-               Con_Printf("prvm_edict <program name> <edict number>\n");
+               Con_Print("prvm_edict <program name> <edict number>\n");
                return;
        }
 
@@ -729,7 +729,7 @@ void PRVM_ED_PrintEdict_f (void)
        i = atoi (Cmd_Argv(2));
        if (i >= prog->num_edicts)
        {
-               Con_Printf("Bad edict number\n");
+               Con_Print("Bad edict number\n");
                PRVM_End;
                return;
        }
@@ -755,7 +755,7 @@ void PRVM_ED_Count_f (void)
 
        if(Cmd_Argc() != 2)
        {
-               Con_Printf("prvm_count <program name>\n");
+               Con_Print("prvm_count <program name>\n");
                return;
        }
 
@@ -776,8 +776,8 @@ void PRVM_ED_Count_f (void)
                        active++;
                }
                
-               Con_Printf ("num_edicts:%3i\n", prog->num_edicts);
-               Con_Printf ("active    :%3i\n", active);
+               Con_Printf("num_edicts:%3i\n", prog->num_edicts);
+               Con_Printf("active    :%3i\n", active);
        }
 
        PRVM_End;
@@ -804,7 +804,7 @@ void PRVM_ED_WriteGlobals (qfile_t *f)
        char            *name;
        int                     type;
 
-       FS_Print(f,"{\n");
+       FS_Print(f,"{\n");
        for (i=0 ; i<prog->progs->numglobaldefs ; i++)
        {
                def = &prog->globaldefs[i];
@@ -817,10 +817,10 @@ void PRVM_ED_WriteGlobals (qfile_t *f)
                        continue;
 
                name = PRVM_GetString(def->s_name);
-               FS_Printf (f,"\"%s\" ", name);
-               FS_Printf (f,"\"%s\"\n", PRVM_UglyValueString(type, (prvm_eval_t *)&prog->globals[def->ofs]));
+               FS_Printf(f,"\"%s\" ", name);
+               FS_Printf(f,"\"%s\"\n", PRVM_UglyValueString(type, (prvm_eval_t *)&prog->globals[def->ofs]));
        }
-       FS_Print(f,"}\n");
+       FS_Print(f,"}\n");
 }
 
 /*
@@ -853,7 +853,7 @@ void PRVM_ED_ParseGlobals (const char *data)
                key = PRVM_ED_FindGlobal (keyname);
                if (!key)
                {
-                       Con_DPrintf ("'%s' is not a global on %s\n", keyname, PRVM_NAME);
+                       Con_DPrintf("'%s' is not a global on %s\n", keyname, PRVM_NAME);
                        continue;
                }
 
@@ -896,7 +896,6 @@ char *PRVM_ED_NewString (const char *string)
        return new;
 }
 
-
 /*
 =============
 PRVM_ED_ParseEval
@@ -972,7 +971,7 @@ qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s)
                func = PRVM_ED_FindFunction(s);
                if (!func)
                {
-                       Con_Printf ("PRVM_ED_ParseEpair: Can't find function %s in %s\n", s, PRVM_NAME);
+                       Con_Printf("PRVM_ED_ParseEpair: Can't find function %s in %s\n", s, PRVM_NAME);
                        return false;
                }
                val->function = func - prog->functions;
@@ -985,6 +984,44 @@ qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s)
        return true;
 }
 
+/*
+=============
+PRVM_ED_EdictSet_f
+
+Console command to set a field of a specified edict
+=============
+*/
+void PRVM_ED_EdictSet_f(void)
+{
+       prvm_edict_t *ed;
+       ddef_t *key;
+
+       if(Cmd_Argc() != 5)
+       {
+               Con_Print("prvm_edictset <program name> <edict number> <field> <value>\n");
+               return;
+       }
+
+       PRVM_Begin;
+       if(!PRVM_SetProgFromString(Cmd_Argv(1)))
+       {
+               Con_Printf("Wrong program name %s !\n", Cmd_Argv(1));
+               return;
+       }
+
+       ed = PRVM_EDICT_NUM(atoi(Cmd_Argv(2)));
+
+       if((key = PRVM_ED_FindField(Cmd_Argv(3))) == 0)
+       {
+               Con_Printf("Key %s not found !\n", Cmd_Argv(3));
+               return;
+       }
+
+       PRVM_ED_ParseEpair(ed, key, Cmd_Argv(4));
+
+       PRVM_End;
+}
+
 /*
 ====================
 PRVM_ED_ParseEdict
@@ -1058,7 +1095,7 @@ const char *PRVM_ED_ParseEdict (const char *data, prvm_edict_t *ent)
                key = PRVM_ED_FindField (keyname);
                if (!key)
                {
-                       Con_DPrintf ("%s: '%s' is not a field\n", PRVM_NAME, keyname);
+                       Con_DPrintf("%s: '%s' is not a field\n", PRVM_NAME, keyname);
                        continue;
                }
 
@@ -1141,8 +1178,8 @@ void PRVM_ED_LoadFromFile (const char *data)
                        string_t handle =  *(string_t*)&((float*)ent->v)[PRVM_ED_FindFieldOffset("classname")];
                        if (!handle)
                        {
-                               Con_Print("No classname for:\n");
-                               PRVM_ED_Print (ent);
+                               Con_Print("No classname for:\n");
+                               PRVM_ED_Print(ent);
                                PRVM_ED_Free (ent);
                                continue;
                        }
@@ -1154,8 +1191,8 @@ void PRVM_ED_LoadFromFile (const char *data)
                        {
                                if (developer.integer) // don't confuse non-developers with errors
                                {
-                                       Con_Print("No spawn function for:\n");
-                                       PRVM_ED_Print (ent);
+                                       Con_Print("No spawn function for:\n");
+                                       PRVM_ED_Print(ent);
                                }
                                PRVM_ED_Free (ent);
                                continue;
@@ -1171,7 +1208,7 @@ void PRVM_ED_LoadFromFile (const char *data)
                        died++;
        }
 
-       Con_DPrintf ("%s: %i new entities parsed, %i new inhibited, %i (%i new) spawned (whereas %i removed self, %i stayed)\n", PRVM_NAME, parsed, inhibited, prog->num_edicts, spawned, died, spawned - died);
+       Con_DPrintf("%s: %i new entities parsed, %i new inhibited, %i (%i new) spawned (whereas %i removed self, %i stayed)\n", PRVM_NAME, parsed, inhibited, prog->num_edicts, spawned, died, spawned - died);
 }      
 
 // not used
@@ -1232,22 +1269,16 @@ void PRVM_LoadProgs (const char * filename, int numrequiredfunc, char **required
        int i;
        dstatement_t *st;
        ddef_t *infielddefs;
-       void *temp;
        dfunction_t *dfunctions;
 
        Mem_EmptyPool(prog->progs_mempool);
        Mem_EmptyPool(prog->edictstring_mempool);
 
-       temp = FS_LoadFile (filename, false);
-       if (temp == 0)
+       prog->progs = (dprograms_t *)FS_LoadFile (filename, prog->progs_mempool, false);
+       if (prog->progs == NULL)
                PRVM_ERROR ("PRVM_LoadProgs: couldn't load %s for %s", filename, PRVM_NAME);
 
-       prog->progs = (dprograms_t *)Mem_Alloc(prog->progs_mempool, fs_filesize);
-
-       memcpy(prog->progs, temp, fs_filesize);
-       Mem_Free(temp);
-
-       Con_DPrintf ("%s programs occupy %iK.\n", PRVM_NAME, fs_filesize/1024);
+       Con_DPrintf("%s programs occupy %iK.\n", PRVM_NAME, fs_filesize/1024);
 
        pr_crc = CRC_Block((qbyte *)prog->progs, fs_filesize);
 
@@ -1485,14 +1516,14 @@ void PRVM_Fields_f (void)
        /*
        if (!sv.active)
        {
-               Con_Printf("no progs loaded\n");
+               Con_Print("no progs loaded\n");
                return;
        }
        */
 
        if(Cmd_Argc() != 2)
        {
-               Con_Printf("prvm_fields <program name>\n");
+               Con_Print("prvm_fields <program name>\n");
                return;
        }
 
@@ -1566,7 +1597,7 @@ void PRVM_Fields_f (void)
                }
                if (strlen(name) > 256)
                {
-                       strncpy(tempstring2, name, 256);
+                       memcpy (tempstring2, name, 256);
                        tempstring2[256] = tempstring2[257] = tempstring2[258] = '.';
                        tempstring2[259] = 0;
                        name = tempstring2;
@@ -1579,7 +1610,7 @@ void PRVM_Fields_f (void)
                strcat(tempstring, "\n");
                if (strlen(tempstring) >= 4096)
                {
-                       Con_Printf("%s", tempstring);
+                       Con_Print(tempstring);
                        tempstring[0] = 0;
                }
                if (counts[i])
@@ -1600,12 +1631,12 @@ void PRVM_Globals_f (void)
        // TODO
        /*if (!sv.active)
        {
-               Con_Printf("no progs loaded\n");
+               Con_Print("no progs loaded\n");
                return;
        }*/
        if(Cmd_Argc () != 2)
        {
-               Con_Printf("prvm_globals <program name>\n");
+               Con_Print("prvm_globals <program name>\n");
                return;
        }
 
@@ -1635,6 +1666,7 @@ void PRVM_Init (void)
        Cmd_AddCommand ("prvm_profile", PRVM_Profile_f);
        Cmd_AddCommand ("prvm_fields", PRVM_Fields_f);
        Cmd_AddCommand ("prvm_globals", PRVM_Globals_f);
+       Cmd_AddCommand ("prvm_edictset", PRVM_ED_EdictSet_f);
        // LordHavoc: optional runtime bounds checking (speed drain, but worth it for security, on by default - breaks most QCCX features (used by CRMod and others))
        Cvar_RegisterVariable (&prvm_boundscheck);
        Cvar_RegisterVariable (&prvm_traceqc);