Cbuf_AddText(string);
}
+static qboolean PRVM_Cvar_ReadOk(const char *string)
+{
+ cvar_t *cvar;
+ cvar = Cvar_FindVar(string);
+ return ((cvar) && ((cvar->flags & CVAR_PRIVATE) == 0));
+}
+
/*
=================
VM_cvar
VM_SAFEPARMCOUNTRANGE(1,8,VM_cvar);
VM_VarString(0, string, sizeof(string));
VM_CheckEmptyString(string);
- PRVM_G_FLOAT(OFS_RETURN) = Cvar_VariableValue(string);
+ PRVM_G_FLOAT(OFS_RETURN) = PRVM_Cvar_ReadOk(string) ? Cvar_VariableValue(string) : 0;
}
/*
VM_SAFEPARMCOUNTRANGE(1,8,VM_cvar_string);
VM_VarString(0, string, sizeof(string));
VM_CheckEmptyString(string);
- PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(Cvar_VariableString(string));
+ PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(PRVM_Cvar_ReadOk(string) ? Cvar_VariableString(string) : "");
}
// returns a section of a string as a tempstring
void VM_substring(void)
{
- int i, start, length;
+ int start, length, slength;
const char *s;
char string[VM_STRINGTEMP_LENGTH];
s = PRVM_G_STRING(OFS_PARM0);
start = (int)PRVM_G_FLOAT(OFS_PARM1);
length = (int)PRVM_G_FLOAT(OFS_PARM2);
- for (i = 0;i < start && *s;i++, s++);
- for (i = 0;i < (int)sizeof(string) - 1 && *s && i < length;i++, s++)
- string[i] = *s;
- string[i] = 0;
+ slength = strlen(s);
+ if (length < 0) // FTE_STRINGS feature
+ length += slength - start;
+ if (start < 0) // FTE_STRINGS feature
+ start += slength;
+ start = bound(0, start, slength); // consistent with php 5.2.0 but not 5.2.3
+ length = min(length, (int)sizeof(string) - 1);
+ length = min(length, slength - start);
+ memcpy(string, s + start, length);
+ string[length] = 0;
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(string);
}
}
/*
=========
+VM_drawrotpic
+
+float drawrotpic(vector position, string pic, vector size, vector org, float angle, vector rgb, float alpha, float flag)
+=========
+*/
+void VM_drawrotpic(void)
+{
+ const char *picname;
+ float *size, *pos, *org, *rgb;
+ int flag;
+
+ VM_SAFEPARMCOUNT(8,VM_drawrotpic);
+
+ picname = PRVM_G_STRING(OFS_PARM1);
+ VM_CheckEmptyString (picname);
+
+ // is pic cached ? no function yet for that
+ if(!1)
+ {
+ PRVM_G_FLOAT(OFS_RETURN) = -4;
+ VM_Warning("VM_drawrotpic: %s: %s not cached !\n", PRVM_NAME, picname);
+ return;
+ }
+
+ pos = PRVM_G_VECTOR(OFS_PARM0);
+ size = PRVM_G_VECTOR(OFS_PARM2);
+ org = PRVM_G_VECTOR(OFS_PARM3);
+ rgb = PRVM_G_VECTOR(OFS_PARM5);
+ flag = (int) PRVM_G_FLOAT(OFS_PARM7);
+
+ if(flag < DRAWFLAG_NORMAL || flag >=DRAWFLAG_NUMFLAGS)
+ {
+ PRVM_G_FLOAT(OFS_RETURN) = -2;
+ VM_Warning("VM_drawrotpic: %s: wrong DRAWFLAG %i !\n",PRVM_NAME,flag);
+ return;
+ }
+
+ if(pos[2] || size[2] || org[2])
+ Con_Printf("VM_drawrotpic: z value from pos/size/org discarded\n");
+
+ DrawQ_RotPic(pos[0], pos[1], Draw_CachePic(picname), size[0], size[1], org[0], org[1], PRVM_G_FLOAT(OFS_PARM4), rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM6), flag);
+ PRVM_G_FLOAT(OFS_RETURN) = 1;
+}
+/*
+=========
VM_drawsubpic
float drawsubpic(vector position, vector size, string pic, vector srcPos, vector srcSize, vector rgb, float alpha, float flag)