]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - exec.c
Merge pull request #141 from CurrentResident/big_endian_swap_fix
[xonotic/gmqcc.git] / exec.c
diff --git a/exec.c b/exec.c
index 33037dcda74bf299487c358679ba82ce7984f4be..d4e75b82e8b580394a8d0300ead3705b1364486f 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012, 2013
+ * Copyright (C) 2012, 2013, 2014
  *     Wolfgang Bumiller
  *     Dale Weiler
  *
  */
 #ifndef QCVM_LOOP
 #include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
 #include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
 
 #include "gmqcc.h"
 
-opts_cmd_t   opts; /* command line options */
 static void loaderror(const char *fmt, ...)
 {
     int     err = errno;
@@ -55,9 +53,9 @@ static void qcvmerror(qc_program_t *prog, const char *fmt, ...)
 
 qc_program_t* prog_load(const char *filename, bool skipversion)
 {
-    qc_program_t   *prog;
     prog_header_t   header;
-    FILE         *file  = fs_file_open(filename, "rb");
+    qc_program_t   *prog;
+    fs_file_t      *file  = fs_file_open(filename, "rb");
 
     if (!file)
         return NULL;
@@ -92,11 +90,11 @@ qc_program_t* prog_load(const char *filename, bool skipversion)
     }
 
 #define read_data(hdrvar, progvar, reserved)                           \
-    if (fs_file_seek(file, header.hdrvar.offset, SEEK_SET) != 0) {        \
+    if (fs_file_seek(file, header.hdrvar.offset, SEEK_SET) != 0) {     \
         loaderror("seek failed");                                      \
         goto error;                                                    \
     }                                                                  \
-    if (fs_file_read (                                                    \
+    if (fs_file_read (                                                 \
             vec_add(prog->progvar, header.hdrvar.length + reserved),   \
             sizeof(*prog->progvar),                                    \
             header.hdrvar.length,                                      \
@@ -353,7 +351,7 @@ static void trace_print_global(qc_program_t *prog, unsigned int glob, int vtype)
 done:
     if (len < (int)sizeof(spaces)-1) {
         spaces[sizeof(spaces)-1-len] = 0;
-        fs_file_puts(stdout, spaces);
+        fs_file_puts((fs_file_t*)stdout, spaces);
         spaces[sizeof(spaces)-1-len] = ' ';
     }
 }
@@ -589,7 +587,6 @@ cleanup:
  * main for when building the standalone executor
  */
 
-#if defined(QCVM_EXECUTOR)
 #include <math.h>
 
 const char *type_name[TYPE_COUNT] = {
@@ -834,7 +831,6 @@ static prog_builtin_t qc_builtins[] = {
     &qc_sqrt,        /*   13  */
     &qc_floor        /*   14  */
 };
-static size_t qc_builtins_count = sizeof(qc_builtins) / sizeof(qc_builtins[0]);
 
 static const char *arg0 = NULL;
 
@@ -879,17 +875,10 @@ static void prog_main_setparams(qc_program_t *prog) {
         arg->vector[2] = 0;
         switch (main_params[i].vtype) {
             case TYPE_VECTOR:
-#ifdef _MSC_VER
-                (void)sscanf_s(main_params[i].value, " %f %f %f ",
-                               &arg->vector[0],
-                               &arg->vector[1],
-                               &arg->vector[2]);
-#else
-                (void)sscanf(main_params[i].value, " %f %f %f ",
-                             &arg->vector[0],
-                             &arg->vector[1],
-                             &arg->vector[2]);
-#endif
+                (void)util_sscanf(main_params[i].value, " %f %f %f ",
+                                       &arg->vector[0],
+                                       &arg->vector[1],
+                                       &arg->vector[2]);
                 break;
             case TYPE_FLOAT:
                 arg->_float = atof(main_params[i].value);
@@ -904,32 +893,6 @@ static void prog_main_setparams(qc_program_t *prog) {
     }
 }
 
-static void escapestring(char* dest, const char* src)  {
-  char c;
-  while ((c = *(src++))) {
-    switch(c) {
-      case '\t':
-        *(dest++) = '\\', *(dest++) = 't';
-        break;
-      case '\n':
-        *(dest++) = '\\', *(dest++) = 'n';
-        break;
-      case '\r':
-        *(dest++) = '\\', *(dest++) = 'r';
-        break;
-      case '\\':
-        *(dest++) = '\\', *(dest++) = '\\';
-        break;
-      case '\"':
-        *(dest++) = '\\', *(dest++) = '\"';
-        break;
-      default:
-        *(dest++) = c;
-     }
-  }
-  *dest = '\0';
-}
-
 void prog_disasm_function(qc_program_t *prog, size_t id);
 
 int main(int argc, char **argv) {
@@ -951,7 +914,7 @@ int main(int argc, char **argv) {
 
     if (argc < 2) {
         usage();
-        exit(1);
+        exit(EXIT_FAILURE);
     }
 
     while (argc > 1) {
@@ -960,7 +923,7 @@ int main(int argc, char **argv) {
             !strcmp(argv[1], "--help"))
         {
             usage();
-            exit(0);
+            exit(EXIT_SUCCESS);
         }
         else if (!strcmp(argv[1], "-v")) {
             ++opts_v;
@@ -974,7 +937,7 @@ int main(int argc, char **argv) {
                     ++opts_v;
                 else {
                     usage();
-                    exit(1);
+                    exit(EXIT_FAILURE);
                 }
             }
             --argc;
@@ -984,7 +947,7 @@ int main(int argc, char **argv) {
                  !strcmp(argv[1], "--version"))
         {
             version();
-            exit(0);
+            exit(EXIT_SUCCESS);
         }
         else if (!strcmp(argv[1], "-trace")) {
             --argc;
@@ -1013,7 +976,7 @@ int main(int argc, char **argv) {
             ++argv;
             if (argc <= 1) {
                 usage();
-                exit(1);
+                exit(EXIT_FAILURE);
             }
             vec_push(dis_list, argv[1]);
             --argc;
@@ -1056,7 +1019,7 @@ int main(int argc, char **argv) {
             ++argv;
             if (argc < 2) {
                 usage();
-                exit(1);
+                exit(EXIT_FAILURE);
             }
             p.value = argv[1];
 
@@ -1073,7 +1036,7 @@ int main(int argc, char **argv) {
             if (progsfile) {
                 fprintf(stderr, "only 1 program file may be specified\n");
                 usage();
-                exit(1);
+                exit(EXIT_FAILURE);
             }
             progsfile = argv[1];
             --argc;
@@ -1083,7 +1046,7 @@ int main(int argc, char **argv) {
         {
             fprintf(stderr, "unknown parameter: %s\n", argv[1]);
             usage();
-            exit(1);
+            exit(EXIT_FAILURE);
         }
     }
 
@@ -1096,17 +1059,17 @@ int main(int argc, char **argv) {
     if (!progsfile) {
         fprintf(stderr, "must specify a program to execute\n");
         usage();
-        exit(1);
+        exit(EXIT_FAILURE);
     }
 
     prog = prog_load(progsfile, noexec);
     if (!prog) {
         fprintf(stderr, "failed to load program '%s'\n", progsfile);
-        exit(1);
+        exit(EXIT_FAILURE);
     }
 
     prog->builtins       = qc_builtins;
-    prog->builtins_count = qc_builtins_count;
+    prog->builtins_count = GMQCC_ARRAY_COUNT(qc_builtins);
 
     if (opts_info) {
         printf("Program's system-checksum = 0x%04x\n", (unsigned int)prog->crc16);
@@ -1146,9 +1109,7 @@ int main(int argc, char **argv) {
         return 0;
     }
     if (opts_printdefs) {
-        char       *escape    = NULL;
         const char *getstring = NULL;
-
         for (i = 0; i < vec_size(prog->defs); ++i) {
             printf("Global: %8s %-16s at %u%s",
                    type_name[prog->defs[i].type & DEF_TYPEMASK],
@@ -1171,11 +1132,9 @@ int main(int argc, char **argv) {
                         break;
                     case TYPE_STRING:
                         getstring = prog_getstring(prog, ((qcany_t*)(prog->globals + prog->defs[i].offset))->string);
-                        escape    = (char*)mem_a(strlen(getstring) * 2 + 1); /* will be enough */
-                        escapestring(escape, getstring);
-                        printf(" [init: `%s`]", escape);
-
-                        mem_d(escape); /* free */
+                        printf(" [init: `");
+                        print_escaped_string(getstring, strlen(getstring));
+                        printf("`]\n");
                         break;
                     default:
                         break;
@@ -1196,7 +1155,7 @@ int main(int argc, char **argv) {
     if (opts_printfuns) {
         for (i = 0; i < vec_size(prog->functions); ++i) {
             int32_t a;
-            printf("Function: %-16s taking %i parameters:(",
+            printf("Function: %-16s taking %u parameters:(",
                    prog_getstring(prog, prog->functions[i].name),
                    (unsigned int)prog->functions[i].nargs);
             for (a = 0; a < prog->functions[i].nargs; ++a) {
@@ -1266,7 +1225,6 @@ void prog_disasm_function(qc_program_t *prog, size_t id) {
         ++st;
     }
 }
-#endif
 #else /* !QCVM_LOOP */
 /*
  * Everything from here on is not including into the compilation of the
@@ -1287,7 +1245,7 @@ void prog_disasm_function(qc_program_t *prog, size_t id) {
 #   define FLOAT_IS_TRUE_FOR_INT(x) ( (x) & 0x7FFFFFFF )
 #endif
 
-while (1) {
+while (prog->vmerror == 0) {
     prog_section_function_t  *newf;
     qcany_t          *ed;
     qcany_t          *ptr;