static METHOD knh__String_opAdd(Ctx *ctx, knh_sfp_t *sfp) { knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); knh_sfp_t *esp = KNH_LOCAL(ctx); if(IS_bString(sfp[0].o)) { knh_Bytes_write(ctx, cwb->ba, knh_String_tobytes(sfp[0].s)); } else { KNH_SETv(ctx, esp[1].o, sfp[0].o); esp[1].data = sfp[0].data; knh_esp1_format(ctx, METHODN__s, cwb->w, KNH_NULL); } if(IS_bString(sfp[1].o)) { knh_Bytes_write(ctx, cwb->ba, knh_String_tobytes(sfp[1].s)); } else { KNH_ASSERT(esp == ctx->esp); KNH_SETv(ctx, esp[1].o, sfp[1].o); esp[1].data = sfp[1].data; knh_esp1_format(ctx, METHODN__s, cwb->w, KNH_NULL); } KNH_RETURN(ctx, sfp, knh_cwb_newString(ctx, cwb)); }
static METHOD knh__String_concat(Ctx *ctx, knh_sfp_t *sfp) { int i, ac = knh_stack_argc(ctx, sfp); knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); knh_sfp_t *esp = KNH_LOCAL(ctx); for(i = 0; i < ac; i++) { if(IS_bString(sfp[i].o)) { knh_Bytes_write(ctx, cwb->ba, knh_String_tobytes(sfp[i].s)); } else { KNH_ASSERT(esp == ctx->esp); KNH_SETv(ctx, esp[1].o, sfp[i].o); esp[1].data = sfp[i].data; knh_esp1_format(ctx, METHODN__s, cwb->w, KNH_NULL); } } KNH_RETURN(ctx, sfp, knh_cwb_newString(ctx, cwb)); }
static METHOD knh__String_opMod(Ctx *ctx, knh_sfp_t *sfp) { if(!IS_bString(sfp[0].o)) { KNH_RETURN(ctx, sfp, TS_EMPTY); } else { knh_bytes_t base = knh_String_tobytes(sfp[0].s); knh_bytes_t delim = knh_String_tobytes(sfp[1].s); knh_index_t index = knh_bytes_indexOf(base, delim); if(index == -1) { KNH_RETURN(ctx, sfp, TS_EMPTY); } else { base = knh_bytes_last(base, index + delim.len); KNH_RETURN(ctx, sfp, new_String(ctx, base, sfp[0].s)); } } }
knh_Fmethod knh_gluefunc(CTX ctx, kMethod *mtd, kNameSpace *ns, kDictMap *mdata) { knh_Fmethod gluefunc = NULL; kObject *gluedata = knh_DictMap_getNULL(ctx, mdata, STEXT("gluefunc")); if(gluedata != NULL && IS_bString(gluedata)) { if(ns->gluehdr == NULL) { DBG_P("gluehdr is not open"); } else { gluefunc = (knh_Fmethod)knh_dlsym(ctx, ns->gluehdr, S_totext((kString*)gluedata), NULL, 0); if(gluefunc == NULL) { DBG_P("gluefunc is not found: %s", S_totext((kString*)gluedata)); } } } //if(gluefunc == NULL) { // gluefunc = Fmethod_FFI; //} return gluefunc; }
static METHOD knh__String_opDiv(Ctx *ctx, knh_sfp_t *sfp) { if(!IS_bString(sfp[0].o)) { KNH_RETURN(ctx, sfp, TS_EMPTY); } else { knh_bytes_t base = knh_String_tobytes(sfp[0].s); knh_index_t index = knh_bytes_indexOf(base, knh_String_tobytes(sfp[1].s)); if(index == -1) { KNH_RETURN(ctx, sfp, sfp[0].o); } else { if(index == 0) { KNH_RETURN(ctx, sfp, TS_EMPTY); } else { base.len = index; KNH_RETURN(ctx, sfp, new_String(ctx, base, sfp[0].s)); } } } }