#!/bin/sh
# $Id: cppcheck-lint,v 1.15 2024/10/06 22:24:13 tom Exp $

defunc() {
	echo "  <function name=\"$3,::$3\">"						>> $FILE
	echo "    <noreturn>$1</noreturn>"							>> $FILE
	echo "    <returnValue type=\"$2\"/>"						>> $FILE
	echo "    <leak-ignore/>"									>> $FILE
	shift 3
	num=0
	for arg in "$@"
	do
		num=`expr "$num" + 1`
		case "$arg" in
		int|bool|attr_t|chtype|wchar_t)
			echo "    <arg nr=\"$num\" direction=\"in\">"		>>$FILE
			echo "      <not-uninit/>"							>>$FILE
			echo "    </arg>"									>>$FILE
    		;;
		*\*)
			echo "    <arg nr=\"$num\" direction=\"inout\">"	>>$FILE
			echo "      <not-uninit/>"							>>$FILE
			echo "    </arg>"									>>$FILE
    		;;
		formatstr)
			echo "    <arg nr=\"$num\" direction=\"in\">"		>>$FILE
			echo "      <formatstr/>"							>>$FILE
			echo "      <not-uninit/>"							>>$FILE
			echo "      <strz/>"								>>$FILE
			echo "    </arg>"									>>$FILE
			;;
		esac
	done
	echo "  </function>" 										>>$FILE
}

OPT=
ARG=
CFG=
for dir in \
	/usr/share/Cppcheck/cfg \
	/usr/lib/x86_64-linux-gnu/cppcheck/cfg
do
	if [ -d "$dir" ]
	then
		CFG="$dir"
		break
	fi
done

if [ -n "$CFG" ]; then
case `pwd` in
*/ncurses*)
	THIS=`type "$0"| sed -e 's,^.* ,,'`
	FILE=$CFG/ncurses.cfg
	if [ -f $FILE ]; then
	OPT="$OPT --library=ncurses.cfg"
	if [ $THIS -nt $FILE ]; then
	cat >$FILE <<"EOF"
