You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/app-i18n/canfep/files/canfep-termcap.patch

267 lines
6.4 KiB

--- 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();