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)); } }
knh_String_t* knh_InputStream_readLine(Ctx *ctx, knh_InputStream_t *in) { int ch; knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); if(DP(in)->decNULL == NULL && in->dspi->getCharset != NULL) { char *charset = (char*)in->dspi->getCharset(ctx, DP(in)->fd); if(charset != NULL) { knh_InputStream_setCharset(ctx, in, new_StringDecoderNULL(ctx, B(charset), NULL)); } } while((ch = knh_InputStream_getc(ctx, in)) != EOF) { if(ch == '\r') { DP(in)->prev = ch; goto L_TOSTRING; } else if(ch == '\n') { if(DP(in)->prev == '\r') continue; DP(in)->prev = ch; goto L_TOSTRING; } else { knh_Bytes_putc(ctx, cwb->ba, ch); } } L_TOSTRING:; if(knh_cwb_size(cwb) != 0) { if(DP(in)->decNULL == NULL) { return knh_cwb_newString(ctx, cwb); } else { return knh_cwb_newStringDECODE(ctx, cwb, DP(in)->decNULL); } } return KNH_TNULL(String); }