X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=exec.c;h=f4c9ecf458f1a5a21d3247ad5f6ffee121d993fc;hp=2957d4c5bf315431353a5d6d7d9c8aaa7528adbc;hb=1410840ef60e16fd3ed989dd79c79ba2df8ee773;hpb=6935561b41dc0a07ca818187fc16a0334711cf04 diff --git a/exec.c b/exec.c index 2957d4c..f4c9ecf 100644 --- a/exec.c +++ b/exec.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * Wolfgang Bumiller * Dale Weiler * @@ -243,13 +243,8 @@ void prog_free_entity(qc_program *prog, qcint e) prog->entitypool[e] = false; } -qcint prog_tempstring(qc_program *prog, const char *_str) +qcint prog_tempstring(qc_program *prog, const char *str) { - /* we don't access it, but the macro-generated functions don't use - * const - */ - char *str = (char*)_str; - size_t len = strlen(str); size_t at = prog->tempstring_at; @@ -475,7 +470,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 @@ -613,10 +609,16 @@ const char *type_name[TYPE_COUNT] = { "field", "function", "pointer", -#if 0 "integer", -#endif - "variant" + + "variant", + + "struct", + "union", + "array", + + "nil", + "noexpr" }; typedef struct { @@ -732,6 +734,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 +756,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 +827,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 +1035,7 @@ int main(int argc, char **argv) --argc; ++argv; - if (argc < 3) { + if (argc < 2) { usage(); exit(1); } @@ -1027,27 +1062,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); } @@ -1254,15 +1282,21 @@ while (1) { OPA->vector[2]*OPB->vector[2]; break; case INSTR_MUL_FV: - OPC->vector[0] = OPA->_float * OPB->vector[0]; - OPC->vector[1] = OPA->_float * OPB->vector[1]; - OPC->vector[2] = OPA->_float * OPB->vector[2]; + { + qcfloat f = OPA->_float; + OPC->vector[0] = f * OPB->vector[0]; + OPC->vector[1] = f * OPB->vector[1]; + OPC->vector[2] = f * OPB->vector[2]; break; + } case INSTR_MUL_VF: - OPC->vector[0] = OPB->_float * OPA->vector[0]; - OPC->vector[1] = OPB->_float * OPA->vector[1]; - OPC->vector[2] = OPB->_float * OPA->vector[2]; + { + qcfloat f = OPB->_float; + OPC->vector[0] = f * OPA->vector[0]; + OPC->vector[1] = f * OPA->vector[1]; + OPC->vector[2] = f * OPA->vector[2]; break; + } case INSTR_DIV_F: if (OPB->_float != 0.0f) OPC->_float = OPA->_float / OPB->_float; @@ -1368,9 +1402,10 @@ while (1) { goto cleanup; } ed = prog_getedict(prog, OPA->edict); - OPC->ivector[0] = ((qcany*)( ((qcint*)ed) + OPB->_int ))->ivector[0]; - OPC->ivector[1] = ((qcany*)( ((qcint*)ed) + OPB->_int ))->ivector[1]; - OPC->ivector[2] = ((qcany*)( ((qcint*)ed) + OPB->_int ))->ivector[2]; + ptr = (qcany*)( ((qcint*)ed) + OPB->_int ); + OPC->ivector[0] = ptr->ivector[0]; + OPC->ivector[1] = ptr->ivector[1]; + OPC->ivector[2] = ptr->ivector[2]; break; case INSTR_ADDRESS: