: (rdlnc) ( -- c ) ( buffer overflow? same as if we typed a newline ) IN> @ IN) = IF 0x0a ELSE KEY THEN ( c ) DUP 0x0a = IF DROP 0xd THEN ( lf? same as cr ) ( backspace? handle and exit ) DUP BS? IF _bs EXIT THEN ( echo back ) DUP EMIT ( c ) ( write and advance ) DUP ( keep as result ) ( c c ) ( We take advantage of the fact that c's MSB is always zero and thus ! automatically null-terminates our string ) IN> @ ! 1 IN> +! ( c ) ( if newline, replace with zero to indicate EOL ) DUP 0xd = IF DROP 0 THEN ;