diff --git a/.gitattributes b/.gitattributes index b7502e06e04f027998e68d42f65fa5db65d6c7fd..39b07c2a7aa6367f0b428d5be439270a2d362968 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 ec0c1888a036110b85d9e3d3d1f6c51166aaa987..4d3aa1757451b3b338b1fc0298ce6b89c8490463 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; } {