summaryrefslogtreecommitdiff
path: root/core/procps/procps-3.2.7-watch-unicode.patch
blob: 1b3d97488d9a64a4c0cdf08102cd56e0c0f61826 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
diff -u procps-3.2.7/Makefile procps/Makefile
--- procps-3.2.7/Makefile	2007-01-16 17:24:49.000000000 +0100
+++ procps/Makefile	2007-01-16 17:29:27.000000000 +0100
@@ -67,7 +67,7 @@
 # plus the top-level Makefile to make it work stand-alone.
 _TARFILES := Makefile
 
-CURSES := -lncurses
+CURSES := -lncursesw
 
 # This seems about right for the dynamic library stuff.
 # Something like this is probably needed to make the SE Linux
diff -u procps-3.2.7/watch.c procps/watch.c
--- procps-3.2.7/watch.c	2007-01-16 17:24:49.000000000 +0100
+++ procps/watch.c	2007-01-16 18:06:57.000000000 +0100
@@ -28,6 +28,8 @@
 #include <termios.h>
 #include <locale.h>
 #include "proc/procps.h"
+#include <wchar.h>
+#include <wctype.h>
 
 #ifdef FORCE_8BIT
 #undef isprint
@@ -137,6 +139,27 @@
 	}
 }
 
+static wint_t
+readwc(FILE *stream, mbstate_t *mbs)
+{
+	for (;;) {
+		int chr;
+		char c;
+		wchar_t wc;
+		size_t len;
+
+		chr = getc(stream);
+		if (chr == EOF)
+			return WEOF;
+		c = chr;
+		len = mbrtowc(&wc, &c, 1, mbs);
+		if (len == (size_t)-1)
+			memset(mbs, 0, sizeof(*mbs));
+		else if (len != (size_t)-2)
+			return wc;
+	}
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -243,6 +266,7 @@
 		FILE *p;
 		int x, y;
 		int oldeolseen = 1;
+		mbstate_t mbs;
 
 		if (screen_size_changed) {
 			get_terminal_size();
@@ -276,49 +300,63 @@
 			do_exit(2);
 		}
 
+		memset(&mbs, 0, sizeof(mbs));
 		for (y = show_title; y < height; y++) {
 			int eolseen = 0, tabpending = 0;
 			for (x = 0; x < width; x++) {
-				int c = ' ';
-				int attr = 0;
+				wint_t c = L' ';
+				int attr = 0, c_width;
+				cchar_t cc;
+				wchar_t wstr[2];
 
 				if (!eolseen) {
 					/* if there is a tab pending, just spit spaces until the
 					   next stop instead of reading characters */
 					if (!tabpending)
 						do
-							c = getc(p);
-						while (c != EOF && !isprint(c)
-						       && c != '\n'
-						       && c != '\t');
-					if (c == '\n')
+							c = readwc(p, &mbs);
+						while (c != WEOF && !iswprint(c)
+						       && c != L'\n'
+						       && c != L'\t');
+					if (c == L'\n')
 						if (!oldeolseen && x == 0) {
 							x = -1;
 							continue;
 						} else
 							eolseen = 1;
-					else if (c == '\t')
+					else if (c == L'\t')
 						tabpending = 1;
-					if (c == EOF || c == '\n' || c == '\t')
-						c = ' ';
+					if (c == WEOF || c == L'\n' || c == L'\t')
+						c = L' ';
 					if (tabpending && (((x + 1) % 8) == 0))
 						tabpending = 0;
 				}
+				wstr[0] = c;
+				wstr[1] = 0;
+				setcchar (&cc, wstr, 0, 0, NULL);
 				move(y, x);
 				if (option_differences) {
-					chtype oldch = inch();
-					char oldc = oldch & A_CHARTEXT;
+					cchar_t oldc;
+					wchar_t oldwstr[2];
+					attr_t attrs;
+					short colors;
+
+					in_wch(&oldc);
+					getcchar(&oldc, oldwstr, &attrs, &colors, NULL);
 					attr = !first_screen
-					    && ((char)c != oldc
+					    && (wstr[0] != oldwstr[0]
 						||
 						(option_differences_cumulative
-						 && (oldch & A_ATTRIBUTES)));
+						 && attrs));
 				}
 				if (attr)
 					standout();
-				addch(c);
+				add_wch(&cc);
 				if (attr)
 					standend();
+				c_width = wcwidth(c);
+				if (c_width > 1)
+					x += c_width - 1;
 			}
 			oldeolseen = eolseen;
 		}