X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=exec.c;h=3955371d5c5fa5f44a5129c87036bb159f7d0600;hb=08302ff32b1a83d738fd3dbdd2af0184ddb46656;hp=b0d7b20a62f95ee23b53dc7e5c5bb6b09c0604b6;hpb=81bb87c49b0c8caf511d88802998e8e5da1cc296;p=xonotic%2Fgmqcc.git diff --git a/exec.c b/exec.c index b0d7b20..3955371 100644 --- a/exec.c +++ b/exec.c @@ -477,7 +477,8 @@ static void prog_print_statement(qc_program *prog, prog_section_statement *st) static qcint prog_enterfunction(qc_program *prog, prog_section_function *func) { qc_exec_stack st; - size_t p, parampos; + size_t parampos; + int32_t p; /* back up locals */ st.localsp = vec_size(prog->localstack); @@ -616,6 +617,8 @@ cleanup: #if defined(QCVM_EXECUTOR) #include +cmd_options opts; + const char *type_name[TYPE_COUNT] = { "void", "string", @@ -631,9 +634,6 @@ const char *type_name[TYPE_COUNT] = { "variant" }; -bool opts_debug = false; -bool opts_memchk = false; - typedef struct { int vtype; const char *value; @@ -691,6 +691,17 @@ static int qc_ftos(qc_program *prog) return 0; } +static int qc_stof(qc_program *prog) +{ + qcany *str; + qcany num; + CheckArgs(1); + str = GetArg(0); + num._float = strtof(prog_getstring(prog, str->string), NULL); + Return(num); + return 0; +} + static int qc_vtos(qc_program *prog) { char buffer[512]; @@ -740,7 +751,7 @@ static int qc_vlen(qc_program *prog) qcany *vec, len; CheckArgs(1); vec = GetArg(0); - len._float = sqrt(vec->vector[0] * vec->vector[0] + + len._float = sqrt(vec->vector[0] * vec->vector[0] + vec->vector[1] * vec->vector[1] + vec->vector[2] * vec->vector[2]); Return(len); @@ -756,7 +767,8 @@ static prog_builtin qc_builtins[] = { &qc_vtos, /* 5 */ &qc_error, /* 6 */ &qc_vlen, /* 7 */ - &qc_etos /* 8 */ + &qc_etos, /* 8 */ + &qc_stof /* 9 */ }; static size_t qc_builtins_count = sizeof(qc_builtins) / sizeof(qc_builtins[0]); @@ -814,6 +826,7 @@ int main(int argc, char **argv) size_t xflags = VMXF_DEFAULT; bool opts_printfields = false; bool opts_printdefs = false; + bool opts_printfuns = false; bool opts_disasm = false; bool opts_info = false; @@ -848,6 +861,11 @@ int main(int argc, char **argv) ++argv; opts_printdefs = true; } + else if (!strcmp(argv[1], "-printfuns")) { + --argc; + ++argv; + opts_printfuns = true; + } else if (!strcmp(argv[1], "-printfields")) { --argc; ++argv; @@ -890,8 +908,9 @@ int main(int argc, char **argv) prog->builtins_count = qc_builtins_count; if (opts_info) { - printf("Program's system-checksum = 0x%04x\n", (int)prog->crc16); - printf("Entity field space: %i\n", (int)prog->entityfields); + printf("Program's system-checksum = 0x%04x\n", (unsigned int)prog->crc16); + printf("Entity field space: %u\n", (unsigned int)prog->entityfields); + printf("Globals: %u\n", (unsigned int)vec_size(prog->globals)); } for (i = 1; i < vec_size(prog->functions); ++i) { @@ -925,6 +944,20 @@ int main(int argc, char **argv) (unsigned int)prog->fields[i].offset); } } + else if (opts_printfuns) { + for (i = 0; i < vec_size(prog->functions); ++i) { + int32_t a; + printf("Function: %-16s taking %i parameters:(", + prog_getstring(prog, prog->functions[i].name), + (unsigned int)prog->functions[i].nargs); + for (a = 0; a < prog->functions[i].nargs; ++a) { + printf(" %i", prog->functions[i].argsize[a]); + } + printf(") locals: %i + %i\n", + prog->functions[i].firstlocal, + prog->functions[i].locals); + } + } else { if (fnmain > 0)