/****************************************************************************
 * Copyright 2020,2021 Thomas E. Dickey                                     *
 * Copyright 2010,2015 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.                                                           *
 ****************************************************************************/

/****************************************************************************
 *  Author: Thomas E. Dickey       2010-on                                  *
 ****************************************************************************/
/* LINTLIBRARY */

/* ./m_attribs.c */

#include <menu.priv.h>

#undef set_menu_fore
int	set_menu_fore(
		MENU	*menu,
		chtype	attr)
		{ return(*(int *)0); }

#undef menu_fore
chtype	menu_fore(
		const MENU *menu)
		{ return(*(chtype *)0); }

#undef set_menu_back
int	set_menu_back(
		MENU	*menu,
		chtype	attr)
		{ return(*(int *)0); }

#undef menu_back
chtype	menu_back(
		const MENU *menu)
		{ return(*(chtype *)0); }

#undef set_menu_grey
int	set_menu_grey(
		MENU	*menu,
		chtype	attr)
		{ return(*(int *)0); }

#undef menu_grey
chtype	menu_grey(
		const MENU *menu)
		{ return(*(chtype *)0); }

/* ./m_cursor.c */

#undef _nc_menu_cursor_pos
int	_nc_menu_cursor_pos(
		const MENU *menu,
		const ITEM *item,
		int	*pY,
		int	*pX)
		{ return(*(int *)0); }

#undef pos_menu_cursor
int	pos_menu_cursor(
		const MENU *menu)
		{ return(*(int *)0); }

/* ./m_driver.c */

#undef _nc_Match_Next_Character_In_Item_Name
int	_nc_Match_Next_Character_In_Item_Name(
		MENU	*menu,
		int	ch,
		ITEM	**item)
		{ return(*(int *)0); }

#undef menu_driver
int	menu_driver(
		MENU	*menu,
		int	c)
		{ return(*(int *)0); }

/* ./m_format.c */

#undef set_menu_format
int	set_menu_format(
		MENU	*menu,
		int	rows,
		int	cols)
		{ return(*(int *)0); }

#undef menu_format
void	menu_format(
		const MENU *menu,
		int	*rows,
		int	*cols)
		{ /* void */ }

/* ./m_global.c */

#undef _nc_Default_Menu
MENU	_nc_Default_Menu;
#undef _nc_Default_Item
ITEM	_nc_Default_Item;

#undef _nc_Connect_Items
NCURSES_BOOL _nc_Connect_Items(
		MENU	*menu,
		ITEM	**items)
		{ return(*(NCURSES_BOOL *)0); }

#undef _nc_Disconnect_Items
void	_nc_Disconnect_Items(
		MENU	*menu)
		{ /* void */ }

#undef _nc_Calculate_Text_Width
int	_nc_Calculate_Text_Width(
		const TEXT *item)
		{ return(*(int *)0); }

#undef _nc_Calculate_Item_Length_and_Width
void	_nc_Calculate_Item_Length_and_Width(
		MENU	*menu)
		{ /* void */ }

#undef _nc_Link_Items
void	_nc_Link_Items(
		MENU	*menu)
		{ /* void */ }

#undef _nc_Show_Menu
void	_nc_Show_Menu(
		const MENU *menu)
		{ /* void */ }

#undef _nc_New_TopRow_and_CurrentItem
void	_nc_New_TopRow_and_CurrentItem(
		MENU	*menu,
		int	new_toprow,
		ITEM	*new_current_item)
		{ /* void */ }

/* ./m_hook.c */

#undef set_menu_init
int	set_menu_init(
		MENU	*menu,
		Menu_Hook func)
		{ return(*(int *)0); }

#undef menu_init
Menu_Hook menu_init(
		const MENU *menu)
		{ return(*(Menu_Hook *)0); }

#undef set_menu_term
int	set_menu_term(
		MENU	*menu,
		Menu_Hook func)
		{ return(*(int *)0); }

#undef menu_term
Menu_Hook menu_term(
		const MENU *menu)
		{ return(*(Menu_Hook *)0); }

#undef set_item_init
int	set_item_init(
		MENU	*menu,
		Menu_Hook func)
		{ return(*(int *)0); }

