aboutsummaryrefslogtreecommitdiff
path: root/packages/ncurses/6.5/ncurses-6.5-20250125.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/ncurses/6.5/ncurses-6.5-20250125.patch')
-rw-r--r--packages/ncurses/6.5/ncurses-6.5-20250125.patch1785
1 files changed, 1785 insertions, 0 deletions
diff --git a/packages/ncurses/6.5/ncurses-6.5-20250125.patch b/packages/ncurses/6.5/ncurses-6.5-20250125.patch
new file mode 100644
index 00000000..cb142b96
--- /dev/null
+++ b/packages/ncurses/6.5/ncurses-6.5-20250125.patch
@@ -0,0 +1,1785 @@
+# ncurses 6.5 - patch 20250125 - Thomas E. Dickey
+#
+# ------------------------------------------------------------------------------
+#
+# Ncurses 6.5 is at
+# https://invisible-island.net/archives/ncurses/
+# https://invisible-mirror.net/archives/ncurses/
+# https://ftp.gnu.org/gnu/ncurses/
+#
+# Patches for ncurses 6.5 can be found at
+# https://invisible-island.net/archives/ncurses/6.5
+# https://invisible-mirror.net/archives/ncurses/6.5
+#
+# ------------------------------------------------------------------------------
+# https://invisible-island.net/archives/ncurses/6.5/ncurses-6.5-20250125.patch.gz
+# patch by Thomas E. Dickey <dickey@invisible-island.net>
+# created Sun Jan 26 00:34:44 UTC 2025
+# ------------------------------------------------------------------------------
+# Ada95/gen/gen.c | 6
+# Ada95/samples/sample-explanation.adb_p | 8
+# Ada95/src/terminal_interface-curses-forms.adb | 8
+# Ada95/src/terminal_interface-curses-menus.adb | 8
+# Ada95/src/terminal_interface-curses-panels-user_data.adb | 4
+# NEWS | 6
+# VERSION | 2
+# c++/cursesapp.cc | 22 +-
+# c++/cursesf.cc | 129 +++++++------
+# c++/cursesf.h | 42 ++--
+# c++/cursesm.cc | 112 ++++++-----
+# c++/cursesm.h | 42 ++--
+# c++/cursesp.cc | 8
+# c++/cursesp.h | 16 -
+# c++/cursespad.cc | 22 +-
+# c++/cursesw.cc | 42 ++--
+# c++/cursesw.h | 6
+# c++/demo.cc | 20 +-
+# c++/etip.h.in | 20 +-
+# dist.mk | 4
+# ncurses/base/lib_mouse.c | 24 +-
+# ncurses/base/lib_set_term.c | 6
+# ncurses/tty/lib_twait.c | 6
+# package/debian-mingw/changelog | 4
+# package/debian-mingw64/changelog | 4
+# package/debian/changelog | 4
+# package/mingw-ncurses.nsi | 4
+# package/mingw-ncurses.spec | 2
+# package/ncurses.spec | 2
+# package/ncursest.spec | 2
+# 30 files changed, 307 insertions(+), 278 deletions(-)
+# ------------------------------------------------------------------------------
+Index: Ada95/gen/gen.c
+Prereq: 1.79
+--- ncurses-6.5-20250118+/Ada95/gen/gen.c 2024-01-19 13:41:45.000000000 +0000
++++ ncurses-6.5-20250125/Ada95/gen/gen.c 2025-01-24 20:39:23.000000000 +0000
+@@ -1,5 +1,5 @@
+ /****************************************************************************
+- * Copyright 2020-2021,2024 Thomas E. Dickey *
++ * Copyright 2020-2024,2025 Thomas E. Dickey *
+ * Copyright 1998-2014,2016 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -35,7 +35,7 @@
+
+ /*
+ Version Control
+- $Id: gen.c,v 1.79 2024/01/19 13:41:45 tom Exp $
++ $Id: gen.c,v 1.80 2025/01/24 20:39:23 tom Exp $
+ --------------------------------------------------------------------------*/
+ /*
+ This program prints on its standard output the source for the
+@@ -189,7 +189,7 @@
+ int
+ main(int argc, const char *argv[])
+ {
+- FILE *fp = 0;
++ FILE *fp = NULL;
+ const int x = 0x12345678;
+
+ little_endian = (*((const char *)&x) == 0x78);
+Index: Ada95/samples/sample-explanation.adb_p
+--- ncurses-6.5-20250118+/Ada95/samples/sample-explanation.adb_p 2020-02-02 23:34:34.000000000 +0000
++++ ncurses-6.5-20250125/Ada95/samples/sample-explanation.adb_p 2025-01-24 20:39:23.000000000 +0000
+@@ -7,7 +7,7 @@
+ -- B O D Y --
+ -- --
+ ------------------------------------------------------------------------------
+--- Copyright 2019,2020 Thomas E. Dickey --
++-- Copyright 2019-2020,2025 Thomas E. Dickey --
+ -- --
+ -- Permission is hereby granted, free of charge, to any person obtaining a --
+ -- copy of this software and associated documentation files (the --
+@@ -35,8 +35,8 @@
+ ------------------------------------------------------------------------------
+ -- Author: Juergen Pfeifer, 1996
+ -- Version Control
+--- $Revision: 1.5 $
+--- $Date: 2020/02/02 23:34:34 $
++-- $Revision: 1.6 $
++-- $Date: 2025/01/24 20:39:23 $
+ -- Binding Version 01.00
+ ------------------------------------------------------------------------------
+ -- Poor mans help system. This scans a sequential file for key lines and
+@@ -136,7 +136,7 @@
+ H : Help_Line_Access := Top_Line;
+ begin
+ if Top_Line /= null then
+- for L in 0 .. (Height - 1) loop
++ for L in 0 .. Height - 1 loop
+ Add (W, L, 0, H.all.Line.all);
+ exit when H.all.Next = null;
+ H := H.all.Next;
+Index: Ada95/src/terminal_interface-curses-forms.adb
+--- ncurses-6.5-20250118+/Ada95/src/terminal_interface-curses-forms.adb 2020-02-02 23:34:34.000000000 +0000
++++ ncurses-6.5-20250125/Ada95/src/terminal_interface-curses-forms.adb 2025-01-24 20:39:23.000000000 +0000
+@@ -7,7 +7,7 @@
+ -- B O D Y --
+ -- --
+ ------------------------------------------------------------------------------
+--- Copyright 2020 Thomas E. Dickey --
++-- Copyright 2020,2025 Thomas E. Dickey --
+ -- Copyright 1999-2011,2014 Free Software Foundation, Inc. --
+ -- --
+ -- Permission is hereby granted, free of charge, to any person obtaining a --
+@@ -36,8 +36,8 @@
+ ------------------------------------------------------------------------------
+ -- Author: Juergen Pfeifer, 1996
+ -- Version Control:
+--- $Revision: 1.33 $
+--- $Date: 2020/02/02 23:34:34 $
++-- $Revision: 1.34 $
++-- $Date: 2025/01/24 20:39:23 $
+ -- Binding Version 01.00
+ ------------------------------------------------------------------------------
+ with Ada.Unchecked_Deallocation;
+@@ -1006,7 +1006,7 @@
+ (Field_Array, Field_Array_Access);
+ begin
+ if FA /= null and then Free_Fields then
+- for I in FA'First .. (FA'Last - 1) loop
++ for I in FA'First .. FA'Last - 1 loop
+ if FA.all (I) /= Null_Field then
+ Delete (FA.all (I));
+ end if;
+Index: Ada95/src/terminal_interface-curses-menus.adb
+--- ncurses-6.5-20250118+/Ada95/src/terminal_interface-curses-menus.adb 2020-02-02 23:34:34.000000000 +0000
++++ ncurses-6.5-20250125/Ada95/src/terminal_interface-curses-menus.adb 2025-01-24 20:39:23.000000000 +0000
+@@ -7,7 +7,7 @@
+ -- B O D Y --
+ -- --
+ ------------------------------------------------------------------------------
+--- Copyright 2018,2020 Thomas E. Dickey --
++-- Copyright 2018-2020,2025 Thomas E. Dickey --
+ -- Copyright 1999-2011,2014 Free Software Foundation, Inc. --
+ -- --
+ -- Permission is hereby granted, free of charge, to any person obtaining a --
+@@ -36,8 +36,8 @@
+ ------------------------------------------------------------------------------
+ -- Author: Juergen Pfeifer, 1996
+ -- Version Control:
+--- $Revision: 1.34 $
+--- $Date: 2020/02/02 23:34:34 $
++-- $Revision: 1.35 $
++-- $Date: 2025/01/24 20:39:23 $
+ -- Binding Version 01.00
+ ------------------------------------------------------------------------------
+ with Ada.Unchecked_Deallocation;
+@@ -878,7 +878,7 @@
+ (Item_Array, Item_Array_Access);
+ begin
+ if IA /= null and then Free_Items then
+- for I in IA'First .. (IA'Last - 1) loop
++ for I in IA'First .. IA'Last - 1 loop
+ if IA.all (I) /= Null_Item then
+ Delete (IA.all (I));
+ end if;
+Index: Ada95/src/terminal_interface-curses-panels-user_data.adb
+--- ncurses-6.5-20250118+/Ada95/src/terminal_interface-curses-panels-user_data.adb 2020-02-02 23:34:34.000000000 +0000
++++ ncurses-6.5-20250125/Ada95/src/terminal_interface-curses-panels-user_data.adb 2025-01-24 20:39:23.000000000 +0000
+@@ -7,7 +7,7 @@
+ -- B O D Y --
+ -- --
+ ------------------------------------------------------------------------------
+--- Copyright 2020 Thomas E. Dickey --
++-- Copyright 2020,2025 Thomas E. Dickey --
+ -- Copyright 1999-2003,2009 Free Software Foundation, Inc. --
+ -- --
+ -- Permission is hereby granted, free of charge, to any person obtaining a --
+@@ -36,7 +36,7 @@
+ ------------------------------------------------------------------------------
+ -- Author: Juergen Pfeifer, 1996
+ -- Version Control:
+--- $Revision: 1.13 $
++-- $Revision: 1.14 $
+ -- Binding Version 01.00
+ ------------------------------------------------------------------------------
+ with Interfaces.C;
+Index: NEWS
+Prereq: 1.4233
+--- ncurses-6.5-20250118+/NEWS 2025-01-19 01:24:13.000000000 +0000
++++ ncurses-6.5-20250125/NEWS 2025-01-25 21:30:09.000000000 +0000
+@@ -26,7 +26,7 @@
+ -- sale, use or other dealings in this Software without prior written --
+ -- authorization. --
+ -------------------------------------------------------------------------------
+--- $Id: NEWS,v 1.4233 2025/01/19 01:24:13 tom Exp $
++-- $Id: NEWS,v 1.4236 2025/01/25 21:30:09 tom Exp $
+ -------------------------------------------------------------------------------
+
+ This is a log of changes that ncurses has gone through since Zeyd started
+@@ -46,6 +46,10 @@
+ Changes through 1.9.9e did not credit all contributions;
+ it is not possible to add this information.
+
++20250125
++ + improve error-handling in c++ binding (report by Mingjie Shen).
++ + strict compiler-warning fixes for upcoming gcc15
++
+ 20250118
+ + improve pattern used for configure --with-xterm-kbs option (report by
+ Mingyu Wang)
+Index: VERSION
+--- ncurses-6.5-20250118+/VERSION 2025-01-18 11:23:10.000000000 +0000
++++ ncurses-6.5-20250125/VERSION 2025-01-25 10:34:16.000000000 +0000
+@@ -1 +1 @@
+-5:0:10 6.5 20250118
++5:0:10 6.5 20250125
+Index: c++/cursesapp.cc
+Prereq: 1.18
+--- ncurses-6.5-20250118+/c++/cursesapp.cc 2020-07-18 19:57:11.000000000 +0000
++++ ncurses-6.5-20250125/c++/cursesapp.cc 2025-01-25 21:20:17.000000000 +0000
+@@ -1,6 +1,6 @@
+ // * this is for making emacs happy: -*-Mode: C++;-*-
+ /****************************************************************************
+- * Copyright 2019,2020 Thomas E. Dickey *
++ * Copyright 2019-2020,2025 Thomas E. Dickey *
+ * Copyright 1998-2007,2008 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -36,7 +36,7 @@
+ #include "internal.h"
+ #include "cursesapp.h"
+
+-MODULE_ID("$Id: cursesapp.cc,v 1.18 2020/07/18 19:57:11 anonymous.maarten Exp $")
++MODULE_ID("$Id: cursesapp.cc,v 1.19 2025/01/25 21:20:17 tom Exp $")
+
+ void
+ NCursesApplication::init(bool bColors)
+@@ -65,9 +65,9 @@
+ Root_Window->bkgd(' '|window_backgrounds());
+ }
+
+-NCursesApplication* NCursesApplication::theApp = 0;
+-NCursesWindow* NCursesApplication::titleWindow = 0;
+-NCursesApplication::SLK_Link* NCursesApplication::slk_stack = 0;
++NCursesApplication* NCursesApplication::theApp = NULL;
++NCursesWindow* NCursesApplication::titleWindow = NULL;
++NCursesApplication::SLK_Link* NCursesApplication::slk_stack = NULL;
+
+
+ NCursesWindow *&NCursesApplication::getTitleWindow() {
+@@ -79,7 +79,7 @@
+ Soft_Label_Key_Set* S;
+
+ delete titleWindow;
+- titleWindow = 0;
++ titleWindow = NULL;
+
+ while( (S=top()) ) {
+ pop();
+@@ -87,7 +87,7 @@
+ }
+
+ delete Root_Window;
+- Root_Window = 0;
++ Root_Window = NULL;
+
+ ::endwin();
+ }
+@@ -105,7 +105,7 @@
+ void NCursesApplication::push(Soft_Label_Key_Set& S)
+ {
+ SLK_Link* L = new SLK_Link;
+- assert(L != 0);
++ assert(L != NULL);
+ L->prev = slk_stack;
+ L->SLKs = &S;
+ slk_stack = L;
+@@ -121,7 +121,7 @@
+ delete L;
+ if (Root_Window) {
+ Soft_Label_Key_Set* xx = top();
+- if (xx != 0)
++ if (xx != NULL)
+ xx->show();
+ }
+ }
+@@ -139,7 +139,7 @@
+ int NCursesApplication::operator()(void)
+ {
+ bool bColors = b_Colors;
+- Soft_Label_Key_Set* S = 0;
++ Soft_Label_Key_Set* S = NULL;
+
+ int ts = titlesize();
+ if (ts>0)
+@@ -147,7 +147,7 @@
+ Soft_Label_Key_Set::Label_Layout fmt = useSLKs();
+ if (fmt!=Soft_Label_Key_Set::None) {
+ S = new Soft_Label_Key_Set(fmt);
+- assert(S != 0);
++ assert(S != NULL);
+ init_labels(*S);
+ }
+
+Index: c++/cursesf.cc
+Prereq: 1.27
+--- ncurses-6.5-20250118+/c++/cursesf.cc 2024-10-05 22:47:12.000000000 +0000
++++ ncurses-6.5-20250125/c++/cursesf.cc 2025-01-25 21:20:17.000000000 +0000
+@@ -1,6 +1,6 @@
+ // * this is for making emacs happy: -*-Mode: C++;-*-
+ /****************************************************************************
+- * Copyright 2019-2021,2024 Thomas E. Dickey *
++ * Copyright 2019-2024,2025 Thomas E. Dickey *
+ * Copyright 1998-2005,2011 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -36,7 +36,7 @@
+ #include "cursesf.h"
+ #include "cursesapp.h"
+
+-MODULE_ID("$Id: cursesf.cc,v 1.27 2024/10/05 22:47:12 tom Exp $")
++MODULE_ID("$Id: cursesf.cc,v 1.28 2025/01/25 21:20:17 tom Exp $")
+
+ NCursesFormField::~NCursesFormField () THROWS(NCursesException)
+ {
+@@ -50,28 +50,34 @@
+ FIELD**
+ NCursesForm::mapFields(NCursesFormField* nfields[])
+ {
+- int fieldCount = 0,lcv;
++ int fieldCount = 0, lcv;
+ FIELD** old_fields;
+
+- assert(nfields != 0);
++ assert(nfields != NULL);
+
+ for (lcv=0; nfields[lcv]->field; ++lcv)
+ ++fieldCount;
+
+- FIELD** fields = new FIELD*[fieldCount + 1];
++ try {
++ FIELD** fields = new FIELD*[fieldCount + 1];
+
+- for (lcv=0;nfields[lcv]->field;++lcv) {
+- fields[lcv] = nfields[lcv]->field;
+- }
+- fields[lcv] = NULL;
++ for (lcv=0;nfields[lcv]->field;++lcv) {
++ fields[lcv] = nfields[lcv]->field;
++ }
++ fields[lcv] = NULL;
+
+- my_fields = nfields;
++ my_fields = nfields;
+
+- if (form && (old_fields = ::form_fields(form))) {
+- ::set_form_fields(form, static_cast<FIELD**>(0));
+- delete[] old_fields;
++ if (form && (old_fields = ::form_fields(form))) {
++ ::set_form_fields(form, static_cast<FIELD**>(0));
++ delete[] old_fields;
++ }
++ return fields;
+ }
+- return fields;
++ catch (std::bad_alloc const&) {
++ OnError (E_SYSTEM_ERROR);
++ }
++ return NULL;
+ }
+
+ void NCursesForm::setDefaultAttributes()
+@@ -108,46 +114,51 @@
+ bool with_frame,
+ bool autoDelete_Fields)
+ {
+- int mrows, mcols;
++ try {
++ int mrows, mcols;
+
+- keypad(TRUE);
+- meta(TRUE);
++ keypad(TRUE);
++ meta(TRUE);
+
+- b_framed = with_frame;
+- b_autoDelete = autoDelete_Fields;
++ b_framed = with_frame;
++ b_autoDelete = autoDelete_Fields;
+
+- form = static_cast<FORM*>(0);
+- form = ::new_form(mapFields(nfields));
+- if (!form)
+- OnError (E_SYSTEM_ERROR);
+-
+- UserHook* hook = new UserHook;
+- hook->m_user = NULL;
+- hook->m_back = this;
+- hook->m_owner = form;
+- ::set_form_userptr(form, reinterpret_cast<void*>(hook));
+-
+- ::set_form_init (form, _nc_xx_frm_init);
+- ::set_form_term (form, _nc_xx_frm_term);
+- ::set_field_init (form, _nc_xx_fld_init);
+- ::set_field_term (form, _nc_xx_fld_term);
+-
+- scale(mrows, mcols);
+- ::set_form_win(form, w);
+-
+- if (with_frame) {
+- if ((mrows > height()-2) || (mcols > width()-2))
+- OnError(E_NO_ROOM);
+- sub = new NCursesWindow(*this,mrows,mcols,1,1,'r');
+- ::set_form_sub(form, sub->w);
+- b_sub_owner = TRUE;
++ form = static_cast<FORM*>(0);
++ form = ::new_form(mapFields(nfields));
++ if (!form)
++ OnError (E_SYSTEM_ERROR);
++
++ UserHook* hook = new UserHook;
++ hook->m_user = NULL;
++ hook->m_back = this;
++ hook->m_owner = form;
++ ::set_form_userptr(form, reinterpret_cast<void*>(hook));
++
++ ::set_form_init (form, _nc_xx_frm_init);
++ ::set_form_term (form, _nc_xx_frm_term);
++ ::set_field_init (form, _nc_xx_fld_init);
++ ::set_field_term (form, _nc_xx_fld_term);
++
++ scale(mrows, mcols);
++ ::set_form_win(form, w);
++
++ if (with_frame) {
++ if ((mrows > height()-2) || (mcols > width()-2))
++ OnError(E_NO_ROOM);
++ sub = new NCursesWindow(*this,mrows,mcols,1,1,'r');
++ ::set_form_sub(form, sub->w);
++ b_sub_owner = TRUE;
++ }
++ else {
++ sub = static_cast<NCursesWindow*>(NULL);
++ b_sub_owner = FALSE;
++ }
++ options_on(O_NL_OVERLOAD);
++ setDefaultAttributes();
+ }
+- else {
+- sub = static_cast<NCursesWindow*>(0);
+- b_sub_owner = FALSE;
++ catch (std::bad_alloc const&) {
++ OnError (E_SYSTEM_ERROR);
+ }
+- options_on(O_NL_OVERLOAD);
+- setDefaultAttributes();
+ }
+
+ NCursesForm::~NCursesForm() THROWS(NCursesException)
+@@ -156,13 +167,13 @@
+ delete hook;
+ if (b_sub_owner) {
+ delete sub;
+- ::set_form_sub(form, static_cast<WINDOW *>(0));
++ ::set_form_sub(form, static_cast<WINDOW *>(NULL));
+ }
+ if (form) {
+ FIELD** fields = ::form_fields(form);
+ int cnt = count();
+
+- OnError(::set_form_fields(form, static_cast<FIELD**>(0)));
++ OnError(::set_form_fields(form, static_cast<FIELD**>(NULL)));
+
+ if (b_autoDelete) {
+ if (cnt>0) {
+@@ -381,19 +392,19 @@
+ {
+ (void) f;
+ NCursesFormField* F = reinterpret_cast<NCursesFormField*>(const_cast<void *>(u));
+- assert(F != 0);
++ assert(F != NULL);
+ UserDefinedFieldType* udf = reinterpret_cast<UserDefinedFieldType*>(F->fieldtype());
+- assert(udf != 0);
++ assert(udf != NULL);
+ return udf->field_check(*F);
+ }
+
+ bool _nc_xx_fld_ccheck(int c, const void *u)
+ {
+ NCursesFormField* F = reinterpret_cast<NCursesFormField*>(const_cast<void *>(u));
+- assert(F != 0);
++ assert(F != NULL);
+ UserDefinedFieldType* udf =
+ reinterpret_cast<UserDefinedFieldType*>(F->fieldtype());
+- assert(udf != 0);
++ assert(udf != NULL);
+ return udf->char_check(c);
+ }
+
+@@ -423,10 +434,10 @@
+ {
+ (void) f;
+ NCursesFormField* F = reinterpret_cast<NCursesFormField*>(const_cast<void *>(u));
+- assert(F != 0);
++ assert(F != NULL);
+ UserDefinedFieldType_With_Choice* udf =
+ reinterpret_cast<UserDefinedFieldType_With_Choice*>(F->fieldtype());
+- assert(udf != 0);
++ assert(udf != NULL);
+ return udf->next(*F);
+ }
+
+@@ -434,10 +445,10 @@
+ {
+ (void) f;
+ NCursesFormField* F = reinterpret_cast<NCursesFormField*>(const_cast<void *>(u));
+- assert(F != 0);
++ assert(F != NULL);
+ UserDefinedFieldType_With_Choice* udf =
+ reinterpret_cast<UserDefinedFieldType_With_Choice*>(F->fieldtype());
+- assert(udf != 0);
++ assert(udf != NULL);
+ return udf->previous(*F);
+ }
+
+Index: c++/cursesf.h
+Prereq: 1.40
+--- ncurses-6.5-20250118+/c++/cursesf.h 2024-10-05 22:47:12.000000000 +0000
++++ ncurses-6.5-20250125/c++/cursesf.h 2025-01-25 21:20:17.000000000 +0000
+@@ -1,7 +1,7 @@
+ // * This makes emacs happy -*-Mode: C++;-*-
+ // vile:cppmode
+ /****************************************************************************
+- * Copyright 2019-2022,2024 Thomas E. Dickey *
++ * Copyright 2019-2024,2025 Thomas E. Dickey *
+ * Copyright 1998-2012,2014 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -33,7 +33,7 @@
+ * Author: Juergen Pfeifer, 1997 *
+ ****************************************************************************/
+
+-// $Id: cursesf.h,v 1.40 2024/10/05 22:47:12 tom Exp $
++// $Id: cursesf.h,v 1.41 2025/01/25 21:20:17 tom Exp $
+
+ #ifndef NCURSES_CURSESF_H_incl
+ #define NCURSES_CURSESF_H_incl 1
+@@ -78,7 +78,7 @@
+
+ public:
+ NCursesFieldType()
+- : fieldtype(STATIC_CAST(FIELDTYPE*)(0))
++ : fieldtype(STATIC_CAST(FIELDTYPE*)(NULL))
+ {
+ }
+
+@@ -119,8 +119,8 @@
+ public:
+ // Create a 'Null' field. Can be used to delimit a field list
+ NCursesFormField()
+- : field(STATIC_CAST(FIELD*)(0)),
+- ftype(STATIC_CAST(NCursesFieldType*)(0))
++ : field(STATIC_CAST(FIELD*)(NULL)),
++ ftype(STATIC_CAST(NCursesFieldType*)(NULL))
+ {
+ }
+
+@@ -131,8 +131,8 @@
+ int first_col = 0,
+ int offscreen_rows = 0,
+ int additional_buffers = 0)
+- : field(0),
+- ftype(STATIC_CAST(NCursesFieldType*)(0))
++ : field(NULL),
++ ftype(STATIC_CAST(NCursesFieldType*)(NULL))
+ {
+ field = ::new_field(rows, ncols, first_row, first_col,
+ offscreen_rows, additional_buffers);
+@@ -363,7 +363,7 @@
+ // Get the backward pointer to the C++ object from a FORM
+ static inline NCursesForm* getHook(const FORM *f) {
+ UserHook* hook = reinterpret_cast<UserHook*>(::form_userptr(f));
+- assert(hook != 0 && hook->m_owner==f);
++ assert(hook != NULL && hook->m_owner==f);
+ return const_cast<NCursesForm*>(hook->m_back);
+ }
+
+@@ -379,13 +379,13 @@
+ // internal routines
+ inline void set_user(void *user) {
+ UserHook* uptr = reinterpret_cast<UserHook*>(::form_userptr (form));
+- assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==form);
++ assert (uptr != NULL && uptr->m_back==this && uptr->m_owner==form);
+ uptr->m_user = user;
+ }
+
+ inline void *get_user() {
+ const UserHook* uptr = reinterpret_cast<UserHook*>(::form_userptr (form));
+- assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==form);
++ assert (uptr != NULL && uptr->m_back==this && uptr->m_owner==form);
+ return uptr->m_user;
+ }
+
+@@ -408,12 +408,12 @@
+ int begin_y = 0,
+ int begin_x = 0)
+ : NCursesPanel(nlines, ncols, begin_y, begin_x),
+- form (STATIC_CAST(FORM*)(0)),
+- sub(0),
++ form (STATIC_CAST(FORM*)(NULL)),
++ sub(NULL),
+ b_sub_owner(0),
+ b_framed(0),
+ b_autoDelete(0),
+- my_fields(0)
++ my_fields(NULL)
+ {
+ }
+
+@@ -423,12 +423,12 @@
+ bool with_frame=FALSE, // reserve space for a frame?
+ bool autoDelete_Fields=FALSE) // do automatic cleanup?
+ : NCursesPanel(),
+- form(0),
+- sub(0),
++ form(NULL),
++ sub(NULL),
+ b_sub_owner(0),
+ b_framed(0),
+ b_autoDelete(0),
+- my_fields(0)
++ my_fields(NULL)
+ {
+ InitForm(Fields, with_frame, autoDelete_Fields);
+ }
+@@ -442,12 +442,12 @@
+ bool with_frame=FALSE, // reserve space for a frame?
+ bool autoDelete_Fields=FALSE) // do automatic cleanup?
+ : NCursesPanel(nlines, ncols, begin_y, begin_x),
+- form(0),
+- sub(0),
++ form(NULL),
++ sub(NULL),
+ b_sub_owner(0),
+ b_framed(0),
+ b_autoDelete(0),
+- my_fields(0)
++ my_fields(NULL)
+ {
+ InitForm(Fields, with_frame, autoDelete_Fields);
+ }
+@@ -681,7 +681,7 @@
+
+ public:
+ NCursesUserForm (NCursesFormField* Fields[],
+- const T* p_UserData = STATIC_CAST(T*)(0),
++ const T* p_UserData = STATIC_CAST(T*)(NULL),
+ bool with_frame=FALSE,
+ bool autoDelete_Fields=FALSE)
+ : NCursesForm (Fields, with_frame, autoDelete_Fields) {
+@@ -694,7 +694,7 @@
+ int ncols,
+ int begin_y = 0,
+ int begin_x = 0,
+- const T* p_UserData = STATIC_CAST(T*)(0),
++ const T* p_UserData = STATIC_CAST(T*)(NULL),
+ bool with_frame=FALSE,
+ bool autoDelete_Fields=FALSE)
+ : NCursesForm (Fields, nlines, ncols, begin_y, begin_x,
+Index: c++/cursesm.cc
+Prereq: 1.28
+--- ncurses-6.5-20250118+/c++/cursesm.cc 2024-10-05 22:47:12.000000000 +0000
++++ ncurses-6.5-20250125/c++/cursesm.cc 2025-01-25 21:20:17.000000000 +0000
+@@ -1,6 +1,6 @@
+ // * this is for making emacs happy: -*-Mode: C++;-*-
+ /****************************************************************************
+- * Copyright 2019-2021,2024 Thomas E. Dickey *
++ * Copyright 2019-2024,2025 Thomas E. Dickey *
+ * Copyright 1998-2011,2017 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -36,7 +36,7 @@
+ #include "cursesm.h"
+ #include "cursesapp.h"
+
+-MODULE_ID("$Id: cursesm.cc,v 1.28 2024/10/05 22:47:12 tom Exp $")
++MODULE_ID("$Id: cursesm.cc,v 1.29 2025/01/25 21:20:17 tom Exp $")
+
+ NCursesMenuItem::~NCursesMenuItem() THROWS(NCursesException)
+ {
+@@ -100,23 +100,28 @@
+ ITEM**
+ NCursesMenu::mapItems(NCursesMenuItem* nitems[])
+ {
+- int itemCount = 0,lcv;
++ try {
++ int itemCount = 0,lcv;
+
+- for (lcv=0; nitems[lcv]->item; ++lcv)
+- ++itemCount;
++ for (lcv=0; nitems[lcv]->item; ++lcv)
++ ++itemCount;
+
+- ITEM** itemArray = new ITEM*[itemCount + 1];
++ ITEM** itemArray = new ITEM*[itemCount + 1];
+
+- for (lcv=0;nitems[lcv]->item;++lcv) {
+- itemArray[lcv] = nitems[lcv]->item;
+- }
+- itemArray[lcv] = NULL;
++ for (lcv=0;nitems[lcv]->item;++lcv) {
++ itemArray[lcv] = nitems[lcv]->item;
++ }
++ itemArray[lcv] = NULL;
+
+- my_items = nitems;
++ my_items = nitems;
+
+- if (menu)
+- delete[] ::menu_items(menu);
+- return itemArray;
++ if (menu)
++ delete[] ::menu_items(menu);
++ return itemArray;
++ }
++ catch (std::bad_alloc const&) {
++ }
++ return NULL;
+ }
+
+ void
+@@ -124,45 +129,50 @@
+ bool with_frame,
+ bool autoDelete_Items)
+ {
+- int mrows, mcols;
+-
+- keypad(TRUE);
+- meta(TRUE);
++ try {
++ int mrows, mcols;
+
+- b_framed = with_frame;
+- b_autoDelete = autoDelete_Items;
++ keypad(TRUE);
++ meta(TRUE);
+
+- menu = static_cast<MENU*>(0);
+- menu = ::new_menu(mapItems(nitems));
+- if (!menu)
+- OnError (E_SYSTEM_ERROR);
++ b_framed = with_frame;
++ b_autoDelete = autoDelete_Items;
+
+- UserHook* hook = new UserHook;
+- hook->m_user = NULL;
+- hook->m_back = this;
+- hook->m_owner = menu;
+- ::set_menu_userptr(menu, static_cast<void*>(hook));
+-
+- ::set_menu_init (menu, _nc_xx_mnu_init);
+- ::set_menu_term (menu, _nc_xx_mnu_term);
+- ::set_item_init (menu, _nc_xx_itm_init);
+- ::set_item_term (menu, _nc_xx_itm_term);
+-
+- scale(mrows, mcols);
+- ::set_menu_win(menu, w);
+-
+- if (with_frame) {
+- if ((mrows > height()-2) || (mcols > width()-2))
+- OnError(E_NO_ROOM);
+- sub = new NCursesWindow(*this,mrows,mcols,1,1,'r');
+- ::set_menu_sub(menu, sub->w);
+- b_sub_owner = TRUE;
++ menu = static_cast<MENU*>(NULL);
++ menu = ::new_menu(mapItems(nitems));
++ if (!menu)
++ OnError (E_SYSTEM_ERROR);
++
++ UserHook* hook = new UserHook;
++ hook->m_user = NULL;
++ hook->m_back = this;
++ hook->m_owner = menu;
++ ::set_menu_userptr(menu, static_cast<void*>(hook));
++
++ ::set_menu_init (menu, _nc_xx_mnu_init);
++ ::set_menu_term (menu, _nc_xx_mnu_term);
++ ::set_item_init (menu, _nc_xx_itm_init);
++ ::set_item_term (menu, _nc_xx_itm_term);
++
++ scale(mrows, mcols);
++ ::set_menu_win(menu, w);
++
++ if (with_frame) {
++ if ((mrows > height()-2) || (mcols > width()-2))
++ OnError(E_NO_ROOM);
++ sub = new NCursesWindow(*this,mrows,mcols,1,1,'r');
++ ::set_menu_sub(menu, sub->w);
++ b_sub_owner = TRUE;
++ }
++ else {
++ sub = static_cast<NCursesWindow*>(NULL);
++ b_sub_owner = FALSE;
++ }
++ setDefaultAttributes();
+ }
+- else {
+- sub = static_cast<NCursesWindow*>(0);
+- b_sub_owner = FALSE;
++ catch (std::bad_alloc const&) {
++ OnError (E_SYSTEM_ERROR);
+ }
+- setDefaultAttributes();
+ }
+
+ void
+@@ -181,14 +191,14 @@
+ UserHook* hook = reinterpret_cast<UserHook*>(::menu_userptr(menu));
+ delete hook;
+ if (b_sub_owner) {
+- ::set_menu_sub(menu, static_cast<WINDOW *>(0));
++ ::set_menu_sub(menu, static_cast<WINDOW *>(NULL));
+ delete sub;
+ }
+ if (menu) {
+ ITEM** itms = ::menu_items(menu);
+ int cnt = count();
+
+- OnError(::set_menu_items(menu, static_cast<ITEM**>(0)));
++ OnError(::set_menu_items(menu, static_cast<ITEM**>(NULL)));
+
+ if (b_autoDelete) {
+ if (cnt>0) {
+@@ -322,7 +332,7 @@
+ if (drvCmnd == CMD_ACTION) {
+ if (options() & O_ONEVALUE) {
+ NCursesMenuItem* itm = current_item();
+- assert(itm != 0);
++ assert(itm != NULL);
+ if (itm->options() & O_SELECTABLE)
+ {
+ b_action = itm->action();
+Index: c++/cursesm.h
+Prereq: 1.36
+--- ncurses-6.5-20250118+/c++/cursesm.h 2024-10-05 22:47:12.000000000 +0000
++++ ncurses-6.5-20250125/c++/cursesm.h 2025-01-25 21:20:17.000000000 +0000
+@@ -1,6 +1,6 @@
+ // * This makes emacs happy -*-Mode: C++;-*-
+ /****************************************************************************
+- * Copyright 2019-2022,2024 Thomas E. Dickey *
++ * Copyright 2019-2024,2025 Thomas E. Dickey *
+ * Copyright 1998-2012,2014 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -32,7 +32,7 @@
+ * Author: Juergen Pfeifer, 1997 *
+ ****************************************************************************/
+
+-// $Id: cursesm.h,v 1.36 2024/10/05 22:47:12 tom Exp $
++// $Id: cursesm.h,v 1.37 2025/01/25 21:20:17 tom Exp $
+
+ #ifndef NCURSES_CURSESM_H_incl
+ #define NCURSES_CURSESM_H_incl 1
+@@ -62,9 +62,9 @@
+ public:
+ NCursesMenuItem (const char* p_name = NULL,
+ const char* p_descript = NULL)
+- : item(0)
++ : item(NULL)
+ {
+- item = p_name ? ::new_item (p_name, p_descript) : STATIC_CAST(ITEM*)(0);
++ item = p_name ? ::new_item (p_name, p_descript) : STATIC_CAST(ITEM*)(NULL);
+ if (p_name && !item)
+ OnError (E_SYSTEM_ERROR);
+ }
+@@ -81,7 +81,7 @@
+ }
+
+ NCursesMenuItem(const NCursesMenuItem& rhs)
+- : item(0)
++ : item(NULL)
+ {
+ (void) rhs;
+ }
+@@ -176,7 +176,7 @@
+
+ NCursesMenuCallbackItem(const NCursesMenuCallbackItem& rhs)
+ : NCursesMenuItem(rhs),
+- p_fct(0)
++ p_fct(NULL)
+ {
+ }
+
+@@ -224,7 +224,7 @@
+ // Get the backward pointer to the C++ object from a MENU
+ static inline NCursesMenu* getHook(const MENU *m) {
+ UserHook* hook = STATIC_CAST(UserHook*)(::menu_userptr(m));
+- assert(hook != 0 && hook->m_owner==m);
++ assert(hook != NULL && hook->m_owner==m);
+ return const_cast<NCursesMenu*>(hook->m_back);
+ }
+
+@@ -240,13 +240,13 @@
+ // internal routines
+ inline void set_user(void *user) {
+ UserHook* uptr = STATIC_CAST(UserHook*)(::menu_userptr (menu));
+- assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==menu);
++ assert (uptr != NULL && uptr->m_back==this && uptr->m_owner==menu);
+ uptr->m_user = user;
+ }
+
+ inline void *get_user() {
+ const UserHook* uptr = STATIC_CAST(UserHook*)(::menu_userptr (menu));
+- assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==menu);
++ assert (uptr != NULL && uptr->m_back==this && uptr->m_owner==menu);
+ return uptr->m_user;
+ }
+
+@@ -270,11 +270,11 @@
+ int begin_x = 0)
+ : NCursesPanel(nlines,ncols,begin_y,begin_x),
+ menu (STATIC_CAST(MENU*)(0)),
+- sub(0),
++ sub(NULL),
+ b_sub_owner(0),
+ b_framed(0),
+ b_autoDelete(0),
+- my_items(0)
++ my_items(NULL)
+ {
+ }
+
+@@ -284,12 +284,12 @@
+ bool with_frame=FALSE, // Reserve space for a frame?
+ bool autoDelete_Items=FALSE) // Autocleanup of Items?
+ : NCursesPanel(),
+- menu(0),
+- sub(0),
++ menu(NULL),
++ sub(NULL),
+ b_sub_owner(0),
+ b_framed(0),
+ b_autoDelete(0),
+- my_items(0)
++ my_items(NULL)
+ {
+ InitMenu(Items, with_frame, autoDelete_Items);
+ }
+@@ -303,12 +303,12 @@
+ bool with_frame=FALSE, // Reserve space for a frame?
+ bool autoDelete_Items=FALSE) // Autocleanup of Items?
+ : NCursesPanel(nlines, ncols, begin_y, begin_x),
+- menu(0),
+- sub(0),
++ menu(NULL),
++ sub(NULL),
+ b_sub_owner(0),
+ b_framed(0),
+ b_autoDelete(0),
+- my_items(0)
++ my_items(NULL)
+ {
+ InitMenu(Items, with_frame, autoDelete_Items);
+ }
+@@ -601,7 +601,7 @@
+ public:
+ NCursesUserItem (const char* p_name,
+ const char* p_descript = NULL,
+- const T* p_UserData = STATIC_CAST(T*)(0))
++ const T* p_UserData = STATIC_CAST(T*)(NULL))
+ : NCursesMenuItem (p_name, p_descript) {
+ if (item)
+ OnError (::set_item_userptr (item, const_cast<void *>(reinterpret_cast<const void*>(p_UserData))));
+@@ -630,7 +630,7 @@
+ int ncols,
+ int begin_y = 0,
+ int begin_x = 0,
+- const T* p_UserData = STATIC_CAST(T*)(0))
++ const T* p_UserData = STATIC_CAST(T*)(NULL))
+ : NCursesMenu(nlines,ncols,begin_y,begin_x) {
+ if (menu)
+ set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
+@@ -638,7 +638,7 @@
+
+ public:
+ NCursesUserMenu (NCursesMenuItem* Items[],
+- const T* p_UserData = STATIC_CAST(T*)(0),
++ const T* p_UserData = STATIC_CAST(T*)(NULL),
+ bool with_frame=FALSE,
+ bool autoDelete_Items=FALSE)
+ : NCursesMenu (Items, with_frame, autoDelete_Items) {
+@@ -651,7 +651,7 @@
+ int ncols,
+ int begin_y = 0,
+ int begin_x = 0,
+- const T* p_UserData = STATIC_CAST(T*)(0),
++ const T* p_UserData = STATIC_CAST(T*)(NULL),
+ bool with_frame=FALSE)
+ : NCursesMenu (Items, nlines, ncols, begin_y, begin_x, with_frame) {
+ if (menu)
+Index: c++/cursesp.cc
+Prereq: 1.28
+--- ncurses-6.5-20250118+/c++/cursesp.cc 2024-10-05 22:47:12.000000000 +0000
++++ ncurses-6.5-20250125/c++/cursesp.cc 2025-01-25 21:20:17.000000000 +0000
+@@ -1,6 +1,6 @@
+ // * this is for making emacs happy: -*-Mode: C++;-*-
+ /****************************************************************************
+- * Copyright 2019-2020,2024 Thomas E. Dickey *
++ * Copyright 2019-2024,2025 Thomas E. Dickey *
+ * Copyright 1998-2003,2005 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -35,9 +35,9 @@
+ #include "internal.h"
+ #include "cursesp.h"
+
+-MODULE_ID("$Id: cursesp.cc,v 1.28 2024/10/05 22:47:12 tom Exp $")
++MODULE_ID("$Id: cursesp.cc,v 1.29 2025/01/25 21:20:17 tom Exp $")
+
+-NCursesPanel* NCursesPanel::dummy = static_cast<NCursesPanel*>(0);
++NCursesPanel* NCursesPanel::dummy = static_cast<NCursesPanel*>(NULL);
+
+ void NCursesPanel::init()
+ {
+@@ -55,7 +55,7 @@
+ NCursesPanel::~NCursesPanel() THROWS(NCursesException)
+ {
+ UserHook* hook = UserPointer();
+- assert(hook != 0 && hook->m_back==this && hook->m_owner==p);
++ assert(hook != NULL && hook->m_back==this && hook->m_owner==p);
+ delete hook;
+ ::del_panel(p);
+ ::update_panels();
+Index: c++/cursesp.h
+Prereq: 1.36
+--- ncurses-6.5-20250118+/c++/cursesp.h 2022-08-20 20:52:15.000000000 +0000
++++ ncurses-6.5-20250125/c++/cursesp.h 2025-01-25 21:20:17.000000000 +0000
+@@ -1,7 +1,7 @@
+ // * This makes emacs happy -*-Mode: C++;-*-
+ // vile:cppmode
+ /****************************************************************************
+- * Copyright 2019-2021,2022 Thomas E. Dickey *
++ * Copyright 2019-2022,2025 Thomas E. Dickey *
+ * Copyright 1998-2012,2014 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -36,7 +36,7 @@
+ #ifndef NCURSES_CURSESP_H_incl
+ #define NCURSES_CURSESP_H_incl 1
+
+-// $Id: cursesp.h,v 1.36 2022/08/20 20:52:15 tom Exp $
++// $Id: cursesp.h,v 1.37 2025/01/25 21:20:17 tom Exp $
+
+ #include <cursesw.h>
+
+@@ -73,7 +73,7 @@
+ void set_user(void *user)
+ {
+ UserHook* uptr = UserPointer();
+- if (uptr != 0 && uptr->m_back==this && uptr->m_owner==p) {
++ if (uptr != NULL && uptr->m_back==this && uptr->m_owner==p) {
+ uptr->m_user = user;
+ }
+ }
+@@ -82,8 +82,8 @@
+ void *get_user()
+ {
+ UserHook* uptr = UserPointer();
+- void *result = 0;
+- if (uptr != 0 && uptr->m_back==this && uptr->m_owner==p)
++ void *result = NULL;
++ if (uptr != NULL && uptr->m_back==this && uptr->m_owner==p)
+ result = uptr->m_user;
+ return result;
+ }
+@@ -104,14 +104,14 @@
+ int ncols,
+ int begin_y = 0,
+ int begin_x = 0)
+- : NCursesWindow(nlines,ncols,begin_y,begin_x), p(0)
++ : NCursesWindow(nlines,ncols,begin_y,begin_x), p(NULL)
+ {
+ init();
+ }
+ // Create a panel with this size starting at the requested position.
+
+ NCursesPanel()
+- : NCursesWindow(::stdscr), p(0)
++ : NCursesWindow(::stdscr), p(NULL)
+ {
+ init();
+ }
+@@ -244,7 +244,7 @@
+ // This creates an user panel of the requested size with associated
+ // user data pointed to by p_UserData.
+
+- explicit NCursesUserPanel(const T* p_UserData = STATIC_CAST(T*)(0)) : NCursesPanel()
++ explicit NCursesUserPanel(const T* p_UserData = STATIC_CAST(T*)(NULL)) : NCursesPanel()
+ {
+ if (p)
+ set_user(const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
+Index: c++/cursespad.cc
+Prereq: 1.19
+--- ncurses-6.5-20250118+/c++/cursespad.cc 2024-10-05 22:47:12.000000000 +0000
++++ ncurses-6.5-20250125/c++/cursespad.cc 2025-01-25 21:21:05.000000000 +0000
+@@ -1,6 +1,6 @@
+ // * this is for making emacs happy: -*-Mode: C++;-*-
+ /****************************************************************************
+- * Copyright 2020,2024 Thomas E. Dickey *
++ * Copyright 2020-2024,2025 Thomas E. Dickey *
+ * Copyright 1999-2012,2013 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -36,17 +36,17 @@
+
+ #include <cursesw.h>
+
+-MODULE_ID("$Id: cursespad.cc,v 1.19 2024/10/05 22:47:12 tom Exp $")
++MODULE_ID("$Id: cursespad.cc,v 1.20 2025/01/25 21:21:05 tom Exp $")
+
+ NCursesPad::NCursesPad(int nlines, int ncols)
+ : NCursesWindow(),
+- viewWin(static_cast<NCursesWindow*>(0)),
+- viewSub(static_cast<NCursesWindow*>(0)),
++ viewWin(static_cast<NCursesWindow*>(NULL)),
++ viewSub(static_cast<NCursesWindow*>(NULL)),
+ h_gridsize(0), v_gridsize(0),
+ min_row(0), min_col(0)
+ {
+ w = ::newpad(nlines, ncols);
+- if (static_cast<WINDOW*>(0) == w) {
++ if (static_cast<WINDOW*>(NULL) == w) {
+ count--;
+ err_handler("Cannot construct window");
+ }
+@@ -85,7 +85,7 @@
+ {
+ NCursesWindow* W = Win();
+
+- if (static_cast<NCursesWindow*>(0) != W) {
++ if (static_cast<NCursesWindow*>(NULL) != W) {
+ int Width = W->width();
+ int Height = W->height();
+
+@@ -170,7 +170,7 @@
+ int NCursesPad::refresh()
+ {
+ int res = noutrefresh();
+- if (res==OK && (static_cast<NCursesWindow*>(0) != viewWin)) {
++ if (res==OK && (static_cast<NCursesWindow*>(NULL) != viewWin)) {
+ res = (viewWin->refresh());
+ }
+ return(res);
+@@ -180,7 +180,7 @@
+ {
+ int res = OK;
+ NCursesWindow* W = Win();
+- if (static_cast<NCursesWindow*>(0) != W) {
++ if (static_cast<NCursesWindow*>(NULL) != W) {
+ int high = W->maxy();
+ int wide = W->maxx();
+ res = copywin(*W, min_row, min_col,
+@@ -210,9 +210,9 @@
+
+ void NCursesPad::setSubWindow(NCursesWindow& sub)
+ {
+- if (static_cast<NCursesWindow*>(0) == viewWin)
++ if (static_cast<NCursesWindow*>(NULL) == viewWin)
+ err_handler("Pad has no viewport");
+- assert(viewWin != 0);
++ assert(viewWin != NULL);
+ if (!viewWin->isDescendant(sub))
+ THROW(new NCursesException("NCursesFramePad", E_SYSTEM_ERROR));
+ viewSub = &sub;
+@@ -224,7 +224,7 @@
+ const NCursesWindow* W = Win();
+ NCursesWindow* W2 = getWindow();
+
+- if ((static_cast<NCursesWindow*>(0) != W) && (static_cast<NCursesWindow*>(0) != W2)) {
++ if ((static_cast<NCursesWindow*>(NULL) != W) && (static_cast<NCursesWindow*>(NULL) != W2)) {
+ int Width = W->width();
+ int Height = W->height();
+ int i, row, col, h_len, v_len;
+Index: c++/cursesw.cc
+Prereq: 1.56
+--- ncurses-6.5-20250118+/c++/cursesw.cc 2020-02-02 23:34:34.000000000 +0000
++++ ncurses-6.5-20250125/c++/cursesw.cc 2025-01-25 21:21:05.000000000 +0000
+@@ -1,6 +1,6 @@
+ // * this is for making emacs happy: -*-Mode: C++;-*-
+ /****************************************************************************
+- * Copyright 2019,2020 Thomas E. Dickey *
++ * Copyright 2019-2020,2025 Thomas E. Dickey *
+ * Copyright 1998-2012,2014 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -43,7 +43,7 @@
+ #include "internal.h"
+ #include "cursesw.h"
+
+-MODULE_ID("$Id: cursesw.cc,v 1.56 2020/02/02 23:34:34 tom Exp $")
++MODULE_ID("$Id: cursesw.cc,v 1.57 2025/01/25 21:21:05 tom Exp $")
+
+ #define COLORS_NEED_INITIALIZATION -1
+ #define COLORS_NOT_INITIALIZED 0
+@@ -188,27 +188,27 @@
+ }
+
+ NCursesWindow::NCursesWindow()
+- : w(0), alloced(FALSE), par(0), subwins(0), sib(0)
++ : w(NULL), alloced(FALSE), par(NULL), subwins(NULL), sib(NULL)
+ {
+ constructing();
+
+- w = static_cast<WINDOW *>(0);
++ w = static_cast<WINDOW *>(NULL);
+ }
+
+ NCursesWindow::NCursesWindow(int nlines, int ncols, int begin_y, int begin_x)
+- : w(0), alloced(TRUE), par(0), subwins(0), sib(0)
++ : w(NULL), alloced(TRUE), par(NULL), subwins(NULL), sib(NULL)
+ {
+ constructing();
+
+ w = ::newwin(nlines, ncols, begin_y, begin_x);
+- if (w == 0) {
++ if (w == NULL) {
+ err_handler("Cannot construct window");
+ }
+ set_keyboard();
+ }
+
+ NCursesWindow::NCursesWindow(WINDOW* window)
+- : w(0), alloced(FALSE), par(0), subwins(0), sib(0)
++ : w(NULL), alloced(FALSE), par(NULL), subwins(NULL), sib(NULL)
+ {
+ constructing();
+
+@@ -223,7 +223,7 @@
+
+ NCursesWindow::NCursesWindow(NCursesWindow& win, int ny, int nx,
+ int begin_y, int begin_x, char absrel)
+- : w(0), alloced(TRUE), par(0), subwins(0), sib(0)
++ : w(NULL), alloced(TRUE), par(NULL), subwins(NULL), sib(NULL)
+ {
+ constructing();
+ if (absrel == 'a') { // absolute origin
+@@ -234,7 +234,7 @@
+ // Link this window into its parent's list of subwindows.
+ // We use derwin(), since this also works for pads.
+ w = ::derwin(win.w, ny, nx, begin_y, begin_x);
+- if (w == 0) {
++ if (w == NULL) {
+ err_handler("Cannot construct subwindow");
+ }
+
+@@ -245,20 +245,20 @@
+
+ NCursesWindow::NCursesWindow(NCursesWindow& win,
+ bool do_box NCURSES_PARAM_INIT(TRUE))
+- : w(0), alloced(TRUE), par(0), subwins(0), sib(0)
++ : w(NULL), alloced(TRUE), par(NULL), subwins(NULL), sib(NULL)
+ {
+ constructing();
+ int myHeight = win.height();
+ int myWidth = win.width();
+ w = :: derwin(win.w, myHeight - 2, myWidth - 2, 1, 1);
+- if (w == 0) {
++ if (w == NULL) {
+ err_handler("Cannot construct subwindow");
+ }
+
+ par = &win;
+ sib = win.subwins;
+ win.subwins = this;
+- subwins = 0;
++ subwins = NULL;
+
+ if (do_box) {
+ win.box();
+@@ -283,7 +283,7 @@
+ static RIPOFFINIT* prip = R_INIT;
+
+ NCursesWindow::NCursesWindow(WINDOW *win, int ncols)
+- : w(0), alloced(FALSE), par(0), subwins(0), sib(0)
++ : w(NULL), alloced(FALSE), par(NULL), subwins(NULL), sib(NULL)
+ {
+ (void) ncols;
+ initialize();
+@@ -331,12 +331,12 @@
+ {
+ NCursesWindow* p = subwins;
+
+- subwins = 0;
+- while (p != 0) {
++ subwins = NULL;
++ while (p != NULL) {
+ NCursesWindow* q = p->sib;
+ p->kill_subwindows();
+ if (p->alloced) {
+- if (p->w != 0)
++ if (p->w != NULL)
+ ::delwin(p->w);
+ }
+ delete p;
+@@ -349,13 +349,13 @@
+ {
+ kill_subwindows();
+
+- if (par != 0) {
++ if (par != NULL) {
+ // Remove this window from the parent's list of subwindows.
+ NCursesWindow * next = par->subwins;
+- NCursesWindow * prev = 0;
+- while (next != 0) {
++ NCursesWindow * prev = NULL;
++ while (next != NULL) {
+ if (next == this) {
+- if (prev != 0) {
++ if (prev != NULL) {
+ prev->sib = next->sib;
+ } else {
+ par->subwins = next->sib;
+@@ -367,7 +367,7 @@
+ }
+ }
+
+- if (alloced && w != 0)
++ if (alloced && w != NULL)
+ ::delwin(w);
+
+ if (alloced) {
+Index: c++/cursesw.h
+Prereq: 1.61
+--- ncurses-6.5-20250118+/c++/cursesw.h 2024-12-15 16:06:49.000000000 +0000
++++ ncurses-6.5-20250125/c++/cursesw.h 2025-01-25 21:21:05.000000000 +0000
+@@ -1,7 +1,7 @@
+ // * This makes emacs happy -*-Mode: C++;-*-
+ // vile:cppmode
+ /****************************************************************************
+- * Copyright 2019-2022,2024 Thomas E. Dickey *
++ * Copyright 2019-2024,2025 Thomas E. Dickey *
+ * Copyright 1998-2014,2017 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -32,7 +32,7 @@
+ #ifndef NCURSES_CURSESW_H_incl
+ #define NCURSES_CURSESW_H_incl 1
+
+-// $Id: cursesw.h,v 1.61 2024/12/15 16:06:49 tom Exp $
++// $Id: cursesw.h,v 1.62 2025/01/25 21:21:05 tom Exp $
+
+ #include <curses.h>
+
+@@ -1439,7 +1439,7 @@
+
+ NCursesWindow* Win(void) const {
+ // Get the window into which the pad should be copied (if any)
+- return (viewSub?viewSub:(viewWin?viewWin:0));
++ return (viewSub?viewSub:(viewWin?viewWin:NULL));
+ }
+
+ NCursesWindow* getWindow(void) const {
+Index: c++/demo.cc
+Prereq: 1.52
+--- ncurses-6.5-20250118+/c++/demo.cc 2023-08-26 19:14:14.000000000 +0000
++++ ncurses-6.5-20250125/c++/demo.cc 2025-01-25 21:21:05.000000000 +0000
+@@ -1,6 +1,6 @@
+ // * This makes emacs happy -*-Mode: C++;-*-
+ /****************************************************************************
+- * Copyright 2018-2021,2023 Thomas E. Dickey *
++ * Copyright 2018-2023,2025 Thomas E. Dickey *
+ * Copyright 1998-2012,2017 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -36,7 +36,7 @@
+ * Demo code for NCursesMenu and NCursesForm written by
+ * Juergen Pfeifer
+ *
+- * $Id: demo.cc,v 1.52 2023/08/26 19:14:14 tom Exp $
++ * $Id: demo.cc,v 1.53 2025/01/25 21:21:05 tom Exp $
+ */
+
+ #include "internal.h"
+@@ -174,7 +174,7 @@
+ public:
+ MyAction (const char* p_name,
+ const T* p_UserData)
+- : NCursesUserItem<T>(p_name, static_cast<const char*>(0), p_UserData)
++ : NCursesUserItem<T>(p_name, static_cast<const char*>(NULL), p_UserData)
+ {}
+
+ virtual ~MyAction() THROWS(NCursesException) {}
+@@ -244,10 +244,10 @@
+ public:
+ TestForm()
+ : NCursesForm(13, 51, (lines() - 15)/2, (cols() - 53)/2),
+- F(0),
+- mft(0),
+- ift(0),
+- eft(0)
++ F(NULL),
++ mft(NULL),
++ ift(NULL),
++ eft(NULL)
+ {
+
+ F = new NCursesFormField*[10];
+@@ -289,7 +289,7 @@
+ }
+
+ TestForm(const TestForm& rhs)
+- : NCursesForm(rhs), F(0), mft(0), ift(0), eft(0)
++ : NCursesForm(rhs), F(NULL), mft(NULL), ift(NULL), eft(NULL)
+ {
+ }
+
+@@ -438,7 +438,7 @@
+ public:
+ MyMenu ()
+ : NCursesMenu (n_items+2, 8, (lines()-10)/2, (cols()-10)/2),
+- P(0), I(0), u(0)
++ P(NULL), I(NULL), u(NULL)
+ {
+ u = new UserData(1);
+ I = new NCursesMenuItem*[1+n_items];
+@@ -467,7 +467,7 @@
+ }
+
+ MyMenu(const MyMenu& rhs)
+- : NCursesMenu(rhs), P(0), I(0), u(0)
++ : NCursesMenu(rhs), P(NULL), I(NULL), u(NULL)
+ {
+ }
+
+Index: c++/etip.h.in
+Prereq: 1.51
+--- ncurses-6.5-20250118+/c++/etip.h.in 2024-12-14 19:08:16.000000000 +0000
++++ ncurses-6.5-20250125/c++/etip.h.in 2025-01-25 22:19:42.000000000 +0000
+@@ -1,6 +1,6 @@
+ // * This makes emacs happy -*-Mode: C++;-*-
+ /****************************************************************************
+- * Copyright 2018-2022,2024 Thomas E. Dickey *
++ * Copyright 2018-2024,2025 Thomas E. Dickey *
+ * Copyright 1998-2012,2017 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -32,7 +32,7 @@
+ * Author: Juergen Pfeifer, 1997 *
+ ****************************************************************************/
+
+-// $Id: etip.h.in,v 1.51 2024/12/14 19:08:16 tom Exp $
++// $Id: etip.h.in,v 1.53 2025/01/25 22:19:42 tom Exp $
+
+ #ifndef NCURSES_ETIP_H_incl
+ #define NCURSES_ETIP_H_incl 1
+@@ -94,6 +94,8 @@
+ # endif
+ #endif
+
++#include <exception>
++
+ #if defined(__GNUG__)
+ # if HAVE_BUILTIN_H || HAVE_GXX_BUILTIN_H || HAVE_GPP_BUILTIN_H
+ # if ETIP_NEEDS_MATH_H
+@@ -114,6 +116,8 @@
+ # endif
+ # undef exception
+ # endif
++#elif defined __CLANG
++# include <exception>
+ #elif defined (__SUNPRO_CC)
+ # include <generic.h>
+ #endif
+@@ -206,7 +210,7 @@
+
+ NCursesPanelException (const char *msg, int err) :
+ NCursesException (msg, err),
+- p (0)
++ p (NULL)
+ {};
+
+ NCursesPanelException (const NCursesPanel* panel,
+@@ -218,7 +222,7 @@
+
+ explicit NCursesPanelException (int err) :
+ NCursesException ("panel library error", err),
+- p (0)
++ p (NULL)
+ {};
+
+ NCursesPanelException (const NCursesPanel* panel,
+@@ -257,7 +261,7 @@
+
+ NCursesMenuException (const char *msg, int err) :
+ NCursesException (msg, err),
+- m (0)
++ m (NULL)
+ {};
+
+ NCursesMenuException (const NCursesMenu* menu,
+@@ -269,7 +273,7 @@
+
+ explicit NCursesMenuException (int err) :
+ NCursesException ("menu library error", err),
+- m (0)
++ m (NULL)
+ {};
+
+ NCursesMenuException (const NCursesMenu* menu,
+@@ -308,7 +312,7 @@
+
+ NCursesFormException (const char *msg, int err) :
+ NCursesException (msg, err),
+- f (0)
++ f (NULL)
+ {};
+
+ NCursesFormException (const NCursesForm* form,
+@@ -320,7 +324,7 @@
+
+ explicit NCursesFormException (int err) :
+ NCursesException ("form library error", err),
+- f (0)
++ f (NULL)
+ {};
+
+ NCursesFormException (const NCursesForm* form,
+Index: dist.mk
+Prereq: 1.1651
+--- ncurses-6.5-20250118+/dist.mk 2025-01-18 11:23:10.000000000 +0000
++++ ncurses-6.5-20250125/dist.mk 2025-01-25 10:34:16.000000000 +0000
+@@ -26,7 +26,7 @@
+ # use or other dealings in this Software without prior written #
+ # authorization. #
+ ##############################################################################
+-# $Id: dist.mk,v 1.1651 2025/01/18 11:23:10 tom Exp $
++# $Id: dist.mk,v 1.1652 2025/01/25 10:34:16 tom Exp $
+ # Makefile for creating ncurses distributions.
+ #
+ # This only needs to be used directly as a makefile by developers, but
+@@ -38,7 +38,7 @@
+ # These define the major/minor/patch versions of ncurses.
+ NCURSES_MAJOR = 6
+ NCURSES_MINOR = 5
+-NCURSES_PATCH = 20250118
++NCURSES_PATCH = 20250125
+
+ # We don't append the patch to the version, since this only applies to releases
+ VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
+Index: ncurses/base/lib_mouse.c
+Prereq: 1.205
+--- ncurses-6.5-20250118+/ncurses/base/lib_mouse.c 2025-01-18 15:01:47.000000000 +0000
++++ ncurses-6.5-20250125/ncurses/base/lib_mouse.c 2025-01-22 23:13:51.000000000 +0000
+@@ -85,7 +85,7 @@
+ #define CUR SP_TERMTYPE
+ #endif
+
+-MODULE_ID("$Id: lib_mouse.c,v 1.205 2025/01/18 15:01:47 tom Exp $")
++MODULE_ID("$Id: lib_mouse.c,v 1.206 2025/01/22 23:13:51 tom Exp $")
+
+ #include <tic.h>
+
+@@ -483,8 +483,8 @@
+ if (NC_ISATTY(fileno(stdout))) {
+ const char *list = getenv("NCURSES_GPM_TERMS");
+ const char *env = getenv("TERM");
+- if (list != 0) {
+- if (env != 0) {
++ if (list != NULL) {
++ if (env != NULL) {
+ result = _nc_name_match(list, env, "|:") ? TRUE : FALSE;
+ }
+ } else {
+@@ -495,7 +495,7 @@
+ * capability. Perhaps that works for someone. If so, they can
+ * set the environment variable (above).
+ */
+- if (env != 0 && strstr(env, "linux") != 0) {
++ if (env != NULL && strstr(env, "linux") != NULL) {
+ result = TRUE;
+ }
+ }
+@@ -507,7 +507,7 @@
+ static void
+ unload_gpm_library(SCREEN *sp)
+ {
+- if (sp->_dlopen_gpm != 0) {
++ if (sp->_dlopen_gpm != NULL) {
+ T(("unload GPM library"));
+ sp->_mouse_gpm_loaded = FALSE;
+ sp->_mouse_fd = -1;
+@@ -522,25 +522,25 @@
+ /*
+ * If we already had a successful dlopen, reuse it.
+ */
+- if (sp->_dlopen_gpm != 0) {
++ if (sp->_dlopen_gpm != NULL) {
+ sp->_mouse_gpm_found = TRUE;
+ sp->_mouse_gpm_loaded = TRUE;
+- } else if ((sp->_dlopen_gpm = dlopen(LIBGPM_SONAME, my_RTLD)) != 0) {
++ } else if ((sp->_dlopen_gpm = dlopen(LIBGPM_SONAME, my_RTLD)) != NULL) {
+ #if (defined(__GNUC__) && (__GNUC__ >= 5)) || defined(__clang__)
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpedantic"
+ #endif
+- if (GET_DLSYM(gpm_fd) == 0 ||
+- GET_DLSYM(Gpm_Open) == 0 ||
+- GET_DLSYM(Gpm_Close) == 0 ||
+- GET_DLSYM(Gpm_GetEvent) == 0) {
++ if (GET_DLSYM(gpm_fd) == NULL ||
++ GET_DLSYM(Gpm_Open) == NULL ||
++ GET_DLSYM(Gpm_Close) == NULL ||
++ GET_DLSYM(Gpm_GetEvent) == NULL) {
+ #if (defined(__GNUC__) && (__GNUC__ >= 5)) || defined(__clang__)
+ #pragma GCC diagnostic pop
+ #endif
+ T(("GPM initialization failed: %s", dlerror()));
+ unload_gpm_library(sp);
+ dlclose(sp->_dlopen_gpm);
+- sp->_dlopen_gpm = 0;
++ sp->_dlopen_gpm = NULL;
+ } else {
+ sp->_mouse_gpm_found = TRUE;
+ sp->_mouse_gpm_loaded = TRUE;
+Index: ncurses/base/lib_set_term.c
+Prereq: 1.192
+--- ncurses-6.5-20250118+/ncurses/base/lib_set_term.c 2025-01-12 00:41:56.000000000 +0000
++++ ncurses-6.5-20250125/ncurses/base/lib_set_term.c 2025-01-22 23:13:27.000000000 +0000
+@@ -57,7 +57,7 @@
+ #undef CUR
+ #define CUR SP_TERMTYPE
+
+-MODULE_ID("$Id: lib_set_term.c,v 1.192 2025/01/12 00:41:56 tom Exp $")
++MODULE_ID("$Id: lib_set_term.c,v 1.193 2025/01/22 23:13:27 tom Exp $")
+
+ #ifdef USE_TERM_DRIVER
+ #define MaxColors InfoOf(sp).maxcolors
+@@ -217,9 +217,9 @@
+ }
+ #if USE_GPM_SUPPORT
+ #ifdef HAVE_LIBDL
+- if (sp->_dlopen_gpm != 0) {
++ if (sp->_dlopen_gpm != NULL) {
+ dlclose(sp->_dlopen_gpm);
+- sp->_dlopen_gpm = 0;
++ sp->_dlopen_gpm = NULL;
+ }
+ #endif
+ #endif /* USE_GPM_SUPPORT */
+Index: ncurses/tty/lib_twait.c
+Prereq: 1.83
+--- ncurses-6.5-20250118+/ncurses/tty/lib_twait.c 2024-12-07 21:02:00.000000000 +0000
++++ ncurses-6.5-20250125/ncurses/tty/lib_twait.c 2025-01-24 20:39:23.000000000 +0000
+@@ -1,5 +1,5 @@
+ /****************************************************************************
+- * Copyright 2018-2023,2024 Thomas E. Dickey *
++ * Copyright 2018-2024,2025 Thomas E. Dickey *
+ * Copyright 1998-2015,2016 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -76,7 +76,7 @@
+ #endif
+ #undef CUR
+
+-MODULE_ID("$Id: lib_twait.c,v 1.83 2024/12/07 21:02:00 tom Exp $")
++MODULE_ID("$Id: lib_twait.c,v 1.84 2025/01/24 20:39:23 tom Exp $")
+
+ /*
+ * Returns an elapsed time, in milliseconds (if possible).
+@@ -242,7 +242,7 @@
+ if ((mode & TW_EVENT) && evl) {
+ if (fds == fd_list)
+ fds = typeMalloc(struct pollfd, MIN_FDS + evl->count);
+- if (fds == 0)
++ if (fds == NULL)
+ return TW_NONE;
+ }
+ #endif
+Index: package/debian-mingw/changelog
+--- ncurses-6.5-20250118+/package/debian-mingw/changelog 2025-01-12 11:23:10.000000000 +0000
++++ ncurses-6.5-20250125/package/debian-mingw/changelog 2025-01-24 20:34:16.000000000 +0000
+@@ -1,8 +1,8 @@
+-ncurses6td (6.5+20250118) unstable; urgency=low
++ncurses6td (6.5+20250125) unstable; urgency=low
+
+ * latest weekly patch
+
+- -- Thomas E. Dickey <dickey@invisible-island.net> Sun, 12 Jan 2025 06:23:10 -0500
++ -- Thomas E. Dickey <dickey@invisible-island.net> Fri, 24 Jan 2025 15:34:16 -0500
+
+ ncurses6 (5.9+20131005) unstable; urgency=low
+
+Index: package/debian-mingw64/changelog
+--- ncurses-6.5-20250118+/package/debian-mingw64/changelog 2025-01-12 11:23:10.000000000 +0000
++++ ncurses-6.5-20250125/package/debian-mingw64/changelog 2025-01-24 20:34:16.000000000 +0000
+@@ -1,8 +1,8 @@
+-ncurses6td (6.5+20250118) unstable; urgency=low
++ncurses6td (6.5+20250125) unstable; urgency=low
+
+ * latest weekly patch
+
+- -- Thomas E. Dickey <dickey@invisible-island.net> Sun, 12 Jan 2025 06:23:10 -0500
++ -- Thomas E. Dickey <dickey@invisible-island.net> Fri, 24 Jan 2025 15:34:16 -0500
+
+ ncurses6 (5.9+20131005) unstable; urgency=low
+
+Index: package/debian/changelog
+--- ncurses-6.5-20250118+/package/debian/changelog 2025-01-12 11:23:10.000000000 +0000
++++ ncurses-6.5-20250125/package/debian/changelog 2025-01-24 20:34:16.000000000 +0000
+@@ -1,8 +1,8 @@
+-ncurses6td (6.5+20250118) unstable; urgency=low
++ncurses6td (6.5+20250125) unstable; urgency=low
+
+ * latest weekly patch
+
+- -- Thomas E. Dickey <dickey@invisible-island.net> Sun, 12 Jan 2025 06:23:10 -0500
++ -- Thomas E. Dickey <dickey@invisible-island.net> Fri, 24 Jan 2025 15:34:16 -0500
+
+ ncurses6 (5.9+20120608) unstable; urgency=low
+
+Index: package/mingw-ncurses.nsi
+Prereq: 1.685
+--- ncurses-6.5-20250118+/package/mingw-ncurses.nsi 2025-01-12 11:23:10.000000000 +0000
++++ ncurses-6.5-20250125/package/mingw-ncurses.nsi 2025-01-24 20:34:16.000000000 +0000
+@@ -1,4 +1,4 @@
+-; $Id: mingw-ncurses.nsi,v 1.685 2025/01/12 11:23:10 tom Exp $
++; $Id: mingw-ncurses.nsi,v 1.686 2025/01/24 20:34:16 tom Exp $
+
+ ; TODO add examples
+ ; TODO bump ABI to 6
+@@ -10,7 +10,7 @@
+ !define VERSION_MAJOR "6"
+ !define VERSION_MINOR "5"
+ !define VERSION_YYYY "2025"
+-!define VERSION_MMDD "0118"
++!define VERSION_MMDD "0125"
+ !define VERSION_PATCH ${VERSION_YYYY}${VERSION_MMDD}
+
+ !define MY_ABI "5"
+Index: package/mingw-ncurses.spec
+--- ncurses-6.5-20250118+/package/mingw-ncurses.spec 2025-01-12 11:23:10.000000000 +0000
++++ ncurses-6.5-20250125/package/mingw-ncurses.spec 2025-01-24 20:34:16.000000000 +0000
+@@ -3,7 +3,7 @@
+ Summary: shared libraries for terminal handling
+ Name: mingw32-ncurses6
+ Version: 6.5
+-Release: 20250118
++Release: 20250125
+ License: X11
+ Group: Development/Libraries
+ URL: https://invisible-island.net/ncurses/
+Index: package/ncurses.spec
+--- ncurses-6.5-20250118+/package/ncurses.spec 2025-01-12 11:23:10.000000000 +0000
++++ ncurses-6.5-20250125/package/ncurses.spec 2025-01-24 20:34:16.000000000 +0000
+@@ -1,7 +1,7 @@
+ Summary: shared libraries for terminal handling
+ Name: ncurses6
+ Version: 6.5
+-Release: 20250118
++Release: 20250125
+ License: X11
+ Group: Development/Libraries
+ URL: https://invisible-island.net/ncurses/
+Index: package/ncursest.spec
+--- ncurses-6.5-20250118+/package/ncursest.spec 2025-01-12 11:23:10.000000000 +0000
++++ ncurses-6.5-20250125/package/ncursest.spec 2025-01-24 20:34:16.000000000 +0000
+@@ -1,7 +1,7 @@
+ Summary: Curses library with POSIX thread support.
+ Name: ncursest6
+ Version: 6.5
+-Release: 20250118
++Release: 20250125
+ License: X11
+ Group: Development/Libraries
+ Source: ncurses-%{version}-%{release}.tgz