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