Skip to content

Commit

Permalink
PRVM: optimise tempstring creation
Browse files Browse the repository at this point in the history
No need for strlen in PRVM_SetTempString(), usually we already have that
information.

Signed-off-by: bones_was_here <bones_was_here@xonotic.au>
  • Loading branch information
bones-was-here committed Jan 21, 2024
1 parent 160ed05 commit 26a665f
Show file tree
Hide file tree
Showing 26 changed files with 486 additions and 348 deletions.
6 changes: 5 additions & 1 deletion cl_demo.c
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@ void CL_Record_f(cmd_state_t *cmd)
int c, track;
char name[MAX_OSPATH];
char vabuf[1024];
int vabuf_len;

c = Cmd_Argc(cmd);
if (c != 2 && c != 3 && c != 4)
Expand Down Expand Up @@ -386,7 +387,10 @@ void CL_Record_f(cmd_state_t *cmd)

// start the map up
if (c > 2)
Cmd_ExecuteString ( cmd, va(vabuf, sizeof(vabuf), "map %s", Cmd_Argv(cmd, 2)), src_local, false);
{
vabuf_len = dpsnprintf(vabuf, sizeof(vabuf), "map %s", Cmd_Argv(cmd, 2));
Cmd_ExecuteString(cmd, vabuf, vabuf_len, src_local, false);
}

// open the demo file
Con_Printf("recording to %s.\n", name);
Expand Down
38 changes: 26 additions & 12 deletions cl_parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -3444,6 +3444,7 @@ void CL_ParseServerMessage(void)
qbool qwplayerupdatereceived;
qbool strip_pqc;
char vabuf[1024];
size_t cl_readstring_len;

// LadyHavoc: moved demo message writing from before the packet parse to
// after the packet parse so that CL_Stop_f can be called by cl_autodemo
Expand Down Expand Up @@ -3550,22 +3551,28 @@ void CL_ParseServerMessage(void)

case qw_svc_print:
i = MSG_ReadByte(&cl_message);
temp = MSG_ReadString(&cl_message, cl_readstring, sizeof(cl_readstring));
cl_readstring_len = MSG_ReadString_len(&cl_message, cl_readstring, sizeof(cl_readstring));
temp = cl_readstring;
if (CL_ExaminePrintString(temp)) // look for anything interesting like player IP addresses or ping reports
{
if (i == 3) // chat
CSQC_AddPrintText(va(vabuf, sizeof(vabuf), "\1%s", temp)); //[515]: csqc
{
cl_readstring_len = dpsnprintf(vabuf, sizeof(vabuf), "\1%s", temp);
CSQC_AddPrintText(vabuf, cl_readstring_len); //[515]: csqc
}
else
CSQC_AddPrintText(temp);
CSQC_AddPrintText(temp, cl_readstring_len);
}
break;

case qw_svc_centerprint:
CL_VM_Parse_CenterPrint(MSG_ReadString(&cl_message, cl_readstring, sizeof(cl_readstring))); //[515]: csqc
cl_readstring_len = MSG_ReadString_len(&cl_message, cl_readstring, sizeof(cl_readstring));
CL_VM_Parse_CenterPrint(cl_readstring, cl_readstring_len); //[515]: csqc
break;

case qw_svc_stufftext:
CL_VM_Parse_StuffCmd(MSG_ReadString(&cl_message, cl_readstring, sizeof(cl_readstring))); //[515]: csqc
cl_readstring_len = MSG_ReadString_len(&cl_message, cl_readstring, sizeof(cl_readstring));
CL_VM_Parse_StuffCmd(cl_readstring, cl_readstring_len); //[515]: csqc
break;

case qw_svc_damage:
Expand Down Expand Up @@ -3708,7 +3715,7 @@ void CL_ParseServerMessage(void)
break;

case qw_svc_sellscreen:
Cmd_ExecuteString(cmd_local, "help", src_local, true);
Cmd_ExecuteString(cmd_local, "help", 4, src_local, true);
break;

case qw_svc_smallkick:
Expand Down Expand Up @@ -3920,17 +3927,20 @@ void CL_ParseServerMessage(void)
break;

case svc_print:
temp = MSG_ReadString(&cl_message, cl_readstring, sizeof(cl_readstring));
cl_readstring_len = MSG_ReadString_len(&cl_message, cl_readstring, sizeof(cl_readstring));
temp = cl_readstring;
if (CL_ExaminePrintString(temp)) // look for anything interesting like player IP addresses or ping reports
CSQC_AddPrintText(temp); //[515]: csqc
CSQC_AddPrintText(temp, cl_readstring_len); //[515]: csqc
break;

case svc_centerprint:
CL_VM_Parse_CenterPrint(MSG_ReadString(&cl_message, cl_readstring, sizeof(cl_readstring))); //[515]: csqc
cl_readstring_len = MSG_ReadString_len(&cl_message, cl_readstring, sizeof(cl_readstring));
CL_VM_Parse_CenterPrint(cl_readstring, cl_readstring_len); //[515]: csqc
break;

