vt: extract selection chars storing from vc_do_selection
authorJiri Slaby <jslaby@suse.cz>
Wed, 15 Apr 2020 09:36:08 +0000 (11:36 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 16 Apr 2020 14:14:15 +0000 (16:14 +0200)
Let's put it to a separate function, named vc_selection_store_chars.
Again, this makes vc_do_selection a bit shorter and more readable.
Having 4 local variables instead of 12 (5.6-rc1) looks much better now.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20200415093608.10348-2-jslaby@suse.cz
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/vt/selection.c

index a9693c0e8d0473b4de0553128421d75987affd26..31bb3647a99c380a4511f4865c6f5d8e95424098 100644 (file)
@@ -185,13 +185,51 @@ int set_selection_user(const struct tiocl_selection __user *sel,
        return set_selection_kernel(&v, tty);
 }
 
+static int vc_selection_store_chars(struct vc_data *vc, bool unicode)
+{
+       char *bp, *obp;
+       unsigned int i;
+
+       /* Allocate a new buffer before freeing the old one ... */
+       /* chars can take up to 4 bytes with unicode */
+       bp = kmalloc_array((vc_sel.end - vc_sel.start) / 2 + 1, unicode ? 4 : 1,
+                          GFP_KERNEL);
+       if (!bp) {
+               printk(KERN_WARNING "selection: kmalloc() failed\n");
+               clear_selection();
+               return -ENOMEM;
+       }
+       kfree(vc_sel.buffer);
+       vc_sel.buffer = bp;
+
+       obp = bp;
+       for (i = vc_sel.start; i <= vc_sel.end; i += 2) {
+               u32 c = sel_pos(i, unicode);
+               if (unicode)
+                       bp += store_utf8(c, bp);
+               else
+                       *bp++ = c;
+               if (!isspace(c))
+                       obp = bp;
+               if (!((i + 2) % vc->vc_size_row)) {
+                       /* strip trailing blanks from line and add newline,
+                          unless non-space at end of line. */
+                       if (obp != bp) {
+                               bp = obp;
+                               *bp++ = '\r';
+                       }
+                       obp = bp;
+               }
+       }
+       vc_sel.buf_len = bp - vc_sel.buffer;
+
+       return 0;
+}
+
 static int vc_do_selection(struct vc_data *vc, unsigned short mode, int ps,
                int pe)
 {
        int new_sel_start, new_sel_end, spc;
-       char *bp, *obp;
-       u32 c;
-       int i, ret = 0;
        bool unicode = vt_do_kdgkbmode(fg_console) == K_UNICODE;
 
        switch (mode) {
@@ -272,40 +310,7 @@ static int vc_do_selection(struct vc_data *vc, unsigned short mode, int ps,
        vc_sel.start = new_sel_start;
        vc_sel.end = new_sel_end;
 
-       /* Allocate a new buffer before freeing the old one ... */
-       /* chars can take up to 4 bytes with unicode */
-       bp = kmalloc_array((vc_sel.end - vc_sel.start) / 2 + 1, unicode ? 4 : 1,
-                          GFP_KERNEL);
-       if (!bp) {
-               printk(KERN_WARNING "selection: kmalloc() failed\n");
-               clear_selection();
-               return -ENOMEM;
-       }
-       kfree(vc_sel.buffer);
-       vc_sel.buffer = bp;
-
-       obp = bp;
-       for (i = vc_sel.start; i <= vc_sel.end; i += 2) {
-               c = sel_pos(i, unicode);
-               if (unicode)
-                       bp += store_utf8(c, bp);
-               else
-                       *bp++ = c;
-               if (!isspace(c))
-                       obp = bp;
-               if (! ((i + 2) % vc->vc_size_row)) {
-                       /* strip trailing blanks from line and add newline,
-                          unless non-space at end of line. */
-                       if (obp != bp) {
-                               bp = obp;
-                               *bp++ = '\r';
-                       }
-                       obp = bp;
-               }
-       }
-       vc_sel.buf_len = bp - vc_sel.buffer;
-
-       return ret;
+       return vc_selection_store_chars(vc, unicode);
 }
 
 static int vc_selection(struct vc_data *vc, struct tiocl_selection *v,