]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - prvm_cmds.c
CSQC fixes (less broken, still not spec compliant)
[xonotic/darkplaces.git] / prvm_cmds.c
index fcc6a5cc9b589db32f55620c8b5e9e468ad0be6d..7d43ad99095d0c113e3aa96ed274161660f1ee81 100644 (file)
@@ -535,7 +535,7 @@ void VM_cvar_string(void)
 
        cvar_string = Cvar_VariableString(name);
 
-       strcpy(out, cvar_string);
+       strlcpy(out, cvar_string, VM_STRINGTEMP_LENGTH);
 
        PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString(out);
 }
@@ -566,7 +566,7 @@ void VM_cvar_defstring (void)
 
        cvar_string = Cvar_VariableDefString(name);
 
-       strcpy(out, cvar_string);
+       strlcpy(out, cvar_string, VM_STRINGTEMP_LENGTH);
 
        PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString(out);
 }
@@ -715,19 +715,19 @@ void VM_itof(void)
 
 /*
 ========================
-VM_itoe
+VM_ftoe
 
-intt ftoi(float num)
+entity ftoe(float num)
 ========================
 */
-void VM_ftoi(void)
+void VM_ftoe(void)
 {
        int ent;
-       VM_SAFEPARMCOUNT(1, VM_ftoi);
+       VM_SAFEPARMCOUNT(1, VM_ftoe);
 
        ent = (int)PRVM_G_FLOAT(OFS_PARM0);
-       if(PRVM_PROG_TO_EDICT(ent)->priv.required->free)
-               PRVM_ERROR ("VM_ftoe: %s tried to access a freed entity (entity %i)!", PRVM_NAME, ent);
+       if (ent < 0 || ent >= MAX_EDICTS || PRVM_PROG_TO_EDICT(ent)->priv.required->free)
+               ent = 0; // return world instead of a free or invalid entity
 
        PRVM_G_INT(OFS_RETURN) = ent;
 }
@@ -766,15 +766,13 @@ void VM_remove (void)
        ed = PRVM_G_EDICT(OFS_PARM0);
        if( PRVM_NUM_FOR_EDICT(ed) <= prog->reserved_edicts )
        {
-               Con_DPrint( "VM_remove: tried to remove the null entity or a reserved entity!\n" );
                if (developer.integer >= 1)
-                       PRVM_PrintState();
+                       VM_Warning( "VM_remove: tried to remove the null entity or a reserved entity!\n" );
        }
        else if( ed->priv.required->free )
        {
-               Con_DPrint( "VM_remove: tried to remove an already freed entity!\n" );
                if (developer.integer >= 1)
-                       PRVM_PrintState();
+                       VM_Warning( "VM_remove: tried to remove an already freed entity!\n" );
        }
        else
                PRVM_ED_Free (ed);
