type line { name: (handle array byte) data: (handle word) cursor: (handle word) next: (handle line) prev: (handle line) } # initialize line with a single empty word fn initialize-line _line: (addr line) { var line/esi: (addr line) <- copy _line var word-ah/eax: (addr handle word) <- get line, data allocate word-ah var word/eax: (addr word) <- lookup *word-ah initialize-word word } fn num-words-in-line _in: (addr line) -> _/eax: int { var in/esi: (addr line) <- copy _in var curr-ah/ecx: (addr handle word) <- get in, data var result/edi: int <- copy 0 { var curr/eax: (addr word) <- lookup *curr-ah compare curr, 0 break-if-= curr-ah <- get curr, next result <- increment loop } return result } fn line-list-length lines: (addr handle line) -> _/eax: int { var curr-ah/esi: (addr handle line) <- copy lines var result/edi: int <- copy 0 { var curr/eax: (addr line) <- lookup *curr-ah compare curr, 0 break-if-= curr-ah <- get curr, next result <- increment loop } return result } fn render-line screen: (addr screen), _line: (addr line), x: int, y: int, render-cursor?: boolean -> _/eax: int { var line/eax: (addr line) <- copy _line var first-word-ah/esi: (addr handle word) <- get line, data # cursor-word var cursor-word/edi: int <- copy 0 compare render-cursor?, 0/false { break-if-= var cursor-word-ah/eax: (addr handle word) <- get line, cursor var _cursor-word/eax: (addr word) <- lookup *cursor-word-ah cursor-word <- copy _cursor-word } # var result/eax: int <- render-words screen, first-word-ah, x, y, cursor-word return result } fn parse-line in: (addr array byte), _out: (addr line) { var out/edi: (addr line) <- copy _out initialize-line out var dest/eax: (addr handle word) <- get out, data parse-words in, dest } #? fn main { #? # line = [aaa, bbb, ccc, ddd] #? var line-storage: line #? var w-ah/eax: (addr handle word) <- get line-storage, data #? allocate-word-with w-ah, "aaa" #? append-word-at-end-with w-ah, "bbb" #? append-word-at-end-with w-ah, "ccc" #? append-word-at-end-with w-ah, "ddd" #? var cursor-ah/ecx: (addr handle word) <- get line-storage, cursor #? var w/eax: (addr word) <- lookup *w-ah #? var next-ah/eax: (addr handle word) <- get w, next #? copy-object next-ah, cursor-ah #? var line-addr/eax: (addr line) <- address line-storage #? var dummy/eax: int <- render-line 0/screen, line-addr, 0/x, 0/y, 1/render-cursor #? }