@@ -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+
113125Terminfo *
114126terminfo_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