#undef item_init
Menu_Hook item_init(
		const MENU *menu)
		{ return(*(Menu_Hook *)0); }

#undef set_item_term
int	set_item_term(
		MENU	*menu,
		Menu_Hook func)
		{ return(*(int *)0); }

#undef item_term
Menu_Hook item_term(
		const MENU *menu)
		{ return(*(Menu_Hook *)0); }

/* ./m_item_cur.c */

#undef set_current_item
int	set_current_item(
		MENU	*menu,
		ITEM	*item)
		{ return(*(int *)0); }

#undef current_item
ITEM	*current_item(
		const MENU *menu)
		{ return(*(ITEM **)0); }

#undef item_index
int	item_index(
		const ITEM *item)
		{ return(*(int *)0); }

/* ./m_item_nam.c */

#undef item_name
const char *item_name(
		const ITEM *item)
		{ return(*(const char **)0); }

#undef item_description
const char *item_description(
		const ITEM *item)
		{ return(*(const char **)0); }

/* ./m_item_new.c */

#undef new_item
ITEM	*new_item(
		const char *name,
		const char *description)
		{ return(*(ITEM **)0); }

#undef free_item
int	free_item(
		ITEM	*item)
		{ return(*(int *)0); }

#undef set_menu_mark
int	set_menu_mark(
		MENU	*menu,
		const char *mark)
		{ return(*(int *)0); }

#undef menu_mark
const char *menu_mark(
		const MENU *menu)
		{ return(*(const char **)0); }

/* ./m_item_opt.c */

#undef set_item_opts
int	set_item_opts(
		ITEM	*item,
		Item_Options opts)
		{ return(*(int *)0); }

#undef item_opts_off
int	item_opts_off(
		ITEM	*item,
		Item_Options opts)
		{ return(*(int *)0); }

#undef item_opts_on
int	item_opts_on(
		ITEM	*item,
		Item_Options opts)
		{ return(*(int *)0); }

#undef item_opts
Item_Options item_opts(
		const ITEM *item)
		{ return(*(Item_Options *)0); }

/* ./m_item_top.c */

#undef set_top_row
int	set_top_row(
		MENU	*menu,
		int	row)
		{ return(*(int *)0); }

#undef top_row
int	top_row(
		const MENU *menu)
		{ return(*(int *)0); }

/* ./m_item_use.c */

#undef set_item_userptr
int	set_item_userptr(
		ITEM	*item,
		void	*userptr)
		{ return(*(int *)0); }

#undef item_userptr
void	*item_userptr(
		const ITEM *item)
		{ return(*(void **)0); }

/* ./m_item_val.c */

#undef set_item_value
int	set_item_value(
		ITEM	*item,
		NCURSES_BOOL value)
		{ return(*(int *)0); }

#undef item_value
NCURSES_BOOL item_value(
		const ITEM *item)
		{ return(*(NCURSES_BOOL *)0); }

/* ./m_item_vis.c */

#undef item_visible
NCURSES_BOOL item_visible(
		const ITEM *item)
		{ return(*(NCURSES_BOOL *)0); }

/* ./m_items.c */

#undef set_menu_items
int	set_menu_items(
		MENU	*menu,
		ITEM	**items)
		{ return(*(int *)0); }

#undef menu_items
ITEM	**menu_items(
		const MENU *menu)
		{ return(*(ITEM ***)0); }

#undef item_count
int	item_count(
		const MENU *menu)
		{ return(*(int *)0); }

/* ./m_new.c */

#undef new_menu_sp
MENU	*new_menu_sp(
		SCREEN	*sp,
		ITEM	**items)
		{ return(*(MENU **)0); }

#undef new_menu
MENU	*new_menu(
		ITEM	**items)
		{ return(*(MENU **)0); }

#undef free_menu
int	free_menu(
		MENU	*menu)
		{ return(*(int *)0); }

/* ./m_opts.c */

#undef set_menu_opts
int	set_menu_opts(
		MENU	*menu,
		Menu_Options opts)
		{ return(*(int *)0); }

