tort_v _tort_string_to_number(tort_v s, int radix) /**/ { long long d = 0; if ( radix == 10 /* FIXME */ && sscanf(tort_string_data(s), "%lld", &d) == 1 ) { return tort_i(d); } else { return tort_false; } }
tort_v _tort_m_dynlib__dlopen(tort_tp struct tort_dynlib *rcvr, tort_v name) { char file_buffer[1024]; const char *file; void *dl; const char *base_sym; void *base_ptr; rcvr->name = name; file = tort_string_data(name); if ( ! (dl = tort_dlopen(file, file_buffer)) ) { const char *str = dlerror(); str = str ? str : "UNKNOWN ERROR"; rcvr->error = tort_string_new_cstr(str); perror(str); return rcvr; } file = file_buffer; rcvr->path = tort_string_new_cstr(file); rcvr->base_sym = rcvr->base_ptr = tort_nil; tort_send(tort__s(emptyE), rcvr); tort_send(tort__s(_load_symtab), rcvr, file, 0); if ( ! tort_map_size(rcvr) ) return rcvr; base_sym = tort_symbol_data(tort_map_data(rcvr)[0]->first); rcvr->base_sym = tort_string_new_cstr(base_sym); base_ptr = tort_ptr_data(tort_map_data(rcvr)[0]->second); rcvr->base_ptr = tort_ptr_new(base_ptr); if ( _tort_dl_debug ) { fprintf(stderr, " base_sym = '%s'\n", base_sym); fprintf(stderr, " base_ptr = %p\n", base_ptr); } base_ptr = dlsym(dl, base_sym); if ( _tort_dl_debug ) fprintf(stderr, " dlsym(@%p, \"%s\") => @%p\n", dl, base_sym, base_ptr); { Dl_info info; bzero(&info, sizeof(info)); dladdr((void*) base_ptr, &info); if ( _tort_dl_debug > 1 ) { fprintf(stderr, " dli_fname = %s\n", info.dli_fname); fprintf(stderr, " dli_fbase = %p\n", info.dli_fbase); fprintf(stderr, " dli_sname = %s\n", info.dli_sname); fprintf(stderr, " dli_saddr = %p\n", info.dli_saddr); } base_ptr = info.dli_fbase; } tort_dlclose(dl); tort_send(tort__s(emptyE), rcvr); tort_send(tort__s(_load_symtab), rcvr, file, base_ptr); tort_send(tort__s(set), tort_(dl_maps), tort_string_new_cstr(file), rcvr); return rcvr; }
tort_v _tort_m_string___inspect(tort_tp tort_v rcvr, tort_v io) { tort_v str = tort_send(tort__s(escape), rcvr, tort_i('"')); printf("\"%s\"", (char *) tort_string_data(str)); return tort_nil; }