commit:     8634bf43cedc22d1e46b67f20b6d81c376c1fbdf
Author:     Akinori Hattori <hattya <AT> gentoo <DOT> org>
AuthorDate: Sun Jul 23 13:14:32 2017 +0000
Commit:     Akinori Hattori <hattya <AT> gentoo <DOT> org>
CommitDate: Sun Jul 23 13:15:24 2017 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=8634bf43

app-i18n/canfep: fix termcap handling

Package-Manager: Portage-2.3.6, Repoman-2.3.1

 app-i18n/canfep/canfep-1.0-r1.ebuild       |   5 +-
 app-i18n/canfep/files/canfep-termcap.patch | 266 +++++++++++++++++++++++++++++
 2 files changed, 270 insertions(+), 1 deletion(-)

diff --git a/app-i18n/canfep/canfep-1.0-r1.ebuild 
b/app-i18n/canfep/canfep-1.0-r1.ebuild
index 9d542a19716..d46bf325837 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 00000000000..afd215b07e7
--- /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();

Reply via email to