Skip to content

Commit ac2856d

Browse files
committed
[terminfo] fix reading of numbers
1 parent 14774a7 commit ac2856d

1 file changed

Lines changed: 20 additions & 6 deletions

File tree

src/third-party/notcurses/src/lib/terminfo.c

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,18 @@ terminfo_load(const char* path)
110110
return retval;
111111
}
112112

113+
static int16_t
114+
read_le16(const char* bits)
115+
{
116+
return bits[0] | (bits[1] << 8);
117+
}
118+
119+
static int32_t
120+
read_le32(const char* bits)
121+
{
122+
return bits[0] | (bits[1] << 8) | (bits[2] << 16) | (bits[3] << 24);
123+
}
124+
113125
Terminfo*
114126
terminfo_parse(const char* orig_content, int size)
115127
{
@@ -167,12 +179,13 @@ terminfo_parse(const char* orig_content, int size)
167179
retval->number_count = header->nums_count;
168180
retval->numbers = malloc(header->nums_count * sizeof(int32_t));
169181
if (num_size == 2) {
170-
int16_t* nums = (int16_t*) content;
171182
for (int lpc = 0; lpc < header->nums_count; lpc++) {
172-
retval->numbers[lpc] = nums[lpc];
183+
retval->numbers[lpc] = read_le16(&content[lpc * num_size]);
173184
}
174185
} else {
175-
memcpy(retval->numbers, content, num_size);
186+
for (int lpc = 0; lpc < header->nums_count; lpc++) {
187+
retval->numbers[lpc] = read_le32(&content[lpc * num_size]);
188+
}
176189
}
177190

178191
content += std_num_size;
@@ -238,12 +251,13 @@ terminfo_parse(const char* orig_content, int size)
238251
retval->ext_number_count = ext_header->nums_count;
239252
retval->ext_numbers = malloc(ext_header->nums_count * sizeof(int32_t));
240253
if (num_size == 2) {
241-
int16_t* nums = (int16_t*) content;
242254
for (int lpc = 0; lpc < ext_header->nums_count; lpc++) {
243-
retval->ext_numbers[lpc] = nums[lpc];
255+
retval->ext_numbers[lpc] = read_le16(&content[lpc * num_size]);
244256
}
245257
} else {
246-
memcpy(retval->ext_numbers, content, ext_num_size);
258+
for (int lpc = 0; lpc < ext_header->nums_count; lpc++) {
259+
retval->ext_numbers[lpc] = read_le32(&content[lpc * num_size]);
260+
}
247261
}
248262

249263
content += ext_num_size;

0 commit comments

Comments
 (0)