// keyboard.b import "io" import "heap" import "string" export { kbd_readch, kbd_unreadch, kbd_readint, kbd_readstring, kbd_readline } /* imported from string: new_string() string_length(s) string_addchar(s, c) string_getchar(s, i) string_setchar(s, i, c) string_print(s) string_frombcplstring(s) string_delete(s) */ let putback = 0; let kbd_readch() be { let answer; test putback = 0 then answer := inch() else answer := putback; putback := 0; resultis answer } let kbd_unreadch(c) be { putback := c } let kbd_readint() be { let n = 0, neg = false, c = kbd_readch(); while c <= ' ' do c := kbd_readch(); test c = '-' then { neg := true; c := kbd_readch() } else if c = '+' then c := kbd_readch(); while c >= '0' /\ c <= '9' do { n := n * 10 + c - '0'; c := kbd_readch() } kbd_unreadch(); if neg then n := - n; resultis n } let kbd_readstring() be { let s = new_string(), c = kbd_readch(); while c <= ' ' /\ c <> '\n' do c := kbd_readch(); while c > ' ' do { string_addchar(s, c); c := kbd_readch() } resultis s } let kbd_readline() be { let s = new_string(), c = kbd_readch(); while c <> '\n' do { string_addchar(s, c); c := kbd_readch() } resultis s } let start() be { let a, b, c, d, e; init(); out("type a single character, two ints, then two strings\n> "); a := kbd_readch(); b := kbd_readint(); c := kbd_readint(); d := kbd_readstring(); e := kbd_readstring(); out("a: '%c'\n", a); out("b: %d\n", b); out("c: %d\n", c); out("d: \""); string_print(d); out("\"\n"); out("e: \""); string_print(e); out("\"\n") }