#!/bin/sh
#****************************************************************************
#* Copyright (c) 2004-2005,2006 Thomas E. Dickey                            *
#*                                                                          *
#* 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.                                                           *
#****************************************************************************/
# $Id: jpf-indent,v 1.6 2006/02/18 17:07:15 tom Exp $
# indent ncurses source written by Juergen Pfeifer
NOOP=no
OPTS='
-npro
--blank-lines-after-declarations
--blank-lines-after-procedures
--brace-indent2
--braces-after-if-line
--continue-at-parentheses
--indent-level2
--line-length80
--no-space-after-casts
--no-space-after-function-call-names
--parameter-indentation4
--swallow-optional-blank-lines
--tab-size8

-T FIELD
-T FIELDTYPE
-T FIELD_CELL
-T FORM
-T NCURSES_INLINE
-T RegExp_Arg 
-T TypeArgument 
-T WINDOW
-T attr_t
-T bool
-T cchar_t
-T chtype
-T enumARG
-T va_list
-T wchar_t 
'
for name in $*
do
	case $name in
	-v|-n)
		NOOP=yes
		OPTS="$OPTS -v"
		;;
	-*)
		OPTS="$OPTS $name"
		;;
	*.[ch])
		save="${name}".a$$
		test="${name}".b$$
		rm -f "$save" "$test"
		mv "$name" "$save"
		sed \
			-e '/MODULE_ID(/s/)$/);/' \
			-e 's,\<GCC_NORETURN;,;//GCC_NORETURN;,' \
			-e 's,\<GCC_PRINTFLIKE(,;//GCC_PRINTFLIKE(,' \
			-e 's,\<GCC_SCANFLIKE(,;//GCC_SCANFLIKE(,' \
			-e 's,\(\<NCURSES_EXPORT_VAR\>\),//\1,' \
			"$save" >"$test"
		cp "$test" "$name"
		chmod u+w "$name"
		# ${INDENT_PROG-indent} --version
		${INDENT_PROG-indent} -npro $OPTS "$name"
		sed \
			-e '/MODULE_ID(/s/);$/)/' \
			-e 's,;[ 	]*//GCC_NORETURN;, GCC_NORETURN;,' \
			-e 's,;[ 	]*//GCC_PRINTFLIKE(, GCC_PRINTFLIKE(,' \
			-e 's,;[ 	]*//GCC_SCANFLIKE(, GCC_SCANFLIKE(,' \
			-e 's,//\(\<NCURSES_EXPORT_VAR\>\),\1,' \
			"$name" >"$test"
		mv "$test" "$name"
		rm -f "${name}~"
		if test $NOOP = yes ; then
			if (cmp -s "$name" "$save" ) then
				echo "** no change: $name"
			else
				diff -u "$save" "$name"
			fi
			rm -f "$name"
			mv "$save" "$name"
		elif ( cmp -s "$name" "$save" ) ; then
			echo "** unchanged $name"
			rm -f "${name}"
			mv "$save" "$name"
		else
			echo "** updated $name"
			rm -f "$save"
		fi
		;;
	*)
		echo "** ignored:   $name"
		;;
	esac
done
