#include "mdfour.h"
extern cvar_t prvm_backtraceforwarnings;
+#ifdef USEODE
extern dllhandle_t ode_dll;
+#endif
// LordHavoc: changed this to NOT use a return statement, so that it can be used in functions that must return a value
void VM_Warning(prvm_prog_t *prog, const char *fmt, ...)
if(prvm_backtraceforwarnings.integer && recursive != realtime) // NOTE: this compares to the time, just in case if PRVM_PrintState causes a Host_Error and keeps recursive set
{
recursive = realtime;
- PRVM_PrintState(prog);
+ PRVM_PrintState(prog, 0);
recursive = -1;
}
}
e++;
if ((e - start) == len && !strncasecmp(start, name, len))
{
+#ifdef USEODE
// special sheck for ODE
if (!strncasecmp("DP_PHYSICS_ODE", name, 14))
{
-#ifdef ODE_DYNAMIC
+#ifndef LINK_TO_LIBODE
return ode_dll ? true : false;
#else
-#ifdef ODE_STATIC
+#ifdef LINK_TO_LIBODE
return true;
#else
return false;
#endif
#endif
}
+#endif
// special sheck for d0_blind_id
if (!strcasecmp("DP_CRYPTO", name))
void VM_ftos(prvm_prog_t *prog)
{
- float v;
+ prvm_vec_t v;
char s[128];
VM_SAFEPARMCOUNT(1, VM_ftos);
v = PRVM_G_FLOAT(OFS_PARM0);
- if ((float)((int)v) == v)
- dpsnprintf(s, sizeof(s), "%i", (int)v);
+ if ((prvm_vec_t)((prvm_int_t)v) == v)
+ dpsnprintf(s, sizeof(s), "%.0f", v);
else
dpsnprintf(s, sizeof(s), "%f", v);
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, s);
void VM_fabs(prvm_prog_t *prog)
{
- float v;
+ prvm_vec_t v;
VM_SAFEPARMCOUNT(1,VM_fabs);
========================
VM_itof
-float itof(intt ent)
+float itof(int ent)
========================
*/
void VM_itof(prvm_prog_t *prog)
*/
void VM_ftoe(prvm_prog_t *prog)
{
- int ent;
+ prvm_int_t ent;
VM_SAFEPARMCOUNT(1, VM_ftoe);
- ent = (int)PRVM_G_FLOAT(OFS_PARM0);
+ ent = (prvm_int_t)PRVM_G_FLOAT(OFS_PARM0);
if (ent < 0 || ent >= prog->max_edicts || PRVM_PROG_TO_EDICT(ent)->priv.required->free)
ent = 0; // return world instead of a free or invalid entity
// LordHavoc: search for flags in float fields
void VM_findflags(prvm_prog_t *prog)
{
- int e;
- int f;
- int s;
+ prvm_int_t e;
+ prvm_int_t f;
+ prvm_int_t s;
prvm_edict_t *ed;
VM_SAFEPARMCOUNT(3, VM_findflags);
e = PRVM_G_EDICTNUM(OFS_PARM0);
f = PRVM_G_INT(OFS_PARM1);
- s = (int)PRVM_G_FLOAT(OFS_PARM2);
+ s = (prvm_int_t)PRVM_G_FLOAT(OFS_PARM2);
for (e++ ; e < prog->num_edicts ; e++)
{
continue;
if (!PRVM_E_FLOAT(ed,f))
continue;
- if ((int)PRVM_E_FLOAT(ed,f) & s)
+ if ((prvm_int_t)PRVM_E_FLOAT(ed,f) & s)
{
VM_RETURN_EDICT(ed);
return;
// LordHavoc: chained search for flags in float fields
void VM_findchainflags(prvm_prog_t *prog)
{
- int i;
- int f;
- int s;
+ prvm_int_t i;
+ prvm_int_t f;
+ prvm_int_t s;
prvm_edict_t *ent, *chain;
int chainfield;
chain = (prvm_edict_t *)prog->edicts;
f = PRVM_G_INT(OFS_PARM0);
- s = (int)PRVM_G_FLOAT(OFS_PARM1);
+ s = (prvm_int_t)PRVM_G_FLOAT(OFS_PARM1);
ent = PRVM_NEXT_EDICT(prog->edicts);
for (i = 1;i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent))
continue;
if (!PRVM_E_FLOAT(ent,f))
continue;
- if (!((int)PRVM_E_FLOAT(ent,f) & s))
+ if (!((prvm_int_t)PRVM_E_FLOAT(ent,f) & s))
continue;
PRVM_EDICTFIELDEDICT(ent,chainfield) = PRVM_EDICT_TO_PROG(chain);
*/
void VM_rint(prvm_prog_t *prog)
{
- float f;
+ prvm_vec_t f;
VM_SAFEPARMCOUNT(1,VM_rint);
f = PRVM_G_FLOAT(OFS_PARM0);
{
ddef_t *d;
int i = (int)PRVM_G_FLOAT(OFS_PARM0);
-
+
if (i < 0 || i >= prog->numfielddefs)
{
- VM_Warning(prog, "VM_entityfieldname: %s: field index out of bounds\n", prog->name);
- PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, "");
+ VM_Warning(prog, "VM_entityfieldname: %s: field index out of bounds\n", prog->name);
+ PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, "");
return;
}
-
+
d = &prog->fielddefs[i];
PRVM_G_INT(OFS_RETURN) = d->s_name; // presuming that s_name points to a string already
}
}
d = &prog->fielddefs[i];
- PRVM_G_FLOAT(OFS_RETURN) = (float)d->type;
+ PRVM_G_FLOAT(OFS_RETURN) = (prvm_vec_t)d->type;
}
// KrimZon - DP_QC_ENTITYDATA
szString = PRVM_G_STRING(OFS_PARM0);
- //nCnt = COM_StringLengthNoColors(szString, 0, NULL);
- nCnt = u8_COM_StringLengthNoColors(szString, 0, NULL);
+ //nCnt = (int)COM_StringLengthNoColors(szString, 0, NULL);
+ nCnt = (int)u8_COM_StringLengthNoColors(szString, 0, NULL);
PRVM_G_FLOAT(OFS_RETURN) = nCnt;
}
if (start < 0) // FTE_STRINGS feature
{
- u_slength = u8_strlen(s);
+ u_slength = (int)u8_strlen(s);
start += u_slength;
start = bound(0, start, u_slength);
}
if (length < 0) // FTE_STRINGS feature
{
if (!u_slength) // it's not calculated when it's not needed above
- u_slength = u8_strlen(s);
+ u_slength = (int)u8_strlen(s);
length += u_slength - start + 1;
}
if (!s[0])
continue;
separators[numseparators] = s;
- separatorlen[numseparators] = strlen(s);
+ separatorlen[numseparators] = (int)strlen(s);
numseparators++;
}
{
VM_SAFEPARMCOUNT(0,VM_serverstate);
- PRVM_G_FLOAT(OFS_RETURN) = sv.active && (svs.maxclients > 1 || cls.state == ca_dedicated);
+ PRVM_G_FLOAT(OFS_RETURN) = sv.active;
}
/*
float gettime(prvm_prog_t *prog)
=========
*/
+#ifdef CONFIG_CD
float CDAudio_GetPosition(void);
+#endif
void VM_gettime(prvm_prog_t *prog)
{
int timer_index;
if(prog->argc == 0)
{
- PRVM_G_FLOAT(OFS_RETURN) = (float) realtime;
+ PRVM_G_FLOAT(OFS_RETURN) = (prvm_vec_t) realtime;
}
else
{
case 3: // GETTIME_UPTIME
PRVM_G_FLOAT(OFS_RETURN) = realtime;
break;
+#ifdef CONFIG_CD
case 4: // GETTIME_CDTRACK
PRVM_G_FLOAT(OFS_RETURN) = CDAudio_GetPosition();
break;
+#endif
default:
VM_Warning(prog, "VM_gettime: %s: unsupported timer specified, returning realtime\n", prog->name);
PRVM_G_FLOAT(OFS_RETURN) = realtime;
entchannel = CHAN_USER2ENGINE(entchannel);
if (!IS_CHAN(entchannel))
VM_Warning(prog, "VM_getsoundtime: %s: bad channel %i\n", prog->name, entchannel);
- PRVM_G_FLOAT(OFS_RETURN) = (float)S_GetEntChannelPosition(entnum, entchannel);
+ PRVM_G_FLOAT(OFS_RETURN) = (prvm_vec_t)S_GetEntChannelPosition(entnum, entchannel);
}
/*
*/
void VM_modulo(prvm_prog_t *prog)
{
- int val, m;
+ prvm_int_t val, m;
VM_SAFEPARMCOUNT(2,VM_module);
- val = (int) PRVM_G_FLOAT(OFS_PARM0);
- m = (int) PRVM_G_FLOAT(OFS_PARM1);
+ val = (prvm_int_t) PRVM_G_FLOAT(OFS_PARM0);
+ m = (prvm_int_t) PRVM_G_FLOAT(OFS_PARM1);
- PRVM_G_FLOAT(OFS_RETURN) = (float) (val % m);
+ PRVM_G_FLOAT(OFS_RETURN) = (prvm_vec_t) (val % m);
}
static void VM_Search_Init(prvm_prog_t *prog)
// float(float number, float quantity) bitshift (EXT_BITSHIFT)
void VM_bitshift (prvm_prog_t *prog)
{
- int n1, n2;
+ prvm_int_t n1, n2;
VM_SAFEPARMCOUNT(2, VM_bitshift);
- n1 = (int)fabs((float)((int)PRVM_G_FLOAT(OFS_PARM0)));
- n2 = (int)PRVM_G_FLOAT(OFS_PARM1);
+ n1 = (prvm_int_t)fabs((prvm_vec_t)((prvm_int_t)PRVM_G_FLOAT(OFS_PARM0)));
+ n2 = (prvm_int_t)PRVM_G_FLOAT(OFS_PARM1);
if(!n1)
PRVM_G_FLOAT(OFS_RETURN) = n1;
else
}
}
- PRVM_G_FLOAT( OFS_RETURN ) = (float) (count / 2);
+ PRVM_G_FLOAT( OFS_RETURN ) = (prvm_vec_t) (count / 2);
}
/*
instr = PRVM_G_STRING( OFS_PARM0 );
for( out = outstr, in = instr, size = sizeof(outstr) - 1 ; size && *in ; size--, in++, out++ )
- if( *in == '\'' ) {
+ if( *in == '\'' && size > 1) {
*out++ = '\\';
*out = '\'';
size--;
return strncmp(b, a, stringbuffers_sortlength);
}
+prvm_stringbuffer_t *BufStr_FindCreateReplace (prvm_prog_t *prog, int bufindex, int flags, char *format)
+{
+ prvm_stringbuffer_t *stringbuffer;
+ int i;
+
+ if (bufindex < 0)
+ return NULL;
+
+ // find buffer with wanted index
+ if (bufindex < (int)Mem_ExpandableArray_IndexRange(&prog->stringbuffersarray))
+ {
+ if ( (stringbuffer = (prvm_stringbuffer_t*) Mem_ExpandableArray_RecordAtIndex(&prog->stringbuffersarray, bufindex)) )
+ {
+ if (stringbuffer->flags & STRINGBUFFER_TEMP)
+ stringbuffer->flags = flags; // created but has not been used yet
+ return stringbuffer;
+ }
+ return NULL;
+ }
+
+ // allocate new buffer with wanted index
+ while(1)
+ {
+ stringbuffer = (prvm_stringbuffer_t *) Mem_ExpandableArray_AllocRecord(&prog->stringbuffersarray);
+ stringbuffer->flags = STRINGBUFFER_TEMP;
+ for (i = 0;stringbuffer != Mem_ExpandableArray_RecordAtIndex(&prog->stringbuffersarray, i);i++);
+ if (i == bufindex)
+ {
+ stringbuffer->flags = flags; // mark as used
+ break;
+ }
+ }
+ return stringbuffer;
+}
+
+void BufStr_Set(prvm_prog_t *prog, prvm_stringbuffer_t *stringbuffer, int strindex, const char *str)
+{
+ size_t alloclen;
+
+ if (!stringbuffer || strindex < 0)
+ return;
+
+ BufStr_Expand(prog, stringbuffer, strindex);
+ stringbuffer->num_strings = max(stringbuffer->num_strings, strindex + 1);
+ if (stringbuffer->strings[strindex])
+ Mem_Free(stringbuffer->strings[strindex]);
+ stringbuffer->strings[strindex] = NULL;
+
+ if (str)
+ {
+ // not the NULL string!
+ alloclen = strlen(str) + 1;
+ stringbuffer->strings[strindex] = (char *)Mem_Alloc(prog->progs_mempool, alloclen);
+ memcpy(stringbuffer->strings[strindex], str, alloclen);
+ }
+
+ BufStr_Shrink(prog, stringbuffer);
+}
+
+void BufStr_Del(prvm_prog_t *prog, prvm_stringbuffer_t *stringbuffer)
+{
+ int i;
+
+ if (!stringbuffer)
+ return;
+
+ for (i = 0;i < stringbuffer->num_strings;i++)
+ if (stringbuffer->strings[i])
+ Mem_Free(stringbuffer->strings[i]);
+ if (stringbuffer->strings)
+ Mem_Free(stringbuffer->strings);
+ if(stringbuffer->origin)
+ PRVM_Free((char *)stringbuffer->origin);
+ Mem_ExpandableArray_FreeRecord(&prog->stringbuffersarray, stringbuffer);
+}
+
+void BufStr_Flush(prvm_prog_t *prog)
+{
+ prvm_stringbuffer_t *stringbuffer;
+ int i, numbuffers;
+
+ numbuffers = (int)Mem_ExpandableArray_IndexRange(&prog->stringbuffersarray);
+ for (i = 0; i < numbuffers; i++)
+ if ( (stringbuffer = (prvm_stringbuffer_t *)Mem_ExpandableArray_RecordAtIndex(&prog->stringbuffersarray, i)) )
+ BufStr_Del(prog, stringbuffer);
+ Mem_ExpandableArray_NewArray(&prog->stringbuffersarray, prog->progs_mempool, sizeof(prvm_stringbuffer_t), 64);
+}
+
/*
========================
VM_buf_create
stringbuffer->origin = PRVM_AllocationOrigin(prog);
// optional flags parm
if (prog->argc >= 2)
- stringbuffer->flags = (int)PRVM_G_FLOAT(OFS_PARM1) & 0xFF;
+ stringbuffer->flags = (int)PRVM_G_FLOAT(OFS_PARM1) & STRINGBUFFER_QCFLAGS;
PRVM_G_FLOAT(OFS_RETURN) = i;
}
VM_SAFEPARMCOUNT(1, VM_buf_del);
stringbuffer = (prvm_stringbuffer_t *)Mem_ExpandableArray_RecordAtIndex(&prog->stringbuffersarray, (int)PRVM_G_FLOAT(OFS_PARM0));
if (stringbuffer)
- {
- int i;
- for (i = 0;i < stringbuffer->num_strings;i++)
- if (stringbuffer->strings[i])
- Mem_Free(stringbuffer->strings[i]);
- if (stringbuffer->strings)
- Mem_Free(stringbuffer->strings);
- if(stringbuffer->origin)
- PRVM_Free((char *)stringbuffer->origin);
- Mem_ExpandableArray_FreeRecord(&prog->stringbuffersarray, stringbuffer);
- }
+ BufStr_Del(prog, stringbuffer);
else
{
VM_Warning(prog, "VM_buf_del: invalid buffer %i used in %s\n", (int)PRVM_G_FLOAT(OFS_PARM0), prog->name);
*/
void VM_bufstr_set (prvm_prog_t *prog)
{
- size_t alloclen;
int strindex;
prvm_stringbuffer_t *stringbuffer;
const char *news;
return;
}
- BufStr_Expand(prog, stringbuffer, strindex);
- stringbuffer->num_strings = max(stringbuffer->num_strings, strindex + 1);
-
- if(stringbuffer->strings[strindex])
- Mem_Free(stringbuffer->strings[strindex]);
- stringbuffer->strings[strindex] = NULL;
-
- if(PRVM_G_INT(OFS_PARM2))
- {
- // not the NULL string!
- news = PRVM_G_STRING(OFS_PARM2);
- alloclen = strlen(news) + 1;
- stringbuffer->strings[strindex] = (char *)Mem_Alloc(prog->progs_mempool, alloclen);
- memcpy(stringbuffer->strings[strindex], news, alloclen);
- }
-
- BufStr_Shrink(prog, stringbuffer);
+ news = PRVM_G_STRING(OFS_PARM2);
+ BufStr_Set(prog, stringbuffer, strindex, news);
}
/*
{
if (stringbuffer->strings[strindex])
{
- if ((strlength = strlen(stringbuffer->strings[strindex])))
+ if ((strlength = (int)strlen(stringbuffer->strings[strindex])))
FS_Write(prog->openfiles[filenum], stringbuffer->strings[strindex], strlength);
FS_Write(prog->openfiles[filenum], "\n", 1);
}
char *ppos, *qpos;
int patternlength;
- patternlength = strlen(pattern);
+ patternlength = (int)strlen(pattern);
ppos = strchr(pattern, '*');
qpos = strchr(pattern, '?');
// has ? - pattern
strlcpy(string, PRVM_G_STRING(OFS_PARM1), sizeof(string));
match = detect_match_rule(string, &matchrule);
}
- matchlen = strlen(match);
+ matchlen = (int)strlen(match);
// find
i = (prog->argc > 3) ? (int)PRVM_G_FLOAT(OFS_PARM3) : 0;
}
// offset
- l = strlen(match);
+ l = (int)strlen(match);
if (prog->argc > 3)
s += max(0, min((unsigned int)PRVM_G_FLOAT(OFS_PARM3), strlen(s)-1));
instr = PRVM_G_STRING(OFS_PARM0);
match = PRVM_G_STRING(OFS_PARM1);
firstofs = (prog->argc > 2)?(int)PRVM_G_FLOAT(OFS_PARM2):0;
- firstofs = u8_bytelen(instr, firstofs);
+ firstofs = (int)u8_bytelen(instr, firstofs);
if (firstofs && (firstofs < 0 || firstofs > (int)strlen(instr)))
{
int index;
VM_SAFEPARMCOUNT(2, VM_str2chr);
s = PRVM_G_STRING(OFS_PARM0);
- index = u8_bytelen(s, (int)PRVM_G_FLOAT(OFS_PARM1));
+ index = (int)u8_bytelen(s, (int)PRVM_G_FLOAT(OFS_PARM1));
if((unsigned)index < strlen(s))
{
redalpha = (int) PRVM_G_FLOAT(OFS_PARM1); //0 same, 1 white, 2 red, 5 alternate, 6 alternate-alternate
rednum = (int) PRVM_G_FLOAT(OFS_PARM2); //0 same, 1 white, 2 red, 3 redspecial, 4 whitespecial, 5 alternate, 6 alternate-alternate
VM_VarString(prog, 3, (char *) resbuf, sizeof(resbuf));
- len = strlen((char *) resbuf);
+ len = (int)strlen((char *) resbuf);
for (i = 0; i < len; i++, result++) //should this be done backwards?
{
if(!digest)
digest = "";
VM_VarString(prog, 1, s, sizeof(s));
- len = strlen(s);
+ len = (int)strlen(s);
outlen = 0;
fn = PRVM_G_STRING(OFS_PARM0);
pack = FS_WhichPack(fn);
- PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, pack ? pack : "");
+ PRVM_G_INT(OFS_RETURN) = pack ? PRVM_SetTempString(prog, pack) : 0;
}
typedef struct
double starttime;
float id;
char buffer[MAX_INPUTLINE];
+ char posttype[128];
unsigned char *postdata; // free when uri_to_prog_t is freed
size_t postlen;
char *sigdata; // free when uri_to_prog_t is freed
handle->sigdata[handle->siglen] = 0;
}
out1:
- ret = Curl_Begin_ToMemory_POST(url, handle->sigdata, 0, posttype, handle->postdata, handle->postlen, (unsigned char *) handle->buffer, sizeof(handle->buffer), uri_to_string_callback, handle);
+ strlcpy(handle->posttype, posttype, sizeof(handle->posttype));
+ ret = Curl_Begin_ToMemory_POST(url, handle->sigdata, 0, handle->posttype, handle->postdata, handle->postlen, (unsigned char *) handle->buffer, sizeof(handle->buffer), uri_to_string_callback, handle);
}
else
{
const char *s, *s0;
char outbuf[MAX_INPUTLINE];
char *o = outbuf, *end = outbuf + sizeof(outbuf), *err;
+ const char *p;
int argpos = 1;
int width, precision, thisarg, flags;
char formatbuf[16];
*f++ = '.';
*f++ = '*';
}
+ if(*s == 'd' || *s == 'i' || *s == 'o' || *s == 'u' || *s == 'x' || *s == 'X')
+ {
+ // make it use a good integer type
+ for(p = INT_LOSSLESS_FORMAT_SIZE; *p; )
+ *f++ = *p++;
+ }
*f++ = *s;
*f++ = 0;
{
case 'd': case 'i':
if(precision < 0) // not set
- o += dpsnprintf(o, end - o, formatbuf, width, (isfloat ? (int) GETARG_FLOAT(thisarg) : (int) GETARG_INT(thisarg)));
+ o += dpsnprintf(o, end - o, formatbuf, width, (isfloat ? INT_LOSSLESS_FORMAT_CONVERT_S(GETARG_FLOAT(thisarg)) : INT_LOSSLESS_FORMAT_CONVERT_S(GETARG_INT(thisarg))));
else
- o += dpsnprintf(o, end - o, formatbuf, width, precision, (isfloat ? (int) GETARG_FLOAT(thisarg) : (int) GETARG_INT(thisarg)));
+ o += dpsnprintf(o, end - o, formatbuf, width, precision, (isfloat ? INT_LOSSLESS_FORMAT_CONVERT_S(GETARG_FLOAT(thisarg)) : INT_LOSSLESS_FORMAT_CONVERT_S(GETARG_INT(thisarg))));
break;
case 'o': case 'u': case 'x': case 'X':
if(precision < 0) // not set
- o += dpsnprintf(o, end - o, formatbuf, width, (isfloat ? (unsigned int) GETARG_FLOAT(thisarg) : (unsigned int) GETARG_INT(thisarg)));
+ o += dpsnprintf(o, end - o, formatbuf, width, (isfloat ? INT_LOSSLESS_FORMAT_CONVERT_U(GETARG_FLOAT(thisarg)) : INT_LOSSLESS_FORMAT_CONVERT_U(GETARG_INT(thisarg))));
else
- o += dpsnprintf(o, end - o, formatbuf, width, precision, (isfloat ? (unsigned int) GETARG_FLOAT(thisarg) : (unsigned int) GETARG_INT(thisarg)));
+ o += dpsnprintf(o, end - o, formatbuf, width, precision, (isfloat ? INT_LOSSLESS_FORMAT_CONVERT_U(GETARG_FLOAT(thisarg)) : INT_LOSSLESS_FORMAT_CONVERT_U(GETARG_INT(thisarg))));
break;
case 'e': case 'E': case 'f': case 'F': case 'g': case 'G':
if(precision < 0) // not set
default:
verbatim:
if(o < end - 1)
- *o++ = *s++;
+ *o++ = *s;
+ ++s;
break;
}
}
VectorCopy(PRVM_G_VECTOR(OFS_PARM1), f.v1);
VM_physics_ApplyCmd(ed, &f);
}
+
+extern cvar_t prvm_coverage;
+void VM_coverage(prvm_prog_t *prog)
+{
+ VM_SAFEPARMCOUNT(0, VM_coverage);
+ if (prog->explicit_profile[prog->xstatement]++ == 0 && (prvm_coverage.integer & 2))
+ PRVM_ExplicitCoverageEvent(prog, prog->xfunction, prog->xstatement);
+}