return 0;
}
+static int qc_strcmp(qc_program *prog)
+{
+ char *cstr1, *cstr2;
+ qcany *str1, *str2;
+ qcany out;
+
+ if (prog->argc != 2 && prog->argc != 3) {
+ printf("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 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_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 */
};
static size_t qc_builtins_count = sizeof(qc_builtins) / sizeof(qc_builtins[0]);
{
printf("usage: %s [options] [parameters] file\n", arg0);
printf("options:\n");
- printf(" -h, --help print this message\n"
- " -trace trace the execution\n"
- " -profile perform profiling during execution\n"
- " -info print information from the prog's header\n"
- " -disasm disassemble and exit\n"
- " -printdefs list the defs section\n"
- " -printfields list the field section\n"
- " -printfuns list functions information\n");
+ printf(" -h, --help print this message\n"
+ " -trace trace the execution\n"
+ " -profile perform profiling during execution\n"
+ " -info print information from the prog's header\n"
+ " -disasm disassemble and exit\n"
+ " -disasm-func func disassemble and exit\n"
+ " -printdefs list the defs section\n"
+ " -printfields list the field section\n"
+ " -printfuns list functions information\n");
printf("parameters:\n");
printf(" -vector <V> pass a vector parameter to main()\n"
" -float <f> pass a float parameter to main()\n"
bool opts_info = false;
bool noexec = false;
const char *progsfile = NULL;
+ const char **dis_list = NULL;
arg0 = argv[0];
opts_disasm = true;
noexec = true;
}
+ else if (!strcmp(argv[1], "-disasm-func")) {
+ --argc;
+ ++argv;
+ if (argc <= 1) {
+ usage();
+ exit(1);
+ }
+ vec_push(dis_list, argv[1]);
+ --argc;
+ ++argv;
+ noexec = true;
+ }
else if (!strcmp(argv[1], "-printdefs")) {
--argc;
++argv;
prog_delete(prog);
return 0;
}
+ for (i = 0; i < vec_size(dis_list); ++i) {
+ size_t k;
+ printf("Looking for `%s`\n", dis_list[i]);
+ for (k = 1; k < vec_size(prog->functions); ++k) {
+ const char *name = prog_getstring(prog, prog->functions[k].name);
+ if (!strcmp(name, dis_list[i])) {
+ prog_disasm_function(prog, k);
+ break;
+ }
+ }
+ }
if (opts_disasm) {
for (i = 1; i < vec_size(prog->functions); ++i)
prog_disasm_function(prog, i);