DFSCH_DEFINE_PRIMITIVE(http_split_query, NULL) { char* pos; char* uri; DFSCH_STRING_ARG(args, uri); DFSCH_ARG_END(args); pos = strchr(uri, '?'); if (!pos) { return dfsch_list(1, dfsch_make_string_cstr(uri)); } else { return dfsch_list(2, dfsch_make_string_buf(uri, pos-uri), dfsch_make_string_cstr(pos+1)); } }
void dfsch_load_add_module_source(dfsch_object_t* ctx, dfsch_object_t* src){ dfsch_object_t* path = dfsch_env_get_cstr(ctx, "*load-path*"); if (path != DFSCH_INVALID_OBJECT){ dfsch_set_cstr(ctx, "*load-path*", dfsch_cons(src, path)); } else { dfsch_define_cstr(ctx, "*load-path*", dfsch_list(1, src)); } }
static void instance_write(dfsch_object_t*obj, dfsch_writer_state_t* state){ class_t* i = DFSCH_TYPE_OF(obj); while (DFSCH_INSTANCE_P(i, DFSCH_CLASS_TYPE)){ if (i->write_instance){ dfsch_apply(i->write_instance, dfsch_list(2, obj, state)); return; } i = i->standard_type.superclass; } dfsch_write_unreadable_with_slots(state, obj); }
static void finalize_slots_definition(class_t* klass, dfsch_object_t* env, dfsch_object_t* slot_definitions){ dfsch_object_t* i = slot_definitions; while (DFSCH_PAIR_P(i)){ dfsch_object_t* slot_def = DFSCH_FAST_CAR(i); if (DFSCH_PAIR_P(slot_def)){ dfsch_slot_t* slot = find_direct_slot(klass, dfsch_symbol(DFSCH_FAST_CAR(slot_def))); slot_def = DFSCH_FAST_CDR(slot_def); while (DFSCH_PAIR_P((slot_def))){ dfsch_object_t* keyword; dfsch_object_t* value; keyword = DFSCH_FAST_CAR(slot_def); slot_def = DFSCH_FAST_CDR(slot_def); if (!DFSCH_PAIR_P(slot_def)){ dfsch_error("Value expected for slot option", keyword); } value = DFSCH_FAST_CAR(slot_def); slot_def = DFSCH_FAST_CDR(slot_def); if(dfsch_compare_keyword(keyword, "accessor")){ dfsch_object_t* accessor = dfsch__make_slot_accessor_for_slot(klass, slot); dfsch_method_t* method = dfsch_make_method(accessor, NULL, dfsch_cons(klass, NULL), accessor); dfsch_define_method(env, value, method); } else if(dfsch_compare_keyword(keyword, "reader")){ dfsch_object_t* accessor = dfsch__make_slot_reader_for_slot(klass, slot); dfsch_method_t* method = dfsch_make_method(accessor, NULL, dfsch_cons(klass, NULL), accessor); dfsch_define_method(env, value, method); } else if(dfsch_compare_keyword(keyword, "write")){ dfsch_object_t* accessor = dfsch__make_slot_writer_for_slot(klass, slot); dfsch_method_t* method = dfsch_make_method(accessor, NULL, dfsch_cons(klass, NULL), accessor); dfsch_define_method(env, value, method); } else if(dfsch_compare_keyword(keyword, "initform")){ klass->initvalues = dfsch_cons(dfsch_list(2, dfsch_eval(value, env), slot), klass->initvalues); } else if(dfsch_compare_keyword(keyword, "initarg")){ klass->initargs = dfsch_cons(dfsch_list(2, value, slot), klass->initargs); } else if(dfsch_compare_keyword(keyword, "documentation")){ slot->documentation = dfsch_string_to_cstr(value); } } } i = DFSCH_FAST_CDR(i); } }
void dfsch_load(dfsch_object_t* env, char* name, dfsch_object_t* path_list, int as_toplevel){ struct stat st; dfsch_object_t* path; char *pathpart; char *fname; str_list_t* l; int i; for (i = 0; i < sizeof(builtin_modules) / sizeof(builtin_module_t); i++){ if (strcmp(builtin_modules[i].name, name) == 0){ builtin_modules[i].register_proc(env); return; } } if (path_list){ path = path_list; } else { path = dfsch_env_get_cstr(env, "*load-path*"); if (path == DFSCH_INVALID_OBJECT){ path = NULL; } } while (DFSCH_PAIR_P(path)){ dfsch_object_t* pp = DFSCH_FAST_CAR(path); if (!dfsch_string_p(pp)){ if (dfsch_apply(pp, dfsch_list(2, env, dfsch_make_string_cstr(name)))){ return; } path = DFSCH_FAST_CDR(path); continue; } l = sl_create(); sl_append(l, dfsch_string_to_cstr(DFSCH_FAST_CAR(path))); sl_append(l, "/"); sl_append(l, name); pathpart = sl_value(l); if (stat(pathpart, &st) == 0){ if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)){ for (i = 0; i < sizeof(loaders) / sizeof(module_loader_t); i++){ if (strcmp(pathpart + strlen(pathpart) - strlen(loaders[i].path_ext), loaders[i].path_ext) == 0){ loaders[i].load(pathpart, env, as_toplevel); return; } } dfsch_load_scm(env, pathpart, 0); return; } } for (i = 0; i < sizeof(loaders) / sizeof(module_loader_t); i++){ fname = stracat(pathpart, loaders[i].path_ext); if (stat(fname, &st) == 0 && (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode))){ loaders[i].load(fname, env, as_toplevel); return; } } path = dfsch_cdr(path); } dfsch_error("Module not found", dfsch_make_string_cstr(name)); }
static void errno_error(char* name, dfsch_object_t* object, int e){ dfsch_error(name, dfsch_list(3, object, dfsch_make_number_from_long(e), dfsch_make_string_cstr(strerror(e)))); }