X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=exec.c;h=bb35ee9e3ac1fc30a375ec6539523ac099efe335;hb=3f1cad18af2aeec3c6b470eb8a3dd0b53d8eb89a;hp=dc93a38dfae0ef04ec442cd683e6d920696f80ec;hpb=b93125c678034b9d3b47f231c76dee6b573aa7e7;p=xonotic%2Fgmqcc.git diff --git a/exec.c b/exec.c index dc93a38..bb35ee9 100644 --- a/exec.c +++ b/exec.c @@ -645,6 +645,13 @@ const char *type_name[TYPE_COUNT] = { bool opts_debug = false; bool opts_memchk = false; +typedef struct { + int vtype; + const char *value; +} qcvm_parameter; + +VECTOR_MAKE(qcvm_parameter, main_params); + #define CheckArgs(num) do { \ if (prog->argc != (num)) { \ prog->vmerror++; \ @@ -702,7 +709,7 @@ static int qc_vtos(qc_program *prog) qcany str; CheckArgs(1); num = GetArg(0); - snprintf(buffer, sizeof(buffer), "`%g %g %g`", num->vector[0], num->vector[1], num->vector[2]); + 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; @@ -758,6 +765,43 @@ void usage() exit(1); } +static void prog_main_setparams(qc_program *prog) +{ + size_t i; + qcany *arg; + + for (i = 0; i < main_params_elements; ++i) { + arg = GetGlobal(OFS_PARM0 + 3*i); + arg->vector[0] = 0; + arg->vector[1] = 0; + arg->vector[2] = 0; + switch (main_params_data[i].vtype) { + case TYPE_VECTOR: +#ifdef WIN32 + (void)sscanf_s(main_params_data[i].value, " %f %f %f ", + &arg->vector[0], + &arg->vector[1], + &arg->vector[2]); +#else + (void)sscanf(main_params_data[i].value, " %f %f %f ", + &arg->vector[0], + &arg->vector[1], + &arg->vector[2]); +#endif + break; + case TYPE_FLOAT: + arg->_float = atof(main_params_data[i].value); + break; + case TYPE_STRING: + arg->string = prog_tempstring(prog, main_params_data[i].value); + break; + default: + printf("error: unhandled parameter type: %i\n", main_params_data[i].vtype); + break; + } + } +} + int main(int argc, char **argv) { size_t i; @@ -799,6 +843,33 @@ int main(int argc, char **argv) ++argv; opts_printfields = true; } + else if (!strcmp(argv[1], "-vector") || + !strcmp(argv[1], "-string") || + !strcmp(argv[1], "-float") ) + { + qcvm_parameter p; + if (argv[1][1] == 'f') + p.vtype = TYPE_FLOAT; + else if (argv[1][1] == 's') + p.vtype = TYPE_STRING; + else if (argv[1][1] == 'v') + p.vtype = TYPE_VECTOR; + + --argc; + ++argv; + if (argc < 3) + usage(); + p.value = argv[1]; + + if (main_params_add(p) < 0) { + if (main_params_data) + mem_d(main_params_data); + printf("cannot add parameter\n"); + exit(1); + } + --argc; + ++argv; + } else usage(); } @@ -814,7 +885,10 @@ 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); + if (opts_info) { + printf("Program's system-checksum = 0x%04x\n", (int)prog->crc16); + printf("Entity field space: %i\n", (int)prog->entityfields); + } for (i = 1; i < prog->functions_count; ++i) { const char *name = prog_getstring(prog, prog->functions[i].name); @@ -822,7 +896,6 @@ int main(int argc, char **argv) if (!strcmp(name, "main")) fnmain = (qcint)i; } - printf("Entity field space: %i\n", (int)prog->entityfields); if (opts_info) { prog_delete(prog); return 0; @@ -830,7 +903,7 @@ int main(int argc, char **argv) if (opts_printdefs) { for (i = 0; i < prog->defs_count; ++i) { printf("Global: %8s %-16s at %u\n", - type_name[prog->defs[i].type], + type_name[prog->defs[i].type & DEF_TYPEMASK], prog_getstring(prog, prog->defs[i].name), (unsigned int)prog->defs[i].offset); } @@ -847,6 +920,7 @@ int main(int argc, char **argv) { if (fnmain > 0) { + prog_main_setparams(prog); prog_exec(prog, &prog->functions[fnmain], xflags, VM_JUMPS_DEFAULT); } else