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;
}
|