vt: deduplicate setGx code
authorJiri Slaby <jslaby@suse.cz>
Mon, 15 Jun 2020 07:48:36 +0000 (09:48 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Jun 2020 15:08:31 +0000 (17:08 +0200)
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>
drivers/tty/vt/vt.c

index 26cb1fc..729c7c8 100644 (file)
@@ -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: