StripCtrlChars: retarget and reset functions.

stripctrl_retarget() points the StripCtrlChars at a new BinarySink, to
avoid having to pointlessly throw it away and make a new one all the
time.

Since that probably means the same scc is going to be reused for
processing a fresh data stream, we also don't want any character-set
conversion state hanging over from the previous stream, so we also
reset the state in the process. Just in case it's needed,
stripctrl_reset() is also provided to do that operation on its own.
This commit is contained in:
Simon Tatham 2019-03-09 15:50:38 +00:00
Родитель d62a369af8
Коммит cfef137ea2
2 изменённых файлов: 26 добавлений и 0 удалений

2
misc.h
Просмотреть файл

@ -384,6 +384,8 @@ StripCtrlChars *stripctrl_new_term_fn(
Terminal *, term_utf8_decode *, unsigned char)); Terminal *, term_utf8_decode *, unsigned char));
#define stripctrl_new_term(bs, cr, sub, term) \ #define stripctrl_new_term(bs, cr, sub, term) \
stripctrl_new_term_fn(bs, cr, sub, term, term_translate) stripctrl_new_term_fn(bs, cr, sub, term, term_translate)
void stripctrl_retarget(StripCtrlChars *sccpub, BinarySink *new_bs_out);
void stripctrl_reset(StripCtrlChars *sccpub);
void stripctrl_free(StripCtrlChars *sanpub); void stripctrl_free(StripCtrlChars *sanpub);
char *stripctrl_string_ptrlen(ptrlen str); char *stripctrl_string_ptrlen(ptrlen str);
static inline char *stripctrl_string(const char *str) static inline char *stripctrl_string(const char *str)

Просмотреть файл

@ -76,6 +76,30 @@ StripCtrlChars *stripctrl_new_term_fn(
return &scc->public; return &scc->public;
} }
void stripctrl_retarget(StripCtrlChars *sccpub, BinarySink *new_bs_out)
{
StripCtrlCharsImpl *scc =
container_of(sccpub, StripCtrlCharsImpl, public);
scc->bs_out = new_bs_out;
stripctrl_reset(sccpub);
}
void stripctrl_reset(StripCtrlChars *sccpub)
{
StripCtrlCharsImpl *scc =
container_of(sccpub, StripCtrlCharsImpl, public);
/*
* Clear all the fields that might have been in the middle of a
* multibyte character or non-default shift state, so that we can
* start converting a fresh piece of data to send to a channel
* that hasn't seen the previous output.
*/
memset(&scc->term_utf8_decode, 0, sizeof(scc->term_utf8_decode));
memset(&scc->mbs_in, 0, sizeof(scc->mbs_in));
memset(&scc->mbs_out, 0, sizeof(scc->mbs_out));
}
void stripctrl_free(StripCtrlChars *sccpub) void stripctrl_free(StripCtrlChars *sccpub)
{ {
StripCtrlCharsImpl *scc = StripCtrlCharsImpl *scc =