]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - exec.c
when using -trace in qcvm: print a newline after every print that doesn't end in...
[xonotic/gmqcc.git] / exec.c
diff --git a/exec.c b/exec.c
index 52ce15e0529e04cfd059f9931242b1ccafb3fbd8..8b4660b3b1abdd2c9febb885ec46b7c1dd83d1f0 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -338,7 +338,11 @@ static void trace_print_global(qc_program *prog, unsigned int glob, int vtype)
     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
@@ -350,7 +354,7 @@ static void trace_print_global(qc_program *prog, unsigned int glob, int vtype)
         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],
@@ -558,9 +562,11 @@ static qcint prog_leavefunction(qc_program *prog)
 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;
@@ -598,6 +604,7 @@ bool prog_exec(qc_program *prog, prog_section_function *func, size_t flags, long
     };
 
 cleanup:
+    prog->xflags = oldxflags;
     prog->localstack_count = 0;
     prog->stack_count = 0;
     if (prog->vmerror)
@@ -610,6 +617,8 @@ cleanup:
  */
 
 #if defined(QCVM_EXECUTOR)
+#include <math.h>
+
 const char *type_name[TYPE_COUNT] = {
     "void",
     "string",
@@ -644,9 +653,15 @@ bool        opts_memchk   = false;
 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;
 }
@@ -703,14 +718,27 @@ static int qc_kill(qc_program *prog)
     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]);