#! /bin/sh
# footnotes - renumber footnotes in a text
# Heiner Steven <heiner.steven AT shelldorado.com>

awk '
    # renumrefs - renumber footnote references in "line", return result
    #
    # "createmap" controls whether new entries for the mapping table [] map
    # are created.

    function renumrefs(line, createmap,		result) {
	result = ""
	# Process all footnote references 
	while (match(line, /\[[0-9][0-9]*\]/) > 0) {
	    oldnum = substr(line, RSTART+1, RLENGTH-2) + 0
	    if (!(oldnum in map) && createmap) {
		map[oldnum + 0] = ++lastnum
	    }
	    newnum = map[oldnum]

	    # Replace old footnote with new one from "newnum"
	    result = result substr(line, 1, RSTART) newnum "]"
	    line = substr(line, RSTART + RLENGTH)
	}
	result = result line		# Use the rest of line
	return result
    }

    # Switch between the two modes: mode "list" processes the
    # footnote list, otherwise a footnote reference is processed.
    $0 == "@footnote:" { mode = "list"; next }

    # Fast path: if there is no footnote reference there is nothing to do
    $0 !~ /\[[0-9][0-9]*\]/ { print; next }

    # There is at least one foot note mark!
    {
    	if (mode != "list") {
	    # Read text, create reference map table
	    print renumrefs($0, 1)
	} else {
	    # Save list entry, will be printed at the end of the script
	    notetext[newnum + 0] = renumrefs($0, 0)
	}
    }

    # The complete text has been read. Write the complete footnote list
    # in the right ascending order.
    END {
    	for (i = 1; i <= lastnum; i++) { print notetext[i] }
    }
' "$@"
