From: Akinori Hattori Date: Sun, 23 Jul 2017 13:14:32 +0000 (+0900) Subject: app-i18n/canfep: fix termcap handling X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=8634bf43cedc22d1e46b67f20b6d81c376c1fbdf;p=gentoo.git app-i18n/canfep: fix termcap handling Package-Manager: Portage-2.3.6, Repoman-2.3.1 --- diff --git a/app-i18n/canfep/canfep-1.0-r1.ebuild b/app-i18n/canfep/canfep-1.0-r1.ebuild index 9d542a197161..d46bf3258374 100644 --- a/app-i18n/canfep/canfep-1.0-r1.ebuild +++ b/app-i18n/canfep/canfep-1.0-r1.ebuild @@ -20,7 +20,10 @@ RDEPEND="app-i18n/canna DEPEND="${RDEPEND} virtual/pkgconfig" -PATCHES=( "${FILESDIR}"/${PN}-posix-pty.patch ) +PATCHES=( + "${FILESDIR}"/${PN}-posix-pty.patch + "${FILESDIR}"/${PN}-termcap.patch +) src_prepare() { use unicode && eapply "${DISTDIR}"/${PN}_utf8.diff diff --git a/app-i18n/canfep/files/canfep-termcap.patch b/app-i18n/canfep/files/canfep-termcap.patch new file mode 100644 index 000000000000..afd215b07e79 --- /dev/null +++ b/app-i18n/canfep/files/canfep-termcap.patch @@ -0,0 +1,266 @@ +--- a/pty.C ++++ b/pty.C +@@ -4,9 +4,18 @@ + int Pty::child = 0; + struct termios Pty::tt; + int Pty::wfd = 0; ++char Pty::buf[] = ""; ++char Pty::funcstr[] = ""; + int Pty::hs = 0; ++char* Pty::so = 0; ++char* Pty::se = 0; ++char* Pty::us = 0; ++char* Pty::ue = 0; ++char* Pty::sc = 0; ++char* Pty::rc = 0; + char* Pty::ce = 0; + char* Pty::ts = 0; ++char* Pty::fs = 0; + char* Pty::ds = 0; + char Pty::endstr[] = ""; + char Pty::endmsg[] = ""; +@@ -14,88 +23,7 @@ + // ¥³¥ó¥¹¥È¥é¥¯¥¿¤À¤è¤ó + Pty::Pty(int ac, char** av, char* amsg, char* emsg) + { +- // ´Ä¶­ÊÑ¿ô TERM ¤Î¥¨¥ó¥È¥ê¤ò¼èÆÀ +- char buff[BUFSIZ]; +- char* term = getenv("TERM"); +- if (!term) +- term = "vt100"; +- int ret = tgetent(buff, term); +- if (ret != 1) { +- tgetent(buff, "vt100"); +- putenv("TERM=vt100"); +- } +- +- // termcap ¤«¤éÁõ¾þÍѤΥ¨¥ó¥È¥ê¤ò¼è¤Ã¤Æ¤¯¤ë +- char funcstr[BUFSIZ]; +- char* pt = funcstr; +- +- // ¥¹¥¿¥ó¥É¥¢¥¦¥È (ȿž) +- so = tgetstr("so", &pt); +- adjstr(so); +- se = tgetstr("se", &pt); +- adjstr(se); +- +- // ¥¢¥ó¥À¡¼¥é¥¤¥ó (²¼Àþ) +- us = tgetstr("us", &pt); +- adjstr(us); +- ue = tgetstr("ue", &pt); +- adjstr(ue); +- +- // ¥«¡¼¥½¥ë°ÌÃÖ¤ÎÊݸ¡¤Êݸ¤·¤¿°ÌÃ֤ؤÎÉüµ¢ +- sc = tgetstr("sc", &pt); +- adjstr(sc); +- rc = tgetstr("rc", &pt); +- adjstr(rc); +- +- // ¥«¡¼¥½¥ë°ÌÃÖ¤«¤é¹Ô¤ÎºÇ¸å¤Þ¤Ç¤òºï½ü¤¹¤ë +- ce = tgetstr("ce", &pt); +- adjstr(ce); +- +- // ¥¹¥Æ¡¼¥¿¥¹¥é¥¤¥ó¤ò»ý¤Ã¤Æ¤¤¤ë¤«¤É¤¦¤« +- hs = tgetflag("hs"); +- +- // kon ¤È jfbterm ¤Ç¤Ï¥¹¥Æ¡¼¥¿¥¹¥é¥¤¥ó¤ò»È¤ï¤Ê¤¤ +- if (strcmp(term, "kon") == 0) +- hs = 0; +- if (strcmp(term, "jfbterm") == 0) +- hs = 0; +- +- // ¥¹¥Æ¡¼¥¿¥¹¥é¥¤¥ó¤Ø°Üư¡¤Ìá¤ë +- if (hs) { +- ts = tgoto(tgetstr("ts", &pt), 0, 0); +- adjstr(ts); +- fs = tgetstr("fs", &pt); +- adjstr(fs); +- ds = tgetstr("ds", &pt); +- adjstr(ds); +- if (ds) { +- strcat(endstr, ds); +- strcat(endstr, ce); +- } +- } +- else { +- char* cs = tgoto(tgetstr("cs", &pt), tgetnum("li") - 2, 0); +- adjstr(cs); +- if (cs) { +- write(1, ce, strlen(ce)); +- write(1, cs, strlen(cs)); +- } +- char* cl = tgetstr("cl", &pt); +- adjstr(cl); +- if (cl) { +- write(1, cl, strlen(cl)); +- strcat(endstr, cl); +- } +- ds = tgoto(tgetstr("cs", &pt), tgetnum("li") - 1, 0); +- adjstr(ds); +- if (ds) { +- strcat(endstr, ds); +- strcat(endstr, ce); +- } +- ts = tgoto(tgetstr("cm", &pt), 0, tgetnum("li") - 1); +- adjstr(ts); +- fs = rc; +- } ++ gettermcap(); + + // ³«»Ï¤È½ªÎ»¤Î¥á¥Ã¥»¡¼¥¸ + if (amsg && ac == 1) +@@ -209,21 +137,75 @@ + done(); + } + +-// termcap ¥¨¥ó¥È¥ê¤«¤é¥Ñ¥Ç¥£¥ó¥°¤òºï½ü¤¹¤ë + void +-Pty::adjstr(char* str) ++Pty::gettermcap() + { +- char* sp = strdup(str); +- char* p = sp; +- while (*p != '\0') { +- if (strncmp(p, "$<", 2) == 0) { +- while (*p != '>') +- p++; +- *p = '\0'; ++ // ´Ä¶­ÊÑ¿ô TERM ¤Î¥¨¥ó¥È¥ê¤ò¼èÆÀ ++ char* term = getenv("TERM"); ++ if (!term) ++ term = "vt100"; ++ int ret = tgetent(buf, term); ++ if (ret != 1) { ++ tgetent(buf, "vt100"); ++ putenv("TERM=vt100"); ++ } ++ ++ // termcap ¤«¤éÁõ¾þÍѤΥ¨¥ó¥È¥ê¤ò¼è¤Ã¤Æ¤¯¤ë ++ char* pt = funcstr; ++ ++ // ¥¹¥¿¥ó¥É¥¢¥¦¥È (ȿž) ++ so = tgetstr("so", &pt); ++ se = tgetstr("se", &pt); ++ ++ // ¥¢¥ó¥À¡¼¥é¥¤¥ó (²¼Àþ) ++ us = tgetstr("us", &pt); ++ ue = tgetstr("ue", &pt); ++ ++ // ¥«¡¼¥½¥ë°ÌÃÖ¤ÎÊݸ¡¤Êݸ¤·¤¿°ÌÃ֤ؤÎÉüµ¢ ++ sc = tgetstr("sc", &pt); ++ rc = tgetstr("rc", &pt); ++ ++ // ¥«¡¼¥½¥ë°ÌÃÖ¤«¤é¹Ô¤ÎºÇ¸å¤Þ¤Ç¤òºï½ü¤¹¤ë ++ ce = tgetstr("ce", &pt); ++ ++ // ¥¹¥Æ¡¼¥¿¥¹¥é¥¤¥ó¤ò»ý¤Ã¤Æ¤¤¤ë¤«¤É¤¦¤« ++ hs = tgetflag("hs"); ++ ++ // kon ¤È jfbterm ¤Ç¤Ï¥¹¥Æ¡¼¥¿¥¹¥é¥¤¥ó¤ò»È¤ï¤Ê¤¤ ++ if (strcmp(term, "kon") == 0) ++ hs = 0; ++ if (strcmp(term, "jfbterm") == 0) ++ hs = 0; ++ ++ // ¥¹¥Æ¡¼¥¿¥¹¥é¥¤¥ó¤Ø°Üư¡¤Ìá¤ë ++ if (hs) { ++ ts = tgoto(tgetstr("ts", &pt), 0, 0); ++ fs = tgetstr("fs", &pt); ++ ds = tgetstr("ds", &pt); ++ if (ds) { ++ strcat(endstr, ds); ++ strcat(endstr, ce); + } +- *str++ = *p++; + } +- free(sp); ++ else { ++ char* cs = tgoto(tgetstr("cs", &pt), tgetnum("li") - 2, 0); ++ if (cs) { ++ write(1, ce, strlen(ce)); ++ write(1, cs, strlen(cs)); ++ } ++ char* cl = tgetstr("cl", &pt); ++ if (cl) { ++ write(1, cl, strlen(cl)); ++ strcat(endstr, cl); ++ } ++ ds = tgoto(tgetstr("cs", &pt), tgetnum("li") - 1, 0); ++ if (ds) { ++ strcat(endstr, ds); ++ strcat(endstr, ce); ++ } ++ ts = tgoto(tgetstr("cm", &pt), 0, tgetnum("li") - 1); ++ fs = rc; ++ } + } + + // ¥Þ¥¹¥¿¥Ç¥Ð¥¤¥¹¤ò¼è¤ë +@@ -327,34 +309,7 @@ + { + signal(SIGWINCH, SIG_IGN); + +- // ¥¹¥Æ¡¼¥¿¥¹¥é¥¤¥ó¤¬»È¤¨¤Ê¤¤¾ì¹ç¤Ï cs/ds/ts ¤ò¼è¤êľ¤¹ +- if (!hs) { +- char buff[BUFSIZ]; +- char* term = getenv("TERM"); +- tgetent(buff, term); +- char funcstr[BUFSIZ]; +- char* pt = funcstr; +- char* cs = tgoto(tgetstr("cs", &pt), tgetnum("li") - 2, 0); +- adjstr(cs); +- if (cs) { +- write(1, ce, strlen(ce)); +- write(1, cs, strlen(cs)); +- } +- char* cl = tgetstr("cl", &pt); +- adjstr(cl); +- if (cl) { +- write(1, cl, strlen(cl)); +- strcpy(endstr, cl); +- } +- ds = tgoto(tgetstr("cs", &pt), tgetnum("li") - 1, 0); +- adjstr(ds); +- if (ds) { +- strcat(endstr, ds); +- strcat(endstr, ce); +- } +- ts = tgoto(tgetstr("cm", &pt), 0, tgetnum("li") - 1); +- adjstr(ts); +- } ++ gettermcap(); + + // ¥¦¥£¥ó¥É¥¦¤Î¥µ¥¤¥º¤òÀßÄꤷľ¤¹ (stty -a ¤Î ¹Ô¿ô/·å¿ô Åù) + struct winsize win; +--- a/pty.H ++++ b/pty.H +@@ -50,18 +50,21 @@ + int rfd; + static int wfd; + private: +- static void adjstr(char* str); ++ static char buf[BUFSIZ]; ++ static char funcstr[BUFSIZ]; ++private: ++ static void gettermcap(); + protected: + static int hs; +- char* so; +- char* se; +- char* us; +- char* ue; +- char* sc; +- char* rc; ++ static char* so; ++ static char* se; ++ static char* us; ++ static char* ue; ++ static char* sc; ++ static char* rc; + static char* ce; + static char* ts; +- char* fs; ++ static char* fs; + static char* ds; + private: + static void finish();