PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(string);
}
+/*
+=========
+VM_strreplace
+
+string(string search, string replace, string subject) strreplace = #484;
+=========
+*/
+// replaces all occurrences of search with replace in the string subject, and returns the result
+void VM_strreplace(void)
+{
+ int i, j, si;
+ const char *search, *replace, *subject;
+ char string[VM_STRINGTEMP_LENGTH];
+ int search_len, replace_len, subject_len;
+
+ VM_SAFEPARMCOUNT(3,VM_strreplace);
+
+ search = PRVM_G_STRING(OFS_PARM0);
+ replace = PRVM_G_STRING(OFS_PARM1);
+ subject = PRVM_G_STRING(OFS_PARM2);
+
+ search_len = (int)strlen(search);
+ replace_len = (int)strlen(replace);
+ subject_len = (int)strlen(subject);
+
+ for (i = 0; i < subject_len; i++)
+ {
+ for (j = 0; j < search_len && i+j < subject_len; j++)
+ if (subject[i+j] != search[j])
+ break;
+ if (j == search_len)
+ {
+ // found it at offset 'i'
+ for (j = 0; j < replace_len && si < (int)sizeof(string) - 1; j++)
+ string[si++] = replace[j];
+ i += search_len - 1;
+ }
+ else
+ {
+ // not found
+ if (si < (int)sizeof(string) - 1)
+ string[si++] = subject[i];
+ }
+ }
+ string[si] = '\0';
+
+ PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(string);
+}
+
+/*
+=========
+VM_strireplace
+
+string(string search, string replace, string subject) strireplace = #485;
+=========
+*/
+// case-insensitive version of strreplace
+void VM_strireplace(void)
+{
+ int i, j, si;
+ const char *search, *replace, *subject;
+ char string[VM_STRINGTEMP_LENGTH];
+ int search_len, replace_len, subject_len;
+
+ VM_SAFEPARMCOUNT(3,VM_strreplace);
+
+ search = PRVM_G_STRING(OFS_PARM0);
+ replace = PRVM_G_STRING(OFS_PARM1);
+ subject = PRVM_G_STRING(OFS_PARM2);
+
+ search_len = (int)strlen(search);
+ replace_len = (int)strlen(replace);
+ subject_len = (int)strlen(subject);
+
+ for (i = 0; i < subject_len; i++)
+ {
+ for (j = 0; j < search_len && i+j < subject_len; j++)
+ if (tolower(subject[i+j]) != tolower(search[j]))
+ break;
+ if (j == search_len)
+ {
+ // found it at offset 'i'
+ for (j = 0; j < replace_len && si < (int)sizeof(string) - 1; j++)
+ string[si++] = replace[j];
+ i += search_len - 1;
+ }
+ else
+ {
+ // not found
+ if (si < (int)sizeof(string) - 1)
+ string[si++] = subject[i];
+ }
+ }
+ string[si] = '\0';
+
+ PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(string);
+}
+
/*
=========
VM_stov
data = PRVM_G_STRING(OFS_PARM1);
// parse the opening brace
- if (!COM_ParseToken_Simple(&data, false) || com_token[0] != '{' )
+ if (!COM_ParseToken_Simple(&data, false, false) || com_token[0] != '{' )
PRVM_ERROR ("VM_parseentitydata: %s: Couldn't parse entity data:\n%s", PRVM_NAME, data );
PRVM_ED_ParseEdict (data, ent);
DrawQ_String (pos[0], pos[1], string, 0, scale[0], scale[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM4), flag, NULL, true);
PRVM_G_FLOAT(OFS_RETURN) = 1;
}
+
+/*
+=========
+VM_drawcolorcodedstring
+
+float drawcolorcodedstring(vector position, string text, vector scale, float alpha, float flag)
+=========
+*/
+void VM_drawcolorcodedstring(void)
+{
+ float *pos,*scale;
+ const char *string;
+ int flag,color;
+ VM_SAFEPARMCOUNT(5,VM_drawstring);
+
+ string = PRVM_G_STRING(OFS_PARM1);
+ pos = PRVM_G_VECTOR(OFS_PARM0);
+ scale = PRVM_G_VECTOR(OFS_PARM2);
+ flag = (int)PRVM_G_FLOAT(OFS_PARM5);
+
+ if(flag < DRAWFLAG_NORMAL || flag >=DRAWFLAG_NUMFLAGS)
+ {
+ PRVM_G_FLOAT(OFS_RETURN) = -2;
+ VM_Warning("VM_drawcolorcodedstring: %s: wrong DRAWFLAG %i !\n",PRVM_NAME,flag);
+ return;
+ }
+
+ if(!scale[0] || !scale[1])
+ {
+ PRVM_G_FLOAT(OFS_RETURN) = -3;
+ VM_Warning("VM_drawcolorcodedstring: scale %s is null !\n", (scale[0] == 0) ? ((scale[1] == 0) ? "x and y" : "x") : "y");
+ return;
+ }
+
+ if(pos[2] || scale[2])
+ Con_Printf("VM_drawcolorcodedstring: z value%s from %s discarded\n",(pos[2] && scale[2]) ? "s" : " ",((pos[2] && scale[2]) ? "pos and scale" : (pos[2] ? "pos" : "scale")));
+
+ color = -1;
+ DrawQ_String (pos[0], pos[1], string, 0, scale[0], scale[1], 1, 1, 1, PRVM_G_FLOAT(OFS_PARM3), flag, NULL, false);
+ PRVM_G_FLOAT(OFS_RETURN) = 1;
+}
/*
=========
VM_drawpic
const char *s;
VM_SAFEPARMCOUNT(2, VM_str2chr);
s = PRVM_G_STRING(OFS_PARM0);
- if((unsigned)PRVM_G_FLOAT(OFS_PARM1) > strlen(s))
- return;
- PRVM_G_FLOAT(OFS_RETURN) = (unsigned char)s[(int)PRVM_G_FLOAT(OFS_PARM1)];
+ if((unsigned)PRVM_G_FLOAT(OFS_PARM1) < strlen(s))
+ PRVM_G_FLOAT(OFS_RETURN) = (unsigned char)s[(unsigned)PRVM_G_FLOAT(OFS_PARM1)];
+ else
+ PRVM_G_FLOAT(OFS_RETURN) = 0;
}
//#223 string(float c, ...) chr2str (FTE_STRINGS)
{
char src[VM_STRINGTEMP_LENGTH];
char destbuf[VM_STRINGTEMP_LENGTH];
- char *dest = destbuf;
int pad;
VM_SAFEPARMCOUNTRANGE(1, 8, VM_strpad);
pad = PRVM_G_FLOAT(OFS_PARM0);
VM_VarString(1, src, sizeof(src));
- if (pad < 0)
- { //pad left
- pad = -pad - strlen(src);
- if (pad>=VM_STRINGTEMP_LENGTH)
- pad = VM_STRINGTEMP_LENGTH-1;
- if (pad < 0)
- pad = 0;
-
- strlcpy(dest+pad, src, VM_STRINGTEMP_LENGTH-pad);
- while(pad--)
- {
- pad--;
- dest[pad] = ' ';
- }
- }
- else
- { //pad right
- if (pad>=VM_STRINGTEMP_LENGTH)
- pad = VM_STRINGTEMP_LENGTH-1;
- pad -= strlen(src);
- if (pad < 0)
- pad = 0;
-
- strlcpy(dest, src, VM_STRINGTEMP_LENGTH);
- dest+=strlen(dest);
-
- while(pad-->0)
- *dest++ = ' ';
- *dest = '\0';
- }
+ // note: < 0 = left padding, > 0 = right padding,
+ // this is reverse logic of printf!
+ dpsnprintf(destbuf, sizeof(destbuf), "%*s", -pad, src);
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(destbuf);
}