未验证 提交 e5179299 编写于 作者: J Joshua Peterson 提交者: GitHub

Merge pull request #1363 from Unity-Technologies/apply-linux-term-fix

[TermInfo] support new file format terminfo2 introduced with ncurses6.1
...@@ -32,7 +32,8 @@ using System.IO; ...@@ -32,7 +32,8 @@ using System.IO;
using System.Text; using System.Text;
namespace System { namespace System {
// This class reads data from a byte array or file containing the terminfo capabilities // This class reads data from a byte array or file containing the terminfo capabilities
// information for any given terminal. The maximum allowed size is 4096 bytes. // information for any given terminal. The maximum allowed size is 4096 (or
// 32768 for terminfo2) bytes.
// //
// Terminfo database files are divided in the following sections: // Terminfo database files are divided in the following sections:
// //
...@@ -45,7 +46,7 @@ namespace System { ...@@ -45,7 +46,7 @@ namespace System {
// //
// The header is as follows: // The header is as follows:
// //
// Magic number (0x1 and 0x1A) // Magic number (0x11A/0432 or 0x21e/01036 for terminfo2)
// Terminal names size // Terminal names size
// Boolean section size // Boolean section size
// Numeric section size // Numeric section size
...@@ -58,8 +59,9 @@ namespace System { ...@@ -58,8 +59,9 @@ namespace System {
// The boolean capabilities section has bytes that are set to 1 if the capability is supported // The boolean capabilities section has bytes that are set to 1 if the capability is supported
// and 0 otherwise. If the index of a capability is greater than the section size, 0 is assumed. // and 0 otherwise. If the index of a capability is greater than the section size, 0 is assumed.
// //
// The numeric capabilities section holds 2-byte integers in little endian format. No negative // The numeric capabilities section holds 2-byte integers (4-byte integers for terminfo2) in
// values are allowed and the absence of a capability is marked as two 0xFF. // little endian format. No negative values are allowed and the absence of a capability is marked
// as two 0xFF (four 0xFF for terminfo2).
// //
// The string offsets section contains 2-byte integer offsets into the string capabilies section. // The string offsets section contains 2-byte integer offsets into the string capabilies section.
// If the capability is not supported, the index will be two 0xFF bytes. // If the capability is not supported, the index will be two 0xFF bytes.
...@@ -72,17 +74,17 @@ namespace System { ...@@ -72,17 +74,17 @@ namespace System {
// //
class TermInfoReader { class TermInfoReader {
//short nameSize; int boolSize;
short boolSize; int numSize;
short numSize; int strOffsets;
short strOffsets;
//short strSize;
//string [] names; // Last one is the description //string [] names; // Last one is the description
byte [] buffer; byte [] buffer;
int booleansOffset; int booleansOffset;
//string term; //string term;
int intOffset;
public TermInfoReader (string term, string filename) public TermInfoReader (string term, string filename)
{ {
using (FileStream st = File.OpenRead (filename)) { using (FileStream st = File.OpenRead (filename)) {
...@@ -114,12 +116,21 @@ namespace System { ...@@ -114,12 +116,21 @@ namespace System {
// get { return term; } // get { return term; }
// } // }
void DetermineVersion (short magic)
{
if (magic == 0x11a)
intOffset = 2;
else if (magic == 0x21e)
intOffset = 4;
else
throw new Exception (String.Format ("Magic number is wrong: {0}", magic));
}
void ReadHeader (byte [] buffer, ref int position) void ReadHeader (byte [] buffer, ref int position)
{ {
short magic = GetInt16 (buffer, position); short magic = GetInt16 (buffer, position);
position += 2; position += 2;
if (magic != 282) DetermineVersion (magic);
throw new Exception (String.Format ("Magic number is wrong: {0}", magic));
/*nameSize =*/ GetInt16 (buffer, position); /*nameSize =*/ GetInt16 (buffer, position);
position += 2; position += 2;
...@@ -161,8 +172,8 @@ namespace System { ...@@ -161,8 +172,8 @@ namespace System {
if ((offset % 2) == 1) if ((offset % 2) == 1)
offset++; offset++;
offset += ((int) number) * 2; offset += ((int) number) * intOffset;
return GetInt16 (buffer, offset); return GetInteger (buffer, offset);
} }
public string Get (TermInfoStrings tstr) public string Get (TermInfoStrings tstr)
...@@ -175,7 +186,7 @@ namespace System { ...@@ -175,7 +186,7 @@ namespace System {
if ((offset % 2) == 1) if ((offset % 2) == 1)
offset++; offset++;
offset += numSize * 2; offset += numSize * intOffset;
int off2 = GetInt16 (buffer, offset + (int) tstr * 2); int off2 = GetInt16 (buffer, offset + (int) tstr * 2);
if (off2 == -1) if (off2 == -1)
return null; return null;
...@@ -193,7 +204,7 @@ namespace System { ...@@ -193,7 +204,7 @@ namespace System {
if ((offset % 2) == 1) if ((offset % 2) == 1)
offset++; offset++;
offset += numSize * 2; offset += numSize * intOffset;
int off2 = GetInt16 (buffer, offset + (int) tstr * 2); int off2 = GetInt16 (buffer, offset + (int) tstr * 2);
if (off2 == -1) if (off2 == -1)
return null; return null;
...@@ -211,6 +222,27 @@ namespace System { ...@@ -211,6 +222,27 @@ namespace System {
return (short) (uno + dos * 256); return (short) (uno + dos * 256);
} }
int GetInt32 (byte [] buffer, int offset)
{
int b1 = (int) buffer [offset];
int b2 = (int) buffer [offset + 1];
int b3 = (int) buffer [offset + 2];
int b4 = (int) buffer [offset + 3];
if (b1 == 255 && b2 == 255 && b3 == 255 && b4 == 255)
return -1;
return b1 + b2 << 8 + b3 << 16 + b4 << 24;
}
int GetInteger (byte [] buffer, int offset)
{
if (intOffset == 2)
return GetInt16 (buffer, offset);
else
// intOffset == 4
return GetInt32 (buffer, offset);
}
string GetString (byte [] buffer, int offset) string GetString (byte [] buffer, int offset)
{ {
int length = 0; int length = 0;
...@@ -250,4 +282,3 @@ namespace System { ...@@ -250,4 +282,3 @@ namespace System {
} }
} }
#endif #endif
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册