vc_screen: extract vcs_read_buf_noattr
[linux-2.6-microblaze.git] / drivers / tty / vt / vc_screen.c
index c62c590..ad015cd 100644 (file)
@@ -53,7 +53,7 @@
 #undef attr
 #undef org
 #undef addr
-#define HEADER_SIZE    4
+#define HEADER_SIZE    4u
 
 #define CON_BUF_SIZE (CONFIG_BASE_SMALL ? 256 : PAGE_SIZE)
 
@@ -249,6 +249,53 @@ static loff_t vcs_lseek(struct file *file, loff_t offset, int orig)
        return fixed_size_llseek(file, offset, orig, size);
 }
 
+static int vcs_read_buf_uni(struct vc_data *vc, char *con_buf,
+               unsigned int pos, unsigned int count, bool viewed)
+{
+       unsigned int nr, row, col, maxcol = vc->vc_cols;
+       int ret;
+
+       ret = vc_uniscr_check(vc);
+       if (ret)
+               return ret;
+
+       pos /= 4;
+       row = pos / maxcol;
+       col = pos % maxcol;
+       nr = maxcol - col;
+       do {
+               if (nr > count / 4)
+                       nr = count / 4;
+               vc_uniscr_copy_line(vc, con_buf, viewed, row, col, nr);
+               con_buf += nr * 4;
+               count -= nr * 4;
+               row++;
+               col = 0;
+               nr = maxcol;
+       } while (count);
+
+       return 0;
+}
+
+static void vcs_read_buf_noattr(const struct vc_data *vc, char *con_buf,
+               unsigned int pos, unsigned int count, bool viewed)
+{
+       u16 *org;
+       unsigned int col, maxcol = vc->vc_cols;
+
+       org = screen_pos(vc, pos, viewed);
+       col = pos % maxcol;
+       pos += maxcol - col;
+
+       while (count-- > 0) {
+               *con_buf++ = (vcs_scr_readw(vc, org++) & 0xff);
+               if (++col == maxcol) {
+                       org = screen_pos(vc, pos, viewed);
+                       col = 0;
+                       pos += maxcol;
+               }
+       }
+}
 
 static ssize_t
 vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
@@ -257,7 +304,7 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
        struct vc_data *vc;
        struct vcs_poll_data *poll;
        u16 *org;
-       unsigned int read, row, col, maxcol;
+       unsigned int read, col, maxcol;
        ssize_t ret;
        char *con_buf;
        loff_t pos;
@@ -327,42 +374,15 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
                orig_count = this_round;
                maxcol = vc->vc_cols;
                if (uni_mode) {
-                       unsigned int nr;
-
-                       ret = vc_uniscr_check(vc);
+                       ret = vcs_read_buf_uni(vc, con_buf, pos, this_round,
+                                       viewed);
                        if (ret)
                                break;
-                       p /= 4;
-                       row = p / vc->vc_cols;
-                       col = p % maxcol;
-                       nr = maxcol - col;
-                       do {
-                               if (nr > this_round/4)
-                                       nr = this_round/4;
-                               vc_uniscr_copy_line(vc, con_buf0, viewed,
-                                                   row, col, nr);
-                               con_buf0 += nr * 4;
-                               this_round -= nr * 4;
-                               row++;
-                               col = 0;
-                               nr = maxcol;
-                       } while (this_round);
                } else if (!attr) {
-                       org = screen_pos(vc, p, viewed);
-                       col = p % maxcol;
-                       p += maxcol - col;
-                       while (this_round-- > 0) {
-                               *con_buf0++ = (vcs_scr_readw(vc, org++) & 0xff);
-                               if (++col == maxcol) {
-                                       org = screen_pos(vc, p, viewed);
-                                       col = 0;
-                                       p += maxcol;
-                               }
-                       }
+                       vcs_read_buf_noattr(vc, con_buf, pos, this_round,
+                                       viewed);
                } else {
                        if (p < HEADER_SIZE) {
-                               unsigned int tmp_count;
-
                                /* clamp header values if they don't fit */
                                con_buf0[0] = min(vc->vc_rows, 0xFFu);
                                con_buf0[1] = min(vc->vc_cols, 0xFFu);
@@ -375,12 +395,8 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
                                        orig_count = this_round - p;
                                }
 
-                               tmp_count = HEADER_SIZE;
-                               if (tmp_count > this_round)
-                                       tmp_count = this_round;
-
                                /* Advance state pointers and move on. */
-                               this_round -= tmp_count;
+                               this_round -= min(HEADER_SIZE, this_round);
                                p = HEADER_SIZE;
                                con_buf0 = con_buf + HEADER_SIZE;
                                /* If this_round >= 0, then p is even... */