GNU Screen開発版(4.1.0)でビルド時にエラー

GNU Screenの開発版(4.1.0、リビジョン:d94037c)で、ビルド時に以下のエラーが発生しました。


端的には、「構造体のメンバ変数を参照する際の名前が間違っている」というだけで、バグ報告もされている(1件目2件目)ので、おそらく、すぐに修正されるものと思いますが、いちおうメモしておきます。

ビルド風景とエラー内容

$ make
gcc -c -I. -I.  -DETCSCREENRC='"//etc/screenrc"' -DSCREENENCODINGS='"//share/screen/utf8encodings"' -DHAVE_CONFIG_H -DGIT_REV=\""`git describe --always 2>/dev/null`"\" \
	     -g -O2 -D_GNU_SOURCE ansi.c
ansi.c: In function ‘MFindUsedLine’:
ansi.c:2930: error: ‘struct win’ has no member named ‘encoding’
make: *** [ansi.o] エラー 1

修正箇所

エラーメッセージにある通り、「ansi.c」の2930行目が問題となっています。

# endif
#endif
#ifdef UTF8
      if (p->encoding == UTF8)  /* ここの行が問題(2030行目) */
	{
	  if (ml->font != null && bcmp((char*)ml->font, null, p->w_width))
	    break;


この、

if (p->encoding == UTF8)

を、以下のように修正すれば完了です。

if (p->w_encoding == UTF8)

補足

修正自体は以上でおわりですが、せっかくなので、ここまで至った経緯をメモしておきます。


当該箇所より上の方をたどっていくと、2908行目で変数「p」は以下のように定義されていることが分かります。

struct win *p;


「struct win」という構造体は、「window.h」の中で定義されています。


【136行目〜306行目まで抜粋】

struct win
{
  struct win *w_next;		/* next window */
  int    w_type;		/* type of window */
  void  *w_data;
  struct layer w_layer;		/* our layer */    /* (※1) */
...  省略  ...
  int	 w_c1;			/* enable C1 flag */
  int	 w_bce;			/* enable backcol erase */
#if 0
  int    w_encoding;		/* for input and paste */    /* (※2) */
#endif
  int    w_decodestate;		/* state of our input decoder */
...  省略  ...
};


#define w_encoding   w_layer.l_encoding        /* (※3) */
#define w_width  w_layer.l_width


(※1)〜(※3)が関係する箇所です。


(※2)を見ると、メンバ変数「w_encoding」はプリプロセッサの過程で無効化されるので、
一見、「w_encodingなどというメンバ変数は今や無い」かと思うのですが、
(※3)の箇所で「w_encoding」を「w_layer.l_encoding」で置換しており、
(※1)の通り「w_layer」というメンバ変数は存在しているため、

p->w_encoding

は問題ない、ということになります。


また、「UTF8」という定数名でgrepすると、他の箇所でも「w_encoding」との比較や代入を行っていたため、
おそらく、上述の修正で問題ないだろうと思います。

補足2

そもそも、最新の安定版をつかえば、という話もあります。