size_t bconv__toUpper(Ctx *ctx, BytesConv *o, knh_bytes_t t, knh_Bytes_t *ba) { size_t i; for(i = 0; i < t.len; i++) { if(islower(t.buf[i])) { knh_Bytes_putc(ctx, ba, toupper(t.buf[i])); } else { knh_Bytes_putc(ctx, ba, t.buf[i]); } } return t.len; }
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)); } }
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)); } }
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); }
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; }
static void knh_cwb_nzenvkey(Ctx *ctx, knh_cwb_t *cwb, knh_bytes_t t) { size_t i; for(i = 0; i < t.len; i++) { knh_Bytes_putc(ctx, (cwb->ba), toupper(t.ustr[i])); } }
static void CWB_nzenvkey(CTX ctx, CWB_t *cwb, kbytes_t t) { size_t i; for(i = 0; i < t.len; i++) { knh_Bytes_putc(ctx, (cwb->ba), toupper(t.utext[i])); } }
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_putc(Ctx *ctx, knh_OutputStream_t *w, int ch) { knh_Bytes_t *ba = DP(w)->ba; DBG_ASSERT(IS_Bytes(ba)); knh_Bytes_putc(ctx, ba, ch); 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++; }
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 */ }