diff options
author | Jiri Slaby <jslaby@suse.cz> | 2020-06-15 10:48:36 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2020-06-24 18:08:31 +0300 |
commit | b4d92b6575ac3c2d0ed8310d6b8279968dca10b8 (patch) | |
tree | b20e4eb8ca9e4d4f18a90177533a770b4d4cb2e4 /drivers/tty/vt/vt.c | |
parent | 77bc14f273c2dfecbf87f41fdc00345d99597e13 (diff) | |
download | linux-b4d92b6575ac3c2d0ed8310d6b8279968dca10b8.tar.xz |
vt: deduplicate setGx code
The code for setting G0 and G1 is duplicated -- for each of them. Move
the code to a separate function (vc_setGx) and distinguish the two cases
by a parameter.
Change if-else-if to switch which allows for slightly better
optimization (decision tree).
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20200615074910.19267-4-jslaby@suse.cz
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/vt/vt.c')
-rw-r--r-- | drivers/tty/vt/vt.c | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 26cb1fc48b27..729c7c8c682b 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c @@ -2103,6 +2103,30 @@ static void reset_terminal(struct vc_data *vc, int do_clear) csi_J(vc, 2); } +static void vc_setGx(struct vc_data *vc, unsigned int which, int c) +{ + unsigned char *charset = which == 0 ? &vc->state.G0_charset : + &vc->state.G1_charset; + + switch (c) { + case '0': + *charset = GRAF_MAP; + break; + case 'B': + *charset = LAT1_MAP; + break; + case 'U': + *charset = IBMPC_MAP; + break; + case 'K': + *charset = USER_MAP; + break; + } + + if (vc->state.charset == which) + vc->vc_translate = set_translate(*charset, vc); +} + /* console_lock is held */ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) { @@ -2485,29 +2509,11 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) } return; case ESsetG0: - if (c == '0') - vc->state.G0_charset = GRAF_MAP; - else if (c == 'B') - vc->state.G0_charset = LAT1_MAP; - else if (c == 'U') - vc->state.G0_charset = IBMPC_MAP; - else if (c == 'K') - vc->state.G0_charset = USER_MAP; - if (vc->state.charset == 0) - vc->vc_translate = set_translate(vc->state.G0_charset, vc); + vc_setGx(vc, 0, c); vc->vc_state = ESnormal; return; case ESsetG1: - if (c == '0') - vc->state.G1_charset = GRAF_MAP; - else if (c == 'B') - vc->state.G1_charset = LAT1_MAP; - else if (c == 'U') - vc->state.G1_charset = IBMPC_MAP; - else if (c == 'K') - vc->state.G1_charset = USER_MAP; - if (vc->state.charset == 1) - vc->vc_translate = set_translate(vc->state.G1_charset, vc); + vc_setGx(vc, 1, c); vc->vc_state = ESnormal; return; case ESosc: |