more messy work

This commit is contained in:
Christopher Jeffrey 2013-02-24 16:31:33 -06:00
parent 8b479fb169
commit c4de02651e

View File

@ -171,11 +171,10 @@ Tput.prototype.parseTerminfo = function(data) {
// Extended Header
if (this.extended) {
i += h.strTableSize - 0;
i += h.strTableSize;
l = data.length;
console.log(i, l);
if (i < l) {
info.extended = this.parseExtended(data.slice(i));
info.extended = this.parseExtended(data.slice(i), data, h, i);
//['bools', 'numbers', 'strings'].forEach(function(key) {
Object.keys(info.extended).forEach(function(key) {
info[key].extended = info.extended[key];
@ -188,155 +187,70 @@ Tput.prototype.parseTerminfo = function(data) {
return info;
};
Tput.prototype.parseExtended = function(data) {
// For xterm, non-extended header:
// { dataSize: 3270,
// headerSize: 12,
// magicNumber: 282,
// namesSize: 48,
// boolCount: 38,
// numCount: 15,
// strCount: 413,
// strTableSize: 1388,
// total: 2342 }
// For xterm, header:
// Offset: 2342
// { header:
// { dataSize: 928,
// headerSize: 10,
// boolCount: 2,
// numCount: 1,
// strCount: 57,
// strTableSize: 117,
// lastStrTableOffset: 680,
// total: 245 },
// For xterm, offsets:
// { header: '0 - 10',
// bools: '10 - 12',
// numbers: '12 - 16',
// strings: '16 - 130',
// stringData: '130 - 612',
// sym: '612 - 928' }
//
// Real header size: 10
// Real bools size: 2
// Real numbers size: 4
// Real string-offset size: 114
// Real table size: 482
// Real sym size: 316
Tput.prototype.parseExtended = function(data, _data, _h, _i) {
var info = {}
, l = data.length
, i = 0
, v
, o;
var h = info.header = {
dataSize: data.length,
headerSize: 10,
boolCount: (data[i + 1] << 8) | data[i + 0],
numCount: (data[i + 3] << 8) | data[i + 2],
strCount: (data[i + 5] << 8) | data[i + 4],
strTableSize: (data[i + 7] << 8) | data[i + 6],
lastStrTableOffset: (data[i + 9] << 8) | data[i + 8]
};
var bools = data.slice(10, 12);
var numbers = data.slice(12, 16);
var strings = data.slice(16, 130);
var stringData = data.slice(130, 612);
var sym = data.slice(612, 928);
h.total = h.headerSize
+ h.boolCount
+ h.numCount * 2
+ h.strCount * 2
+ h.strTableSize;
console.log(_h);
console.log(_i);
console.log(_data.length);
process.exit(0);
i = h.headerSize;
console.log(h);
//process.exit(0);
// Booleans Section
// One byte for each flag
// Same order as <term.h>
info.bools = {};
l = i + h.boolCount;
o = 36 + 1;
for (; i < l; i++) {
v = Tput.bools[o++] || 'OFFSET: ' + (o - 1);
info.bools[v] = !!data[i];
}
// Null byte in between to make sure numbers begin on an even byte.
if (i % 2) {
assert.equal(data[i], 0);
i++;
}
// Numbers Section
info.numbers = {};
l = i + h.numCount * 2;
o = 32 + 1;
for (; i < l; i += 2) {
v = Tput.numbers[o++] || 'OFFSET: ' + (o - 1);
if (data[i + 1] === 0377 && data[i] === 0377) {
info.numbers[v] = -1;
} else {
info.numbers[v] = (data[i + 1] << 8) | data[i];
}
}
// looks like: ffff 0000
// 0000920: 1b6c 001b 6d00 0200 0100 3900 7500 a802 .l..m.....9.u...
// 0000930: 0100 ffff ffff 0000 0700 0e00 1500 1c00 ................
//console.log(data.slice(i, i + 10));
//process.exit(0);
if (data[i + 1] === 0377 && data[i] === 0377) {
i += 2;
}
// Strings Section
info.strings = {};
l = i + h.strCount * 2;
o = 393 + 1;
for (; i < l; i += 2) {
v = Tput.strings[o++] || 'OFFSET: ' + (o - 1);
if (data[i + 1] === 0377 && data[i] === 0377) {
//break;
info.strings[v] = -1;
} else {
info.strings[v] = (data[i + 1] << 8) | data[i];
}
}
// 0000990: 3b01 4201 4901 5001 5701 5e01 6501 ffff ;.B.I.P.W.^.e...
// 00009a0: ffff ffff ffff 0000 0300 0600 0900 0c00 ................
// i = 130, l = 130
//console.log(data.slice(i, i + 10));
//process.exit(0);
//i--; // without this it's on `03`
//i = l - 1;
//assert.equal(data[i], 0);
i = l;
// String Table
Object.keys(info.strings).forEach(function(key, k, keys) {
if (info.strings[key] === -1) {
//delete info.strings[key];
//return;
}
var s = i + info.strings[key]
, j = s;
//if (keys.length > k + 1) {
// var next = info.strings[keys[k + 1]];
// j = i + next - 2;
//} else {
while (data[s - 1] !== 0) s--;
while (data[j]) j++;
if (s >= data.length || j > data.length) {
delete info.strings[key];
return;
}
info.strings[key] = data.toString('ascii', s, j);
info.strings[key] = (s - i) + '-' + (j - i) + '-' + info.strings[key];
console.log({
bools: JSON.stringify(bools.toString('ascii')),
numbers: JSON.stringify(numbers.toString('ascii')),
strings: JSON.stringify(strings.toString('ascii')),
stringData: JSON.stringify(stringData.toString('ascii')),
sym: JSON.stringify(sym.toString('ascii'))
});
// Symbol Table
i = h.lastStrTableOffset - 68;
l = data.length;
//console.log(data.slice(i - 10, i + 10));
//console.log(JSON.stringify(data.slice(i - 10, i + 10).toString('ascii')));
//process.exit(0);
var sym = []
, j = 0;
for (; i < l; i++) {
j = i;
while (data[j]) j++;
sym.push(data.toString('ascii', i, j));
i = j;
}
console.log(sym);
console.log(sym.length);
console.log(Object.keys(info.strings).length);
//process.exit(0);
return info;
};
Tput.prototype.parseExtended = function(data) {
var info = {}
, l = data.length
, i = 0
, v
, o;
process.exit(0);
var h = info.header = {
dataSize: data.length,
@ -359,6 +273,7 @@ Tput.prototype.parseExtended = function(data) {
console.log(h);
//process.exit(0);
var b_start = i;
// Booleans Section
// One byte for each flag
// Same order as <term.h>
@ -373,7 +288,9 @@ Tput.prototype.parseExtended = function(data) {
assert.equal(data[i], 0);
i++;
}
var b_end = i;
var no_start = i;
// Numbers Section
info.numbers = [];
l = i + h.numCount * 2;
@ -393,18 +310,21 @@ Tput.prototype.parseExtended = function(data) {
if (data[i + 1] === 0377 && data[i] === 0377) {
i += 2;
}
var no_end = i;
var sto_start = i;
// Strings Section
info.strings = [];
l = i + h.strCount * 2;
for (; i < l; i += 2) {
if (data[i + 1] === 0377 && data[i] === 0377) {
//break;
//break; // XXX - WHY?
info.strings.push(-1);
} else {
info.strings.push((data[i + 1] << 8) | data[i]);
}
}
var sto_end = l;
// 0000990: 3b01 4201 4901 5001 5701 5e01 6501 ffff ;.B.I.P.W.^.e...
// 00009a0: ffff ffff ffff 0000 0300 0600 0900 0c00 ................
@ -416,11 +336,15 @@ Tput.prototype.parseExtended = function(data) {
//assert.equal(data[i], 0);
i = l;
var st_start = i;
// String Table
var last = 0;
info.strings.forEach(function(offset, k) {
if (offset > last) last = offset;
if (offset === -1) {
//info.strings[k] = '';
//return;
info.strings[k] = '';
return;
}
var s = i + offset
@ -431,18 +355,34 @@ Tput.prototype.parseExtended = function(data) {
while (data[j]) j++;
if (j - i > last) last = j - i;
if (s >= data.length || j > data.length) {
//info.strings[k] = '';
return;
}
info.strings[k] = data.toString('ascii', s, j);
//info.strings[k] = (s - i) + '-' + (j - i) + '-' + info.strings[k];
info.strings[k] = (s - i) + '-' + (j - i) + '-' + info.strings[k];
});
last += i;
var st_end = last + 120;
console.log(data.slice(last, last + 120));
console.log('strings: ' + info.strings.length);
// missing 17 strings in the next 120 bytes (maybe unused?)
// total: 74, 4a - or could be 73, 49, or 75, 4b
console.log(JSON.stringify(data.slice(last, last + 120).toString('ascii').split('\0')));
//process.exit(0);
// Symbol Table
// XXX - WHY?
i = h.lastStrTableOffset - 68;
//i = i + h.strTableSize;
//i = (i + h.strCount * 2 + _h.strCount * 2);
//console.log('cur: %d, needed: %d, needed2: %d, toffset: %d', i, h.lastStrTableOffset - 68, last + 120, _i + i);
//process.exit(0);
//i = h.lastStrTableOffset - 68;
i = last + 120;
l = data.length;
console.log(data.slice(i - 10, i + 10));
@ -452,12 +392,23 @@ Tput.prototype.parseExtended = function(data) {
var sym = []
, j = 0;
var sym_start = i;
for (; i < l; i++) {
j = i;
while (data[j]) j++;
sym.push(data.toString('ascii', i, j));
i = j;
}
var sym_end = i;
console.log({
header: '0' + ' - ' + h.headerSize,
bools: b_start + ' - ' + b_end,
numbers: no_start + ' - ' + no_end,
strings: sto_start + ' - ' + sto_end,
stringData: st_start + ' - ' + st_end,
sym: sym_start + ' - ' + sym_end
});
console.log(sym);
console.log(sym.length);