Skip to content

Commit 0df8d71

Browse files
committed
[terminfo] handle 32bit terminfo and fix leak
1 parent 599434a commit 0df8d71

9 files changed

Lines changed: 112 additions & 69 deletions

File tree

src/third-party/notcurses/include/terminfo/terminfo.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,20 @@
33

44
#include <stdint.h>
55

6-
#define TERMINFO_MAGIC 0x011A
6+
#define TERMINFO_MAGIC 0x011A
7+
#define TERMINFO_MAGIC_32BIT 0x021E
78

89
typedef struct {
910
char* name;
1011
uint8_t* bools;
11-
int16_t* numbers;
12+
int32_t* numbers;
1213
char** strings;
1314
int bool_count;
1415
int number_count;
1516
int string_count;
1617

1718
uint8_t* ext_bools;
18-
int16_t* ext_numbers;
19+
int32_t* ext_numbers;
1920
char** ext_strings;
2021
int ext_bool_count;
2122
int ext_number_count;

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

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ int ncdirect_cursor_up(ncdirect* nc, int num){
7575
}
7676
const char* cuu = get_escape(&nc->tcache, ESCAPE_CUU);
7777
if(cuu){
78-
TiparmValue argv[] = {tiparm_int(num)};
79-
return term_emit(tiparm_s(cuu, 1, argv), nc->ttyfp, false);
78+
TiparmValue argv[] = {tiparm_int(num)};
79+
return term_emit_parm(tiparm_s(cuu, 1, argv), nc->ttyfp, false);
8080
}
8181
return -1;
8282
}
@@ -91,8 +91,8 @@ int ncdirect_cursor_left(ncdirect* nc, int num){
9191
}
9292
const char* cub = get_escape(&nc->tcache, ESCAPE_CUB);
9393
if(cub){
94-
TiparmValue argv[] = {tiparm_int(num)};
95-
return term_emit(tiparm_s(cub, 1, argv), nc->ttyfp, false);
94+
TiparmValue argv[] = {tiparm_int(num)};
95+
return term_emit_parm(tiparm_s(cub, 1, argv), nc->ttyfp, false);
9696
}
9797
return -1;
9898
}
@@ -107,8 +107,8 @@ int ncdirect_cursor_right(ncdirect* nc, int num){
107107
}
108108
const char* cuf = get_escape(&nc->tcache, ESCAPE_CUF);
109109
if(cuf){
110-
TiparmValue argv[] = {tiparm_int(num)};
111-
return term_emit(tiparm_s(cuf, 1, argv), nc->ttyfp, false);
110+
TiparmValue argv[] = {tiparm_int(num)};
111+
return term_emit_parm(tiparm_s(cuf, 1, argv), nc->ttyfp, false);
112112
}
113113
return -1; // FIXME fall back to cuf1?
114114
}
@@ -223,7 +223,7 @@ int ncdirect_cursor_move_yx(ncdirect* n, int y, int x){
223223
if(y == -1){ // keep row the same, horizontal move only
224224
if(hpa){
225225
TiparmValue argv[] = {tiparm_int(x)};
226-
return term_emit(tiparm_s(hpa, 1, argv), n->ttyfp, false);
226+
return term_emit_parm(tiparm_s(hpa, 1, argv), n->ttyfp, false);
227227
}else if(n->tcache.ttyfd >= 0 && u7){
228228
unsigned yprime;
229229
if(cursor_yx_get(n, u7, &yprime, NULL)){
@@ -236,7 +236,7 @@ int ncdirect_cursor_move_yx(ncdirect* n, int y, int x){
236236
}else if(x == -1){ // keep column the same, vertical move only
237237
if(!vpa){
238238
TiparmValue argv[] = {tiparm_int(y)};
239-
return term_emit(tiparm_s(vpa, 1, argv), n->ttyfp, false);
239+
return term_emit_parm(tiparm_s(vpa, 1, argv), n->ttyfp, false);
240240
}else if(n->tcache.ttyfd >= 0 && u7){
241241
unsigned xprime;
242242
if(cursor_yx_get(n, u7, NULL, &xprime)){
@@ -250,13 +250,12 @@ int ncdirect_cursor_move_yx(ncdirect* n, int y, int x){
250250
const char* cup = get_escape(&n->tcache, ESCAPE_CUP);
251251
if(cup){
252252
TiparmValue argv[] = {tiparm_int(y), tiparm_int(x)};
253-
return term_emit(tiparm_s(cup, 2, argv), n->ttyfp, false);
253+
return term_emit_parm(tiparm_s(cup, 2, argv), n->ttyfp, false);
254254
}else if(vpa && hpa){
255-
TiparmValue argv[] = {tiparm_int(x)};
256-
TiparmValue argv2[] = {tiparm_int(y)};
257-
if(term_emit(tiparm_s(hpa, 1, argv), n->ttyfp, false) == 0 &&
258-
259-
term_emit(tiparm_s(vpa, 1, argv2), n->ttyfp, false) == 0){
255+
TiparmValue argv[] = {tiparm_int(x)};
256+
TiparmValue argv2[] = {tiparm_int(y)};
257+
if(term_emit_parm(tiparm_s(hpa, 1, argv), n->ttyfp, false) == 0 &&
258+
term_emit_parm(tiparm_s(vpa, 1, argv2), n->ttyfp, false) == 0){
260259
return 0;
261260
}
262261
}
@@ -795,8 +794,8 @@ int ncdirect_set_fg_palindex(ncdirect* nc, int pidx){
795794
if(ncchannels_set_fg_palindex(&nc->channels, pidx) < 0){
796795
return -1;
797796
}
798-
TiparmValue argv[] = {tiparm_int(pidx)};
799-
return term_emit(tiparm_s(setaf, 1, argv), nc->ttyfp, false);
797+
TiparmValue argv[] = {tiparm_int(pidx)};
798+
return term_emit_parm(tiparm_s(setaf, 1, argv), nc->ttyfp, false);
800799
}
801800

802801
int ncdirect_set_bg_palindex(ncdirect* nc, int pidx){
@@ -808,7 +807,7 @@ int ncdirect_set_bg_palindex(ncdirect* nc, int pidx){
808807
return -1;
809808
}
810809
TiparmValue argv[] = {tiparm_int(pidx)};
811-
return term_emit(tiparm_s(setab, 1, argv), nc->ttyfp, false);
810+
return term_emit_parm(tiparm_s(setab, 1, argv), nc->ttyfp, false);
812811
}
813812

814813
int ncdirect_vprintf_aligned(ncdirect* n, int y, ncalign_e align, const char* fmt, va_list ap){

src/third-party/notcurses/src/lib/fbuf.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,13 @@ fbuf_emit(fbuf* f, const char* esc){
245245
return 0;
246246
}
247247

248+
static inline int
249+
fbuf_emit_parm(fbuf* f, const char* esc){
250+
int retval = fbuf_emit(f, esc);
251+
free(esc);
252+
return retval;
253+
}
254+
248255
// releases the resources held by f. f itself is not freed.
249256
static inline void
250257
fbuf_free(fbuf* f){

src/third-party/notcurses/src/lib/internal.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,8 +1101,8 @@ static inline int
11011101
term_bg_palindex(const notcurses* nc, fbuf* f, unsigned pal){
11021102
const char* setab = get_escape(&nc->tcache, ESCAPE_SETAB);
11031103
if(setab){
1104-
TiparmValue argv[] = {tiparm_int(pal)};
1105-
return fbuf_emit(f, tiparm_s(setab, 1, argv));
1104+
TiparmValue argv[] = {tiparm_int(pal)};
1105+
return fbuf_emit_parm(f, tiparm_s(setab, 1, argv));
11061106
}
11071107
return 0;
11081108
}
@@ -1111,8 +1111,8 @@ static inline int
11111111
term_fg_palindex(const notcurses* nc, fbuf* f, unsigned pal){
11121112
const char* setaf = get_escape(&nc->tcache, ESCAPE_SETAF);
11131113
if(setaf){
1114-
TiparmValue argv[] = {tiparm_int(pal)};
1115-
return fbuf_emit(f, tiparm_s(setaf, 1, argv));
1114+
TiparmValue argv[] = {tiparm_int(pal)};
1115+
return fbuf_emit_parm(f, tiparm_s(setaf, 1, argv));
11161116
}
11171117
return 0;
11181118
}
@@ -1229,14 +1229,14 @@ goto_location(notcurses* nc, fbuf* f, int y, int x, const ncplane* srcp){
12291229
++nc->stats.s.hpa_gratuitous;
12301230
}
12311231
TiparmValue argv[] = {tiparm_int(x)};
1232-
if(fbuf_emit(f, tiparm_s(hpa, 1, argv))){
1232+
if(fbuf_emit_parm(f, tiparm_s(hpa, 1, argv))){
12331233
return -1;
12341234
}
12351235
}else{
12361236
// cup is required, no need to verify existence
12371237
const char* cup = get_escape(&nc->tcache, ESCAPE_CUP);
12381238
TiparmValue argv[] = {tiparm_int(y), tiparm_int(x)};
1239-
if(fbuf_emit(f, tiparm_s(cup, 2, argv))){
1239+
if(fbuf_emit_parm(f, tiparm_s(cup, 2, argv))){
12401240
return -1;
12411241
}
12421242
}
@@ -1871,7 +1871,7 @@ emit_scrolls(const tinfo* ti, int count, fbuf* f){
18711871
const char* indn = get_escape(ti, ESCAPE_INDN);
18721872
if(indn){
18731873
TiparmValue argv[] = {tiparm_int(count)};
1874-
if(fbuf_emit(f, tiparm_s(indn, 1, argv)) < 0){
1874+
if(fbuf_emit_parm(f, tiparm_s(indn, 1, argv)) < 0){
18751875
return -1;
18761876
}
18771877
return 0;
@@ -1883,7 +1883,7 @@ emit_scrolls(const tinfo* ti, int count, fbuf* f){
18831883
}
18841884
// fell through if we had no indn
18851885
while(count > 0){
1886-
if(fbuf_emit(f, ind) < 0){
1886+
if(fbuf_emit_parm(f, ind) < 0){
18871887
return -1;
18881888
}
18891889
--count;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ int reset_term_palette(const tinfo* ti, fbuf* f, unsigned touchedpalette){
105105
r = r * 1000 / 255;
106106
g = g * 1000 / 255;
107107
b = b * 1000 / 255;
108-
TiparmValue argv[] = {tiparm_int(z), tiparm_int(r), tiparm_int(g), tiparm_int(b),};
108+
TiparmValue argv[] = {tiparm_int(z), tiparm_int(r), tiparm_int(g), tiparm_int(b),};
109109

110-
if(fbuf_emit(f, tiparm_s(esc, 4, argv)) < 0){
110+
if(fbuf_emit_parm(f, tiparm_s(esc, 4, argv)) < 0){
111111
return -1;
112112
}
113113
}

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -734,12 +734,11 @@ term_bg_rgb8(const tinfo* ti, fbuf* f, unsigned r, unsigned g, unsigned b){
734734
// a single screen, start... combining close ones? For 8-color mode, simple
735735
// interpolation. I have no idea what to do for 88 colors. FIXME
736736
if(ti->caps.colors >= 256){
737-
TiparmValue argv[] = {tiparm_int(rgb_quantize_256(r, g, b))};
738-
return fbuf_emit(f, tiparm_s(setab, 1, argv));
737+
TiparmValue argv[] = {tiparm_int(rgb_quantize_256(r, g, b))};
738+
return fbuf_emit_parm(f, tiparm_s(setab, 1, argv));
739739
}else if(ti->caps.colors >= 8){
740-
TiparmValue argv[] = {tiparm_int(rgb_quantize_8(r, g, b))};
741-
742-
return fbuf_emit(f, tiparm_s(setab, 1, argv));
740+
TiparmValue argv[] = {tiparm_int(rgb_quantize_8(r, g, b))};
741+
return fbuf_emit_parm(f, tiparm_s(setab, 1, argv));
743742
}
744743
}
745744
}
@@ -763,10 +762,10 @@ int term_fg_rgb8(const tinfo* ti, fbuf* f, unsigned r, unsigned g, unsigned b){
763762
// interpolation. I have no idea what to do for 88 colors. FIXME
764763
if(ti->caps.colors >= 256){
765764
TiparmValue argv[] = {tiparm_int(rgb_quantize_256(r, g, b))};
766-
return fbuf_emit(f, tiparm_s(setaf, 1, argv));
765+
return fbuf_emit_parm(f, tiparm_s(setaf, 1, argv));
767766
}else if(ti->caps.colors >= 8){
768767
TiparmValue argv[] = {tiparm_int(rgb_quantize_8(r, g, b))};
769-
return fbuf_emit(f, tiparm_s(setaf, 1, argv));
768+
return fbuf_emit_parm(f, tiparm_s(setaf, 1, argv));
770769
}
771770
}
772771
}
@@ -787,8 +786,8 @@ update_palette(notcurses* nc, fbuf* f){
787786
r = r * 1000 / 255;
788787
g = g * 1000 / 255;
789788
b = b * 1000 / 255;
790-
TiparmValue argv[] = {tiparm_int(damageidx), tiparm_int(r), tiparm_int(g), tiparm_int(b),};
791-
if(fbuf_emit(f, tiparm_s(initc, 4, argv)) < 0){
789+
TiparmValue argv[] = {tiparm_int(damageidx), tiparm_int(r), tiparm_int(g), tiparm_int(b),};
790+
if(fbuf_emit_parm(f, tiparm_s(initc, 4, argv)) < 0){
792791
return -1;
793792
}
794793
nc->palette_damage[damageidx] = false;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1397,10 +1397,11 @@ int interrogate_terminfo(tinfo* ti, FILE* out, unsigned utf8,
13971397
loginfo("terminfo path for %s = %s", tname, terminfo_path);
13981398
if (terminfo_path) {
13991399
notcurses_terminfo = terminfo_load(terminfo_path);
1400-
if (terminfo_path) {
1400+
if (notcurses_terminfo) {
14011401
loginfo("names = %s", notcurses_terminfo->name);
14021402
} else {
14031403
logpanic("failed to load terminfo at %s", terminfo_path);
1404+
free(terminfo_path);
14041405
goto err;
14051406
}
14061407
free(terminfo_path);

src/third-party/notcurses/src/lib/termdesc.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,13 @@ term_emit(const char* seq, FILE* out, bool flush){
316316
return flush ? ncflush(out) : 0;
317317
}
318318

319+
static inline int
320+
term_emit_parm(const char* seq, FILE* out, bool flush){
321+
int retval = term_emit(seq, out, flush);
322+
free(seq);
323+
return retval;
324+
}
325+
319326
// |drain| is set iff we're draining input.
320327
int enter_alternate_screen(int ttyfd, FILE* ttyfp, tinfo* ti, unsigned drain);
321328
int leave_alternate_screen(int ttyfd, FILE* ttyfp, tinfo* ti, unsigned drain);

0 commit comments

Comments
 (0)