bug-ncurses
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: extended format is wrong?


From: Anmol Sethi
Subject: Re: extended format is wrong?
Date: Tue, 26 Apr 2016 23:24:25 -0400

I found https://github.com/mauke/unibilium

It supports extended capabilities but its code is much easier for me to 
understand. I’m gonna try and implement it again tomorrow.
> On Apr 26, 2016, at 10:03 PM, Anmol Sethi <address@hidden> wrote:
> 
> I’d test to see how ncurses handles it, and fix my problems from there, but I 
> cannot enable tracing for some reason. I have 0 experience with c, sorry! I 
> set the environment variable, I see the tracing set, but it outputs nothing. 
> And I do have the right flags set.
> 
>> On Apr 26, 2016, at 10:02 PM, Anmol Sethi <address@hidden> wrote:
>> 
>> Hello!
>> 
>> I’m writing a terminfo library for go. Someone here suggested I add support 
>> for the extended storage format. I’ve tried and I’m running into quite a few 
>> problems. Here is an example xterm terminfo file from my system in hex. I’ve 
>> only included the extended format divided up.
>> 
>> 
>> EXTENDED:                             
>> Header:
>> 01 00 00 00 39 00 73 00 a2 02 
>> Values are 1, 0, 57, 115, and 674 in decimal.
>> 
>> According to term(5), that means 1 bool cap, 0 numeric caps, 57 string caps, 
>> 115 bytes for the extended string table and 674 bytes for the last offset of 
>> the extended string table. Ok so I attempted at writing a reader with this 
>> information and turns out those values are wrong or I am not understanding 
>> any of this correctly. Before I begin, what exactly is the difference 
>> between the 4th and 5th short integers of the header? One is the byte length 
>> of the string table and the other is the last offset of the string table. 
>> I’m not 100% what exactly that means. I’m gonna assume that the first one is 
>> the size in which the string cap values are contained and the second is the 
>> entire size of the table. The ncurses source defines the 4th short as 
>> ext_str_size and the 5th as ext_str_limit. Funny thing is, the source 
>> doesn’t even use the 4th short.
>> 
>> Bool:
>> 01 00 
>> 
>> Anyways, after the header, there is the boolean section. Since there is only 
>> one boolean value, I read the byte and then I noticed the old quirk, I need 
>> to skip the extra null byte inserted to keep everything on word boundaries. 
>> Ok so done and done.
>> 
>> String Section:
>> ff ff 00 00 07 00 0e 00 15 00 1c 00 23 00 2a 00 31 00 38 00 3f 00 46 00 4d 
>> 00 54 00 5b 00 62 00 69 00
>> 70 00 77 00 7e 00 85 00 8c 00 93 00 9a 00 a1 00 a8 00 af 00 b6 00 bd 00 c4 
>> 00 cb 00 d2 00 d9 00 e0 00
>> e7 00 ee 00 f5 00 fc 00 03 01 0a 01 11 01 18 01 1f 01 26 01 2d 01 34 01 3b 
>> 01 42 01 49 01 50 01 57 01
>> 5e 01 65 01 ff ff ff ff ff ff ff ff 
>> 
>> Next the numeric capabilities were 0 so I went straight to the string caps. 
>> Now here I read in these 114 bytes, or 57 shorts.
>> 
>> Rest:
>> 00 00 03 00 06 00 0b 00 10 00
>> 15 00 1a 00 1f 00 23 00 28 00 2d 00 32 00 37 00 3c 00 42 00 48 00 4e 00 54 
>> 00 5a 00 60 00 66 00 6c 00
>> 72 00 78 00 7d 00 82 00 87 00 8c 00 91 00 97 00 9d 00 a3 00 a9 00 af 00 b5 
>> 00 bb 00 c1 00 c7 00 cd 00
>> d3 00 d9 00 df 00 e5 00 eb 00 f1 00 f7 00 fd 00 03 01 09 01 0d 01 12 01 17 
>> 01 1c 01 21 01 26 01 2a 01
>> 2e 01 32 01 1b 5b 33 3b 33 7e 00 1b 5b 33 3b 34 7e 00 1b 5b 33 3b 35 7e 00 
>> 1b 5b 33 3b 36 7e 00 1b 5b
>> 33 3b 37 7e 00 1b 5b 31 3b 32 42 00 1b 5b 31 3b 33 42 00 1b 5b 31 3b 34 42 
>> 00 1b 5b 31 3b 35 42 00 1b
>> 5b 31 3b 36 42 00 1b 5b 31 3b 37 42 00 1b 5b 31 3b 33 46 00 1b 5b 31 3b 34 
>> 46 00 1b 5b 31 3b 35 46 00
>> 1b 5b 31 3b 36 46 00 1b 5b 31 3b 37 46 00 1b 5b 31 3b 33 48 00 1b 5b 31 3b 
>> 34 48 00 1b 5b 31 3b 35 48
>> 00 1b 5b 31 3b 36 48 00 1b 5b 31 3b 37 48 00 1b 5b 32 3b 33 7e 00 1b 5b 32 
>> 3b 34 7e 00 1b 5b 32 3b 35
>> 7e 00 1b 5b 32 3b 36 7e 00 1b 5b 32 3b 37 7e 00 1b 5b 31 3b 33 44 00 1b 5b 
>> 31 3b 34 44 00 1b 5b 31 3b
>> 35 44 00 1b 5b 31 3b 36 44 00 1b 5b 31 3b 37 44 00 1b 5b 36 3b 33 7e 00 1b 
>> 5b 36 3b 34 7e 00 1b 5b 36
>> 3b 35 7e 00 1b 5b 36 3b 36 7e 00 1b 5b 36 3b 37 7e 00 1b 5b 35 3b 33 7e 00 
>> 1b 5b 35 3b 34 7e 00 1b 5b
>> 35 3b 35 7e 00 1b 5b 35 3b 36 7e 00 1b 5b 35 3b 37 7e 00 1b 5b 31 3b 33 43 
>> 00 1b 5b 31 3b 34 43 00 1b
>> 5b 31 3b 35 43 00 1b 5b 31 3b 36 43 00 1b 5b 31 3b 37 43 00 1b 5b 31 3b 32 
>> 41 00 1b 5b 31 3b 33 41 00
>> 1b 5b 31 3b 34 41 00 1b 5b 31 3b 35 41 00 1b 5b 31 3b 36 41 00 1b 5b 31 3b 
>> 37 41 00 41 58 00 58 4d 00
>> 6b 44 43 33 00 6b 44 43 34 00 6b 44 43 35 00 6b 44 43 36 00 6b 44 43 37 00 
>> 6b 44 4e 00 6b 44 4e 33 00
>> 6b 44 4e 34 00 6b 44 4e 35 00 6b 44 4e 36 00 6b 44 4e 37 00 6b 45 4e 44 33 
>> 00 6b 45 4e 44 34 00 6b 45
>> 4e 44 35 00 6b 45 4e 44 36 00 6b 45 4e 44 37 00 6b 48 4f 4d 33 00 6b 48 4f 
>> 4d 34 00 6b 48 4f 4d 35 00
>> 6b 48 4f 4d 36 00 6b 48 4f 4d 37 00 6b 49 43 33 00 6b 49 43 34 00 6b 49 43 
>> 35 00 6b 49 43 36 00 6b 49
>> 43 37 00 6b 4c 46 54 33 00 6b 4c 46 54 34 00 6b 4c 46 54 35 00 6b 4c 46 54 
>> 36 00 6b 4c 46 54 37 00 6b
>> 4e 58 54 33 00 6b 4e 58 54 34 00 6b 4e 58 54 35 00 6b 4e 58 54 36 00 6b 4e 
>> 58 54 37 00 6b 50 52 56 33
>> 00 6b 50 52 56 34 00 6b 50 52 56 35 00 6b 50 52 56 36 00 6b 50 52 56 37 00 
>> 6b 52 49 54 33 00 6b 52 49
>> 54 34 00 6b 52 49 54 35 00 6b 52 49 54 36 00 6b 52 49 54 37 00 6b 55 50 00 
>> 6b 55 50 33 00 6b 55 50 34
>> 00 6b 55 50 35 00 6b 55 50 36 00 6b 55 50 37 00 6b 61 32 00 6b 62 31 00 6b 
>> 62 33 00 6b 63 32 00
>> 
>> Alright, now the rest of it should be the string table right? Well it turns 
>> out that it isn’t. Here look, this is the rest of the extended format (it is 
>> in a different format but it should be clear whats going on):
>> 
>> First 116 bytes:
>> "\x00\x00\x03\x00\x06\x00\v\x00\x10\x00\x15\x00\x1a\x00\x1f\x00#\x00(\x00-\x002\x007\x00<\x00B\x00H\x0
>> 0N\x00T\x00Z\x00`\x00f\x00l\x00r\x00x\x00}\x00\x82\x00\x87\x00\x8c\x00\x91\x00\x97\x00\x9d\x00\xa3\x00
>> \xa9\x00\xaf\x00\xb5\x00\xbb\x00\xc1\x00\xc7\x00\xcd\x00\xd3\x00\xd9\x00\xdf\x00\xe5\x00\xeb\x00\xf1\x
>> 00\xf7\x00\xfd\x00\x03\x01\t\x01\r\x01\x12\x01\x17\x01\x1c\x01!\x01&\x01*\x01.\x012\x01"
>> 
>> String Table:
>> "\x1b[3;3~\x00\x
>> 1b[3;4~\x00\x1b[3;5~\x00\x1b[3;6~\x00\x1b[3;7~\x00\x1b[1;2B\x00\x1b[1;3B\x00\x1b[1;4B\x00\x1b[1;5B\x00
>> \x1b[1;6B\x00\x1b[1;7B\x00\x1b[1;3F\x00\x1b[1;4F\x00\x1b[1;5F\x00\x1b[1;6F\x00\x1b[1;7F\x00\x1b[1;3H\x
>> 00\x1b[1;4H\x00\x1b[1;5H\x00\x1b[1;6H\x00\x1b[1;7H\x00\x1b[2;3~\x00\x1b[2;4~\x00\x1b[2;5~\x00\x1b[2;6~
>> \x00\x1b[2;7~\x00\x1b[1;3D\x00\x1b[1;4D\x00\x1b[1;5D\x00\x1b[1;6D\x00\x1b[1;7D\x00\x1b[6;3~\x00\x1b[6;
>> 4~\x00\x1b[6;5~\x00\x1b[6;6~\x00\x1b[6;7~\x00\x1b[5;3~\x00\x1b[5;4~\x00\x1b[5;5~\x00\x1b[5;6~\x00\x1b[
>> 5;7~\x00\x1b[1;3C\x00\x1b[1;4C\x00\x1b[1;5C\x00\x1b[1;6C\x00\x1b[1;7C\x00\x1b[1;2A\x00\x1b[1;3A\x00\x1
>> b[1;4A\x00\x1b[1;5A\x00\x1b[1;6A\x00\x1b[1;7A\x00AX\x00XM\x00kDC3\x00kDC4\x00kDC5\x00kDC6\x00kDC7\x00k
>> DN\x00kDN3\x00kDN4\x00kDN5\x00kDN6\x00kDN7\x00kEND3\x00kEND4\x00kEND5\x00kEND6\x00kEND7\x00kHOM3\x00kH
>> OM4\x00kHOM5\x00kHOM6\x00kHOM7\x00kIC3\x00kIC4\x00kIC5\x00kIC6\x00kIC7\x00kLFT3\x00kLFT4\x00kLFT5\x00k
>> LFT6\x00kLFT7\x00kNXT3\x00kNXT4\x00kNXT5\x00kNXT6\x00kNXT7\x00kPRV3\x00kPRV4\x00kPRV5\x00kPRV6\x00kPRV
>> 7\x00kRIT3\x00kRIT4\x00kRIT5\x00kRIT6\x00kRIT7\x00kUP\x00kUP3\x00kUP4\x00kUP5\x00kUP6\x00kUP7\x00ka2\x
>> 00kb1\x00kb3\x00kc2\x00”
>> 
>> The first 116 bytes are actually not part of the string table. I have no 
>> idea what purpose they serve. If I skip these 116 bytes, I get to the actual 
>> string table and the offsets from before work perfectly fine. I noticed that 
>> 114 + 116 is 230. So 230 bytes need to be read to get to the string table. I 
>> noticed that the 4th short is 115, and 115 * 2 = 230. So essentially I’m 
>> using the 4th short multiplied by 2 as the length of the offsets. But I take 
>> the 3rd short of the header, aka the number of string caps and use only that 
>> number of shorts from the buffer. As in I read in those extra 116 bytes but 
>> I never use them. This seems to work fine across different files but I don’t 
>> think its correct. I think I’m misunderstanding something.
>> 
>> Could someone please help me understand the extended format and what I am 
>> doing wrong?
>> 
>> If you need any further clarification on my problem, please do not hesitate 
>> to ask.
>> 
>> Here is the current extended reader code. 
>> https://github.com/nhooyr/terminfo/blob/master/read.go#L126
>> 
>> First I make sure we’re on a word boundary. Then I read in the 10 bytes for 
>> the reader. Next I print it out. Then I read in the bool section. Then I 
>> read in the numeric section (its 0 in this case). Next I read the string 
>> offset section but for the size, I use r.h[lenExtTable] * 2 which means, 
>> take the 4th short (the size of the string table section apparently..) and 
>> multiple it by 2, and use that. Then I use the last offset as the size of 
>> the actual string table and print out all of the extended values. You can 
>> easily run this on your own computer by setting the TERM to xterm, running 
>> “go get github.com/nhooyr/terminfo” and then run "go test 
>> github.com/nhooyr/terminfo -v”. You should see all of the string caps being 
>> printed out.
>> 
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]