]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - exec.c
add ticks around vector strings created by vtos
[xonotic/gmqcc.git] / exec.c
diff --git a/exec.c b/exec.c
index 2e1f58d476baf9f99c622153dcfaa5093b884505..e792affd0bf3d61f8d6ac20e4b05e48357a6f0a6 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -80,6 +80,7 @@ qc_program* prog_load(const char *filename)
     memset(prog, 0, sizeof(*prog));
 
     prog->entityfields = header.entfield;
+    prog->crc16 = header.crc16;
 
     prog->filename = util_strdup(filename);
     if (!prog->filename) {
@@ -606,6 +607,21 @@ cleanup:
  */
 
 #if defined(QCVM_EXECUTOR)
+const char *type_name[TYPE_COUNT] = {
+    "void",
+    "string",
+    "float",
+    "vector",
+    "entity",
+    "field",
+    "function",
+    "pointer",
+#if 0
+    "integer",
+#endif
+    "variant"
+};
+
 bool        opts_debug    = false;
 bool        opts_memchk   = false;
 
@@ -645,6 +661,19 @@ static int qc_ftos(qc_program *prog)
     return 0;
 }
 
+static int qc_vtos(qc_program *prog)
+{
+    char buffer[512];
+    qcany *num;
+    qcany str;
+    CheckArgs(1);
+    num = GetArg(0);
+    snprintf(buffer, sizeof(buffer), "`%g %g %g`", num->vector[0], num->vector[1], num->vector[2]);
+    str.string = prog_tempstring(prog, buffer);
+    Return(str);
+    return 0;
+}
+
 static int qc_spawn(qc_program *prog)
 {
     qcany ent;
@@ -668,7 +697,8 @@ static prog_builtin qc_builtins[] = {
     &qc_print,
     &qc_ftos,
     &qc_spawn,
-    &qc_kill
+    &qc_kill,
+    &qc_vtos,
 };
 static size_t qc_builtins_count = sizeof(qc_builtins) / sizeof(qc_builtins[0]);
 
@@ -686,6 +716,9 @@ int main(int argc, char **argv)
     qcint       fnmain = -1;
     qc_program *prog;
     size_t      xflags = VMXF_DEFAULT;
+    bool        opts_printfields = false;
+    bool        opts_printdefs   = false;
+    bool        opts_info  = false;
 
     arg0 = argv[0];
 
@@ -703,6 +736,21 @@ int main(int argc, char **argv)
             ++argv;
             xflags |= VMXF_PROFILE;
         }
+        else if (!strcmp(argv[1], "-info")) {
+            --argc;
+            ++argv;
+            opts_info = true;
+        }
+        else if (!strcmp(argv[1], "-printdefs")) {
+            --argc;
+            ++argv;
+            opts_printdefs = true;
+        }
+        else if (!strcmp(argv[1], "-printfields")) {
+            --argc;
+            ++argv;
+            opts_printfields = true;
+        }
         else
             usage();
     }
@@ -718,6 +766,8 @@ int main(int argc, char **argv)
     prog->builtins_count = qc_builtins_count;
     prog->builtins_alloc = 0;
 
+    printf("Program's system-checksum = 0x%04x\n", (int)prog->crc16);
+
     for (i = 1; i < prog->functions_count; ++i) {
         const char *name = prog_getstring(prog, prog->functions[i].name);
         /* printf("Found function: %s\n", name); */
@@ -725,12 +775,35 @@ int main(int argc, char **argv)
             fnmain = (qcint)i;
     }
     printf("Entity field space: %i\n", (int)prog->entityfields);
-    if (fnmain > 0)
-    {
-        prog_exec(prog, &prog->functions[fnmain], xflags, VM_JUMPS_DEFAULT);
+    if (opts_info) {
+        prog_delete(prog);
+        return 0;
+    }
+    if (opts_printdefs) {
+        for (i = 0; i < prog->defs_count; ++i) {
+            printf("Global: %8s %-16s at %u\n",
+                   type_name[prog->defs[i].type],
+                   prog_getstring(prog, prog->defs[i].name),
+                   (unsigned int)prog->defs[i].offset);
+        }
+    }
+    else if (opts_printfields) {
+        for (i = 0; i < prog->fields_count; ++i) {
+            printf("Field: %8s %-16s at %u\n",
+                   type_name[prog->fields[i].type],
+                   prog_getstring(prog, prog->fields[i].name),
+                   (unsigned int)prog->fields[i].offset);
+        }
     }
     else
-        printf("No main function found\n");
+    {
+        if (fnmain > 0)
+        {
+            prog_exec(prog, &prog->functions[fnmain], xflags, VM_JUMPS_DEFAULT);
+        }
+        else
+            printf("No main function found\n");
+    }
 
     prog_delete(prog);
     return 0;