static void process_arguments(sl_vm_t* vm, int argc, char** argv) { int i = 1; for(; i < argc; i++) { if(strcmp(argv[i], "-I") == 0) { if(i + 1 == argc) { fprintf(stderr, "Expected <path> after -I\n"); shutdown_vm(vm, 1); } sl_require_path_prepend(vm, argv[++i]); continue; } if(strcmp(argv[i], "-i") == 0) { opt_interactive = true; continue; } if(strcmp(argv[i], "-h") == 0) { print_help(argv[0]); shutdown_vm(vm, 0); } if(strcmp(argv[i], "--") == 0) { i++; break; } if(argv[i][0] == '-') { fprintf(stderr, "Unknown option '%s'\n", argv[i]); shutdown_vm(vm, 1); } break; } if(!opt_interactive) { if(i == argc || strcmp(argv[i], "-") == 0) { opt_source_file = stdin; opt_source_file_name = "(stdin)"; } else { opt_source_file = fopen(argv[i], "rb"); opt_source_file_name = argv[i]; if(!opt_source_file) { perror("Could not open source file"); shutdown_vm(vm, 1); } } i++; } SLVAL vargv = sl_make_array(vm, 0, NULL); for(; i < argc; i++) { SLVAL varg = sl_make_cstring(vm, argv[i]); sl_array_push(vm, vargv, 1, &varg); } sl_class_set_const(vm, vm->lib.Object, "ARGV", vargv); }
static void run_repl(sl_vm_t* vm) { printf("Interactive Slash\n"); cli_setup_readline(); while(true) { char* line = cli_readline(">> "); if(!line) { printf("\n"); shutdown_vm(vm, 0); } sl_vm_frame_t frame; SLVAL exception; SL_TRY(frame, SL_UNWIND_EXCEPTION, { SLVAL result = sl_do_string(vm, (uint8_t*)line, strlen(line), "(repl)", 1); result = sl_inspect(vm, result); printf("=> "); sl_string_t* str = (sl_string_t*)sl_get_ptr(result); fwrite(str->buff, str->buff_len, 1, stdout); printf("\n"); }, exception, { SLVAL exception_str = sl_to_s_no_throw(vm, exception); sl_string_t* str = (sl_string_t*)sl_get_ptr(exception_str); fwrite(str->buff, str->buff_len, 1, stdout); printf("\n"); });
static void handle_exception_and_exit(sl_vm_t* vm, SLVAL error) { SLVAL error_str = sl_to_s_no_throw(vm, error); sl_string_t* str = (sl_string_t*)sl_get_ptr(error_str); fwrite(str->buff, str->buff_len, 1, stderr); fprintf(stderr, "\n\n"); shutdown_vm(vm, 1); }
void tearDown(void) { shutdown_vm(); }