diff options
author | Alessandro Barbieri <lssndrbarbieri@gmail.com> | 2022-06-22 01:48:58 +0200 |
---|---|---|
committer | Alessandro Barbieri <lssndrbarbieri@gmail.com> | 2022-06-26 04:29:44 +0200 |
commit | 08c29eb875d5834e490a7005bb3404ff68215c41 (patch) | |
tree | b2c1220265d5e2e9e80fe70ef1b87e3c362e785e /app-i18n | |
parent | licenses: add canfep license (diff) | |
download | guru-08c29eb875d5834e490a7005bb3404ff68215c41.tar.gz guru-08c29eb875d5834e490a7005bb3404ff68215c41.tar.bz2 guru-08c29eb875d5834e490a7005bb3404ff68215c41.zip |
app-i18n/canfep: new package, add 1.0-r1
Signed-off-by: Alessandro Barbieri <lssndrbarbieri@gmail.com>
Diffstat (limited to 'app-i18n')
-rw-r--r-- | app-i18n/canfep/Manifest | 1 | ||||
-rw-r--r-- | app-i18n/canfep/canfep-1.0-r1.ebuild | 38 | ||||
-rw-r--r-- | app-i18n/canfep/files/canfep-1.0-respect-flags.patch | 24 | ||||
-rw-r--r-- | app-i18n/canfep/files/canfep-1.0-utf8.patch | 190 | ||||
-rw-r--r-- | app-i18n/canfep/files/canfep-posix-pty.patch | 67 | ||||
-rw-r--r-- | app-i18n/canfep/files/canfep-termcap.patch | 266 | ||||
-rw-r--r-- | app-i18n/canfep/metadata.xml | 9 |
7 files changed, 595 insertions, 0 deletions
diff --git a/app-i18n/canfep/Manifest b/app-i18n/canfep/Manifest new file mode 100644 index 000000000..8b3ed0252 --- /dev/null +++ b/app-i18n/canfep/Manifest @@ -0,0 +1 @@ +DIST canfep-1.0.tar.gz 8067 BLAKE2B 1a6e8af357d2b7aaccf442b0f8bab577ed05a5a0fdf2fb4c189105c2c41f739c2e559e740584bf393fcc52d3f3bd0bb6216e06e2b685f62f7dded9d576e95bed SHA512 0fd7c8ca56282fa537b76fe33f46e03d4f0f4727528ccad95cd4726888372da9158fc8bed2cdc67d645defb479040cd4a4d0999f69d38fd8b4080f7ece4e67d6 diff --git a/app-i18n/canfep/canfep-1.0-r1.ebuild b/app-i18n/canfep/canfep-1.0-r1.ebuild new file mode 100644 index 000000000..5c5fdabb8 --- /dev/null +++ b/app-i18n/canfep/canfep-1.0-r1.ebuild @@ -0,0 +1,38 @@ +# Copyright 1999-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +inherit toolchain-funcs + +DESCRIPTION="Canna Japanese kana-kanji frontend processor on console" +HOMEPAGE="https://web.archive.org/web/20170517105759/http://www.geocities.co.jp/SiliconValley-Bay/7584/canfep/" +SRC_URI="https://web.archive.org/web/20181106043248if_/http://www.geocities.co.jp/SiliconValley-Bay/7584/${PN}/${P}.tar.gz" + +LICENSE="canfep" +SLOT="0" +KEYWORDS="~amd64" + +RDEPEND=" + app-i18n/canna + sys-libs/ncurses:= +" +DEPEND="${RDEPEND}" +BDEPEND="virtual/pkgconfig" + +PATCHES=( + "${FILESDIR}/${P}-utf8.patch" + "${FILESDIR}/${PN}-posix-pty.patch" + "${FILESDIR}/${PN}-termcap.patch" + "${FILESDIR}/${P}-respect-flags.patch" +) + +src_compile() { + tc-export CXX + LIBS="$($(tc-getPKG_CONFIG) --libs ncurses)" emake +} + +src_install() { + dobin "${PN}" + dodoc 00{changes,readme} +} diff --git a/app-i18n/canfep/files/canfep-1.0-respect-flags.patch b/app-i18n/canfep/files/canfep-1.0-respect-flags.patch new file mode 100644 index 000000000..4dbcbec77 --- /dev/null +++ b/app-i18n/canfep/files/canfep-1.0-respect-flags.patch @@ -0,0 +1,24 @@ +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,5 @@ + # Linux +-CC=c++ +-LIBS=-lcanna -ltermcap +-CFLAGS=-O2 -g ++LIBS += -lcanna + + # Solaris 2.6J + #CC=c++ +@@ -19,10 +17,10 @@ + all: $(TARGET) + + $(TARGET): $(OBJS) +- $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) ++ $(CXX) $(CXXFLAGS) $(LDFLAGS) -fPIE -o $@ $(OBJS) $(LIBS) + + .C.o: +- $(CC) $(CFLAGS) -c $< ++ $(CXX) $(CXXFLAGS) -fPIC -c $< + + clean: + rm -rf $(TARGET) $(OBJS) diff --git a/app-i18n/canfep/files/canfep-1.0-utf8.patch b/app-i18n/canfep/files/canfep-1.0-utf8.patch new file mode 100644 index 000000000..e798d109d --- /dev/null +++ b/app-i18n/canfep/files/canfep-1.0-utf8.patch @@ -0,0 +1,190 @@ +--- a/canna.C ++++ b/canna.C +@@ -4,10 +4,87 @@ + #define FEP_KEY 15 + #define ESC_KEY 27 + ++void Canna::write_utf8(int fd, char *p, int len) ++{ ++ if (eucjp_to_utf8_cd == (iconv_t)-1) ++ write(fd, p, strlen(p)); ++ else ++ { ++ char *putf8 = iconv_string(eucjp_to_utf8_cd, p, len); ++ write(fd, putf8, strlen(putf8)); ++ free(putf8); ++ } ++} ++ ++char * Canna::iconv_string(iconv_t fd, char *str, int slen) ++{ ++ char *from; ++ size_t fromlen; ++ char *to; ++ size_t tolen; ++ size_t len = 0; ++ size_t done = 0; ++ char *result = NULL; ++ char *p; ++ int l; ++ ++ from = (char *)str; ++ fromlen = slen; ++ for (;;) ++ { ++ if (len == 0 || errno == E2BIG) ++ { ++ /* Allocate enough room for most conversions. When re-allocating ++ * increase the buffer size. */ ++ len = len + fromlen * 2 + 40; ++ p = (char*)malloc((unsigned)len); ++ if (p != NULL && done > 0) ++ memcpy(p, result, done); ++ free(result); ++ result = p; ++ if (result == NULL) /* out of memory */ ++ break; ++ } ++ ++ to = (char *)result + done; ++ tolen = len - done - 2; ++ /* Avoid a warning for systems with a wrong iconv() prototype by ++ * casting the second argument to void *. */ ++ if (iconv(fd, &from, &fromlen, &to, &tolen) != (size_t)-1) ++ { ++ /* Finished, append a NUL. */ ++ *to = 0; ++ break; ++ } ++ /* Check both ICONV_EILSEQ and EILSEQ, because the dynamically loaded ++ * iconv library may use one of them. */ ++ if (errno == EILSEQ || errno == EILSEQ) ++ { ++ /* Can't convert: insert a '?' and skip a character. This assumes ++ * conversion from 'encoding' to something else. In other ++ * situations we don't know what to skip anyway. */ ++ *to++ = *from++; ++ fromlen -= 1; ++ } ++ else if (errno != E2BIG) ++ { ++ /* conversion failed */ ++ free(result); ++ result = NULL; ++ break; ++ } ++ /* Not enough room or skipping illegal sequence. */ ++ done = to - (char *)result; ++ } ++ return result; ++} ++ + // コンストラクタだよん + Canna::Canna(int ac, char** av, char* amsg, char* emsg): + Pty(ac, av, amsg, emsg) + { ++ char *p_lang = getenv("LANG"); ++ + // かんなの初期化 + jrKanjiControl(0, KC_INITIALIZE, 0); + jrKanjiControl(0, KC_SETAPPNAME, "canfep"); +@@ -15,6 +92,9 @@ + jrKanjiControl(0, KC_QUERYMODE, (char*) saveMode); + jrKanjiControl(0, KC_SETWIDTH, (char*) 72); + ++ if (p_lang == NULL || strstr(p_lang, "-8")) ++ eucjp_to_utf8_cd = iconv_open("utf-8", "euc-jp"); ++ + mode(saveMode); + } + +@@ -25,6 +105,8 @@ + jrKanjiControl(0, KC_KILL, (char*) &ksv); + jrKanjiControl(0, KC_FINALIZE, 0); + ++ if (eucjp_to_utf8_cd != (iconv_t)-1) ++ iconv_close(eucjp_to_utf8_cd); + mode(saveMode); + } + +@@ -32,7 +114,7 @@ + void + Canna::kakutei(unsigned char* p) + { +- write(wfd, p, strlen((char*) p)); ++ write_utf8(wfd, (char*)p, strlen((char*) p)); + } + + // 変換中(未確定)の文字列を出力する +@@ -42,13 +124,13 @@ + write(rfd, sc, strlen(sc)); + write(rfd, rc, strlen(rc)); + write(rfd, us, strlen(us)); +- write(rfd, p, pos); ++ write_utf8(rfd, (char*)p, pos); + write(rfd, ue, strlen(ue)); + write(rfd, so, strlen(so)); +- write(rfd, p + pos, len); ++ write_utf8(rfd, (char*)p + pos, len); + write(rfd, se, strlen(se)); + write(rfd, us, strlen(us)); +- write(rfd, p + pos + len, strlen((char*) p + pos + len)); ++ write_utf8(rfd, (char*)p + pos + len, strlen((char*) p + pos + len)); + write(rfd, ue, strlen(ue)); + } + +@@ -73,7 +155,7 @@ + write(rfd, sc, strlen(sc)); + write(rfd, ts, strlen(ts)); + write(rfd, ce, strlen(ce)); +- write(rfd, p, strlen((char*) p)); ++ write_utf8(rfd, (char*)p, strlen((char*) p)); + write(rfd, fs, strlen(fs)); + } + +@@ -84,13 +166,13 @@ + write(rfd, sc, strlen(sc)); + write(rfd, ts, strlen(ts)); + write(rfd, ce, strlen(ce)); +- write(rfd, p, strlen((char*) p)); ++ write_utf8(rfd, (char*)p, strlen((char*) p)); + write(rfd, " ", 1); +- write(rfd, l, pos); ++ write_utf8(rfd, (char*)l, pos); + write(rfd, so, strlen(so)); +- write(rfd, l + pos, len); ++ write_utf8(rfd, (char*)l + pos, len); + write(rfd, se, strlen(se)); +- write(rfd, l + pos + len, strlen((char*) l + pos +len)); ++ write_utf8(rfd, (char*)l + pos + len, strlen((char*) l + pos +len)); + write(rfd, fs, strlen(fs)); + } + +--- a/canna.H ++++ b/canna.H +@@ -5,6 +5,8 @@ + #include <stdlib.h> + #include <string.h> + #include <unistd.h> ++#include <errno.h> ++#include <iconv.h> + #include <canna/jrkanji.h> + + #include "pty.H" +@@ -17,6 +19,7 @@ + jrKanjiStatus ks; + jrKanjiStatusWithValue ksv; + private: ++ iconv_t eucjp_to_utf8_cd; + unsigned char currentMode[BUFSIZ]; + unsigned char saveMode[BUFSIZ]; + private: +@@ -25,6 +28,8 @@ + void delhenkan(int len); + void mode(unsigned char* p); + void gline(unsigned char* p, unsigned char* l, int pos, int len); ++ void write_utf8(int fd, char *p, int len); ++ char* iconv_string(iconv_t fd, char *str, int slen); + public: + void loop(); + }; diff --git a/app-i18n/canfep/files/canfep-posix-pty.patch b/app-i18n/canfep/files/canfep-posix-pty.patch new file mode 100644 index 000000000..caa451232 --- /dev/null +++ b/app-i18n/canfep/files/canfep-posix-pty.patch @@ -0,0 +1,67 @@ +https://bugs.gentoo.org/show_bug.cgi?id=212709 + +Author: OKUMURA N. Shin-ya <oku.ns@dream.com> + +--- a/pty.C ++++ b/pty.C +@@ -257,6 +257,23 @@ + } + } + ++#if defined(_POSIX_C_SOURCE) ++ // BSD pty が開けないので、POSIX の方法を試す ++ if ((master = posix_openpt(O_RDWR)) >= 0) { ++ if (grantpt(master) == 0 && unlockpt(master) == 0) { ++ // マスタデバイス名は固定 ++ strcpy(line, "/dev/ptmx"); ++ tcgetattr(0, &tt); ++ tt.c_iflag &= ~ISTRIP; ++ ioctl(0, TIOCGWINSZ, (char*) &win); ++ return; ++ } ++ close(master); ++ } else { ++ perror("/dev/ptmx"); ++ } ++#endif // _POSIX_C_SOURCE ++ + printf("Out of pty's\n"); + fail(); + } +@@ -265,12 +282,36 @@ + void + Pty::getslave() + { ++#if defined(_POSIX_C_SOURCE) ++ // マスタデバイスが POSIX 方式の場合 ++ if (strcmp(line, "/dev/ptmx") == 0) { ++ char *slave_devname = ptsname(master); ++ if (slave_devname == NULL) { ++ perror("ptsname"); ++ fail(); ++ } ++ slave = open(slave_devname, O_RDWR); ++ if (slave < 0) { ++ perror(slave_devname); ++ fail(); ++ } ++ strcpy(line, slave_devname); ++ } else { ++ line[strlen("/dev/")] = 't'; ++ slave = open(line, O_RDWR); ++ if (slave < 0) { ++ perror(line); ++ fail(); ++ } ++ } ++#else // ! _POSIX_C_SOURCE + line[strlen("/dev/")] = 't'; + slave = open(line, O_RDWR); + if (slave < 0) { + perror(line); + fail(); + } ++#endif // _POSIX_C_SOURCE + tcsetattr(slave, TCSAFLUSH, &tt); + if (!hs) + win.ws_row--; diff --git a/app-i18n/canfep/files/canfep-termcap.patch b/app-i18n/canfep/files/canfep-termcap.patch new file mode 100644 index 000000000..afd215b07 --- /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(); diff --git a/app-i18n/canfep/metadata.xml b/app-i18n/canfep/metadata.xml new file mode 100644 index 000000000..37185a78f --- /dev/null +++ b/app-i18n/canfep/metadata.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> +<pkgmetadata> + <maintainer type="person"> + <description>co-maintainers welcome</description> + <name>Alessandro Barbieri</name> + <email>lssndrbarbieri@gmail.com</email> + </maintainer> +</pkgmetadata> |