diff options
author | frazze-jobb <frazze@erlang.org> | 2023-05-05 11:07:53 +0200 |
---|---|---|
committer | Rickard Green <rickard@erlang.org> | 2023-05-05 18:44:44 +0200 |
commit | 338958e904bd3a7803a277b5e7af67985999b1f2 (patch) | |
tree | 6b8654715844f6015e0bb5eadfdf65116a56a1d4 /lib/kernel/src/prim_tty.erl | |
parent | 36a02676a4c30d915518453a2664b8338fd46d85 (diff) | |
download | erlang-338958e904bd3a7803a277b5e7af67985999b1f2.tar.gz |
kernel: support sending raw byte data over stdout
After rewriting the shell, group.erl converts everything to Unicode.
However, this is problematic if you want to send raw byte data over
stdout which may contain Erlang terms converted to binary that you
want to convert back to Erlang term after data transfer.
If io:setopts(_, {encoding, latin1}) is set, group.erl will just send
the data directly to user_drv.erl which will send the data to
prim_tty.erl without converting it to Unicode.
Diffstat (limited to 'lib/kernel/src/prim_tty.erl')
-rw-r--r-- | lib/kernel/src/prim_tty.erl | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/lib/kernel/src/prim_tty.erl b/lib/kernel/src/prim_tty.erl index 7ed418de5e..4ef10c752d 100644 --- a/lib/kernel/src/prim_tty.erl +++ b/lib/kernel/src/prim_tty.erl @@ -164,6 +164,7 @@ sig => boolean() }. -type request() :: + {putc_raw, binary()} | {putc, unicode:unicode_binary()} | {expand, unicode:unicode_binary()} | {insert, unicode:unicode_binary()} | @@ -525,6 +526,8 @@ writer_loop(TTY, WriterRef) -> -spec handle_request(state(), request()) -> {erlang:iovec(), state()}. handle_request(State = #state{ options = #{ tty := false } }, Request) -> case Request of + {putc_raw, Binary} -> + {Binary, State}; {putc, Binary} -> {encode(Binary, State#state.unicode), State}; beep -> @@ -565,6 +568,8 @@ handle_request(State = #state{ unicode = U }, {putc, Binary}) -> {_, _, _, NewBA} = split(NewLength - OldLength, NewState#state.buffer_after, U), {encode(PutBuffer, U), NewState#state{ buffer_after = NewBA }} end; +handle_request(State, {putc_raw, Binary}) -> + handle_request(State, {putc, unicode:characters_to_binary(Binary, latin1)}); handle_request(State = #state{ unicode = U }, {delete, N}) when N > 0 -> {_DelNum, DelCols, _, NewBA} = split(N, State#state.buffer_after, U), BBCols = cols(State#state.buffer_before, U), |