static uim_lisp uim_sqlite3_close(uim_lisp db_) { if (sqlite3_close(C_PTR(db_)) != SQLITE_OK) ERROR_OBJ(sqlite3_errmsg(C_PTR(db_)), db_); return uim_scm_t(); }
static uim_lisp uim_sqlite3_prepare(uim_lisp db_, uim_lisp zSql_, uim_lisp nBytes_) { sqlite3_stmt *ppStmt; const char *pzTail; if (sqlite3_prepare(C_PTR(db_), REFER_C_STR(zSql_), C_INT(nBytes_), &ppStmt, &pzTail) != SQLITE_OK) ERROR_OBJ(sqlite3_errmsg(C_PTR(db_)), zSql_); return CONS(MAKE_PTR(ppStmt), MAKE_STR(pzTail)); }
static uim_lisp uim_sqlite3_clear_bindings(uim_lisp pStmt_) { if (sqlite3_clear_bindings(C_PTR(pStmt_)) != SQLITE_OK) uim_scm_f(); return uim_scm_t(); }
static uim_lisp uim_sqlite3_bind_text(uim_lisp pStmt_, uim_lisp idx_, uim_lisp str_, uim_lisp nBytes_) { if (sqlite3_bind_text(C_PTR(pStmt_), C_INT(idx_), REFER_C_STR(str_), C_INT(nBytes_), SQLITE_TRANSIENT) != SQLITE_OK) uim_scm_f(); return uim_scm_t(); }
static uim_lisp uim_sqlite3_bind_null(uim_lisp pStmt_, uim_lisp idx_) { if (sqlite3_bind_null(C_PTR(pStmt_), C_INT(idx_)) != SQLITE_OK) uim_scm_f(); return uim_scm_t(); }
static uim_lisp uim_sqlite3_reset(uim_lisp pStmt_) { if (sqlite3_reset(C_PTR(pStmt_)) != SQLITE_OK) uim_scm_f(); return uim_scm_t(); }
static uim_lisp c_getaddrinfo(uim_lisp hostname_, uim_lisp servname_, uim_lisp hint_) { const char *hostname; char *servname = NULL; struct addrinfo *hints = C_PTR(hint_); struct addrinfo *res, *res0; uim_lisp ret_ = uim_scm_null(); int error; if (INTP(servname_)) { uim_asprintf(&servname, "%d", C_INT(servname_)); } else { servname = C_STR(servname_); } if (FALSEP(hostname_)) hostname = NULL; else hostname = REFER_C_STR(hostname_); error = getaddrinfo(hostname, servname, hints, &res0); if (error) { const char *errstr = gai_strerror(error); uim_notify_fatal("getaddrinfo: %s", errstr); free(servname); return uim_scm_f(); } free(servname); for (res = res0; res; res = res->ai_next) { ret_ = CONS(MAKE_PTR(res) , ret_); } return uim_scm_callf("reverse", "o", ret_); }
static uim_lisp c_sun_len(uim_lisp sun_) { struct sockaddr_un *s_un = C_PTR(sun_); return MAKE_INT(SUN_LEN(s_un)); }
static uim_lisp c_ref_sockaddr_un_sun_family(uim_lisp sun_) { struct sockaddr_un *s_un = C_PTR(sun_); return MAKE_INT(s_un->sun_family); }
static uim_lisp c_addrinfo_ref_ai_addr(uim_lisp addrinfo_) { struct addrinfo *addrinfo = C_PTR(addrinfo_); return MAKE_PTR(addrinfo->ai_addr); }
static void * dynlib_unbind_all_internal(uim_lisp plugin_alist_) { /* call dlclose(3) collectively at the end in order to avoid GC problem */ uim_lisp alist_ = plugin_alist_; while (!NULLP(alist_)) { uim_lisp plugin_, quit_proc_; void (*dynlib_instance_quit)(void); plugin_ = CAR(alist_); quit_proc_ = CAR(CDR(CDR(CDR(plugin_)))); if (!FALSEP(quit_proc_)) { dynlib_instance_quit = C_FPTR(quit_proc_); (*dynlib_instance_quit)(); } alist_ = CDR(alist_); } alist_ = plugin_alist_; while (!NULLP(alist_)) { uim_lisp plugin_, lib_; void *library; plugin_ = CAR(alist_); lib_ = CAR(CDR(plugin_)); if (!FALSEP(lib_)) { library = C_PTR(lib_); dlclose(library); } alist_ = CDR(alist_); } return uim_scm_t(); }
static uim_lisp c_addrinfo_ref_ai_socktype(uim_lisp addrinfo_) { struct addrinfo *addrinfo = C_PTR(addrinfo_); return MAKE_INT(addrinfo->ai_socktype); }
static uim_lisp c_addrinfo_ref_ai_protocol(uim_lisp addrinfo_) { struct addrinfo *addrinfo = C_PTR(addrinfo_); return MAKE_INT(addrinfo->ai_protocol); }
static uim_lisp c_addrinfo_ref_ai_family(uim_lisp addrinfo_) { struct addrinfo *addrinfo = C_PTR(addrinfo_); return MAKE_INT(addrinfo->ai_family); }
static uim_lisp c_ref_sockaddr_un_sun_path(uim_lisp sun_) { struct sockaddr_un *s_un = C_PTR(sun_); return MAKE_STR(s_un->sun_path); }
static uim_lisp c_set_sockaddr_un_sun_path(uim_lisp sun_, uim_lisp path_) { struct sockaddr_un *s_un = C_PTR(sun_); strlcpy(s_un->sun_path, REFER_C_STR(path_), sizeof(s_un->sun_path)); return uim_scm_t(); }
static uim_lisp c_addrinfo_set_ai_family(uim_lisp addrinfo_, uim_lisp ai_family_) { struct addrinfo *addrinfo = C_PTR(addrinfo_); addrinfo->ai_family = C_INT(ai_family_); return uim_scm_t(); }
static uim_lisp c_delete_sockaddr_un(uim_lisp sun_) { struct sockaddr_un *s_un = C_PTR(sun_); free(s_un); return uim_scm_t(); }
static uim_lisp c_addrinfo_set_ai_protocol(uim_lisp addrinfo_, uim_lisp ai_protocol_) { struct addrinfo *addrinfo = C_PTR(addrinfo_); addrinfo->ai_protocol = C_INT(ai_protocol_); return uim_scm_t(); }
static uim_lisp c_addrinfo_set_ai_socktype(uim_lisp addrinfo_, uim_lisp ai_socktype_) { struct addrinfo *addrinfo = C_PTR(addrinfo_); addrinfo->ai_socktype = C_INT(ai_socktype_); return uim_scm_t(); }
static uim_lisp c_set_sockaddr_un_sun_family(uim_lisp sun_, uim_lisp family_) { struct sockaddr_un *s_un = C_PTR(sun_); s_un->sun_family = C_INT(family_); return uim_scm_t(); }
static uim_lisp uim_sqlite3_column_text(uim_lisp pStmt_, uim_lisp iCol_) { const unsigned char *ret = sqlite3_column_text(C_PTR(pStmt_), C_INT(iCol_)); if (ret) return MAKE_STR(ret); return uim_scm_f(); }
obj_t make_c_pointer(obj_t /* <static-pointer-class> */ cls, void *ptr) { obj_t res = alloc(cls, sizeof(struct c_pointer)); C_PTR(res)->pointer = ptr; return res; }
static uim_lisp c_dlclose(uim_lisp handle_) { if (!PTRP(handle_)) return uim_scm_f(); dlclose(C_PTR(handle_)); ffi_strerr_ = NULL; return uim_scm_t(); }
static uim_lisp uim_xml_set_characterdata_handler(uim_lisp ctx_, uim_lisp element_characterdata_) { uim_xml_ctx *ctx = C_PTR(ctx_); ctx->data->characterdata_ = element_characterdata_; return uim_scm_t(); }
static uim_lisp c_accept(uim_lisp s_, uim_lisp storage_) { socklen_t storagelen; struct sockaddr_storage *storage = C_PTR(storage_); storagelen = sizeof(struct sockaddr_storage); return MAKE_INT(accept(C_INT(s_), (struct sockaddr *)storage, &storagelen)); }
static void * uim_xml_parse_internal(struct uim_xml_parse_args *args) { uim_xml_ctx *ctx = C_PTR(args->ctx_); const XML_Char *s = REFER_C_STR(args->s_); int isFinal = C_INT(args->isFinal_); XML_SetUserData(ctx->parser, ctx->data); return MAKE_INT(XML_Parse(ctx->parser, s, strlen(s), isFinal)); }
static uim_lisp uim_xml_set_element_handler(uim_lisp ctx_, uim_lisp element_start_, uim_lisp element_end_) { uim_xml_ctx *ctx = C_PTR(ctx_); ctx->data->start_ = element_start_; ctx->data->end_ = element_end_; return uim_scm_t(); }
static uim_lisp uim_sqlite3_step(uim_lisp pStmt_) { int ret; ret = sqlite3_step(C_PTR(pStmt_)); if (ret != SQLITE_OK) uim_scm_f(); return MAKE_INT(ret); }
/* extract Scheme IM context from Scheme-object-wrapped uim_context */ static uim_lisp im_retrieve_context(uim_lisp uc_) { uim_context uc; uc = C_PTR(uc_); assert(uc); return uc->sc; }