naoki86star

インターネットの片隅でなにかしら書いてみる

ANSI COLOR表示するのをc言語で書く

 grcはpythonスクリプトで構成されていたみたいだけども、sflowtool*1みたいな出力大量なものの場合に、色出力部分は魔改造(すなわちc言語での直接改造)したほうがいい場合がある。
 なにも気にしないでエスケープシーケンスの色制御コードを追加すればそれで色が付く。だけども、行儀よくやる場合は、端末に直接出力する場合には、色制御コードを足す、そうでない場合(パイプ出力・リダイレクトの場合)には色制御コードは出力しない、のがよりよい。昔、lsコマンドを例題にしてそんなやり方を教わった。

こんなのインクルードして

#include <termios.h>
#include <sys/ioctl.h>

こんなんで、端末に出力かどうかの有無を判定

#ifdef TIOCGWINSZ
  {
    struct winsize ws;
    if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &ws) != -1)
      line_length = ws.ws_col;
  }
#endif

 command | lessとかパイプをつないだ場合にはioctl (STDOUT_FILENO, TIOCGWINSZ,..)は-1を返してくる。端末出力であると判断できたらstdoutへの出力にエスケープシーケンスの色制御を追加してあげる、という寸法。


 Unix Magazineとかで見たのだったかなぁ。。


(2021/06/04追記) pythonでする場合

*1:例で思いつくものがこれだった。。