#!/bin/sh
#
# FIXME_list.sh
#
# Display FIXME segments from man-pages source files
#
# (C) Copyright 2007 & 2013, Michael Kerrisk
# 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).
#
######################################################################
#
# (C) Copyright 2006 & 2013, Michael Kerrisk
# 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
