diff options
Diffstat (limited to 'st.c.rej')
-rw-r--r-- | st.c.rej | 121 |
1 files changed, 0 insertions, 121 deletions
diff --git a/st.c.rej b/st.c.rej deleted file mode 100644 index ca81ac7..0000000 --- a/st.c.rej +++ /dev/null @@ -1,121 +0,0 @@ ---- st.c -+++ st.c -@@ -152,6 +152,11 @@ typedef struct { - int narg; /* nb of args */ - } STREscape; - -+typedef struct { -+ int state; -+ size_t length; -+} URLdfa; -+ - static void execsh(char *, char **); - static void stty(char **); - static void sigchld(int); -@@ -201,6 +206,7 @@ static void tdefutf8(char); - static int32_t tdefcolor(const int *, int *, int); - static void tdeftran(char); - static void tstrsequence(uchar); -+static int daddch(URLdfa *, char); - - static void drawregion(int, int, int, int); - -@@ -2666,3 +2672,98 @@ redraw(void) - tfulldirt(); - draw(); - } -+ -+int -+daddch(URLdfa *dfa, char c) -+{ -+ /* () and [] can appear in urls, but excluding them here will reduce false -+ * positives when figuring out where a given url ends. -+ */ -+ static const char URLCHARS[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" -+ "abcdefghijklmnopqrstuvwxyz" -+ "0123456789-._~:/?#@!$&'*+,;=%"; -+ static const char RPFX[] = "//:sptth"; -+ -+ if (!strchr(URLCHARS, c)) { -+ dfa->length = 0; -+ dfa->state = 0; -+ -+ return 0; -+ } -+ -+ dfa->length++; -+ -+ if (dfa->state == 2 && c == '/') { -+ dfa->state = 0; -+ } else if (dfa->state == 3 && c == 'p') { -+ dfa->state++; -+ } else if (c != RPFX[dfa->state]) { -+ dfa->state = 0; -+ return 0; -+ } -+ -+ if (dfa->state++ == 7) { -+ dfa->state = 0; -+ return 1; -+ } -+ -+ return 0; -+} -+ -+/* -+** Select and copy the previous url on screen (do nothing if there's no url). -+*/ -+void -+copyurl(const Arg *arg) { -+ int row = 0, /* row of current URL */ -+ col = 0, /* column of current URL start */ -+ colend = 0, /* column of last occurrence */ -+ passes = 0; /* how many rows have been scanned */ -+ -+ const char *c = NULL, -+ *match = NULL; -+ URLdfa dfa = { 0 }; -+ -+ row = (sel.ob.x >= 0 && sel.nb.y > 0) ? sel.nb.y : term.bot; -+ LIMIT(row, term.top, term.bot); -+ -+ colend = (sel.ob.x >= 0 && sel.nb.y > 0) ? sel.nb.x : term.col; -+ LIMIT(colend, 0, term.col); -+ -+ /* -+ ** Scan from (term.row - 1,term.col - 1) to (0,0) and find -+ ** next occurrance of a URL -+ */ -+ for (passes = 0; passes < term.row; passes++) { -+ /* Read in each column of every row until -+ ** we hit previous occurrence of URL -+ */ -+ for (col = colend; col--;) -+ if (daddch(&dfa, term.line[row][col].u < 128 ? term.line[row][col].u : ' ')) -+ break; -+ -+ if (col >= 0) -+ break; -+ -+ /* .i = 0 --> botton-up -+ * .i = 1 --> top-down -+ */ -+ if (!arg->i) { -+ if (--row < 0) -+ row = term.row - 1; -+ } else { -+ if (++row >= term.row) -+ row = 0; -+ } -+ -+ colend = term.col; -+ } -+ -+ if (passes < term.row) { -+ selstart(col, row, 0); -+ selextend((col + dfa.length - 1) % term.col, row + (col + dfa.length - 1) / term.col, SEL_REGULAR, 0); -+ selextend((col + dfa.length - 1) % term.col, row + (col + dfa.length - 1) / term.col, SEL_REGULAR, 1); -+ xsetsel(getsel()); -+ xclipcopy(); -+ } -+} |