端末の幅が知りたい

例えばOCamlのFormatモジュールを使うとき,幅が80だと仮定されてるから,ちょっと大きなデータを出力すると,右端がかわいそうなことになる.

こんな感じ.

#include <sys/ioctl.h>
#include <unistd.h>
#include <caml/mlvalues.h>

value getcol() {
  struct winsize winsz;
  if (ioctl(1, TIOCGSIZE, &winsz) == -1) {
    return Val_int(-1);
  }
  return Val_int(winsz.ws_col);
}

ML側は,

external getcol : unit -> int = "getcol"

let () = Printf.printf "%d\n" (getcol())

コンパイル

% ocamlc -custom column.c main.ml

これがポータブルな方法かどうかは知らん.