about summary refs log tree commit diff stats
path: root/arc/buffered-stdin.mu
blob: 9a7bc7ae8934454945591890f2b460ddeab77a37 (plain) (blame)
1
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000;
; reads lines, prints them back when you hit 'enter'
; dies if you wait a while, because so far we never free memory
(function main [
  (default-space:space-address <- new space:literal 30:literal)
  (cursor-mode) ;? 1
  ; hook up stdin
  (stdin:channel-address <- init-channel 1:literal)
  (fork-helper send-keys-to-stdin:fn nil:literal/globals nil:literal/limit nil:literal/keyboard stdin:channel-address)
  ; buffer stdin
  (buffered-stdin:channel-address <- init-channel 1:literal)
  (fork-helper buffer-lines:fn nil:literal/globals nil:literal/limit stdin:channel-address buffered-stdin:channel-address)
  { begin
    ; now read characters from the buffer until 'enter' is typed
    (s:string-address <- new "? ")
    (print-string nil:literal/terminal s:string-address)
    { begin
      (x:tagged-value buffered-stdin:channel-address/deref <- read buffered-stdin:channel-address)
      (c:character <- maybe-coerce x:tagged-value character:literal)
;?       ($print (("AAA " literal))) ;? 1
;?       ($print c:character) ;? 1
;?       ($print (("\n" literal))) ;? 1
      (print-character nil:literal/terminal c:character)
      (line-done?:boolean <- equal c:character ((#\newline literal)))
      (loop-unless line-done?:boolean)
    }
    (loop)
  }
])