origIFS=$IFS
IFS=''; set -fCu  # safe mode: no split/glob = no quoting headaches
let() { return $((!($1))); }

# Automatically (re-)indent make...done blocks in a Mamfile.
# Usage: Mamfile_indent <Mamfile >Mamfile.new
#
# Should work on all current POSIX compliant shells.
# By Martijn Dekker <martijn@inlv.org>, 2021, 2024. Public domain.

# Spacing per indentation level. Edit to change style.
indent='	'  # one tab

# Remove existing indentation, add new indentation.
indentlvl=0
sed 's/^[[:space:]]*//' \
| while IFS=$origIFS read -r line
do	case $line in
	'')	printf '\n'; continue ;;
	done*)	let "indentlvl -= 1" ;;
	esac

	spc=
	i=0
	while	let "(i += 1) <= indentlvl"
	do	spc=$indent$spc
	done
	printf '%s\n' $spc$line

	case $line in
	make* | loop*)
		let "indentlvl += 1" ;;
	esac
done