<?xml version="1.0"?>
<def format="2">
EOF
	defunc "false" "int"  "addstr" "char*"
	defunc "false" "int"  "addwstr" "wchar_t*"
	defunc "false" "int"  "attroff" attr_t
	defunc "false" "int"  "attron" attr_t
	defunc "false" "int"  "attrset" attr_t
	defunc "false" "int"  "beep"
	defunc "false" "int"  "bkgrnd" "cchar_t*"
	defunc "false" "int"  "bkgrnd_set" "cchar_t*"
	defunc "false" "int"  "bkgrndset" "cchar_t*"
	defunc "false" "int"  "bkgset" chtype
	defunc "false" "int"  "border" chtype chtype chtype chtype chtype chtype chtype chtype
	defunc "false" "int"  "box" "WINDOW*" chtype chtype
	defunc "false" "int"  "cbreak"
	defunc "false" "int"  "clear"
	defunc "false" "int"  "clearok"	"WINDOW*" "bool"
	defunc "false" "int"  "clrtobot"
	defunc "false" "int"  "clrtoeol"
	defunc "false" "int"  "copywin" "WINDOW*" "WINDOW*" int int int int int int
	defunc "false" "int"  "curses_trace" int
	defunc "false" "int"  "data_ahead" "FORM*"
	defunc "false" "int"  "data_behind" "FORM*"
	defunc "false" "int"  "del_curterm" "TERMINAL*"
	defunc "false" "int"  "delwin" "WINDOW*"
	defunc "false" "int"  "derwin" "WINDOW*" int int int int
	defunc "false" "int"  "doupdate"
	defunc "false" "int"  "echo"
	defunc "false" "int"  "endwin"
	defunc "false" "int"  "erase"
	defunc "false" "int"  "field_back" "FIELD*"
	defunc "false" "int"  "field_buffer" "FIELD*" int
	defunc "false" "int"  "field_count" "FORM*"
	defunc "false" "int"  "field_fore" "FIELD*"
	defunc "false" "int"  "field_just" "FIELD*"
	defunc "false" "int"  "field_opts" "FIELD*"
	defunc "false" "int"  "field_pad" "FIELD*"
	defunc "false" "int"  "field_status" "FIELD*"
	defunc "false" "int"  "form_opts" "FIELD*"
	defunc "false" "int"  "form_page" "FORM*"
	defunc "false" "int"  "getattrs" "WINDOW*"
	defunc "false" "int"  "getbkgd" "WINDOW*"
	defunc "false" "int"  "getch"
	defunc "false" "int"  "idcok" "WINDOW*" "bool"
	defunc "false" "int"  "idlok" "WINDOW*" "bool"
	defunc "false" "int"  "immedok" "WINDOW*" "bool"
	defunc "false" "int"  "init_pair" int int int
	defunc "false" "int"  "intrflush" "WINDOW*" "bool"
	defunc "false" "int"  "item_count"
	defunc "false" "int"  "item_description"
	defunc "false" "int"  "item_name"
	defunc "false" "int"  "item_opts"
	defunc "false" "int"  "item_opts_off" "ITEM*" int
	defunc "false" "int"  "item_opts_on" "ITEM*" int
	defunc "false" "int"  "item_value"
	defunc "false" "int"  "item_visible"
	defunc "false" "int"  "keypad" "WINDOW*" "bool"
	defunc "false" "int"  "leaveok" "WINDOW*" "bool"
	defunc "false" "int"  "menu_back" "MENU*"
	defunc "false" "int"  "menu_fore" "MENU*"
	defunc "false" "int"  "menu_format" "MENU*" "int*" "int*"
	defunc "false" "int"  "menu_grey" "MENU*"
	defunc "false" "int"  "menu_mark" "MENU*"
	defunc "false" "int"  "menu_opts" "MENU*"
	defunc "false" "int"  "menu_opts_off" "MENU*" int
	defunc "false" "int"  "menu_opts_on" "MENU*" int
	defunc "false" "int"  "menu_pad" "MENU*"
	defunc "false" "int"  "menu_pattern" "MENU*"
	defunc "false" "int"  "menu_request_name" int
	defunc "false" "int"  "meta" "WINDOW*" "bool"
	defunc "false" "int"  "move" int int
	defunc "false" "int"  "mvcur" int int int int
	defunc "false" "WINDOW*"  "newwin" int int int int
	defunc "false" "int"  "mvaddch" int int chtype
	defunc "false" "int"  "mvwaddch" "WINDOW*" int int chtype
	defunc "false" "int"  "mvwaddchnstr" "WINDOW*" int int chtype int
	defunc "false" "int"  "mvwaddstr" "WINDOW*" int int "char*"
	defunc "false" "int"  "mvwaddnstr" "WINDOW*" int int "char*" int
	defunc "false" "int"  "mvwchgat" "WINDOW*" int int int attr_t "void*"
	defunc "false" "int"  "mvwdelch" "WINDOW*" int int
	defunc "false" "int"  "mvwgetch" "WINDOW*" int int
	defunc "false" "int"  "mvwgetnstr" "WINDOW*" int int "char*" int
	defunc "false" "int"  "mvwhline" "WINDOW*" int int chtype int
	defunc "false" "int"  "mvwin" "WINDOW*" int int
	defunc "false" "int"  "mvwinch" "WINDOW*" int int
	defunc "false" "int"  "mvwinchnstr" "WINDOW*" int int "chtype*" int
	defunc "false" "int"  "mvwinnstr" "WINDOW*" int int "char*" int
	defunc "false" "int"  "mvwinsch" "WINDOW*" int int chtype
	defunc "false" "int"  "mvwinsnstr" "WINDOW*" int int "char*" int
	defunc "false" "int"  "mvwvline" "WINDOW*" int int chtype int
	defunc "false" "int"  "napms" int
	defunc "false" "int"  "new_page" "FIELD*"
	defunc "false" "int"  "nodelay" "WINDOW*" bool
	defunc "false" "int"  "noecho"
	defunc "false" "int"  "notimeout" "WINDOW*" bool
	defunc "false" "int"  "overlay" "WINDOW*" "WINDOW*"
	defunc "false" "int"  "overwrite" "WINDOW*" "WINDOW*"
	defunc "false" "int"  "pechochar" "WINDOW*" chtype
	defunc "false" "int"  "pnoutrefresh" "WINDOW" int int int int int int
	defunc "false" "int"  "prefresh" "WINDOW" int int int int int int
	defunc "false" "int"  "printw" formatstr
	defunc "false" "int"  "refresh"
	defunc "false" "int"  "reset_prog_mode"
	defunc "false" "int"  "reset_shell_mode"
	defunc "false" "int"  "restartterm" "char*" int "int*"
	defunc "false" "int"  "ripoffline" int intfunc*
	defunc "false" "int"  "scrollok" "WINDOW*" bool
	defunc "false" "int"  "set_curterm" "TERMINAL*"
	defunc "false" "int"  "set_escdelay" int
	defunc "false" "int"  "set_field_back" "FIELD*" int
	defunc "false" "int"  "set_field_fore" "FIELD*" int
	defunc "false" "int"  "set_field_just" "FIELD*" int
	defunc "false" "int"  "set_field_opts" "FIELD*" int
	defunc "false" "int"  "set_field_pad" "FIELD*" int
	defunc "false" "int"  "set_field_userptr" "FIELD*" "void*"
	defunc "false" "int"  "set_fieldtype_arg" "FIELDTYPE*" "intfunc*" "intfunc*"
	defunc "false" "int"  "set_fieldtype_choice" "FIELDTYPE*" "intfunc*" "intfunc*"
	defunc "false" "int"  "set_form_fields" "FORM*" "FIELD**"
	defunc "false" "int"  "set_form_sub" "FORM*" "WINDOW*"
	defunc "false" "int"  "set_max_field" "FIELD*" int
	defunc "false" "int"  "set_menu_back" "MENU*" chtype
	defunc "false" "int"  "set_menu_fore" "MENU*" chtype
	defunc "false" "int"  "set_menu_grey" "MENU*" chtype
	defunc "false" "int"  "set_menu_sub" "MENU*" "WINDOW*"
	defunc "false" "int"  "set_panel_userptr" "PANEL*" "void*"
	defunc "false" "int"  "setcchar" "cchar_t*" wchar_t attr_t int "void*"
	defunc "false" "int"  "setupterm" "char*" int "int*"
	defunc "false" "int"  "start_color"
	defunc "false" "int"  "syncok" "WINDOW*" bool
	defunc "false" "int"  "top_row" "MENU*"
	defunc "false" "int"  "touchline" "WINDOW*" int int
	defunc "false" "int"  "touchwin" "WINDOW*"
	defunc "false" "int"  "tputs" "char*" int "intfunc*"
	defunc "false" "int"  "tputs_sp" "SCREEN*" "char*" int "intfunc*"
	defunc "false" "int"  "update_panels"
	defunc "false" "int"  "use_default_colors"
	defunc "false" "int"  "use_screen" "SCREEN*" "intfunc*" "void*"
	defunc "false" "int"  "use_window" "WINDOW*" "intfunc*" "void*"
	defunc "false" "int"  "vid_attr" attr_t int "void*"
	defunc "false" "int"  "vid_puts" attr_t int "void*" "intfunc*"
	defunc "false" "int"  "vidattr" chtype
	defunc "false" "int"  "vidputs" chtype "intfunc*"
	defunc "false" "int"  "vline" chtype int
	defunc "false" "int"  "vline_set" "cchar_t*" int
	defunc "false" "int"  "waddch" "WINDOW*" chtype
	defunc "false" "int"  "waddchnstr" "WINDOW*" "chtype*" int
	defunc "false" "int"  "waddnstr" "WINDOW*" "char*" int
	defunc "false" "int"  "waddstr" "WINDOW*" "char*"
	defunc "false" "int"  "wattroff" "WINDOW*" attr_t
	defunc "false" "int"  "wattron" "WINDOW*" attr_t
	defunc "false" "int"  "wattrset" "WINDOW*" attr_t
	defunc "false" "int"  "wbkgd" "WINDOW*" chtype
	defunc "false" "int"  "wbkgdset" "WINDOW*" chtype
	defunc "false" "int"  "wborder" "WINDOW*" chtype chtype chtype chtype chtype chtype chtype chtype
	defunc "false" "int"  "wchgat" "WINDOW*" int attr_t int "void*"
	defunc "false" "int"  "wclear" "WINDOW*"
	defunc "false" "int"  "wclrtobot" "WINDOW*"
	defunc "false" "int"  "wclrtoeol" "WINDOW*"
	defunc "false" "int"  "wcolor_set" "WINDOW*" int "void*"
	defunc "false" "int"  "wcursyncup" "WINDOW*"
	defunc "false" "int"  "wdelch" "WINDOW*"
	defunc "false" "int"  "wechochar" "WINDOW*" chtype
	defunc "false" "int"  "werase" "WINDOW*"
	defunc "false" "int"  "wgetch" "WINDOW*"
	defunc "false" "int"  "wgetnstr" "WINDOW*" "char*" int
	defunc "false" "int"  "whline" "WINDOW*" "char*" int
	defunc "false" "int"  "winch" "WINDOW*"
	defunc "false" "int"  "winchnstr" "WINDOW*" "chtype*" int
	defunc "false" "int"  "winnstr" "WINDOW*" "char*" int
	defunc "false" "int"  "winsch" "WINDOW*" chtype
	defunc "false" "int"  "winsdelln" "WINDOW*" int
	defunc "false" "int"  "winsnstr" "WINDOW*" "char*" int
	defunc "false" "int"  "wmove" "WINDOW*" int int
	defunc "false" "int"  "wnoutrefresh" "WINDOW*"
	defunc "false" "int"  "wprintw" "WINDOW*" formatstr
	defunc "false" "int"  "wredrawln"
	defunc "false" "int"  "wrefresh"	"WINDOW*"
	defunc "false" "int"  "wresize" "WINDOW*" int int
	defunc "false" "int"  "wscrl" "WINDOW*" int
	defunc "false" "int"  "wsetscrreg" "WINDOW*" int int
	defunc "false" "int"  "wstandend" "WINDOW*"
	defunc "false" "int"  "wstandout" "WINDOW*"
	defunc "false" "int"  "wsyncdown" "WINDOW*"
	defunc "false" "int"  "wsyncup" "WINDOW*"
	defunc "false" "int"  "wtouchln" "WINDOW*" int int int
	defunc "false" "int"  "wvline" "WINDOW*" chtype int
	defunc "false" "int"  "wvline_set" "WINDOW*" "cchar_t*" int
	defunc "false" "void" "_tracef" "formatstr"
	defunc "false" "void" _nc_copy_termtype2 "TERMINAL*" "TERMINAL*"
	defunc "false" "void" _nc_do_color_sp "SCREEN*" int int int "intfunc*"
	defunc "false" "void" _nc_export_termtype2
	defunc "false" "void" _nc_export_termtype2 "TERMINAL*" "TERMINAL*"
	defunc "false" "void" _nc_fifo_dump "SCREEN*"
	defunc "false" "void" _nc_flush
	defunc "false" "void" _nc_flush_sp "SCREEN*"
	defunc "false" "void" _nc_format_slks "SCREEN*" int
	defunc "false" "void" _nc_free_entry "HEAD*" "TERMINAL*"
	defunc "false" "void" _nc_free_termtype2 "TERMINAL*"
	defunc "false" "void" _nc_free_tparm "TERMINAL*"
	defunc "false" "void" _nc_init_wacs
	defunc "false" "void" _nc_keep_tic_dir "char*"
	defunc "false" "void" _nc_keypad "SCREEN*" int
	defunc "false" "void" _nc_mvcur int int int int
	defunc "false" "void" _nc_mvcur_sp "SCREEN*"
	defunc "false" "void" _nc_mvcur_sp "SCREEN*" int int int int
	defunc "false" "void" _nc_new_pair_leaks "SCREEN*"
	defunc "false" "void" _nc_outch_sp "SCREEN*" int
	defunc "false" "void" _nc_putp_sp "SCREEN*" "char*" "char*"
	defunc "false" "void" _nc_reserve_pairs "SCREEN*" int
	defunc "false" "void" _nc_reset_colors_sp "SCREEN*"
	defunc "false" "void" _nc_safe_strcat "string_desc*" "char*"
	defunc "false" "void" _nc_set_source "char*"
	defunc "false" "void" _nc_setenv_num "char*" int
	defunc "false" "void" _nc_setup_tinfo "char*" "TERMTYPE2*"
	defunc "false" "void" _nc_slk_initialize "WINDOW*" int
	defunc "false" "void" _nc_synchook "WINDOW*"
	defunc "false" "void" _nc_tinfo_cmdch "TERMINAL*" int
	defunc "false" "void" _nc_warning formatstr
	defunc "false" "void" _tracedump "char*" "WINDOW*"
	defunc "false" "void" baudrate_sp "SCREEN*"
	defunc "false" "void" cbreak_sp "SCREEN*"
	defunc "false" "void" curs_set int
	defunc "false" "void" curs_set_sp "SCREEN*"
	defunc "false" "void" curs_set_sp "SCREEN*" int
	defunc "false" "void" def_prog_mode_sp "SCREEN*"
	defunc "false" "void" del_curterm "TERMINAL*"
	defunc "false" "void" echo_sp "SCREEN*"
	defunc "false" "void" nl_sp "SCREEN*"
	defunc "false" "void" noecho_sp "SCREEN*"
	defunc "false" "void" nonl_sp "SCREEN*"
	defunc "false" "void" noraw_sp "SCREEN*"
	defunc "false" "void" raw_sp "SCREEN*"
	defunc "false" "void" scroll "WINDOW*"
	defunc "false" "void" set_escdelay_sp "SCREEN*" int
	defunc "false" "void" ungetch_sp "SCREEN*" chtype
	defunc "true"  "void" "exit_curses" "int"
	defunc "true"  "void" "exit_terminfo" "int"
	defunc "true" "void" _nc_err_abort formatstr
	defunc "true" "void" _nc_syserr_abort formatstr
	echo "</def>" >>$FILE
	fi
	fi
	;;
esac
fi

case `cppcheck --version` in
2.15.*)
	OPT="$OPT --check-level=exhaustive"
	;;
esac

for n in "$@"
do
	case .$n in
	.-[lLW]*)
		;;
	*.[ch]|*.cc|*.hh|*.cpp)
		ARG="$ARG $n"
		;;
	*.[ly])
		;;
	.-[DUI-]*)
		# just in case I need to handle blanks in -D options
		n=`echo "$n" | sed -e 's/ /_/g'`
		OPT="$OPT $n"
		;;
	esac
done
[ -n "$ARG" ] && exec cppcheck \
	--check-library \
	--library=posix.cfg \
	--enable=all \
	--suppress=missingIncludeSystem $OPT $ARG
# vile:ts=4 sw=4
