: (rdlnc) ( -- f ) ( buffer overflow? same as if we typed a newline ) IN> @ IN) = IF 0x0a ELSE KEY THEN ( c ) DUP 0x7f = IF DROP 0x8 THEN ( del? same as backspace ) DUP 0x0a = IF DROP 0xd THEN ( lf? same as cr ) ( echo back ) DUP EMIT ( c ) ( bacspace? handle and exit ) DUP 0x8 = IF (inbs) EXIT THEN ( 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 ;