6467
This commit is contained in:
parent
cde591e03e
commit
536058af78
|
@ -0,0 +1,8 @@
|
||||||
|
Start fleshing out the previous prototype's plans into something working.
|
||||||
|
|
||||||
|
We're back to just plain text without bold formatting. Let's get something
|
||||||
|
like prototype 3 working with the new architecture. Since Mu still has no
|
||||||
|
checks we need to move slowly.
|
||||||
|
|
||||||
|
One issue with this architecture: I have separate checks for `next-char ==
|
||||||
|
EOF` and `done-reading? fs`. I'm gonna tolerate that duplication for now.
|
|
@ -0,0 +1,44 @@
|
||||||
|
type file-state {
|
||||||
|
source: (handle buffered-file)
|
||||||
|
eof?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init-file-state _self: (addr file-state), filename: (addr array byte) {
|
||||||
|
var self/eax: (addr file-state) <- copy _self
|
||||||
|
load-file self, filename
|
||||||
|
var eof/eax: (addr boolean) <- get self, eof?
|
||||||
|
copy-to *eof, 0 # false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn load-file _self: (addr file-state), filename: (addr array byte) {
|
||||||
|
var self/eax: (addr file-state) <- copy _self
|
||||||
|
var out/esi: (addr handle buffered-file) <- get self, source
|
||||||
|
open filename, 0, out # 0 = read mode
|
||||||
|
}
|
||||||
|
|
||||||
|
fn next-char _self: (addr file-state) -> result/eax: byte {
|
||||||
|
var self/ecx: (addr file-state) <- copy _self
|
||||||
|
var source/eax: (addr handle buffered-file) <- get self, source
|
||||||
|
var in/eax: (addr buffered-file) <- lookup *source
|
||||||
|
result <- read-byte-buffered in
|
||||||
|
# if result == EOF, set eof?
|
||||||
|
compare result, 0xffffffff # EOF marker
|
||||||
|
{
|
||||||
|
var eof/ecx: (addr boolean) <- get self, eof?
|
||||||
|
copy-to *eof, 1 # true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn done-reading? _self: (addr file-state) -> result/eax: boolean {
|
||||||
|
var self/eax: (addr file-state) <- copy _self
|
||||||
|
var eof/eax: (addr boolean) <- get self, eof?
|
||||||
|
result <- copy *eof
|
||||||
|
}
|
||||||
|
|
||||||
|
fn dump in: (addr buffered-file) {
|
||||||
|
var c/eax: byte <- read-byte-buffered in
|
||||||
|
compare c, 0xffffffff # EOF marker
|
||||||
|
break-if-=
|
||||||
|
print-byte c
|
||||||
|
loop
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
fn main args: (addr array (addr array byte)) -> exit-status/ebx: int {
|
||||||
|
# initialize fs from args[1]
|
||||||
|
var filename/eax: (addr array byte) <- first-arg args
|
||||||
|
#? print-string filename
|
||||||
|
#? print-string "\n"
|
||||||
|
var file-state-storage: file-state
|
||||||
|
var fs/esi: (addr file-state) <- address file-state-storage
|
||||||
|
init-file-state fs, filename
|
||||||
|
render fs
|
||||||
|
exit-status <- copy 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render fs: (addr file-state) {
|
||||||
|
render-normal fs
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render-normal fs: (addr file-state) {
|
||||||
|
{
|
||||||
|
var c/eax: byte <- next-char fs
|
||||||
|
# if (c == EOF) break
|
||||||
|
compare c, 0xffffffff # EOF marker
|
||||||
|
break-if-=
|
||||||
|
#
|
||||||
|
print-byte c
|
||||||
|
#
|
||||||
|
loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn first-arg args-on-stack: (addr array (addr array byte)) -> out/eax: (addr array byte) {
|
||||||
|
var args/eax: (addr array (addr array byte)) <- copy args-on-stack
|
||||||
|
var result/eax: (addr addr array byte) <- index args, 1
|
||||||
|
out <- copy *result
|
||||||
|
}
|
Loading…
Reference in New Issue