# $Id: ncurses.supp,v 1.8 2020/02/02 23:34:34 tom Exp $
##############################################################################
# Copyright 2020 Thomas E. Dickey                                            #
# Copyright 2008 Free Software Foundation, Inc.                              #
#                                                                            #
# Permission is hereby granted, free of charge, to any person obtaining a    #
# copy of this software and associated documentation files (the "Software"), #
# to deal in the Software without restriction, including without limitation  #
# the rights to use, copy, modify, merge, publish, distribute, distribute    #
# with modifications, sublicense, and/or sell copies of the Software, and to #
# permit persons to whom the Software is furnished to do so, subject to the  #
# following conditions:                                                      #
#                                                                            #
# The above copyright notice and this permission notice shall be included in #
# all copies or substantial portions of the Software.                        #
#                                                                            #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   #
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    #
# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      #
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING    #
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER        #
# DEALINGS IN THE SOFTWARE.                                                  #
#                                                                            #
# Except as contained in this notice, the name(s) of the above copyright     #
# holders shall not be used in advertising or otherwise to promote the sale, #
# use or other dealings in this Software without prior written               #
# authorization.                                                             #
##############################################################################
#
# This is a warning-suppression file for valgrind and ncurses.
#
# ncurses can also be configured using the --disable-leaks option, which
# allows an application to call _nc_freeall() or _nc_free_and_exit(), to
# free all of ncurses' "permanent" memory.
#
# Some of these leaks can be freed if the application does its own cleanup,
# for example:
#	delscreen(SP);
#	del_curterm(cur_term);
# However, few applications do this.

{
   ncurses_leak__nc_add_to_try
   Memcheck:Leak
   fun:*alloc
   fun:_nc_add_to_try
}

{
   ncurses_leak__nc_home_terminfo
   Memcheck:Leak
   fun:malloc
   fun:_nc_home_terminfo
}

{
   ncurses_leak__nc_init_wacs
   Memcheck:Leak
   fun:calloc
   fun:_nc_init_wacs
}

{
   ncurses_leak__nc_keyname
   Memcheck:Leak
   fun:calloc
   fun:_nc_keyname
}

{
   ncurses_leak__nc_keyname_2
   Memcheck:Leak
   fun:malloc
   fun:strdup
   fun:_nc_keyname
}

{
   ncurses_leak__nc_printf_string
   Memcheck:Leak
   fun:malloc
   fun:_nc_doalloc
   fun:_nc_printf_string
}

{
   ncurses_leak__nc_read_termtype
   Memcheck:Leak
   fun:*alloc
   fun:_nc_read_termtype
   fun:_nc_read_file_entry
}

{
   ncurses_leak__nc_read_termtype_2
   Memcheck:Leak
   fun:*alloc
   fun:_nc_doalloc
   fun:_nc_read_termtype
   fun:_nc_read_file_entry
}

{
   ncurses_leak__nc_scroll_optimize
   Memcheck:Leak
   fun:*alloc
   fun:_nc_hash_map
   fun:_nc_scroll_optimize
}

{
   ncurses_leak__nc_scroll_optimize_2
   Memcheck:Leak
   fun:*alloc
   fun:_nc_doalloc
   fun:_nc_scroll_optimize
}

{
   ncurses_leak__nc_setupscreen
   Memcheck:Leak
   fun:calloc
   fun:_nc_setupscreen
   fun:newterm
}

{
   ncurses_leak__nc_setupscreen_2
   Memcheck:Leak
   fun:calloc
   fun:newwin
   fun:_nc_setupscreen
}

{
   ncurses_leak__nc_setupterm_1
   Memcheck:Leak
   fun:malloc
   fun:strdup
   fun:_nc_setupterm
}

{
   ncurses_leak__nc_setupterm
   Memcheck:Leak
   fun:calloc
   fun:_nc_setupterm
}

{
   ncurses_leak__nc_setupscreen_3
   Memcheck:Leak
   fun:calloc
   fun:_nc_makenew
   fun:newwin
   fun:_nc_setupscreen
}

{
   ncurses_leak__nc_set_buffer
   Memcheck:Leak
   fun:malloc
   fun:_nc_set_buffer
}

{
   ncurses_leak__nc_tparm_analyze
   Memcheck:Leak
   fun:*alloc
   fun:_nc_doalloc
   fun:_nc_tparm_analyze
}

{
   ncurses_leak__nc_trace_alloc
   Memcheck:Leak
   fun:*alloc
   fun:_nc_doalloc
   fun:_nc_trace_alloc
}

{
   ncurses_leak_start_color
   Memcheck:Leak
   fun:calloc
   fun:start_color
}

{
   ncurses_leak_tparm
   Memcheck:Leak
   fun:realloc
   fun:_nc_doalloc
   fun:tparm
}

{
   ncurses_leak_tparam_internal
   Memcheck:Leak
   fun:realloc
   fun:_nc_doalloc
   fun:get_space
   fun:save_number
   fun:tparam_internal
}
