summaryrefslogtreecommitdiff
path: root/drivers/tty/vt/vt.c
diff options
context:
space:
mode:
authorJiri Slaby <jslaby@suse.cz>2020-06-15 10:48:36 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-06-24 18:08:31 +0300
commitb4d92b6575ac3c2d0ed8310d6b8279968dca10b8 (patch)
treeb20e4eb8ca9e4d4f18a90177533a770b4d4cb2e4 /drivers/tty/vt/vt.c
parent77bc14f273c2dfecbf87f41fdc00345d99597e13 (diff)
downloadlinux-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.c46
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: