static int run_slash_script(request_rec* r, void* stack_top) { sl_vm_t* vm; slash_context_t ctx; sl_vm_frame_t exit_frame, exception_frame; char* last_slash; SLVAL error; sl_static_init(); vm = sl_init("apache2"); sl_gc_set_stack_top(vm->arena, stack_top); vm->cwd = sl_alloc_buffer(vm->arena, strlen(r->canonical_filename) + 10); strcpy(vm->cwd, r->canonical_filename); last_slash = strrchr(vm->cwd, '/'); if(last_slash) { *last_slash = 0; } SL_TRY(exit_frame, SL_UNWIND_ALL, { SL_TRY(exception_frame, SL_UNWIND_EXCEPTION, { ctx.headers_sent = 0; ctx.vm = vm; ctx.r = r; vm->data = &ctx; setup_request_object(vm, r); setup_response_object(vm); ap_set_content_type(r, "text/html; charset=utf-8"); sl_do_file(vm, r->canonical_filename); }, error, { sl_response_clear(vm); sl_render_error_page(vm, error); });
int main(int argc, char** argv) { int sock; slash_context_t* ctx; #ifdef USE_PTHREADS pthread_t thread; pthread_attr_t thread_attr; pthread_attr_init(&thread_attr); pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); #endif parse_opts(argc, argv); FCGX_Init(); sl_static_init(); if(DAEMONIZE) { daemonize(); } sock = FCGX_OpenSocket(LISTEN, BACKLOG); while(1) { ctx = malloc(sizeof(slash_context_t)); FCGX_InitRequest(&ctx->request, sock, 0); if(FCGX_Accept_r(&ctx->request) != 0) { exit(1); } #ifdef USE_PTHREADS pthread_create(&thread, &thread_attr, handle_request_thread_start, ctx); #else handle_request_thread_start(ctx); #endif } }
static sl_vm_t* setup_vm(void* stack_top) { sl_static_init(); sl_vm_t* vm = sl_init("cli"); sl_gc_set_stack_top(vm->arena, stack_top); setup_vm_request(vm); setup_vm_response(vm); return vm; }
static void run_slash_script(slash_api_base_t* api, cgi_options* options, void* stack_top) { sl_vm_t* vm; slash_context_t ctx; sl_vm_frame_t exit_frame, exception_frame; char* canonical_filename; SLVAL error; sl_static_init(); vm = sl_init("cgi-fcgi"); bzero(&ctx, sizeof(ctx)); ctx.api = api; ctx.headers_sent = 0; ctx.vm = vm; vm->data = &ctx; sl_gc_set_stack_top(vm->arena, stack_top); load_cgi_options(vm, options); load_request_info(vm, options, api, &ctx.info); #ifdef SL_TEST register_cgi_test_utils(vm); #endif canonical_filename = ctx.info.real_canonical_filename; #ifndef SL_TEST vm->cwd = ctx.info.real_canonical_dir; #endif if(canonical_filename) { SL_TRY(exit_frame, SL_UNWIND_ALL, { SL_TRY(exception_frame, SL_UNWIND_EXCEPTION, { bool request_valid = setup_request_object(vm, &ctx.info); setup_response_object(vm); if(!request_valid) { sl_error(vm, vm->lib.Error, "Invalid Request"); } sl_do_file_hashbang(vm, canonical_filename, api->type == SLASH_REQUEST_CGI); }, error, { sl_response_clear(vm); sl_render_error_page(vm, error); }); }, error, {});
int main(int argc, char** argv) { sl_static_init(); sl_vm_t* vm = sl_init("disasm"); if(argc < 1) { fprintf(stderr, "Usage: slash-dis <source file>\n"); exit(1); } FILE* f = fopen(argv[1], "r"); if(!f) { fprintf(stderr, "Could not open %s for reading.\n", argv[1]); exit(1); } fseek(f, 0, SEEK_END); size_t size = ftell(f); fseek(f, 0, SEEK_SET); char* source = sl_alloc_buffer(vm->arena, size + 1); fread(source, size, 1, f); fclose(f); SLVAL err; sl_vm_frame_t frame; SL_TRY(frame, SL_UNWIND_ALL, { size_t token_count; sl_token_t* tokens = sl_lex(vm, (uint8_t*)argv[1], (uint8_t*)source, size, &token_count, 0); sl_node_base_t* ast = sl_parse(vm, tokens, token_count, (uint8_t*)argv[1]); sl_vm_section_t* section = sl_compile(vm, ast, (uint8_t*)argv[1]); disassemble(vm, section); while(section_j < section_i) { disassemble(vm, section_queue[++section_j]); } }, err, {