static METHOD knh__String_replace(Ctx *ctx, knh_sfp_t *sfp) { knh_bytes_t base = knh_String_tobytes(sfp[0].s); knh_bytes_t target = knh_String_tobytes(sfp[1].s); knh_bytes_t alt = knh_String_tobytes(sfp[2].s); knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); int search_flag= 0, ch = target.buf[0], i; if (base.len == 0 || target.len == 0) KNH_RETURN(ctx, sfp, sfp[0].o); for(i = 0; i < base.len - target.len+1; i++) { if(base.buf[i] == ch && knh_bytes_equals_(base, i, target)) { knh_Bytes_write(ctx, cwb->ba, alt); i += target.len - 1; search_flag = 1; }else { knh_Bytes_putc(ctx, cwb->ba, base.buf[i]); } } if(search_flag == 0) { KNH_RETURN(ctx, sfp, sfp[0].o); } else { knh_bytes_t leftover = {base.buf + i, base.len - i}; knh_Bytes_write(ctx, cwb->ba, leftover); KNH_RETURN(ctx, sfp, knh_cwb_newString(ctx, cwb)); } }
static METHOD knh__String_format(Ctx *ctx, knh_sfp_t *sfp) { knh_bytes_t fmt = knh_String_tobytes(sfp[0].s); knh_sfp_t *param = sfp + 1; int ac = knh_stack_argc(ctx, param); knh_bytes_t mt, expr, next; if(!knh_bytes_findMT(ctx, fmt, &mt, &expr, &next)) { KNH_RETURN(ctx, sfp, sfp[0].s); } knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); int count; for(count = 0; ; count++) { if(mt.buf > fmt.buf + 1) { fmt.len = (mt.buf - fmt.buf) - 1; knh_Bytes_write(ctx, cwb->ba, fmt); } int index = count; if(expr.len > 0) { knh_int_t num; if(knh_bytes_parseint(expr, &num)) { index = (int)num; } } if(0 <= index && index < ac) { knh_sfp_t *esp = KNH_LOCAL(ctx); KNH_SETv(ctx, esp[1].o, param[index].o); esp[1].data = param[index].data; Object *m = KNH_NULL; if(knh_bytes_isOptionalMT(mt)) m = UP(new_String(ctx, mt, NULL)); mt.buf = mt.buf - 1; mt.len++; /* 's' == > '%s' */ knh_methodn_t mn = knh_getmn(ctx, mt, METHODN__empty); knh_esp1_format(ctx, mn, cwb->w, m); } else { if(knh_Context_isDebug(ctx)) { KNH_THROW_OUTOFINDEX(ctx, index, ac); } } fmt.buf = next.buf; fmt.len = next.len; if(!knh_bytes_findMT(ctx, fmt, &mt, &expr, &next)) { break; } } if(fmt.len > 0) { knh_Bytes_write(ctx, cwb->ba, fmt); } KNH_RETURN(ctx, sfp, new_StringX__cwb(ctx, knh_Object_cid(sfp[0].o), cwb)); }
static kstatus_t readstmt(CTX ctx, CWB_t *cwb) { int line = 1; kstatus_t status = K_CONTINUE; CWB_clear(cwb, 0); fputs(TERM_BBOLD(ctx), stdout); while(1) { int check; char *ln = ctx->spi->readline(line == 1 ? ">>> " : " "); if(ln == NULL) { CWB_clear(cwb, 0); status = K_BREAK; break; } if(line > 1) knh_Bytes_putc(ctx, cwb->ba, '\n'); knh_Bytes_write(ctx, cwb->ba, B(ln)); free(ln); if((check = shell_checkstmt(CWB_tobytes(cwb))) > 0) { line++; continue; } if(check < 0) { fputs("(Cancelled)...\n", stdout); CWB_clear(cwb, 0); } break; } if(CWB_size(cwb) > 0) { const char *p = CWB_totext(ctx, cwb); ctx->spi->add_history(p); } fputs(TERM_EBOLD(ctx), stdout); fflush(stdout); return status; }
KNHAPI(void) knh_ResultSet_setInt(Ctx *ctx, knh_ResultSet_t *rs, size_t n, knh_int_t value) { KNH_ASSERT(n < DP(rs)->column_size); knh_bytes_t t = {{(const char*)(&value)}, sizeof(knh_int_t)}; DP(rs)->column[n].ctype = knh_ResultSet_CTYPE__integer; DP(rs)->column[n].start = BA_size(DP(rs)->databuf); DP(rs)->column[n].len = sizeof(knh_int_t); knh_Bytes_write(ctx, DP(rs)->databuf, t); }
KNHAPI(void) knh_ResultSet_setBlob(Ctx *ctx, knh_ResultSet_t *o, size_t n, knh_bytes_t t) { KNH_ASSERT(n < DP(o)->column_size); DP(o)->column[n].ctype = knh_ResultSet_CTYPE__bytes; DP(o)->column[n].start = BA_size(DP(o)->databuf); DP(o)->column[n].len = t.len; knh_Bytes_write(ctx, DP(o)->databuf, t); int i, c = t.len % sizeof(void*); for(i = 0; i < c; i++) knh_Bytes_putc(ctx, DP(o)->databuf, 0); /* zero */ }
KNHAPI(void) knh_OutputStream_write(Ctx *ctx, knh_OutputStream_t *w, knh_bytes_t buf) { knh_Bytes_t *ba = DP(w)->ba; DBG_ASSERT(IS_Bytes(ba)); knh_Bytes_write(ctx, ba, buf); if(!knh_OutputStream_isStoringBuffer(w) && BA_size(ba) > SP(w)->dspi->bufsiz) { SP(w)->dspi->fwrite(ctx, DP(w)->fd, (ba)->bu.text, (ba)->bu.len); knh_Bytes_clear(ba, 0); } DP(w)->size += buf.len; }
KNHAPI(void) knh_ResultSet_setFloat(Ctx *ctx, knh_ResultSet_t *rs, size_t n, knh_float_t value) { KNH_ASSERT(n < DP(rs)->column_size); knh_bytes_t t = {{(const char*)(&value)}, sizeof(knh_float_t)}; DP(rs)->column[n].ctype = knh_ResultSet_CTYPE__float; DP(rs)->column[n].start = BA_size(DP(rs)->databuf); DP(rs)->column[n].len = sizeof(knh_float_t); knh_Bytes_write(ctx, DP(rs)->databuf, t); int i, c = t.len % sizeof(void*); for(i = 0; i < c; i++) knh_Bytes_putc(ctx, DP(rs)->databuf, 0); /* zero */ }
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)); }
knh_cwb_t* knh_cwb_copy(CTX ctx, knh_cwb_t *cwbbuf, knh_path_t *ph, int hasScheme) { knh_cwb_t *cwb = knh_cwb_open(ctx, cwbbuf); knh_Bytes_ensureSize(ctx, cwb->ba, ph->plen + 1); knh_bytes_t t = {{P_text(ph)}, ph->plen}; if(!hasScheme) { t.text = t.text + ph->pbody; t.len = t.len - ph->pbody; } knh_Bytes_write(ctx, cwb->ba, t); return cwb; }
static METHOD knh__String_getBytes(Ctx *ctx, knh_sfp_t *sfp) { Bytes *ba; if(IS_NULL(sfp[1].o)) { ba = new_Bytes(ctx, (sfp[0].s)->size + 1); knh_Bytes_write(ctx, ba, knh_String_tobytes(sfp[0].s)); } else { knh_bytes_t t = knh_String_tobytes(sfp[0].s); BytesConv *bc = new_BytesConv__out(ctx, knh_String_tochar(sfp[1].s)); KNH_SETv(ctx, sfp[2].o, bc); ba = new_Bytes(ctx, t.len); bc->fbconv(ctx, bc, t, ba); } KNH_RETURN(ctx, sfp, ba); }
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_opMul(Ctx *ctx, knh_sfp_t *sfp) { knh_intptr_t n = p_int(sfp[1]); if(n <= 0) { KNH_RETURN(ctx, sfp, TS_EMPTY); }else if(n == 1) { KNH_RETURN(ctx, sfp, sfp[0].o); } else { knh_bytes_t base = knh_String_tobytes(sfp[0].s); knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); knh_intptr_t i; for(i = 0; i < n; i++) { knh_Bytes_write(ctx, cwb->ba, base); } KNH_RETURN(ctx, sfp, knh_cwb_newString(ctx, cwb)); } }