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); }
knh_String_t* knh_ResultSet_getString(Ctx *ctx, knh_ResultSet_t *o, size_t n) { KNH_ASSERT(n < DP(o)->column_size); const char *p = BA_tochar(DP(o)->databuf) + DP(o)->column[n].start; switch(DP(o)->column[n].ctype) { case knh_ResultSet_CTYPE__integer : return new_String__int(ctx, (knh_int_t)(*((knh_int_t*)p))); case knh_ResultSet_CTYPE__float : return new_String__float(ctx, (knh_float_t)(*((knh_float_t*)p))); case knh_ResultSet_CTYPE__text : { knh_bytes_t t = {{p}, DP(o)->column[n].len}; return new_S(ctx, t); } case knh_ResultSet_CTYPE__null : break; } return KNH_TNULL(String); }
static knh_OutputStream_t *knh_Socket_getOutputStream(CTX ctx, knh_io_t sd) { return new_OutputStreamDPI(ctx, sd, &SOCKET_DSPI, KNH_TNULL(Path)); }