void knh_OutputStream_close(Ctx *ctx, knh_OutputStream_t *w) { knh_OutputStream_flush(ctx, w); knh_Fclose f = SP(w)->dspi->fclose; SP(w)->dspi = knh_getStreamDSPI(ctx, K_DEFAULT_DSPI); f(ctx, DP(w)->fd); DP(w)->fd = IO_NULL; }
KNHAPI(void) knh_write_EOL(Ctx *ctx, knh_OutputStream_t *w) { knh_OutputStream_write(ctx, w, S_tobytes(DP(w)->NEWLINE)); if(knh_OutputStream_isAutoFlush(w)) { knh_OutputStream_flush(ctx, w); } knh_OutputStream_setBOL(w, 1); }
static void knh_shell(CTX ctx) { void *shell_status = NULL; BEGIN_LOCAL(ctx, lsfp, 2); // LOCAL_NEW(ctx, lsfp, 0, kInputStream *, bin, new_BytesInputStream(ctx, new_Bytes(ctx, "shell", K_PAGESIZE))); { CWB_t cwbbuf, *cwb = CWB_open(ctx, &cwbbuf); knh_showWelcome(ctx, cwb->w); knh_showSecurityAlert(ctx, cwb->w); shell_status = shell_init(ctx, CWB_totext(ctx, cwb), NULL); CWB_close(ctx, cwb); } while(1) { { CWB_t cwbbuf, *cwb = CWB_open(ctx, &cwbbuf); kstatus_t status = readstmt(ctx, cwb); if(status == K_BREAK) { CWB_close(ctx, cwb); break; } if(CWB_size(cwb) == 0) { CWB_close(ctx, cwb); continue; } status = shell_command(ctx, CWB_totext(ctx, cwb)); if(status == K_BREAK) { CWB_close(ctx, cwb); break; } if(status == K_REDO) { CWB_close(ctx, cwb); continue; } #ifdef K_USING_SUGAR kString *script = CWB_newString(ctx, cwb, 0); KNH_SETv(ctx, lsfp[0].o, script); knh_beval2(ctx, S_totext(script), 1); #else kInputStream *bin = new_BytesInputStream(ctx, CWB_totext(ctx, cwb), CWB_size(cwb)); KNH_SETv(ctx, lsfp[0].o, bin); knh_beval(ctx, bin, 1); #endif } knh_OutputStream_flush(ctx, ctx->out); if(ctx->isEvaled == 1) { CWB_t cwbbuf, *cwb = CWB_open(ctx, &cwbbuf); knh_write_Object(ctx, cwb->w, ctx->evaled, FMT_dump); knh_showSecurityAlert(ctx, cwb->w); if(CWB_size(cwb) !=0) { shell_display(ctx, shell_status, CWB_totext(ctx, cwb)); } CWB_close(ctx, cwb); WCTX(ctx)->isEvaled = 0; } } shell_cleanup(ctx, shell_status); END_LOCAL(ctx, lsfp); }
static void msgpack_flushfree(CTX ctx, kpackAPI_t *pk) { msgpack_sbuffer *sbuffer = pk->sbuffer; kbytes_t t = {{sbuffer->data}, sbuffer->size}; knh_OutputStream_write(ctx, pk->w, t); knh_OutputStream_flush(ctx, pk->w); /* TODO need flush? */ msgpack_sbuffer_free(pk->sbuffer); msgpack_packer_free(pk->pk); }