s390/raw3270: make raw3270_buffer_address() accept x/y coordinates
authorSven Schnelle <svens@linux.ibm.com>
Sat, 26 Nov 2022 19:18:21 +0000 (20:18 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 9 Jan 2023 13:34:00 +0000 (14:34 +0100)
All callers of raw3270_buffer_address() are calculating the offset
from some x/y coordinates. Move that calculation inside of the
function, so user can pass the x/y values directly. Note that
negative values are relative to the end-of-line or end-of-screen.

Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Tested-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
drivers/s390/char/con3270.c
drivers/s390/char/raw3270.c
drivers/s390/char/raw3270.h

index d3c9fb2..0a4fce0 100644 (file)
@@ -133,6 +133,7 @@ struct tty3270 {
 #define TTY_UPDATE_ALL         16      /* Recreate screen. */
 
 #define TTY3270_INPUT_AREA_ROWS 2
+
 static void tty3270_update(struct timer_list *);
 /*
  * Setup timeout for a device. On timeout trigger an update.
@@ -153,7 +154,6 @@ static int tty3270_tty_rows(struct tty3270 *tp)
 static void tty3270_update_prompt(struct tty3270 *tp, char *input, int count)
 {
        struct string *line;
-       unsigned int off;
 
        line = tp->prompt;
        if (count != 0)
@@ -168,8 +168,7 @@ static void tty3270_update_prompt(struct tty3270 *tp, char *input, int count)
        if (count < tp->view.cols * 2 - 11) {
                line->string[7 + count] = TO_RA;
                line->string[10 + count] = 0;
-               off = tp->view.cols * tp->view.rows - 9;
-               raw3270_buffer_address(tp->view.dev, line->string+count+8, off);
+               raw3270_buffer_address(tp->view.dev, line->string+count+8, -9, -1);
                line->len = 11 + count;
        } else
                line->len = 7 + count;
@@ -183,7 +182,6 @@ static void tty3270_create_prompt(struct tty3270 *tp)
                  /* empty input string */
                  TO_IC, TO_RA, 0, 0, 0 };
        struct string *line;
-       unsigned int offset;
 
        line = alloc_string(&tp->freemem,
                            sizeof(blueprint) + tp->view.cols * 2 - 9);
@@ -193,10 +191,9 @@ static void tty3270_create_prompt(struct tty3270 *tp)
        memcpy(line->string, blueprint, sizeof(blueprint));
        line->len = sizeof(blueprint);
        /* Set output offsets. */
-       offset = tp->view.cols * tty3270_tty_rows(tp);
-       raw3270_buffer_address(tp->view.dev, line->string + 1, offset);
-       offset = tp->view.cols * tp->view.rows - 9;
-       raw3270_buffer_address(tp->view.dev, line->string + 8, offset);
+
+       raw3270_buffer_address(tp->view.dev, line->string + 1, 0, -2);
+       raw3270_buffer_address(tp->view.dev, line->string + 8, -9, -1);
 
        /* Allocate input string for reading. */
        tp->input = alloc_string(&tp->freemem, tp->view.cols * 2 - 9 + 6);
@@ -232,7 +229,7 @@ static void tty3270_create_status(struct tty3270 *tp)
        memcpy(line->string, blueprint, sizeof(blueprint));
        /* Set address to start of status string (= last 9 characters). */
        offset = tp->view.cols * tp->view.rows - 9;
-       raw3270_buffer_address(tp->view.dev, line->string + 1, offset);
+       raw3270_buffer_address(tp->view.dev, line->string + 1, -9, -1);
 }
 
 /*
@@ -243,12 +240,10 @@ static void tty3270_update_string(struct tty3270 *tp, struct string *line, int n
 {
        unsigned char *cp;
 
-       raw3270_buffer_address(tp->view.dev, line->string + 1,
-                              tp->view.cols * nr);
+       raw3270_buffer_address(tp->view.dev, line->string + 1, 0, nr);
        cp = line->string + line->len - 4;
        if (*cp == TO_RA)
-               raw3270_buffer_address(tp->view.dev, cp + 1,
-                                      tp->view.cols * (nr + 1));
+               raw3270_buffer_address(tp->view.dev, cp + 1, 0, nr + 1);
 }
 
 /*
index e2d703e..6f55a09 100644 (file)
@@ -113,8 +113,15 @@ static inline int raw3270_state_ready(struct raw3270 *rp)
        return rp->state == RAW3270_STATE_READY;
 }
 
-void raw3270_buffer_address(struct raw3270 *rp, char *cp, unsigned short addr)
+void raw3270_buffer_address(struct raw3270 *rp, char *cp, int x, int y)
 {
+       int addr;
+
+       if (x < 0)
+               x = max_t(int, 0, rp->view->cols + x);
+       if (y < 0)
+               y = max_t(int, 0, rp->view->rows + y);
+       addr = (y * rp->view->cols) + x;
        if (test_bit(RAW3270_FLAGS_14BITADDR, &rp->flags)) {
                cp[0] = (addr >> 8) & 0x3f;
                cp[1] = addr & 0xff;
index 05cd501..23efa6b 100644 (file)
@@ -132,7 +132,7 @@ raw3270_request_final(struct raw3270_request *rq)
        return list_empty(&rq->list);
 }
 
-void raw3270_buffer_address(struct raw3270 *, char *, unsigned short);
+void raw3270_buffer_address(struct raw3270 *, char *, int, int);
 
 /*
  * Functions of a 3270 view.