@@ -1152,15 +1150,14 @@ float   rint(float)
 */
 void VM_rint (void)
 {
-       float   f;
-
+       float f;
        VM_SAFEPARMCOUNT(1,VM_rint);
 
        f = PRVM_G_FLOAT(OFS_PARM0);
        if (f > 0)
-               PRVM_G_FLOAT(OFS_RETURN) = (int)(f + 0.5);
+               PRVM_G_FLOAT(OFS_RETURN) = floor(f + 0.5);
        else
-               PRVM_G_FLOAT(OFS_RETURN) = (int)(f - 0.5);
+               PRVM_G_FLOAT(OFS_RETURN) = ceil(f - 0.5);
 }
 
 /*
@@ -1821,12 +1818,14 @@ void VM_strzone(void)
 {
        char *out;
        char string[VM_STRINGTEMP_LENGTH];
+       size_t alloclen;
 
        VM_SAFEPARMCOUNT(1,VM_strzone);
 
        VM_VarString(0, string, sizeof(string));
-       PRVM_G_INT(OFS_RETURN) = PRVM_AllocString(strlen(string) + 1, &out);
-       strcpy(out, string);
+       alloclen = strlen(string) + 1;
+       PRVM_G_INT(OFS_RETURN) = PRVM_AllocString(alloclen, &out);
+       memcpy(out, string, alloclen);
 }
 
 /*
@@ -1898,13 +1897,15 @@ void VM_tokenize (void)
        pos = 0;
        while(COM_ParseToken(&p, false))
        {
+               size_t tokenlen;
                if (num_tokens >= (int)(sizeof(tokens)/sizeof(tokens[0])))
                        break;
-               if (pos + strlen(com_token) + 1 > sizeof(tokenbuf))
+               tokenlen = strlen(com_token) + 1;
+               if (pos + tokenlen > sizeof(tokenbuf))
                        break;
                tokens[num_tokens++] = tokenbuf + pos;
-               strcpy(tokenbuf + pos, com_token);
-               pos += strlen(com_token) + 1;
+               memcpy(tokenbuf + pos, com_token, tokenlen);
+               pos += tokenlen;
        }
 
        PRVM_G_FLOAT(OFS_RETURN) = num_tokens;
@@ -2311,7 +2312,7 @@ void VM_search_getfilename(void)
        }
 
        tmp = VM_GetTempString();
-       strcpy(tmp, VM_SEARCHLIST[handle]->filenames[filenum]);
+       strlcpy(tmp, VM_SEARCHLIST[handle]->filenames[filenum], VM_STRINGTEMP_LENGTH);
 
        PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString(tmp);
 }
@@ -2665,7 +2666,7 @@ void VM_keynumtostring (void)
 
        tmp = VM_GetTempString();
 
-       strcpy(tmp, Key_KeynumToString(keynum));
+       strlcpy(tmp, Key_KeynumToString(keynum), VM_STRINGTEMP_LENGTH);
 
        PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString(tmp);
 }
@@ -3009,7 +3010,7 @@ void VM_R_PolygonBegin (void)
        if(picname[0])
                p->tex = Draw_CachePic(picname, true)->tex;
        else
-               p->tex = r_texture_notexture;
+               p->tex = r_texture_white;
        p->flags = (unsigned char)PRVM_G_FLOAT(OFS_PARM1);
        vm_current_vertices = 0;
        vm_polygonbegin = true;
@@ -3051,8 +3052,7 @@ void VM_R_PolygonVertex (void)
 
        p->data[vm_current_vertices*3]          = coords[0];
        p->data[1+vm_current_vertices*3]        = coords[1];
-       if(!(p->flags & VM_POLYGON_FL2D))
-               p->data[2+vm_current_vertices*3]        = coords[2];
+       p->data[2+vm_current_vertices*3]        = coords[2];
 
        p->data[12+vm_current_vertices*2]       = tx[0];
        if(!(p->flags & VM_POLYGON_FLLINES))
@@ -3285,7 +3285,7 @@ void VM_altstr_set( void )
                return;
        }
 
-       strcpy( out, in );
+       strlcpy(out, in, VM_STRINGTEMP_LENGTH);
        PRVM_G_INT( OFS_RETURN ) = PRVM_SetEngineString( outstr );
 }
 
@@ -3324,7 +3324,7 @@ void VM_altstr_ins(void)
        for( ; *set ; *out++ = *set++ );
        *out++ = '\'';
 
-       strcpy( out, in );
+       strlcpy(out, in, VM_STRINGTEMP_LENGTH);
        PRVM_G_INT( OFS_RETURN ) = PRVM_SetEngineString( outstr );
 }
 
@@ -3529,13 +3529,15 @@ void VM_buf_copy (void)
        for(i=0;i<b1->num_strings;i++)
                if(b1->strings[i] && b1->strings[i][0])
                {
-                       b2->strings[i] = (char *)Z_Malloc(strlen(b1->strings[i])+1);
+                       size_t stringlen;
+                       stringlen = strlen(b1->strings[i]) + 1;
+                       b2->strings[i] = (char *)Z_Malloc(stringlen);
                        if(!b2->strings[i])
                        {
                                VM_Warning("VM_buf_copy: not enough memory for buffer %i used in %s\n", (int)PRVM_G_FLOAT(OFS_PARM1), PRVM_NAME);
                                break;
                        }
-                       strcpy(b2->strings[i], b1->strings[i]);
+                       memcpy(b2->strings[i], b1->strings[i], stringlen);
                }
 }
 
@@ -3623,17 +3625,13 @@ void VM_buf_implode (void)
                        l += strlen(b->strings[i]);
                        if(l>=4095)
                                break;
-                       k = strcat(k, b->strings[i]);
-                       if(!k)
-                               break;
+                       strlcat(k, b->strings[i], VM_STRINGTEMP_LENGTH);
                        if(sep && (i != b->num_strings-1))
                        {
                                l += strlen(sep);
                                if(l>=4095)
                                        break;
-                               k = strcat(k, sep);
-                               if(!k)
-                                       break;
+                               strlcat(k, sep, VM_STRINGTEMP_LENGTH);
                        }
                }
        PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString(k);
@@ -3683,6 +3681,7 @@ void VM_bufstr_set (void)
        int                             bufindex, strindex;
        qcstrbuffer_t   *b;
        const char              *news;
+       size_t                  alloclen;
 
        VM_SAFEPARMCOUNT(3, VM_bufstr_set);
 
@@ -3707,8 +3706,9 @@ void VM_bufstr_set (void)
        }
        if(b->strings[strindex])
                Z_Free(b->strings[strindex]);
-       b->strings[strindex] = (char *)Z_Malloc(strlen(news)+1);
-       strcpy(b->strings[strindex], news);
+       alloclen = strlen(news) + 1;
+       b->strings[strindex] = (char *)Z_Malloc(alloclen);
+       memcpy(b->strings[strindex], news, alloclen);
 }
 
 /*
@@ -3724,6 +3724,7 @@ void VM_bufstr_add (void)
        int                             bufindex, order, strindex;
        qcstrbuffer_t   *b;
        const char              *string;
+       size_t                  alloclen;
 
        VM_SAFEPARMCOUNT(3, VM_bufstr_add);
 
@@ -3767,8 +3768,9 @@ void VM_bufstr_add (void)
        }
        if(b->strings[strindex])
                Z_Free(b->strings[strindex]);
-       b->strings[strindex] = (char *)Z_Malloc(strlen(string)+1);
-       strcpy(b->strings[strindex], string);
+       alloclen = strlen(string) + 1;
+       b->strings[strindex] = (char *)Z_Malloc(alloclen);
+       memcpy(b->strings[strindex], string, alloclen);
        PRVM_G_FLOAT(OFS_RETURN) = strindex;
 }