add readchar

This commit is contained in:
sfja 2024-12-13 20:29:06 +01:00
parent ab853d0516
commit a88c502529
4 changed files with 22 additions and 6 deletions

View File

@ -55,9 +55,10 @@ export const Builtins = {
FileOpen: 0x41, FileOpen: 0x41,
FileClose: 0x42, FileClose: 0x42,
FileWriteString: 0x43, FileWriteString: 0x43,
FileReadToString: 0x44, FileReadChar: 0x44,
FileFlush: 0x45, FileReadToString: 0x45,
FileEof: 0x46, FileFlush: 0x46,
FileEof: 0x47,
} as const; } as const;
export function opToString(op: number): string { export function opToString(op: number): string {

View File

@ -15,6 +15,7 @@ fn array_at_string(array: [string], index: int) -> string #[builtin(ArrayAt)] {}
fn file_open(filename: string, mode: string) -> int #[builtin(FileOpen)] {} fn file_open(filename: string, mode: string) -> int #[builtin(FileOpen)] {}
fn file_close(file: int) #[builtin(FileClose)] {} fn file_close(file: int) #[builtin(FileClose)] {}
fn file_write_string(file: int, content: string) -> int #[builtin(FileWriteString)] {} fn file_write_string(file: int, content: string) -> int #[builtin(FileWriteString)] {}
fn file_read_char(file: int) -> int #[builtin(FileReadChar)] {}
fn file_read_to_string(file: int) -> string #[builtin(FileReadToString)] {} fn file_read_to_string(file: int) -> string #[builtin(FileReadToString)] {}
fn file_flush(file: int) #[builtin(FileFlush)] {} fn file_flush(file: int) #[builtin(FileFlush)] {}
fn file_eof(file: int) -> bool #[builtin(FileEof)] {} fn file_eof(file: int) -> bool #[builtin(FileEof)] {}

View File

@ -56,9 +56,10 @@ enum class Builtin : uint32_t {
FileOpen = 0x41, FileOpen = 0x41,
FileClose = 0x42, FileClose = 0x42,
FileWriteString = 0x43, FileWriteString = 0x43,
FileReadToString = 0x44, FileReadChar = 0x44,
FileFlush = 0x45, FileReadToString = 0x45,
FileEof = 0x46, FileFlush = 0x46,
FileEof = 0x47,
}; };
} }

View File

@ -322,6 +322,7 @@ void VM::run_builtin(Builtin builtin_id)
case Builtin::FileOpen: case Builtin::FileOpen:
case Builtin::FileClose: case Builtin::FileClose:
case Builtin::FileWriteString: case Builtin::FileWriteString:
case Builtin::FileReadChar:
case Builtin::FileReadToString: case Builtin::FileReadToString:
case Builtin::FileFlush: case Builtin::FileFlush:
case Builtin::FileEof: case Builtin::FileEof:
@ -488,6 +489,18 @@ void VM::run_file_builtin(Builtin builtin_id)
stack_push(Int(0)); stack_push(Int(0));
break; break;
} }
case Builtin::FileReadChar: {
assert_stack_has(1);
auto file_id = stack_pop().as_int().value;
auto fp = this->open_files.find(file_id);
if (fp == this->open_files.end()) {
std::cerr << std::format("error: no open file {}\n", file_id);
std::exit(1);
}
int value = std::fgetc(fp->second);
stack_push(Int(value));
break;
}
case Builtin::FileReadToString: { case Builtin::FileReadToString: {
assert_stack_has(1); assert_stack_has(1);
auto file_id = stack_pop().as_int().value; auto file_id = stack_pop().as_int().value;