type environment { screen: (handle screen) program: (handle program) cursor-word: (handle word) nrows: int ncols: int code-separator-col: int } fn initialize-environment _env: (addr environment) { var env/esi: (addr environment) <- copy _env var program-ah/eax: (addr handle program) <- get env, program allocate program-ah var program/eax: (addr program) <- lookup *program-ah var cursor-word-ah/ecx: (addr handle word) <- get env, cursor-word initialize-program program, cursor-word-ah # initialize screen var screen-ah/eax: (addr handle screen) <- get env, screen var _screen/eax: (addr screen) <- lookup *screen-ah var screen/edi: (addr screen) <- copy _screen var nrows/eax: int <- copy 0 var ncols/ecx: int <- copy 0 nrows, ncols <- screen-size screen var dest/edx: (addr int) <- get env, nrows copy-to *dest, nrows dest <- get env, ncols copy-to *dest, ncols var repl-col/ecx: int <- copy ncols repl-col <- shift-right 1 dest <- get env, code-separator-col copy-to *dest, repl-col } fn draw-screen _env: (addr environment) { var env/esi: (addr environment) <- copy _env var screen-ah/eax: (addr handle screen) <- get env, screen var _screen/eax: (addr screen) <- lookup *screen-ah var screen/edi: (addr screen) <- copy _screen var dest/edx: (addr int) <- get env, code-separator-col var tmp/eax: int <- copy *dest clear-canvas env tmp <- add 2 # repl-margin-left move-cursor screen, 3, tmp # input-row } fn initialize-environment-with-fake-screen _self: (addr environment), nrows: int, ncols: int { var self/esi: (addr environment) <- copy _self var screen-ah/eax: (addr handle screen) <- get self, screen allocate screen-ah var screen-addr/eax: (addr screen) <- lookup *screen-ah initialize-screen screen-addr, nrows, ncols initialize-environment self } fn process _self: (addr environment), key: grapheme { $process:body: { var self/esi: (addr environment) <- copy _self compare key, 0x445b1b # left-arrow { break-if-!= var cursor-word-ah/edi: (addr handle word) <- get self, cursor-word var _cursor-word/eax: (addr word) <- lookup *cursor-word-ah var cursor-word/ecx: (addr word) <- copy _cursor-word # if not at start, move left within current word var at-start?/eax: boolean <- cursor-at-start? cursor-word compare at-start?, 0 # false { break-if-= cursor-left cursor-word break $process:body } # otherwise, move to end of prev word var prev-word-ah/esi: (addr handle word) <- get cursor-word, prev var prev-word/eax: (addr word) <- lookup *prev-word-ah { compare prev-word, 0 break-if-= copy-object prev-word-ah, cursor-word-ah cursor-to-end prev-word } break $process:body } compare key, 0x435b1b # right-arrow { break-if-!= var cursor-word-ah/edi: (addr handle word) <- get self, cursor-word var _cursor-word/eax: (addr word) <- lookup *cursor-word-ah var cursor-word/ecx: (addr word) <- copy _cursor-word # if not at end, move right within current word var at-end?/eax: boolean <- cursor-at-end? cursor-word compare at-end?, 0 # false { break-if-= cursor-right cursor-word break $process:body } # otherwise, move to start of next word var next-word-ah/esi: (addr handle word) <- get cursor-word, next var next-word/eax: (addr word) <- lookup *next-word-ah { compare next-word, 0 break-if-= copy-object next-word-ah, cursor-word-ah cursor-to-start next-word } break $process:body } compare key, 0x7f # del (backspace on Macs) { break-if-!= var cursor-word-ah/edi: (addr handle word) <- get self, cursor-word var _cursor-word/eax: (addr word) <- lookup *cursor-word-ah var cursor-word/ecx: (addr word) <- copy _cursor-word # if not at start of some word, delete grapheme before cursor within current word var at-start?/eax: boolean <- cursor-at-start? cursor-word compare at-start?, 0 # false { break-if-= delete-before-cursor cursor-word break $process:body } # otherwise delete current word and move to end of prev word var prev-word-ah/esi: (addr handle word) <- get cursor-word, prev var prev-word/eax: (
discard """
  disabled: "Windows"
  output: '''Full read size: 20
Half read size: 10 Data: Hello'''
"""
import memfiles, os
const
  fn = "test.mmap"
var
  mm, mm_full, mm_half: MemFile
  p: pointer

if fileExists(fn): removeFile(fn)

# Create a new file, data all zeros
mm = memfiles.open(fn, mode = fmReadWrite, newFileSize = 20)
mm.close()

# read, change
mm_full = memfiles.open(fn, mode = fmWrite, mappedSize = -1, allowRemap = true)
let size = mm_full.size
p = mm_full.mapMem(fmReadWrite, 20, 0)
echo "Full read size: ", size
var p2 = cast[cstring](p)
p2[0] = 'H'
p2[1] = 'e'
p2[2] = 'l'
p2[3] = 'l'
p2[