From 92fcb5564d6bf24366922b010e75d0bbeb5b0c07 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Sun, 11 Mar 2018 19:46:28 +0100
Subject: [PATCH] Terminfo: Support Ncurses 6 format.

Fixes support for eg xterm-256color.
---
 .gitattributes                       |  1 -
 lib/modules/Stdio.pmod/Terminfo.pmod | 26 +++++++++++++++++++-------
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/.gitattributes b/.gitattributes
index b7502e06e0..39b07c2a7a 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -200,7 +200,6 @@ testfont binary
 /lib/modules/Stdio.pmod foreign_ident
 /lib/modules/Stdio.pmod/FakeFile.pike foreign_ident
 /lib/modules/Stdio.pmod/Readline.pike foreign_ident
-/lib/modules/Stdio.pmod/Terminfo.pmod foreign_ident
 /lib/modules/Stdio.pmod/module.pmod foreign_ident
 /lib/modules/String.pmod/Elite.pmod foreign_ident
 /lib/modules/String.pmod/HTML.pmod foreign_ident
diff --git a/lib/modules/Stdio.pmod/Terminfo.pmod b/lib/modules/Stdio.pmod/Terminfo.pmod
index ec0c1888a0..4d3aa17574 100644
--- a/lib/modules/Stdio.pmod/Terminfo.pmod
+++ b/lib/modules/Stdio.pmod/Terminfo.pmod
@@ -1,4 +1,4 @@
-// $Id: Terminfo.pmod,v 1.14 2003/01/20 17:44:01 nilsson Exp $
+// $Id$
 #pike __REAL_VERSION__
 
 
@@ -279,6 +279,9 @@ class Terminfo {
 
   inherit TermMachine;
 
+  protected local constant MAGIC = 0432;	// SysV
+  protected local constant MAGIC2 = 01036;	// Ncurses 6
+
   //!
   array(string) aliases;
 
@@ -343,7 +346,7 @@ class Terminfo {
 
     if (6!=sscanf(swab(f->read(12)), "%2c%2c%2c%2c%2c%2c",
 		  magic, sname, nbool, nnum, nstr, sstr) ||
-	magic != 0432)
+	(magic != MAGIC && magic != MAGIC2))
       return 0;
     aliases = (f->read(sname)-"\0")/"|";
     {
@@ -356,14 +359,23 @@ class Terminfo {
       map = mkmapping(boolnames[..sizeof(bools)-1], bools);
     }
     {
-      array(int) nums = [array(int)]
-	array_sscanf(swab(f->read(nnum*2)), "%2c"*nnum);
+      array(int) nums;
+      if (magic == MAGIC2) {
+	// 32-bit little-endian integers.
+	nums = array_sscanf(f->read(nnum*4), "%-4c"*nnum);
+      } else {
+	nums = [array(int)]
+	  array_sscanf(swab(f->read(nnum*2)), "%2c"*nnum);
+      }
       if (sizeof(nums)>sizeof(numnames))
 	nums = nums[..sizeof(numnames)-1];
       mapping(string:int) tmp = mkmapping(numnames[..sizeof(nums)-1], nums);
-      foreach (numnames[..sizeof(nums)-1], string name)
-	if (tmp[name]>=0xfffe)
-	  m_delete(tmp, name);
+      foreach (numnames[..sizeof(nums)-1], string name) {
+	if (tmp[name]>=0xfffe) {
+	  if ((magic == MAGIC) || (tmp[name] >= 0xfffffffe))
+	    m_delete(tmp, name);
+	}
+      }
       map += tmp;
     }
     {
-- 
GitLab