[dev] [st] [PATCH] Refactor selsnap SNAP_WORD.

From: Colona <colona_AT_ycc.fr>
Date: Thu, 5 Jun 2014 06:32:01 +0200

Refactor the SNAP_WORD part in selsnap, and fix a bug that caused the word
delimiters to be ignored if it was at the very beginning or end of a wrapped
line.
---
 st.c | 40 +++++++++++++++++-----------------------
 1 file changed, 17 insertions(+), 23 deletions(-)
diff --git a/st.c b/st.c
index e0c64e3..a74186e 100644
--- a/st.c
+++ b/st.c
_AT_@ -703,6 +703,9 @@ selected(int x, int y) {
 
 void
 selsnap(int mode, int *x, int *y, int direction) {
+	int newx, newy;
+	Glyph* gp;
+
 	switch(mode) {
 	case SNAP_WORD:
 		/*
_AT_@ -710,36 +713,27 @@ selsnap(int mode, int *x, int *y, int direction) {
 		 * beginning of a line.
 		 */
 		for(;;) {
-			if(direction < 0 && *x <= 0) {
-				if(*y > 0 && term.line[*y - 1][term.col-1].mode
-						& ATTR_WRAP) {
-					*y -= 1;
-					*x = term.col-1;
-				} else {
+			newx = *x + direction;
+			newy = *y;
+			if(!BETWEEN(newx, 0, term.col - 1)) {
+				newy += direction;
+				newx = (newx + term.col) % (term.col);
+				if (!BETWEEN(newy, 0, term.row - 1))
 					break;
-				}
-			}
-			if(direction > 0 && *x >= term.col-1) {
-				if(*y < term.row-1 && term.line[*y][*x].mode
-						& ATTR_WRAP) {
-					*y += 1;
-					*x = 0;
-				} else {
+				if (!(term.line[direction > 0 ? *y : newy]
+							   [direction > 0 ? *x : newx].mode & ATTR_WRAP))
 					break;
-				}
 			}
 
-			if(term.line[*y][*x+direction].mode & ATTR_WDUMMY) {
-				*x += direction;
-				continue;
-			}
+			if (newx >= tlinelen(newy))
+				break;
 
-			if(*x >= tlinelen(*y) || strchr(worddelimiters,
-					term.line[*y][*x+direction].c[0])) {
+			gp = &term.line[newy][newx];
+			if (!(gp->mode & ATTR_WDUMMY) && strchr(worddelimiters, gp->c[0]))
 				break;
-			}
 
-			*x += direction;
+			*x = newx;
+			*y = newy;
 		}
 		break;
 	case SNAP_LINE:
-- 
2.0.0
-- 
Ivan "Colona" Delalande
Received on Thu Jun 05 2014 - 06:32:01 CEST

This archive was generated by hypermail 2.3.0 : Thu Jun 05 2014 - 06:36:08 CEST