case svc_stufftext:
temp = MSG_ReadString(&cl_message, cl_readstring, sizeof(cl_readstring));
cl_readstring_len = MSG_ReadString_len(&cl_message, cl_readstring, sizeof(cl_readstring));
temp = cl_readstring;
/* if(utf8_enable.integer)
{
strip_pqc = true;
Expand Down Expand Up @@ -3961,11 +3971,15 @@ void CL_ParseServerMessage(void)
if(*temp == 0x01)
{
++temp;
--cl_readstring_len;
while(*temp >= 0x01 && *temp <= 0x1F)
{
++temp;
--cl_readstring_len;
}
}
}
CL_VM_Parse_StuffCmd(temp); //[515]: csqc
CL_VM_Parse_StuffCmd(temp, cl_readstring_len); //[515]: csqc
break;

case svc_damage:
Expand Down Expand Up @@ -4204,7 +4218,7 @@ void CL_ParseServerMessage(void)
break;

case svc_sellscreen:
Cmd_ExecuteString(cmd_local, "help", src_local, true);
Cmd_ExecuteString(cmd_local, "help", 4, src_local, true);
break;
case svc_hidelmp:
if (gamemode == GAME_TENEBRAE)
Expand Down
1 change: 1 addition & 0 deletions client.h
Original file line number Diff line number Diff line change
Expand Up @@ -1118,6 +1118,7 @@ typedef struct client_state_s
qbool csqc_usecsqclistener;
matrix4x4_t csqc_listenermatrix;
char csqc_printtextbuf[MAX_INPUTLINE];
size_t csqc_printtextbuf_len; ///< strlen

// collision culling data
world_t world;
Expand Down
51 changes: 29 additions & 22 deletions clvm_cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -2063,6 +2063,7 @@ static void VM_CL_getstats (prvm_prog_t *prog)
{
int i;
char t[17];
size_t t_len;
VM_SAFEPARMCOUNT(1, VM_CL_getstats);
i = (int)PRVM_G_FLOAT(OFS_PARM0);
if(i < 0 || i > MAX_CL_STATS-4)
Expand All @@ -2071,8 +2072,8 @@ static void VM_CL_getstats (prvm_prog_t *prog)
VM_Warning(prog, "VM_CL_getstats: index>MAX_CL_STATS-4 or index<0\n");
return;
}
dp_strlcpy(t, (char*)&cl.stats[i], sizeof(t));
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, t);
t_len = dp_strlcpy(t, (char*)&cl.stats[i], sizeof(t));
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, t, t_len);
}

//#333 void(entity e, float mdlindex) setmodelindex (EXT_CSQC)
Expand Down Expand Up @@ -2374,9 +2375,10 @@ static void VM_CL_runplayerphysics (prvm_prog_t *prog)
//#348 string(float playernum, string keyname) getplayerkeyvalue (EXT_CSQC)
static void VM_CL_getplayerkey (prvm_prog_t *prog)
{
int i;
char t[128];
const char *c;
int i;
char t[128];
size_t t_len;
const char *c;

VM_SAFEPARMCOUNT(2, VM_CL_getplayerkey);

Expand All @@ -2393,37 +2395,37 @@ static void VM_CL_getplayerkey (prvm_prog_t *prog)
t[0] = 0;

if(!strcasecmp(c, "name"))
dp_strlcpy(t, cl.scores[i].name, sizeof(t));
t_len = dp_strlcpy(t, cl.scores[i].name, sizeof(t));
else
if(!strcasecmp(c, "frags"))
dpsnprintf(t, sizeof(t), "%i", cl.scores[i].frags);
t_len = dpsnprintf(t, sizeof(t), "%i", cl.scores[i].frags);
else
if(!strcasecmp(c, "ping"))
dpsnprintf(t, sizeof(t), "%i", cl.scores[i].qw_ping);
t_len = dpsnprintf(t, sizeof(t), "%i", cl.scores[i].qw_ping);
else
if(!strcasecmp(c, "pl"))
dpsnprintf(t, sizeof(t), "%i", cl.scores[i].qw_packetloss);
t_len = dpsnprintf(t, sizeof(t), "%i", cl.scores[i].qw_packetloss);
else
if(!strcasecmp(c, "movementloss"))
dpsnprintf(t, sizeof(t), "%i", cl.scores[i].qw_movementloss);
t_len = dpsnprintf(t, sizeof(t), "%i", cl.scores[i].qw_movementloss);
else
if(!strcasecmp(c, "entertime"))
dpsnprintf(t, sizeof(t), "%f", cl.scores[i].qw_entertime);
t_len = dpsnprintf(t, sizeof(t), "%f", cl.scores[i].qw_entertime);
else
if(!strcasecmp(c, "colors"))
dpsnprintf(t, sizeof(t), "%i", cl.scores[i].colors);
t_len = dpsnprintf(t, sizeof(t), "%i", cl.scores[i].colors);
else
if(!strcasecmp(c, "topcolor"))
dpsnprintf(t, sizeof(t), "%i", cl.scores[i].colors & 0xf0);
t_len = dpsnprintf(t, sizeof(t), "%i", cl.scores[i].colors & 0xf0);
else
if(!strcasecmp(c, "bottomcolor"))
dpsnprintf(t, sizeof(t), "%i", (cl.scores[i].colors &15)<<4);
t_len = dpsnprintf(t, sizeof(t), "%i", (cl.scores[i].colors &15)<<4);
else
if(!strcasecmp(c, "viewentity"))
dpsnprintf(t, sizeof(t), "%i", i+1);
t_len = dpsnprintf(t, sizeof(t), "%i", i+1);
if(!t[0])
return;
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, t);
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, t, t_len);
}

//#351 void(vector origin, vector forward, vector right, vector up) SetListener (EXT_CSQC)
Expand Down Expand Up @@ -2491,8 +2493,11 @@ static void VM_CL_ReadAngle (prvm_prog_t *prog)
//#366 string() readstring (EXT_CSQC)
static void VM_CL_ReadString (prvm_prog_t *prog)
{
size_t cl_readstring_len;

VM_SAFEPARMCOUNT(0, VM_CL_ReadString);
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, MSG_ReadString(&cl_message, cl_readstring, sizeof(cl_readstring)));
cl_readstring_len = MSG_ReadString_len(&cl_message, cl_readstring, sizeof(cl_readstring));
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, cl_readstring, cl_readstring_len);
}

//#367 float() readfloat (EXT_CSQC)
Expand All @@ -2507,6 +2512,7 @@ extern cvar_t cl_readpicture_force;
static void VM_CL_ReadPicture (prvm_prog_t *prog)
{
const char *name;
size_t name_len;
unsigned char *data;
unsigned char *buf;
unsigned short size;
Expand All @@ -2515,7 +2521,8 @@ static void VM_CL_ReadPicture (prvm_prog_t *prog)

VM_SAFEPARMCOUNT(0, VM_CL_ReadPicture);

name = MSG_ReadString(&cl_message, cl_readstring, sizeof(cl_readstring));
name_len = MSG_ReadString_len(&cl_message, cl_readstring, sizeof(cl_readstring));
name = cl_readstring;
size = (unsigned short) MSG_ReadShort(&cl_message);

// check if a texture of that name exists
Expand Down Expand Up @@ -2546,7 +2553,7 @@ static void VM_CL_ReadPicture (prvm_prog_t *prog)
}
}

PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, name);
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, name, name_len);
}

//////////////////////////////////////////////////////////
Expand Down Expand Up @@ -3409,7 +3416,7 @@ static void VM_CL_gettaginfo (prvm_prog_t *prog)
Matrix4x4_ToVectors(&tag_localmatrix, forward, left, up, origin);

PRVM_clientglobalfloat(gettaginfo_parent) = parentindex;
PRVM_clientglobalstring(gettaginfo_name) = tagname ? PRVM_SetTempString(prog, tagname) : 0;
PRVM_clientglobalstring(gettaginfo_name) = tagname ? PRVM_SetTempString(prog, tagname, strlen(tagname)) : 0;
VectorCopy(forward, PRVM_clientglobalvector(gettaginfo_forward));
VectorScale(left, -1, PRVM_clientglobalvector(gettaginfo_right));
VectorCopy(up, PRVM_clientglobalvector(gettaginfo_up));
Expand Down Expand Up @@ -4496,7 +4503,7 @@ static void VM_CL_serverkey(prvm_prog_t *prog)
char string[VM_TEMPSTRING_MAXSIZE];
VM_SAFEPARMCOUNT(1, VM_CL_serverkey);
InfoString_GetValue(cl.qw_serverinfo, PRVM_G_STRING(OFS_PARM0), string, sizeof(string));
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, string);
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, string, strlen(string));
}

/*
Expand Down Expand Up @@ -4657,7 +4664,7 @@ static void VM_CL_skel_get_bonename(prvm_prog_t *prog)
return;
if (bonenum < 0 || bonenum >= skeleton->model->num_bones)
return;
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, skeleton->model->data_bones[bonenum].name);
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, skeleton->model->data_bones[bonenum].name, strlen(skeleton->model->data_bones[bonenum].name));
}

// #267 float(float skel, float bonenum) skel_get_boneparent = #267; // (FTE_CSQC_SKELETONOBJECTS) returns parent num for supplied bonenum, 0 if bonenum has no parent or bone does not exist (returned value is always less than bonenum, you can loop on this)
Expand Down
Loading

0 comments on commit 26a665f

Please sign in to comment.