1 |
commit: 08c29eb875d5834e490a7005bb3404ff68215c41 |
2 |
Author: Alessandro Barbieri <lssndrbarbieri <AT> gmail <DOT> com> |
3 |
AuthorDate: Tue Jun 21 23:48:58 2022 +0000 |
4 |
Commit: Alessandro Barbieri <lssndrbarbieri <AT> gmail <DOT> com> |
5 |
CommitDate: Sun Jun 26 02:29:44 2022 +0000 |
6 |
URL: https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=08c29eb8 |
7 |
|
8 |
app-i18n/canfep: new package, add 1.0-r1 |
9 |
|
10 |
Signed-off-by: Alessandro Barbieri <lssndrbarbieri <AT> gmail.com> |
11 |
|
12 |
app-i18n/canfep/Manifest | 1 + |
13 |
app-i18n/canfep/canfep-1.0-r1.ebuild | 38 +++ |
14 |
.../canfep/files/canfep-1.0-respect-flags.patch | 24 ++ |
15 |
app-i18n/canfep/files/canfep-1.0-utf8.patch | 190 +++++++++++++++ |
16 |
app-i18n/canfep/files/canfep-posix-pty.patch | 67 ++++++ |
17 |
app-i18n/canfep/files/canfep-termcap.patch | 266 +++++++++++++++++++++ |
18 |
app-i18n/canfep/metadata.xml | 9 + |
19 |
7 files changed, 595 insertions(+) |
20 |
|
21 |
diff --git a/app-i18n/canfep/Manifest b/app-i18n/canfep/Manifest |
22 |
new file mode 100644 |
23 |
index 000000000..8b3ed0252 |
24 |
--- /dev/null |
25 |
+++ b/app-i18n/canfep/Manifest |
26 |
@@ -0,0 +1 @@ |
27 |
+DIST canfep-1.0.tar.gz 8067 BLAKE2B 1a6e8af357d2b7aaccf442b0f8bab577ed05a5a0fdf2fb4c189105c2c41f739c2e559e740584bf393fcc52d3f3bd0bb6216e06e2b685f62f7dded9d576e95bed SHA512 0fd7c8ca56282fa537b76fe33f46e03d4f0f4727528ccad95cd4726888372da9158fc8bed2cdc67d645defb479040cd4a4d0999f69d38fd8b4080f7ece4e67d6 |
28 |
|
29 |
diff --git a/app-i18n/canfep/canfep-1.0-r1.ebuild b/app-i18n/canfep/canfep-1.0-r1.ebuild |
30 |
new file mode 100644 |
31 |
index 000000000..5c5fdabb8 |
32 |
--- /dev/null |
33 |
+++ b/app-i18n/canfep/canfep-1.0-r1.ebuild |
34 |
@@ -0,0 +1,38 @@ |
35 |
+# Copyright 1999-2022 Gentoo Authors |
36 |
+# Distributed under the terms of the GNU General Public License v2 |
37 |
+ |
38 |
+EAPI=8 |
39 |
+ |
40 |
+inherit toolchain-funcs |
41 |
+ |
42 |
+DESCRIPTION="Canna Japanese kana-kanji frontend processor on console" |
43 |
+HOMEPAGE="https://web.archive.org/web/20170517105759/http://www.geocities.co.jp/SiliconValley-Bay/7584/canfep/" |
44 |
+SRC_URI="https://web.archive.org/web/20181106043248if_/http://www.geocities.co.jp/SiliconValley-Bay/7584/${PN}/${P}.tar.gz" |
45 |
+ |
46 |
+LICENSE="canfep" |
47 |
+SLOT="0" |
48 |
+KEYWORDS="~amd64" |
49 |
+ |
50 |
+RDEPEND=" |
51 |
+ app-i18n/canna |
52 |
+ sys-libs/ncurses:= |
53 |
+" |
54 |
+DEPEND="${RDEPEND}" |
55 |
+BDEPEND="virtual/pkgconfig" |
56 |
+ |
57 |
+PATCHES=( |
58 |
+ "${FILESDIR}/${P}-utf8.patch" |
59 |
+ "${FILESDIR}/${PN}-posix-pty.patch" |
60 |
+ "${FILESDIR}/${PN}-termcap.patch" |
61 |
+ "${FILESDIR}/${P}-respect-flags.patch" |
62 |
+) |
63 |
+ |
64 |
+src_compile() { |
65 |
+ tc-export CXX |
66 |
+ LIBS="$($(tc-getPKG_CONFIG) --libs ncurses)" emake |
67 |
+} |
68 |
+ |
69 |
+src_install() { |
70 |
+ dobin "${PN}" |
71 |
+ dodoc 00{changes,readme} |
72 |
+} |
73 |
|
74 |
diff --git a/app-i18n/canfep/files/canfep-1.0-respect-flags.patch b/app-i18n/canfep/files/canfep-1.0-respect-flags.patch |
75 |
new file mode 100644 |
76 |
index 000000000..4dbcbec77 |
77 |
--- /dev/null |
78 |
+++ b/app-i18n/canfep/files/canfep-1.0-respect-flags.patch |
79 |
@@ -0,0 +1,24 @@ |
80 |
+--- a/Makefile |
81 |
++++ b/Makefile |
82 |
+@@ -1,7 +1,5 @@ |
83 |
+ # Linux |
84 |
+-CC=c++ |
85 |
+-LIBS=-lcanna -ltermcap |
86 |
+-CFLAGS=-O2 -g |
87 |
++LIBS += -lcanna |
88 |
+ |
89 |
+ # Solaris 2.6J |
90 |
+ #CC=c++ |
91 |
+@@ -19,10 +17,10 @@ |
92 |
+ all: $(TARGET) |
93 |
+ |
94 |
+ $(TARGET): $(OBJS) |
95 |
+- $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) |
96 |
++ $(CXX) $(CXXFLAGS) $(LDFLAGS) -fPIE -o $@ $(OBJS) $(LIBS) |
97 |
+ |
98 |
+ .C.o: |
99 |
+- $(CC) $(CFLAGS) -c $< |
100 |
++ $(CXX) $(CXXFLAGS) -fPIC -c $< |
101 |
+ |
102 |
+ clean: |
103 |
+ rm -rf $(TARGET) $(OBJS) |
104 |
|
105 |
diff --git a/app-i18n/canfep/files/canfep-1.0-utf8.patch b/app-i18n/canfep/files/canfep-1.0-utf8.patch |
106 |
new file mode 100644 |
107 |
index 000000000..e798d109d |
108 |
--- /dev/null |
109 |
+++ b/app-i18n/canfep/files/canfep-1.0-utf8.patch |
110 |
@@ -0,0 +1,190 @@ |
111 |
+--- a/canna.C |
112 |
++++ b/canna.C |
113 |
+@@ -4,10 +4,87 @@ |
114 |
+ #define FEP_KEY 15 |
115 |
+ #define ESC_KEY 27 |
116 |
+ |
117 |
++void Canna::write_utf8(int fd, char *p, int len) |
118 |
++{ |
119 |
++ if (eucjp_to_utf8_cd == (iconv_t)-1) |
120 |
++ write(fd, p, strlen(p)); |
121 |
++ else |
122 |
++ { |
123 |
++ char *putf8 = iconv_string(eucjp_to_utf8_cd, p, len); |
124 |
++ write(fd, putf8, strlen(putf8)); |
125 |
++ free(putf8); |
126 |
++ } |
127 |
++} |
128 |
++ |
129 |
++char * Canna::iconv_string(iconv_t fd, char *str, int slen) |
130 |
++{ |
131 |
++ char *from; |
132 |
++ size_t fromlen; |
133 |
++ char *to; |
134 |
++ size_t tolen; |
135 |
++ size_t len = 0; |
136 |
++ size_t done = 0; |
137 |
++ char *result = NULL; |
138 |
++ char *p; |
139 |
++ int l; |
140 |
++ |
141 |
++ from = (char *)str; |
142 |
++ fromlen = slen; |
143 |
++ for (;;) |
144 |
++ { |
145 |
++ if (len == 0 || errno == E2BIG) |
146 |
++ { |
147 |
++ /* Allocate enough room for most conversions. When re-allocating |
148 |
++ * increase the buffer size. */ |
149 |
++ len = len + fromlen * 2 + 40; |
150 |
++ p = (char*)malloc((unsigned)len); |
151 |
++ if (p != NULL && done > 0) |
152 |
++ memcpy(p, result, done); |
153 |
++ free(result); |
154 |
++ result = p; |
155 |
++ if (result == NULL) /* out of memory */ |
156 |
++ break; |
157 |
++ } |
158 |
++ |
159 |
++ to = (char *)result + done; |
160 |
++ tolen = len - done - 2; |
161 |
++ /* Avoid a warning for systems with a wrong iconv() prototype by |
162 |
++ * casting the second argument to void *. */ |
163 |
++ if (iconv(fd, &from, &fromlen, &to, &tolen) != (size_t)-1) |
164 |
++ { |
165 |
++ /* Finished, append a NUL. */ |
166 |
++ *to = 0; |
167 |
++ break; |
168 |
++ } |
169 |
++ /* Check both ICONV_EILSEQ and EILSEQ, because the dynamically loaded |
170 |
++ * iconv library may use one of them. */ |
171 |
++ if (errno == EILSEQ || errno == EILSEQ) |
172 |
++ { |
173 |
++ /* Can't convert: insert a '?' and skip a character. This assumes |
174 |
++ * conversion from 'encoding' to something else. In other |
175 |
++ * situations we don't know what to skip anyway. */ |
176 |
++ *to++ = *from++; |
177 |
++ fromlen -= 1; |
178 |
++ } |
179 |
++ else if (errno != E2BIG) |
180 |
++ { |
181 |
++ /* conversion failed */ |
182 |
++ free(result); |
183 |
++ result = NULL; |
184 |
++ break; |
185 |
++ } |
186 |
++ /* Not enough room or skipping illegal sequence. */ |
187 |
++ done = to - (char *)result; |
188 |
++ } |
189 |
++ return result; |
190 |
++} |
191 |
++ |
192 |
+ // コンストラクタだよん |
193 |
+ Canna::Canna(int ac, char** av, char* amsg, char* emsg): |
194 |
+ Pty(ac, av, amsg, emsg) |
195 |
+ { |
196 |
++ char *p_lang = getenv("LANG"); |
197 |
++ |
198 |
+ // かんなの初期化 |
199 |
+ jrKanjiControl(0, KC_INITIALIZE, 0); |
200 |
+ jrKanjiControl(0, KC_SETAPPNAME, "canfep"); |
201 |
+@@ -15,6 +92,9 @@ |
202 |
+ jrKanjiControl(0, KC_QUERYMODE, (char*) saveMode); |
203 |
+ jrKanjiControl(0, KC_SETWIDTH, (char*) 72); |
204 |
+ |
205 |
++ if (p_lang == NULL || strstr(p_lang, "-8")) |
206 |
++ eucjp_to_utf8_cd = iconv_open("utf-8", "euc-jp"); |
207 |
++ |
208 |
+ mode(saveMode); |
209 |
+ } |
210 |
+ |
211 |
+@@ -25,6 +105,8 @@ |
212 |
+ jrKanjiControl(0, KC_KILL, (char*) &ksv); |
213 |
+ jrKanjiControl(0, KC_FINALIZE, 0); |
214 |
+ |
215 |
++ if (eucjp_to_utf8_cd != (iconv_t)-1) |
216 |
++ iconv_close(eucjp_to_utf8_cd); |
217 |
+ mode(saveMode); |
218 |
+ } |
219 |
+ |
220 |
+@@ -32,7 +114,7 @@ |
221 |
+ void |
222 |
+ Canna::kakutei(unsigned char* p) |
223 |
+ { |
224 |
+- write(wfd, p, strlen((char*) p)); |
225 |
++ write_utf8(wfd, (char*)p, strlen((char*) p)); |
226 |
+ } |
227 |
+ |
228 |
+ // 変換中(未確定)の文字列を出力する |
229 |
+@@ -42,13 +124,13 @@ |
230 |
+ write(rfd, sc, strlen(sc)); |
231 |
+ write(rfd, rc, strlen(rc)); |
232 |
+ write(rfd, us, strlen(us)); |
233 |
+- write(rfd, p, pos); |
234 |
++ write_utf8(rfd, (char*)p, pos); |
235 |
+ write(rfd, ue, strlen(ue)); |
236 |
+ write(rfd, so, strlen(so)); |
237 |
+- write(rfd, p + pos, len); |
238 |
++ write_utf8(rfd, (char*)p + pos, len); |
239 |
+ write(rfd, se, strlen(se)); |
240 |
+ write(rfd, us, strlen(us)); |
241 |
+- write(rfd, p + pos + len, strlen((char*) p + pos + len)); |
242 |
++ write_utf8(rfd, (char*)p + pos + len, strlen((char*) p + pos + len)); |
243 |
+ write(rfd, ue, strlen(ue)); |
244 |
+ } |
245 |
+ |
246 |
+@@ -73,7 +155,7 @@ |
247 |
+ write(rfd, sc, strlen(sc)); |
248 |
+ write(rfd, ts, strlen(ts)); |
249 |
+ write(rfd, ce, strlen(ce)); |
250 |
+- write(rfd, p, strlen((char*) p)); |
251 |
++ write_utf8(rfd, (char*)p, strlen((char*) p)); |
252 |
+ write(rfd, fs, strlen(fs)); |
253 |
+ } |
254 |
+ |
255 |
+@@ -84,13 +166,13 @@ |
256 |
+ write(rfd, sc, strlen(sc)); |
257 |
+ write(rfd, ts, strlen(ts)); |
258 |
+ write(rfd, ce, strlen(ce)); |
259 |
+- write(rfd, p, strlen((char*) p)); |
260 |
++ write_utf8(rfd, (char*)p, strlen((char*) p)); |
261 |
+ write(rfd, " ", 1); |
262 |
+- write(rfd, l, pos); |
263 |
++ write_utf8(rfd, (char*)l, pos); |
264 |
+ write(rfd, so, strlen(so)); |
265 |
+- write(rfd, l + pos, len); |
266 |
++ write_utf8(rfd, (char*)l + pos, len); |
267 |
+ write(rfd, se, strlen(se)); |
268 |
+- write(rfd, l + pos + len, strlen((char*) l + pos +len)); |
269 |
++ write_utf8(rfd, (char*)l + pos + len, strlen((char*) l + pos +len)); |
270 |
+ write(rfd, fs, strlen(fs)); |
271 |
+ } |
272 |
+ |
273 |
+--- a/canna.H |
274 |
++++ b/canna.H |
275 |
+@@ -5,6 +5,8 @@ |
276 |
+ #include <stdlib.h> |
277 |
+ #include <string.h> |
278 |
+ #include <unistd.h> |
279 |
++#include <errno.h> |
280 |
++#include <iconv.h> |
281 |
+ #include <canna/jrkanji.h> |
282 |
+ |
283 |
+ #include "pty.H" |
284 |
+@@ -17,6 +19,7 @@ |
285 |
+ jrKanjiStatus ks; |
286 |
+ jrKanjiStatusWithValue ksv; |
287 |
+ private: |
288 |
++ iconv_t eucjp_to_utf8_cd; |
289 |
+ unsigned char currentMode[BUFSIZ]; |
290 |
+ unsigned char saveMode[BUFSIZ]; |
291 |
+ private: |
292 |
+@@ -25,6 +28,8 @@ |
293 |
+ void delhenkan(int len); |
294 |
+ void mode(unsigned char* p); |
295 |
+ void gline(unsigned char* p, unsigned char* l, int pos, int len); |
296 |
++ void write_utf8(int fd, char *p, int len); |
297 |
++ char* iconv_string(iconv_t fd, char *str, int slen); |
298 |
+ public: |
299 |
+ void loop(); |
300 |
+ }; |
301 |
|
302 |
diff --git a/app-i18n/canfep/files/canfep-posix-pty.patch b/app-i18n/canfep/files/canfep-posix-pty.patch |
303 |
new file mode 100644 |
304 |
index 000000000..caa451232 |
305 |
--- /dev/null |
306 |
+++ b/app-i18n/canfep/files/canfep-posix-pty.patch |
307 |
@@ -0,0 +1,67 @@ |
308 |
+https://bugs.gentoo.org/show_bug.cgi?id=212709 |
309 |
+ |
310 |
+Author: OKUMURA N. Shin-ya <oku.ns@×××××.com> |
311 |
+ |
312 |
+--- a/pty.C |
313 |
++++ b/pty.C |
314 |
+@@ -257,6 +257,23 @@ |
315 |
+ } |
316 |
+ } |
317 |
+ |
318 |
++#if defined(_POSIX_C_SOURCE) |
319 |
++ // BSD pty が開けないので、POSIX の方法を試す |
320 |
++ if ((master = posix_openpt(O_RDWR)) >= 0) { |
321 |
++ if (grantpt(master) == 0 && unlockpt(master) == 0) { |
322 |
++ // マスタデバイス名は固定 |
323 |
++ strcpy(line, "/dev/ptmx"); |
324 |
++ tcgetattr(0, &tt); |
325 |
++ tt.c_iflag &= ~ISTRIP; |
326 |
++ ioctl(0, TIOCGWINSZ, (char*) &win); |
327 |
++ return; |
328 |
++ } |
329 |
++ close(master); |
330 |
++ } else { |
331 |
++ perror("/dev/ptmx"); |
332 |
++ } |
333 |
++#endif // _POSIX_C_SOURCE |
334 |
++ |
335 |
+ printf("Out of pty's\n"); |
336 |
+ fail(); |
337 |
+ } |
338 |
+@@ -265,12 +282,36 @@ |
339 |
+ void |
340 |
+ Pty::getslave() |
341 |
+ { |
342 |
++#if defined(_POSIX_C_SOURCE) |
343 |
++ // マスタデバイスが POSIX 方式の場合 |
344 |
++ if (strcmp(line, "/dev/ptmx") == 0) { |
345 |
++ char *slave_devname = ptsname(master); |
346 |
++ if (slave_devname == NULL) { |
347 |
++ perror("ptsname"); |
348 |
++ fail(); |
349 |
++ } |
350 |
++ slave = open(slave_devname, O_RDWR); |
351 |
++ if (slave < 0) { |
352 |
++ perror(slave_devname); |
353 |
++ fail(); |
354 |
++ } |
355 |
++ strcpy(line, slave_devname); |
356 |
++ } else { |
357 |
++ line[strlen("/dev/")] = 't'; |
358 |
++ slave = open(line, O_RDWR); |
359 |
++ if (slave < 0) { |
360 |
++ perror(line); |
361 |
++ fail(); |
362 |
++ } |
363 |
++ } |
364 |
++#else // ! _POSIX_C_SOURCE |
365 |
+ line[strlen("/dev/")] = 't'; |
366 |
+ slave = open(line, O_RDWR); |
367 |
+ if (slave < 0) { |
368 |
+ perror(line); |
369 |
+ fail(); |
370 |
+ } |
371 |
++#endif // _POSIX_C_SOURCE |
372 |
+ tcsetattr(slave, TCSAFLUSH, &tt); |
373 |
+ if (!hs) |
374 |
+ win.ws_row--; |
375 |
|
376 |
diff --git a/app-i18n/canfep/files/canfep-termcap.patch b/app-i18n/canfep/files/canfep-termcap.patch |
377 |
new file mode 100644 |
378 |
index 000000000..afd215b07 |
379 |
--- /dev/null |
380 |
+++ b/app-i18n/canfep/files/canfep-termcap.patch |
381 |
@@ -0,0 +1,266 @@ |
382 |
+--- a/pty.C |
383 |
++++ b/pty.C |
384 |
+@@ -4,9 +4,18 @@ |
385 |
+ int Pty::child = 0; |
386 |
+ struct termios Pty::tt; |
387 |
+ int Pty::wfd = 0; |
388 |
++char Pty::buf[] = ""; |
389 |
++char Pty::funcstr[] = ""; |
390 |
+ int Pty::hs = 0; |
391 |
++char* Pty::so = 0; |
392 |
++char* Pty::se = 0; |
393 |
++char* Pty::us = 0; |
394 |
++char* Pty::ue = 0; |
395 |
++char* Pty::sc = 0; |
396 |
++char* Pty::rc = 0; |
397 |
+ char* Pty::ce = 0; |
398 |
+ char* Pty::ts = 0; |
399 |
++char* Pty::fs = 0; |
400 |
+ char* Pty::ds = 0; |
401 |
+ char Pty::endstr[] = ""; |
402 |
+ char Pty::endmsg[] = ""; |
403 |
+@@ -14,88 +23,7 @@ |
404 |
+ // コンストラクタだよん |
405 |
+ Pty::Pty(int ac, char** av, char* amsg, char* emsg) |
406 |
+ { |
407 |
+- // 環境変数 TERM のエントリを取得 |
408 |
+- char buff[BUFSIZ]; |
409 |
+- char* term = getenv("TERM"); |
410 |
+- if (!term) |
411 |
+- term = "vt100"; |
412 |
+- int ret = tgetent(buff, term); |
413 |
+- if (ret != 1) { |
414 |
+- tgetent(buff, "vt100"); |
415 |
+- putenv("TERM=vt100"); |
416 |
+- } |
417 |
+- |
418 |
+- // termcap から装飾用のエントリを取ってくる |
419 |
+- char funcstr[BUFSIZ]; |
420 |
+- char* pt = funcstr; |
421 |
+- |
422 |
+- // スタンドアウト (反転) |
423 |
+- so = tgetstr("so", &pt); |
424 |
+- adjstr(so); |
425 |
+- se = tgetstr("se", &pt); |
426 |
+- adjstr(se); |
427 |
+- |
428 |
+- // アンダーライン (下線) |
429 |
+- us = tgetstr("us", &pt); |
430 |
+- adjstr(us); |
431 |
+- ue = tgetstr("ue", &pt); |
432 |
+- adjstr(ue); |
433 |
+- |
434 |
+- // カーソル位置の保存,保存した位置への復帰 |
435 |
+- sc = tgetstr("sc", &pt); |
436 |
+- adjstr(sc); |
437 |
+- rc = tgetstr("rc", &pt); |
438 |
+- adjstr(rc); |
439 |
+- |
440 |
+- // カーソル位置から行の最後までを削除する |
441 |
+- ce = tgetstr("ce", &pt); |
442 |
+- adjstr(ce); |
443 |
+- |
444 |
+- // ステータスラインを持っているかどうか |
445 |
+- hs = tgetflag("hs"); |
446 |
+- |
447 |
+- // kon と jfbterm ではステータスラインを使わない |
448 |
+- if (strcmp(term, "kon") == 0) |
449 |
+- hs = 0; |
450 |
+- if (strcmp(term, "jfbterm") == 0) |
451 |
+- hs = 0; |
452 |
+- |
453 |
+- // ステータスラインへ移動,戻る |
454 |
+- if (hs) { |
455 |
+- ts = tgoto(tgetstr("ts", &pt), 0, 0); |
456 |
+- adjstr(ts); |
457 |
+- fs = tgetstr("fs", &pt); |
458 |
+- adjstr(fs); |
459 |
+- ds = tgetstr("ds", &pt); |
460 |
+- adjstr(ds); |
461 |
+- if (ds) { |
462 |
+- strcat(endstr, ds); |
463 |
+- strcat(endstr, ce); |
464 |
+- } |
465 |
+- } |
466 |
+- else { |
467 |
+- char* cs = tgoto(tgetstr("cs", &pt), tgetnum("li") - 2, 0); |
468 |
+- adjstr(cs); |
469 |
+- if (cs) { |
470 |
+- write(1, ce, strlen(ce)); |
471 |
+- write(1, cs, strlen(cs)); |
472 |
+- } |
473 |
+- char* cl = tgetstr("cl", &pt); |
474 |
+- adjstr(cl); |
475 |
+- if (cl) { |
476 |
+- write(1, cl, strlen(cl)); |
477 |
+- strcat(endstr, cl); |
478 |
+- } |
479 |
+- ds = tgoto(tgetstr("cs", &pt), tgetnum("li") - 1, 0); |
480 |
+- adjstr(ds); |
481 |
+- if (ds) { |
482 |
+- strcat(endstr, ds); |
483 |
+- strcat(endstr, ce); |
484 |
+- } |
485 |
+- ts = tgoto(tgetstr("cm", &pt), 0, tgetnum("li") - 1); |
486 |
+- adjstr(ts); |
487 |
+- fs = rc; |
488 |
+- } |
489 |
++ gettermcap(); |
490 |
+ |
491 |
+ // 開始と終了のメッセージ |
492 |
+ if (amsg && ac == 1) |
493 |
+@@ -209,21 +137,75 @@ |
494 |
+ done(); |
495 |
+ } |
496 |
+ |
497 |
+-// termcap エントリからパディングを削除する |
498 |
+ void |
499 |
+-Pty::adjstr(char* str) |
500 |
++Pty::gettermcap() |
501 |
+ { |
502 |
+- char* sp = strdup(str); |
503 |
+- char* p = sp; |
504 |
+- while (*p != '\0') { |
505 |
+- if (strncmp(p, "$<", 2) == 0) { |
506 |
+- while (*p != '>') |
507 |
+- p++; |
508 |
+- *p = '\0'; |
509 |
++ // 環境変数 TERM のエントリを取得 |
510 |
++ char* term = getenv("TERM"); |
511 |
++ if (!term) |
512 |
++ term = "vt100"; |
513 |
++ int ret = tgetent(buf, term); |
514 |
++ if (ret != 1) { |
515 |
++ tgetent(buf, "vt100"); |
516 |
++ putenv("TERM=vt100"); |
517 |
++ } |
518 |
++ |
519 |
++ // termcap から装飾用のエントリを取ってくる |
520 |
++ char* pt = funcstr; |
521 |
++ |
522 |
++ // スタンドアウト (反転) |
523 |
++ so = tgetstr("so", &pt); |
524 |
++ se = tgetstr("se", &pt); |
525 |
++ |
526 |
++ // アンダーライン (下線) |
527 |
++ us = tgetstr("us", &pt); |
528 |
++ ue = tgetstr("ue", &pt); |
529 |
++ |
530 |
++ // カーソル位置の保存,保存した位置への復帰 |
531 |
++ sc = tgetstr("sc", &pt); |
532 |
++ rc = tgetstr("rc", &pt); |
533 |
++ |
534 |
++ // カーソル位置から行の最後までを削除する |
535 |
++ ce = tgetstr("ce", &pt); |
536 |
++ |
537 |
++ // ステータスラインを持っているかどうか |
538 |
++ hs = tgetflag("hs"); |
539 |
++ |
540 |
++ // kon と jfbterm ではステータスラインを使わない |
541 |
++ if (strcmp(term, "kon") == 0) |
542 |
++ hs = 0; |
543 |
++ if (strcmp(term, "jfbterm") == 0) |
544 |
++ hs = 0; |
545 |
++ |
546 |
++ // ステータスラインへ移動,戻る |
547 |
++ if (hs) { |
548 |
++ ts = tgoto(tgetstr("ts", &pt), 0, 0); |
549 |
++ fs = tgetstr("fs", &pt); |
550 |
++ ds = tgetstr("ds", &pt); |
551 |
++ if (ds) { |
552 |
++ strcat(endstr, ds); |
553 |
++ strcat(endstr, ce); |
554 |
+ } |
555 |
+- *str++ = *p++; |
556 |
+ } |
557 |
+- free(sp); |
558 |
++ else { |
559 |
++ char* cs = tgoto(tgetstr("cs", &pt), tgetnum("li") - 2, 0); |
560 |
++ if (cs) { |
561 |
++ write(1, ce, strlen(ce)); |
562 |
++ write(1, cs, strlen(cs)); |
563 |
++ } |
564 |
++ char* cl = tgetstr("cl", &pt); |
565 |
++ if (cl) { |
566 |
++ write(1, cl, strlen(cl)); |
567 |
++ strcat(endstr, cl); |
568 |
++ } |
569 |
++ ds = tgoto(tgetstr("cs", &pt), tgetnum("li") - 1, 0); |
570 |
++ if (ds) { |
571 |
++ strcat(endstr, ds); |
572 |
++ strcat(endstr, ce); |
573 |
++ } |
574 |
++ ts = tgoto(tgetstr("cm", &pt), 0, tgetnum("li") - 1); |
575 |
++ fs = rc; |
576 |
++ } |
577 |
+ } |
578 |
+ |
579 |
+ // マスタデバイスを取る |
580 |
+@@ -327,34 +309,7 @@ |
581 |
+ { |
582 |
+ signal(SIGWINCH, SIG_IGN); |
583 |
+ |
584 |
+- // ステータスラインが使えない場合は cs/ds/ts を取り直す |
585 |
+- if (!hs) { |
586 |
+- char buff[BUFSIZ]; |
587 |
+- char* term = getenv("TERM"); |
588 |
+- tgetent(buff, term); |
589 |
+- char funcstr[BUFSIZ]; |
590 |
+- char* pt = funcstr; |
591 |
+- char* cs = tgoto(tgetstr("cs", &pt), tgetnum("li") - 2, 0); |
592 |
+- adjstr(cs); |
593 |
+- if (cs) { |
594 |
+- write(1, ce, strlen(ce)); |
595 |
+- write(1, cs, strlen(cs)); |
596 |
+- } |
597 |
+- char* cl = tgetstr("cl", &pt); |
598 |
+- adjstr(cl); |
599 |
+- if (cl) { |
600 |
+- write(1, cl, strlen(cl)); |
601 |
+- strcpy(endstr, cl); |
602 |
+- } |
603 |
+- ds = tgoto(tgetstr("cs", &pt), tgetnum("li") - 1, 0); |
604 |
+- adjstr(ds); |
605 |
+- if (ds) { |
606 |
+- strcat(endstr, ds); |
607 |
+- strcat(endstr, ce); |
608 |
+- } |
609 |
+- ts = tgoto(tgetstr("cm", &pt), 0, tgetnum("li") - 1); |
610 |
+- adjstr(ts); |
611 |
+- } |
612 |
++ gettermcap(); |
613 |
+ |
614 |
+ // ウィンドウのサイズを設定し直す (stty -a の 行数/桁数 等) |
615 |
+ struct winsize win; |
616 |
+--- a/pty.H |
617 |
++++ b/pty.H |
618 |
+@@ -50,18 +50,21 @@ |
619 |
+ int rfd; |
620 |
+ static int wfd; |
621 |
+ private: |
622 |
+- static void adjstr(char* str); |
623 |
++ static char buf[BUFSIZ]; |
624 |
++ static char funcstr[BUFSIZ]; |
625 |
++private: |
626 |
++ static void gettermcap(); |
627 |
+ protected: |
628 |
+ static int hs; |
629 |
+- char* so; |
630 |
+- char* se; |
631 |
+- char* us; |
632 |
+- char* ue; |
633 |
+- char* sc; |
634 |
+- char* rc; |
635 |
++ static char* so; |
636 |
++ static char* se; |
637 |
++ static char* us; |
638 |
++ static char* ue; |
639 |
++ static char* sc; |
640 |
++ static char* rc; |
641 |
+ static char* ce; |
642 |
+ static char* ts; |
643 |
+- char* fs; |
644 |
++ static char* fs; |
645 |
+ static char* ds; |
646 |
+ private: |
647 |
+ static void finish(); |
648 |
|
649 |
diff --git a/app-i18n/canfep/metadata.xml b/app-i18n/canfep/metadata.xml |
650 |
new file mode 100644 |
651 |
index 000000000..37185a78f |
652 |
--- /dev/null |
653 |
+++ b/app-i18n/canfep/metadata.xml |
654 |
@@ -0,0 +1,9 @@ |
655 |
+<?xml version="1.0" encoding="UTF-8"?> |
656 |
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> |
657 |
+<pkgmetadata> |
658 |
+ <maintainer type="person"> |
659 |
+ <description>co-maintainers welcome</description> |
660 |
+ <name>Alessandro Barbieri</name> |
661 |
+ <email>lssndrbarbieri@×××××.com</email> |
662 |
+ </maintainer> |
663 |
+</pkgmetadata> |