]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - pr_edict.c
fix a severe bug with the checking of WSAStartup (basically any socket after the...
[xonotic/darkplaces.git] / pr_edict.c
index 750c26c23d82e4829600b262508ecb70fd0e0494..2a77bac1d4df77add0a2927f635045d3f2c6103d 100644 (file)
@@ -42,7 +42,7 @@ int           type_size[8] = {1,sizeof(string_t)/4,1,3,1,1,sizeof(func_t)/4,sizeof(void *
 ddef_t *ED_FieldAtOfs(int ofs);
 qboolean ED_ParseEpair(edict_t *ent, ddef_t *key, const char *s);
 
-cvar_t pr_checkextension = {0, "pr_checkextension", "1"};
+cvar_t pr_checkextension = {CVAR_READONLY, "pr_checkextension", "1"};
 cvar_t nomonsters = {0, "nomonsters", "0"};
 cvar_t gamecfg = {0, "gamecfg", "0"};
 cvar_t scratch1 = {0, "scratch1", "0"};
@@ -380,7 +380,7 @@ PR_ValueString
 Returns a string describing *data in a type specific manner
 =============
 */
-int NoCrash_NUM_FOR_EDICT(edict_t *e);
+//int NoCrash_NUM_FOR_EDICT(edict_t *e);
 char *PR_ValueString (etype_t type, eval_t *val)
 {
        static char line[1024]; // LordHavoc: enlarged a bit (was 256)
@@ -393,40 +393,40 @@ char *PR_ValueString (etype_t type, eval_t *val)
        switch (type)
        {
        case ev_string:
-               sprintf (line, "%s", PR_GetString(val->string));
+               snprintf (line, sizeof (line), "%s", PR_GetString(val->string));
                break;
        case ev_entity:
                //n = NoCrash_NUM_FOR_EDICT(PROG_TO_EDICT(val->edict));
                n = val->edict;
                if (n < 0 || n >= MAX_EDICTS)
-                       sprintf (line, "entity %i (invalid!)", n);
+                       snprintf (line, sizeof (line), "entity %i (invalid!)", n);
                else
-                       sprintf (line, "entity %i", n);
+                       snprintf (line, sizeof (line), "entity %i", n);
                break;
        case ev_function:
                f = pr_functions + val->function;
-               sprintf (line, "%s()", PR_GetString(f->s_name));
+               snprintf (line, sizeof (line), "%s()", PR_GetString(f->s_name));
                break;
        case ev_field:
                def = ED_FieldAtOfs ( val->_int );
-               sprintf (line, ".%s", PR_GetString(def->s_name));
+               snprintf (line, sizeof (line), ".%s", PR_GetString(def->s_name));
                break;
        case ev_void:
-               sprintf (line, "void");
+               snprintf (line, sizeof (line), "void");
                break;
        case ev_float:
                // LordHavoc: changed from %5.1f to %10.4f
-               sprintf (line, "%10.4f", val->_float);
+               snprintf (line, sizeof (line), "%10.4f", val->_float);
                break;
        case ev_vector:
                // LordHavoc: changed from %5.1f to %10.4f
-               sprintf (line, "'%10.4f %10.4f %10.4f'", val->vector[0], val->vector[1], val->vector[2]);
+               snprintf (line, sizeof (line), "'%10.4f %10.4f %10.4f'", val->vector[0], val->vector[1], val->vector[2]);
                break;
        case ev_pointer:
-               sprintf (line, "pointer");
+               snprintf (line, sizeof (line), "pointer");
                break;
        default:
-               sprintf (line, "bad type %i", type);
+               snprintf (line, sizeof (line), "bad type %i", type);
                break;
        }
 
@@ -454,23 +454,11 @@ char *PR_UglyValueString (etype_t type, eval_t *val)
        switch (type)
        {
        case ev_string:
-               sprintf (line, "%s", PR_GetString(val->string));
-               break;
-       case ev_entity:
-               sprintf (line, "%i", NUM_FOR_EDICT(PROG_TO_EDICT(val->edict)));
-               break;
-       case ev_function:
-               f = pr_functions + val->function;
-               sprintf (line, "%s", PR_GetString(f->s_name));
-               break;
-       case ev_field:
-               def = ED_FieldAtOfs ( val->_int );
-               // LordHavoc: parse the string a bit to turn special characters
+               // Parse the string a bit to turn special characters
                // (like newline, specifically) into escape codes,
                // this fixes saving games from various mods
-               //sprintf (line, "%s", PR_GetString(def->s_name));
-               s = PR_GetString(def->s_name);
-               for (i = 0;i < 4095 && *s;)
+               s = PR_GetString (val->string);
+               for (i = 0;i < (int)sizeof(line) - 2 && *s;)
                {
                        if (*s == '\n')
                        {
@@ -483,22 +471,33 @@ char *PR_UglyValueString (etype_t type, eval_t *val)
                                line[i++] = 'r';
                        }
                        else
-                               line[i] = *s;
+                               line[i++] = *s;
                        s++;
                }
-               line[i++] = 0;
+               line[i] = '\0';
+               break;
+       case ev_entity:
+               snprintf (line, sizeof (line), "%i", NUM_FOR_EDICT(PROG_TO_EDICT(val->edict)));
+               break;
+       case ev_function:
+               f = pr_functions + val->function;
+               snprintf (line, sizeof (line), "%s", PR_GetString(f->s_name));
+               break;
+       case ev_field:
+               def = ED_FieldAtOfs ( val->_int );
+               snprintf (line, sizeof (line), ".%s", PR_GetString(def->s_name));
                break;
        case ev_void:
-               sprintf (line, "void");
+               snprintf (line, sizeof (line), "void");
                break;
        case ev_float:
-               sprintf (line, "%f", val->_float);
+               snprintf (line, sizeof (line), "%f", val->_float);
                break;
        case ev_vector:
-               sprintf (line, "%f %f %f", val->vector[0], val->vector[1], val->vector[2]);
+               snprintf (line, sizeof (line), "%f %f %f", val->vector[0], val->vector[1], val->vector[2]);
                break;
        default:
-               sprintf (line, "bad type %i", type);
+               snprintf (line, sizeof (line), "bad type %i", type);
                break;
        }
 
@@ -586,7 +585,7 @@ void ED_Print (edict_t *ed)
        }
 
        tempstring[0] = 0;
-       sprintf(tempstring, "\nEDICT %i:\n", NUM_FOR_EDICT(ed));
+       snprintf (tempstring, sizeof (tempstring), "\nEDICT %i:\n", NUM_FOR_EDICT(ed));
        for (i=1 ; i<progs->numfielddefs ; i++)
        {
                d = &pr_fielddefs[i];
@@ -801,6 +800,34 @@ void ED_WriteGlobals (qfile_t *f)
        FS_Printf (f,"}\n");
 }
 
+/*
+=============
+ED_EdictSet_f
+
+Console command to set a field of a specified edict
+=============
+*/
+void ED_EdictSet_f(void)
+{
+       edict_t *ed;
+       ddef_t *key;
+
+       if(Cmd_Argc() != 4)
+       {
+               Con_Printf("edictset <edict number> <field> <value>\n");
+               return;
+       }
+       ed = EDICT_NUM(atoi(Cmd_Argv(1)));
+
+       if((key = ED_FindField(Cmd_Argv(2))) == 0)
+       {
+               Con_Printf("Key %s not found !\n", Cmd_Argv(2));
+               return;
+       }
+
+       ED_ParseEpair(ed, key, Cmd_Argv(3));
+}
+
 /*
 =============
 ED_ParseGlobals
@@ -996,19 +1023,15 @@ const char *ED_ParseEdict (const char *data, edict_t *ent)
 
                // anglehack is to allow QuakeEd to write single scalar angles
                // and allow them to be turned into vectors. (FIXME...)
-               if (!strcmp(com_token, "angle"))
-               {
-                       strcpy (com_token, "angles");
-                       anglehack = true;
-               }
-               else
-                       anglehack = false;
+               anglehack = !strcmp (com_token, "angle");
+               if (anglehack)
+                       strlcpy (com_token, "angles", sizeof (com_token));
 
                // FIXME: change light to _light to get rid of this hack
                if (!strcmp(com_token, "light"))
-                       strcpy (com_token, "light_lev");        // hack for single light def
+                       strlcpy (com_token, "light_lev", sizeof (com_token));   // hack for single light def
 
-               strcpy (keyname, com_token);
+               strlcpy (keyname, com_token, sizeof (keyname));
 
                // another hack to fix heynames with trailing spaces
                n = strlen(keyname);
@@ -1042,8 +1065,8 @@ const char *ED_ParseEdict (const char *data, edict_t *ent)
                if (anglehack)
                {
                        char    temp[32];
-                       strcpy (temp, com_token);
-                       sprintf (com_token, "0 %s 0", temp);
+                       strlcpy (temp, com_token, sizeof (temp));
+                       snprintf (com_token, sizeof (com_token), "0 %s 0", temp);
                }
 
                if (!ED_ParseEpair(ent, key, com_token))
@@ -1558,6 +1581,7 @@ void PR_Init (void)
        Cmd_AddCommand ("edict", ED_PrintEdict_f);
        Cmd_AddCommand ("edicts", ED_PrintEdicts);
        Cmd_AddCommand ("edictcount", ED_Count);
+       Cmd_AddCommand ("edictset", ED_EdictSet_f);
        Cmd_AddCommand ("profile", PR_Profile_f);
        Cmd_AddCommand ("pr_fields", PR_Fields_f);
        Cmd_AddCommand ("pr_globals", PR_Globals_f);