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