use fmt; use os; use bufio; use strings; use unix::poll; export fn console_input(c: u8, ctype: u8, state: *uxn) (done | error) = { state.dev[0x12] = c; state.dev[0x17] = ctype; if(state.console_vector != 0){ // fmt::printfln("Evaluating Console Vector ctype: {:x} value: {:x}",ctype,c)!; match(uxn_eval(state.console_vector, state)){ case done => state.dev[0x12] = 0; state.dev[0x17] = 0; return done; case let err: error => state.dev[0x12] = 0; state.dev[0x17] = 0; return err; case => state.dev[0x12] = 0; state.dev[0x17] = 0; return done; }; }; state.dev[0x12] = 0; state.dev[0x17] = 0; return done; }; fn console_output(value: rune, state: *uxn) void = { fmt::print(value)!; bufio::flush(os::stdout)!; }; export fn console_poll(buf: []u8, state: *uxn) void = { for( let b .. buf ){ // fmt::printfln("Input: {}",b: rune)!; if(b == 0){ // fmt::printfln("Ending stdin argument")!; match (console_input('\n',4,state)) { case done => yield done; case let val: u8 => fmt::fatalf("Unhandled Opcode: {:x}", val); }; // fmt::printfln("Finished stdin argument")!; break; }; match (console_input(b,1,state)) { case done => yield done; case let val: u8 => fmt::fatalf("Unhandled Opcode: {:x}", val); }; }; // fmt::printfln("Finished stdin argument")!; }; export fn uxn_console_argument(state: *uxn) void = { // fmt::printf("Evaluating console arguments")!; let args = os::args[2..]; let i: u8 = 0; let argcount = len(args): u8; for (let arg .. args){ // fmt::println("Console input args")!; for(let char: u8 .. strings::toutf8(arg)){ // fmt::printfln("Console input arg char: {}", char: rune)!; match (console_input(char,2,state)) { case done => yield done; case let val: u8 => fmt::fatalf("Unhandled Opcode: {:x}", val); case => yield done; }; }; let ctype: u8 = if(i == (argcount - 1)){ yield 4; } else { yield 3; }; match (console_input('\n',ctype,state)) { case done => yield done; case let val: u8 => fmt::fatalf("Unhandled Opcode: {:x}", val); case => yield done; }; i+=1; //TODO using i here seems inelegant }; };