#!/bin/sh
#
# FIXME_list.sh
#
# Display FIXME segments from man-pages source files
#
# Copyright 2006-2013, Michael Kerrisk <mtk.manpages@gmail.com>
# Copyright, the authors of the Linux man-pages project
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details
# (http://www.gnu.org/licenses/gpl-2.0.html).
#

show_all="n"
while getopts "a" optname; do
    case "$optname" in

    a)  # "all"
        # Even show FIXMEs that aren't generally interesting.  (Typically
	# these FIXMEs are notes to the maintainer to reverify something
	# at a future date.)

    	show_all="y"
        ;;

    *)  echo "Unknown option: $OPTARG"
	exit 1
	;;

    esac
done

shift $(( $OPTIND - 1 ))

if test $# -eq 0; then
    echo "Usage: $0 [-a] pathname..." 1>&2
    exit 1;
fi

for dir in "$@"; do
    for page in $(find "$dir" -type f -name '*.[1-9]' \
			-exec grep -l FIXME {} \; | sort)
    do
        cat "$page" | awk -v SHOW_ALL=$show_all -v PAGE_NAME="$page" \
	    '
            BEGIN {
	        page_FIXME_cnt = 0;
	    }

	    /FIXME/ {

                # /.\" FIXME . / ==> do not display this FIXME, unless
                # -a command-line option was supplied

		if ($0 ~ /^\.\\" FIXME \./ )
		    FIXME_type = "hidden"
		else if ($0 ~ /^\.\\" FIXME *\?/ )
		    FIXME_type = "question"
		else
		    FIXME_type = "normal";
	        if (FIXME_type == "normal" || SHOW_ALL == "y") {
	            if (page_FIXME_cnt == 0) {
		        print "==========";
		        print PAGE_NAME;
	            }
	            page_FIXME_cnt++;

	            finished = 0;
	            do {
	                print $0;

		        # Implicit end of FIXME is end-of-file or a line
		        # that is not a comment

	                if (getline == 0)
		            finished = 1;

	                if (!($0 ~ /^.\\"/))
		            finished = 1;

                        # /.\" .$/ ==> Explicit end of FIXME

	                if ($0 ~ /^.\\" \.$/)
		            finished = 1;
	            } while (!finished);

	            print "";
                }
    	    }
            '
    done | sed -e 's/^\.\\"/    /' | sed -e 's/ *$//' | cat -s
done
