示例#1
0
文件: cli.c 项目: Hmaal/slash
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);
}
示例#2
0
文件: cli.c 项目: Hmaal/slash
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");
        });
示例#3
0
文件: cli.c 项目: Hmaal/slash
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);
}
示例#4
0
void tearDown(void)
{
    shutdown_vm();
}