#undef menu_opts_off
int	menu_opts_off(
		MENU	*menu,
		Menu_Options opts)
		{ return(*(int *)0); }

#undef menu_opts_on
int	menu_opts_on(
		MENU	*menu,
		Menu_Options opts)
		{ return(*(int *)0); }

#undef menu_opts
Menu_Options menu_opts(
		const MENU *menu)
		{ return(*(Menu_Options *)0); }

/* ./m_pad.c */

#undef set_menu_pad
int	set_menu_pad(
		MENU	*menu,
		int	pad)
		{ return(*(int *)0); }

#undef menu_pad
int	menu_pad(
		const MENU *menu)
		{ return(*(int *)0); }

/* ./m_pattern.c */

#undef menu_pattern
char	*menu_pattern(
		const MENU *menu)
		{ return(*(char **)0); }

#undef set_menu_pattern
int	set_menu_pattern(
		MENU	*menu,
		const char *p)
		{ return(*(int *)0); }

/* ./m_post.c */

#undef _nc_Post_Item
void	_nc_Post_Item(
		const MENU *menu,
		const ITEM *item)
		{ /* void */ }

#undef _nc_Draw_Menu
void	_nc_Draw_Menu(
		const MENU *menu)
		{ /* void */ }

#undef post_menu
int	post_menu(
		MENU	*menu)
		{ return(*(int *)0); }

#undef unpost_menu
int	unpost_menu(
		MENU	*menu)
		{ return(*(int *)0); }

/* ./m_req_name.c */

#undef menu_request_name
const char *menu_request_name(
		int	request)
		{ return(*(const char **)0); }

#undef menu_request_by_name
int	menu_request_by_name(
		const char *str)
		{ return(*(int *)0); }

/* ./m_scale.c */

#undef scale_menu
int	scale_menu(
		const MENU *menu,
		int	*rows,
		int	*cols)
		{ return(*(int *)0); }

/* ./m_spacing.c */

#undef set_menu_spacing
int	set_menu_spacing(
		MENU	*menu,
		int	s_desc,
		int	s_row,
		int	s_col)
		{ return(*(int *)0); }

#undef menu_spacing
int	menu_spacing(
		const MENU *menu,
		int	*s_desc,
		int	*s_row,
		int	*s_col)
		{ return(*(int *)0); }

/* ./m_sub.c */

#undef set_menu_sub
int	set_menu_sub(
		MENU	*menu,
		WINDOW	*win)
		{ return(*(int *)0); }

#undef menu_sub
WINDOW	*menu_sub(
		const MENU *menu)
		{ return(*(WINDOW **)0); }

/* ./m_trace.c */

#undef _nc_retrace_item
ITEM	*_nc_retrace_item(
		ITEM	*code)
		{ return(*(ITEM **)0); }

#undef _nc_retrace_item_ptr
ITEM	**_nc_retrace_item_ptr(
		ITEM	**code)
		{ return(*(ITEM ***)0); }

#undef _nc_retrace_item_opts
Item_Options _nc_retrace_item_opts(
		Item_Options code)
		{ return(*(Item_Options *)0); }

#undef _nc_retrace_menu
MENU	*_nc_retrace_menu(
		MENU	*code)
		{ return(*(MENU **)0); }

#undef _nc_retrace_menu_hook
Menu_Hook _nc_retrace_menu_hook(
		Menu_Hook code)
		{ return(*(Menu_Hook *)0); }

#undef _nc_retrace_menu_opts
Menu_Options _nc_retrace_menu_opts(
		Menu_Options code)
		{ return(*(Menu_Options *)0); }

/* ./m_userptr.c */

#undef set_menu_userptr
int	set_menu_userptr(
		MENU	*menu,
		void	*userptr)
		{ return(*(int *)0); }

#undef menu_userptr
void	*menu_userptr(
		const MENU *menu)
		{ return(*(void **)0); }

/* ./m_win.c */

#undef set_menu_win
int	set_menu_win(
		MENU	*menu,
		WINDOW	*win)
		{ return(*(int *)0); }

#undef menu_win
WINDOW	*menu_win(
		const MENU *menu)
		{ return(*(WINDOW **)0); }
