value = (qcany*)(&prog->globals[glob]);
if (def) {
- len = printf("[%s] ", prog_getstring(prog, def->name));
+ const char *name = prog_getstring(prog, def->name);
+ if (name[0] == '#')
+ len = printf("$");
+ else
+ len = printf("%s ", name);
vtype = def->type;
}
else
case TYPE_FIELD:
case TYPE_FUNCTION:
case TYPE_POINTER:
- len += printf("%i,", value->_int);
+ len += printf("(%i),", value->_int);
break;
case TYPE_VECTOR:
len += printf("'%g %g %g',", value->vector[0],
bool prog_exec(qc_program *prog, prog_section_function *func, size_t flags, long maxjumps)
{
long jumpcount = 0;
+ size_t oldxflags = prog->xflags;
prog_section_statement *st;
prog->vmerror = 0;
+ prog->xflags = flags;
st = prog->code + prog_enterfunction(prog, func);
--st;
};
cleanup:
+ prog->xflags = oldxflags;
prog->localstack_count = 0;
prog->stack_count = 0;
if (prog->vmerror)
*/
#if defined(QCVM_EXECUTOR)
+#include <math.h>
+
const char *type_name[TYPE_COUNT] = {
"void",
"string",
static int qc_print(qc_program *prog)
{
size_t i;
+ const char *laststr = NULL;
for (i = 0; i < prog->argc; ++i) {
qcany *str = (qcany*)(prog->globals + OFS_PARM0 + 3*i);
- printf("%s", prog_getstring(prog, str->string));
+ printf("%s", (laststr = prog_getstring(prog, str->string)));
+ }
+ if (laststr && (prog->xflags & VMXF_TRACE)) {
+ size_t len = strlen(laststr);
+ if (!len || laststr[len-1] != '\n')
+ printf("\n");
}
return 0;
}
return 0;
}
+static int qc_vlen(qc_program *prog)
+{
+ qcany *vec, len;
+ CheckArgs(1);
+ vec = GetArg(0);
+ len._float = sqrt(vec->vector[0] * vec->vector[0] +
+ vec->vector[1] * vec->vector[1] +
+ vec->vector[2] * vec->vector[2]);
+ Return(len);
+ return 0;
+}
+
static prog_builtin qc_builtins[] = {
NULL,
- &qc_print,
- &qc_ftos,
- &qc_spawn,
- &qc_kill,
- &qc_vtos,
- &qc_error
+ &qc_print, /* 1 */
+ &qc_ftos, /* 2 */
+ &qc_spawn, /* 3 */
+ &qc_kill, /* 4 */
+ &qc_vtos, /* 5 */
+ &qc_error, /* 6 */
+ &qc_vlen /* 7 */
};
static size_t qc_builtins_count = sizeof(qc_builtins) / sizeof(qc_builtins[0]);