static kstatus_t readstmt(CTX, kwb_t *wb, kline_t *uline) { int line = 1; kstatus_t status = K_CONTINUE; // fputs(TERM_BBOLD(_ctx), stdout); while(1) { int check; char *ln = kreadline(line == 1 ? ">>> " : " "); if(ln == NULL) { kwb_free(wb); status = K_BREAK; break; } if(line > 1) kwb_putc(wb, '\n'); kwb_write(wb, ln, strlen(ln)); free(ln); if((check = checkstmt(kwb_top(wb, 0), kwb_bytesize(wb))) > 0) { uline[0]++; line++; continue; } if(check < 0) { fputs("(Cancelled)...\n", stdout); kwb_free(wb); } break; } if(kwb_bytesize(wb) > 0) { kadd_history(kwb_top(wb, 1)); } // fputs(TERM_EBOLD(_ctx), stdout); fflush(stdout); uline[0]++; return status; }
static void shell(CTX) { kwb_t wb; kwb_init(&(_ctx->stack->cwb), &wb); kline_t uline = FILEID_("(shell)") | 1; while(1) { kline_t inc = 0; kstatus_t status = readstmt(_ctx, &wb, &inc); if(status == K_CONTINUE && kwb_bytesize(&wb) > 0) { status = konoha_eval((konoha_t)_ctx, kwb_top(&wb, 1), uline); uline += inc; kwb_free(&wb); if(status != K_FAILED) { dumpEval(_ctx, &wb); kwb_free(&wb); } } if(status == K_BREAK) { break; } } kwb_free(&wb); fprintf(stdout, "\n"); return; }
static void dumpMethod(CTX, ksfp_t *sfp, kMethod *mtd) { kwb_t wb; kwb_init(&(_ctx->stack->cwb), &wb); KSETv(sfp[2].mtd, mtd); O_ct(mtd)->p(_ctx, sfp, 2, &wb, 1); PLAT printf_i("%s\n", kwb_top(&wb, 1)); kwb_free(&wb); return; }
static void dumpEval(CTX, kwb_t *wb) { kstack_t *base = _ctx->stack; ktype_t ty = base->evalty; if(ty != TY_void) { ksfp_t *lsfp = base->stack + base->evalidx; CT_(ty)->p(_ctx, lsfp, 0, wb, P_DUMP); fflush(stdout); fprintf(stdout, "TYPE=%s EVAL=%s\n", TY_t(ty), kwb_top(wb,1)); } }