static void knh_linkDynamicReadline(CTX ctx) { if(ctx->spi->readline == NULL) { void *handler = knh_dlopen(ctx, "libreadline" K_OSDLLEXT); if(handler != NULL) { void *f = knh_dlsym(ctx, handler, "readline", NULL, 0/*isTest*/); if(f != NULL) { ((knh_ServiceSPI_t*)ctx->spi)->readlinespi = "libreadline"; ((knh_ServiceSPI_t*)ctx->spi)->readline = (char* (*)(const char*))f; } else { goto L_STDIN; } f = knh_dlsym(ctx, handler, "add_history", NULL, 0/*isTest*/); if(f != NULL) { ((knh_ServiceSPI_t*)ctx->spi)->add_history = (int (*)(const char*))f; } else { ((knh_ServiceSPI_t*)ctx->spi)->add_history = add_history; } return; } L_STDIN:; ((knh_ServiceSPI_t*)ctx->spi)->readlinespi = "stdin"; ((knh_ServiceSPI_t*)ctx->spi)->readline = readline; ((knh_ServiceSPI_t*)ctx->spi)->add_history = add_history; } }
void *knh_path_dlopen(CTX ctx, knh_path_t *ph) { knh_bytes_t t = {{P_text(ph)}, ph->plen}; if(!knh_bytes_endsWith(t, STEXT(K_OSDLLEXT))) { knh_path_append(ctx, ph, 0/*sep*/, K_OSDLLEXT); } return knh_dlopen(ctx, P_text(ph) + ph->pbody); }
static void knh_linkDynamicIconv(CTX ctx) { knh_ServiceSPI_t *spi = ((knh_ServiceSPI_t*)ctx->spi); void *handler = knh_dlopen(ctx, "libiconv" K_OSDLLEXT); void *f = NULL; if(handler != NULL) { f = knh_dlsym(ctx, handler, "iconv_open", "libiconv_open", 1/*isTest*/); if (f != NULL) { spi->iconvspi = "libiconv"; spi->iconv_openSPI = (ficonv_open)f; spi->iconvSPI = (ficonv)knh_dlsym(ctx, handler, "iconv", "libiconv", 0/*isTest*/); spi->iconv_closeSPI = (ficonv_close)knh_dlsym(ctx, handler, "libiconv_close", "iconv_close", 0); KNH_ASSERT(spi->iconvSPI != NULL && spi->iconv_closeSPI != NULL); return ; // OK } } PleaseLetUsKnowYourOS("libiconv is not available"); }
static void load_codegenerator(CTX ctx) { KONOHA_BEGIN(ctx); CompilerAPI_disable(ctx); if (codegenerator_file[compile_mode]) { kbytes_t t = new_bytes((char*)codegenerator_file[compile_mode]); knh_loadPackage(ctx, t); CWB_t cwbbuf, *cwb = CWB_open(ctx, &cwbbuf); kString *s = (kString *) knh_DictMap_getNULL(ctx, ctx->share->props, STEXT("konoha.package.path")); CWB_clear(cwb, 0); knh_buff_addpath(ctx, cwb->ba, cwb->pos, 0, S_tobytes(s)); knh_buff_addpath(ctx, cwb->ba, cwb->pos, 1, STEXT("konoha.compiler")); knh_buff_addpath(ctx, cwb->ba, cwb->pos, 1, STEXT("compiler")); knh_buff_addpath(ctx, cwb->ba, cwb->pos, 0, STEXT(K_OSDLLEXT)); void *p = knh_dlopen(ctx, CWB_totext(ctx, cwb)); typedef void (*knh_Fpkgcomplete)(CTX); knh_Fpkgcomplete pkgcomplete = (knh_Fpkgcomplete) knh_dlsym(ctx, p, "reset_compiler_api", NULL, 1); if (pkgcomplete) pkgcomplete(ctx); CWB_close(ctx, cwb); } CompilerAPI_enable(ctx); KONOHA_END(ctx); }
} static void ProcessGlue_free(CTX ctx, void *ptr) { if (ptr != NULL) { ptr = NULL; } } /* ------------------------------------------------------------------------ */ //@Native Clib Clib.new(String libname, Clib _); METHOD Clib_new(CTX ctx, knh_sfp_t *sfp _RIX) { const char *libname = String_to(const char *, sfp[1]); knh_CLib_t *clib = (knh_CLib_t*)KNH_MALLOC(ctx, sizeof(knh_CLib_t)); clib->handler = knh_dlopen(ctx, libname); knh_RawPtr_t *po = new_RawPtr(ctx, sfp[2].p, clib); RETURN_(po); } static METHOD Fmethod_wrapCLib(CTX ctx, knh_sfp_t *sfp _RIX) { knh_type_t rtype = knh_ParamArray_rtype(DP(sfp[K_MTDIDX].mtdNC)->mp); knh_Func_t *fo = sfp[0].fo; knh_ClibGlue_t *cglue = (knh_ClibGlue_t*)(((fo->mtd)->b)->cfunc); // fprintf(stderr, "fptr:%p, %p, %d, %p, %p\n", // dg->fptr, // &(dg->cif), dg->argCount, // dg->retT, dg->argT); int idx = 0;