X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=exec.c;h=5bff85e06a8605e692c58778820096b19cffb8ad;hb=96126b435ae831d651855d9cf4430c8540ce13b0;hp=7931486e411ab65b382755020c70a0e88eff1f3a;hpb=babdebee797f07a3478d7af532536b6f44b33046;p=xonotic%2Fgmqcc.git diff --git a/exec.c b/exec.c index 7931486..5bff85e 100644 --- a/exec.c +++ b/exec.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * Wolfgang Bumiller * Dale Weiler * @@ -359,7 +359,7 @@ static void trace_print_global(qc_program *prog, unsigned int glob, int vtype) done: if (len < (int)sizeof(spaces)-1) { spaces[sizeof(spaces)-1-len] = 0; - printf(spaces); + file_puts(stdout, spaces); spaces[sizeof(spaces)-1-len] = ' '; } } @@ -475,7 +475,8 @@ static qcint prog_enterfunction(qc_program *prog, prog_section_function *func) st.function = func; if (prog->xflags & VMXF_TRACE) { - vec_push(prog->function_stack, prog_getstring(prog, func->name)); + const char *str = prog_getstring(prog, func->name); + vec_push(prog->function_stack, str); } #ifdef QCVM_BACKUP_STRATEGY_CALLER_VARS @@ -732,6 +733,16 @@ static int qc_kill(qc_program *prog) return 0; } +static int qc_sqrt(qc_program *prog) +{ + qcany *num, out; + CheckArgs(1); + num = GetArg(0); + out._float = sqrt(num->_float); + Return(out); + return 0; +} + static int qc_vlen(qc_program *prog) { qcany *vec, len; @@ -744,6 +755,27 @@ static int qc_vlen(qc_program *prog) return 0; } +static int qc_normalize(qc_program *prog) +{ + double len; + qcany *vec; + qcany out; + CheckArgs(1); + vec = GetArg(0); + len = sqrt(vec->vector[0] * vec->vector[0] + + vec->vector[1] * vec->vector[1] + + vec->vector[2] * vec->vector[2]); + if (len) + len = 1.0 / len; + else + len = 0; + out.vector[0] = len * vec->vector[0]; + out.vector[1] = len * vec->vector[1]; + out.vector[2] = len * vec->vector[2]; + Return(out); + return 0; +} + static int qc_strcat(qc_program *prog) { char *buffer; @@ -794,17 +826,19 @@ static int qc_strcmp(qc_program *prog) static prog_builtin qc_builtins[] = { NULL, - &qc_print, /* 1 */ - &qc_ftos, /* 2 */ - &qc_spawn, /* 3 */ - &qc_kill, /* 4 */ - &qc_vtos, /* 5 */ - &qc_error, /* 6 */ - &qc_vlen, /* 7 */ - &qc_etos, /* 8 */ - &qc_stof, /* 9 */ - &qc_strcat, /* 10 */ - &qc_strcmp /* 11 */ + &qc_print, /* 1 */ + &qc_ftos, /* 2 */ + &qc_spawn, /* 3 */ + &qc_kill, /* 4 */ + &qc_vtos, /* 5 */ + &qc_error, /* 6 */ + &qc_vlen, /* 7 */ + &qc_etos, /* 8 */ + &qc_stof, /* 9 */ + &qc_strcat, /* 10 */ + &qc_strcmp, /* 11 */ + &qc_normalize, /* 12 */ + &qc_sqrt /* 13 */ }; static size_t qc_builtins_count = sizeof(qc_builtins) / sizeof(qc_builtins[0]); @@ -1000,7 +1034,7 @@ int main(int argc, char **argv) --argc; ++argv; - if (argc < 3) { + if (argc < 2) { usage(); exit(1); } @@ -1027,27 +1061,20 @@ int main(int argc, char **argv) } else { + printf("unknown parameter: %s\n", argv[1]); usage(); exit(1); } } - if (argc > 2) { - usage(); - exit(1); - } - if (argc > 1) { - if (progsfile) { - printf("only 1 program file may be specified\n"); - usage(); - exit(1); - } + if (argc == 2 && !progsfile) { progsfile = argv[1]; --argc; ++argv; } if (!progsfile) { + printf("must specify a program to execute\n"); usage(); exit(1); }