summaryrefslogtreecommitdiff
path: root/lib/kernel/src/prim_tty.erl
diff options
context:
space:
mode:
authorfrazze-jobb <frazze@erlang.org>2023-05-05 11:07:53 +0200
committerRickard Green <rickard@erlang.org>2023-05-05 18:44:44 +0200
commit338958e904bd3a7803a277b5e7af67985999b1f2 (patch)
tree6b8654715844f6015e0bb5eadfdf65116a56a1d4 /lib/kernel/src/prim_tty.erl
parent36a02676a4c30d915518453a2664b8338fd46d85 (diff)
downloaderlang-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.erl5
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),