static METHOD knh__String_opSub(Ctx *ctx, knh_sfp_t *sfp) { knh_bytes_t base = knh_String_tobytes(sfp[0].s); knh_bytes_t t = knh_String_tobytes(sfp[1].s); knh_uchar_t c = t.buf[0]; knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); size_t i; for(i = 0; i < base.len; i++) { if(base.buf[i] == c) { size_t j; for(j = 1; j < t.len; j++) { if(base.buf[i+j] != t.buf[j]) break; } if(j == t.len) { i += t.len - 1; continue; } } knh_Bytes_putc(ctx, cwb->ba, base.buf[i]); } if(base.len == knh_cwb_size(cwb)) { knh_cwb_close(cwb); KNH_RETURN(ctx, sfp, sfp[0].o); } else { KNH_RETURN(ctx, sfp, knh_cwb_newString(ctx, cwb)); } }
KNHAPI(void) knh_OutputStream_writeLine(Ctx *ctx, knh_OutputStream_t *w, knh_bytes_t t, knh_bool_t isNEWLINE) { if(knh_OutputStream_isBOL(w)) { knh_write_BOL(ctx, w); } if(t.len > 0) { if(DP(w)->encNULL != NULL && !knh_bytes_isASCII(t)) { if(knh_bytes_in(ctx->bufa->bu, t.ubuf)) { KNH_TODO("write cwb->buf with encoding"); } else { knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); knh_StringEncoder_t *c = DP(w)->encNULL; c->dspi->enc(ctx, c->conv, t, cwb->ba); knh_write(ctx, w, knh_cwb_tobytes(cwb)); knh_cwb_close(cwb); } } else { knh_OutputStream_write(ctx, w, t); } } if(isNEWLINE) { knh_write_EOL(ctx, w); } }
const char* knh_ospath(CTX ctx, knh_path_t *ph) { knh_uchar_t *ubuf = P_ubuf(ph); DBG_ASSERT(ubuf[ph->plen] == 0); if(!ph->isRealPath) { int hasUTF8 = 0; size_t i; for(i = ph->pbody; i < ph->plen; i++) { int ch = ubuf[i]; if(ch == '/' || ch == '\\') { ubuf[i] = K_FILESEPARATOR; } if(ch > 127) hasUTF8 = 1; } if(hasUTF8) { KNH_TODO("multibytes file path"); } { knh_cwb_t cwbbuf, *cwb = knh_cwb_copy(ctx, &cwbbuf, ph, 0); const char *p = knh_realpath(ctx, knh_cwb_tochar(ctx, cwb), ph); knh_cwb_close(cwb); return p; // p is NULL if not found; } } return P_text(ph) + ph->pbody; }
knh_String_t* knh_getPropertyNULL(Ctx *ctx, knh_bytes_t key) { if(knh_bytes_startsWith(key, STEXT("env."))) { knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); knh_cwb_nzenvkey(ctx, cwb, knh_bytes_last(key, 4)); char *v = knh_getenv(knh_cwb_tochar(ctx, cwb)); knh_cwb_close(cwb); if(v == NULL) return NULL; return new_S(ctx, B(v)); } return (knh_String_t*)knh_DictMap_getNULL(ctx, DP(ctx->sys)->props, key); }
knh_String_t *knh_cwb_newString(Ctx *ctx, knh_cwb_t *cwb) { if(cwb->pos == (cwb->ba)->bu.len) { return TS_EMPTY; } else { knh_bytes_t t = knh_cwb_tobytes(cwb); knh_String_t *s = new_S(ctx, t); knh_cwb_close(cwb); return s; } }
METHOD knh__Script_eval(Ctx *ctx, knh_sfp_t *sfp) { if(IS_NOTNULL(sfp[1].s)) { knh_sfp_t *lsfp = KNH_LOCAL(ctx); knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); knh_cwb_write(ctx, cwb, knh_String_tobytes(sfp[1].s)); knh_cwb_putc(ctx, cwb, '\n'); InputStream *in = new_BytesInputStream(ctx, cwb->ba, cwb->pos, knh_Bytes_size(cwb->ba)); KNH_LPUSH(ctx, in); DP(in)->uri = URI_EVAL; DP(in)->line = 0; knh_NameSpace_load(ctx, ctx->share->mainns, in, 1/*isEval*/,0/*isThrowable*/); knh_cwb_close(cwb); KNH_LOCALBACK(ctx, lsfp); } KNH_RETURN_void(ctx, sfp); }