97 lines
2.2 KiB
Hare
97 lines
2.2 KiB
Hare
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
|
|
};
|
|
};
|