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); }
METHOD knh__Script_eval(Ctx *ctx, knh_sfp_t *sfp) { if(IS_NOTNULL(sfp[1].s)) { knh_sfp_t *lsfp = KNH_LOCAL(ctx); knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); knh_cwb_write(ctx, cwb, knh_String_tobytes(sfp[1].s)); knh_cwb_putc(ctx, cwb, '\n'); InputStream *in = new_BytesInputStream(ctx, cwb->ba, cwb->pos, knh_Bytes_size(cwb->ba)); KNH_LPUSH(ctx, in); DP(in)->uri = URI_EVAL; DP(in)->line = 0; knh_NameSpace_load(ctx, ctx->share->mainns, in, 1/*isEval*/,0/*isThrowable*/); knh_cwb_close(cwb); KNH_LOCALBACK(ctx, lsfp); } KNH_RETURN_void(ctx, sfp); }