+static int qc_normalize(qc_program_t *prog) {
+ double len;
+ qcany_t *vec;
+ qcany_t 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_t *prog) {
+ char *buffer;
+ size_t len1, len2;
+ qcany_t *str1, *str2;
+ qcany_t out;
+
+ const char *cstr1;
+ const char *cstr2;
+
+ CheckArgs(2);
+ str1 = GetArg(0);
+ str2 = GetArg(1);
+ cstr1 = prog_getstring(prog, str1->string);
+ cstr2 = prog_getstring(prog, str2->string);
+ len1 = strlen(cstr1);
+ len2 = strlen(cstr2);
+ buffer = (char*)mem_a(len1 + len2 + 1);
+ memcpy(buffer, cstr1, len1);
+ memcpy(buffer+len1, cstr2, len2+1);
+ out.string = prog_tempstring(prog, buffer);
+ mem_d(buffer);
+ Return(out);
+ return 0;
+}
+
+static int qc_strcmp(qc_program_t *prog) {
+ qcany_t *str1, *str2;
+ qcany_t out;
+
+ const char *cstr1;
+ const char *cstr2;
+
+ if (prog->argc != 2 && prog->argc != 3) {
+ fprintf(stderr, "ERROR: invalid number of arguments for strcmp/strncmp: %i, expected 2 or 3\n",
+ prog->argc);
+ return -1;
+ }
+
+ str1 = GetArg(0);
+ str2 = GetArg(1);
+ cstr1 = prog_getstring(prog, str1->string);
+ cstr2 = prog_getstring(prog, str2->string);
+ if (prog->argc == 3)
+ out._float = strncmp(cstr1, cstr2, GetArg(2)->_float);
+ else
+ out._float = strcmp(cstr1, cstr2);
+ Return(out);
+ return 0;
+}
+
+static int qc_floor(qc_program_t *prog) {
+ qcany_t *num, out;
+ CheckArgs(1);
+ num = GetArg(0);
+ out._float = floor(num->_float);
+ Return(out);
+ return 0;
+}
+
+static prog_builtin_t qc_builtins[] = {