From 9585bf1c9992f21103886a955a3ffc677b01f513 Mon Sep 17 00:00:00 2001 From: havoc Date: Sun, 12 Apr 2009 01:44:56 +0000 Subject: [PATCH] implemented FTE_STRINGS compliant substring behavior (FRIK_FILE feature but upgraded by FTE_STRINGS) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8901 d7cf8633-e32d-0410-b094-e92efae38249 --- prvm_cmds.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/prvm_cmds.c b/prvm_cmds.c index a644f1a2..f792d63f 100644 --- a/prvm_cmds.c +++ b/prvm_cmds.c @@ -2101,7 +2101,7 @@ string substring(string s, float start, float length) // 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]; @@ -2110,10 +2110,16 @@ void VM_substring(void) 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); } -- 2.39.2