From 9076d69190007e263cadbffc480fb93b1ca27f9c Mon Sep 17 00:00:00 2001 From: Ciaran Woodward Date: Thu, 11 Sep 2025 16:20:00 +0000 Subject: [PATCH] gdb/tui: Fix build for older ncurses Older versions of ncurses (including the version that ships inside macos, and Centos 7) do not include the A_ITALIC macro. This patch simply hides any use of A_ITALIC behind a preprocessor guard. The result of this is that italics won't be rendered in the tui if ncurses isn't supported. We do have other options if we think it's important - for instance we could show italics as bold if italics aren't supported. From my understanding, that might be overthinking it - so I took the simplest approach here, just to fix the build. Those versions also define tgetnum as: int tgetnum(char *id); so attempting to compile for c++ results in the error: ISO C++ forbids converting a string constant to 'char*' [-Werror=write-strings] This is just a dated API issue, so a const cast resolves the issue. Approved-By: Tom Tromey --- gdb/tui/tui-io.c | 4 ++++ gdb/ui-style.c | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c index c97e8fd1717..84cad9366d5 100644 --- a/gdb/tui/tui-io.c +++ b/gdb/tui/tui-io.c @@ -319,7 +319,9 @@ tui_apply_style (WINDOW *w, ui_file_style style) wattron (w, A_NORMAL); wattroff (w, A_BOLD); wattroff (w, A_DIM); +#ifdef A_ITALIC wattroff (w, A_ITALIC); +#endif wattroff (w, A_UNDERLINE); wattroff (w, A_REVERSE); if (last_color_pair != -1) @@ -368,8 +370,10 @@ tui_apply_style (WINDOW *w, ui_file_style style) gdb_assert_not_reached ("invalid intensity"); } +#ifdef A_ITALIC if (style.is_italic ()) wattron (w, A_ITALIC); +#endif if (style.is_underline ()) wattron (w, A_UNDERLINE); diff --git a/gdb/ui-style.c b/gdb/ui-style.c index 9a58e4dd2ae..d450c3e6079 100644 --- a/gdb/ui-style.c +++ b/gdb/ui-style.c @@ -594,7 +594,11 @@ colorsupport () { std::vector result = {color_space::MONOCHROME}; - int colors = tgetnum ("Co"); + /* ncurses versions prior to 6.1 (and other curses + implementations) declare the tgetnum argument to be + 'char *', so we need the const_cast, since C++ will not + implicitly convert. */ + int colors = tgetnum (const_cast ("Co")); if (colors >= 8) result.push_back (color_space::ANSI_8COLOR); if (colors >= 16) -- 2.47.3