#!/bin/awk -f
# scripts/options.awk - library build configuration control
#
# last changed in libpng version 1.5.0 - June 18, 2010
#
# Copyright (c) 1998-2010 Glenn Randers-Pehrson
#
# This code is released under the libpng license.
# For conditions of distribution and use, see the disclaimer
# and license in png.h

# The output of this script is written to the file given by
# the variable 'out'.  The script is run twice, once with
# an intermediate output file, 'options.tmp' then again on
# that file to produce the final output:
#
#  awk -f scripts/options.awk out=options.tmp scripts/options.dfa 1>&2
#  awk -f scripts/options.awk out=options.dfn options.tmp 1>&2
#
# Some options may be specified on the command line:
#
#   deb=1            Causes debugging to be output
#   logunsupported=1 Causes all options to be recorded in the output
#   everything=off   Causes all options to be disabled by default
#   everything=on    Causes all options to be enabled by default
#
# These options may also be specified in the original input file (and
# are copied to the preprocessed file).

BEGIN{
    out="/dev/null"                      # intermediate, preprocessed, file
    pre=-1                               # preprocess (first line)
    err=0                                # in-line exit sets this
    start="PNG_DEFN_MAGIC-"              # Arbitrary start
    end="-PNG_DEFN_END"                  # Arbitrary end
    cx= "/@@@*"                          # Open C comment for output file
    comment=start cx                     # Comment start
    cend="*/" end                        # Comment end
    def=start "#define PNG_@@@"          # Arbitrary define
    sup="@@@_SUPPORTED" end              # end supported option
    und=comment "#undef PNG_@@@"         # Unsupported option
    une="@@@_SUPPORTED" cend             # end unsupported option
    error=start "ERROR:"                 # error message

    # Variables
    deb=0                                # debug - set on command line
    everything=""                        # do not override defaults
    logunsupported=0                     # write unsupported options too
    
    # Precreate arrays
    option[""] = ""      # list of all options: default enabled/disabled
    done[""] = 1         # marks option as having been output
    requires[""] = ""    # requires by option
    iffs[""] = ""        # if by option
    enabledby[""] = ""   # options that enable it by option
    setting[""] = ""     # requires by setting
    defaults[""] = ""    # used for a defaulted value
    doneset[""] = 1      # marks setting as having been output
    r[""] = ""           # Temporary array

    # For decorating the output file
    protect = ""
}

# The output file must be specified before any input:
out == "/dev/null" {
    print "out=output.file must be given on the command line"
    err = 1
    exit 1
}

# The very first line indicates whether we are reading pre-processed
# input or not, this must come *first* because 'PREPROCESSED' needs
# to be the very first line in the temporary file.
pre == -1{
    if ($0 == "PREPROCESSED") {
	pre = 0
	next
    } else {
    	pre = 1
	print "PREPROCESSED" >out
	# And fall through to continue processing
    }
}

# Preprocessing - this just copies the input file with lines
# that need preprocessing (just chunk at present) expanded
pre && $1 != "chunk"{
    print >out
    next
}

# The first characters of the line determine how it is processed,
# leading spaces are ignored.  In general tokens that are not
# keywords are the names of options.  An option 'name' is
# controlled by the definition of the corresponding macros:
#
#   PNG_name_SUPPORTED    The option is turned on
#   PNG_NO_name
#   PNG_NO_name_SUPPORTED If the first macro is not defined
#                         either of these will turn the option off
#
# If none of these macros are defined the option is turned on, unless
# the keyword 'off' is given in a line relating to the option.  The
# keyword 'on' can also be given, but it will be ignored (since it is
# the default.)
#
# In the syntax below a 'name' is indicated by "NAME", other macro
# values are indicated by "MACRO", as with "NAME" the leading "PNG_"
# is omitted, but in this case the "NO_" prefix and the "_SUPPORTED"
# suffix are never used.
#
# Each line is introduced by a keyword - the first non-space characters
# on the line.  A line starting with a '#' is a comment - it is totally
# ignored.  Keywords are as follows, a NAME, is simply a macro name
# without the leading PNG_, PNG_NO_ or the trailing _SUPPORTED.

$1 ~ /^#/ || $0 ~ /^[ 	]*$/{
    next
}

# com <comment>
#   The whole line is placed in the output file as a comment with
#   the preceding 'com' removed
$1 == "com"{
    if (NF > 1) {
	sub(/^[ 	]*com[ 	]*/, "")
	print comment, $0, cend >out
    } else
    	print start end >out
    next
}

# file output input protect
#   Informational: the official name of the input file (without
#   make generated local directories), the official name of the
#   output file and, if required, a name to use in a protection
#   macro for the contents.
$1 == "file" && NF >= 2{
    print comment, $2, cend >out
    print comment, "Machine generated file: DO NOT EDIT", cend >out
    if (NF >= 3)
    	print comment, "Derived from:", $3, cend >out
    protect = $4
    if (protect != "") {
    	print start "#ifndef", protect end >out
    	print start "#define", protect end >out
    }
    next
}

# variable=value
#   Sets the given variable to the given value (the syntax is fairly
#   free form, except for deb (you are expected to understand how to
#   set the debug variable...)
$0 ~ /^[ 	]*everything[ 	=]*off[ 	]*$/{
    everything = "off"
    next
}
$0 ~ /^[ 	]*everything[ 	=]*on[ 	]*$/{
    everything = "on"
    next
}
$0 ~ /^[ 	]*logunsupported[ 	=]*0[ 	]*$/{
    logunsupported = 0
    next
}
$0 ~ /^[ 	]*logunsupported[ 	=]*1[ 	]*$/{
    logunsupported = 1
    next
}
$1 == "deb" && $2 == "=" && NF == 3{
    deb = $3
    next
}

# option NAME ( (requires|enables|if) NAME* | on | off | disabled )*
#   Declares an option 'NAME' and describes its default setting (disabled)
#   and its relationship to other options.  The option is disabled
#   unless *all* the options listed after 'requires' are set and at
#   least one of the options listed after 'if' is set.  If the
#   option is set then it turns on all the options listed after 'enables'.
#
#   Note that "enables" takes priority over the required/if/disabled/off
#   setting of the target option.
#
#   The definition file may list an option as 'disabled': off by default,
#   otherwise the option is enabled: on by default.  A later (and it must
#   be later) entry may turn an option on or off explicitly.

$1 == "option" && NF >= 2{
    onoff = option[$2]  # records current (and the default is "", enabled)
    key = ""
    for (i=3; i<=NF; ++i) {
    	if ($(i) == "on" || $(i) == "off" || $(i) == "disabled") {
	    key = ""
	    if (onoff != $(i)) {
		# on or off can zap disabled or enabled:
	    	if (onoff == "" ||
		    (onoff == "disabled" || onoff == "enabled") &&
		    	($(i) == "on" || $(i) == "off")) {
		    # It's easy to mis-spell the option when turning it
		    # on or off, so warn about it here:
		    if (onoff == "" && ($(i) == "on" || $(i) == "off")) {
		    	print $2 ": ERROR: turning unrecognized option", $(i)
			# For the moment error out - it is safer
			err = 1 # prevent END{} running
			exit 1
		    }
		    onoff = $(i)
		} else {
		    # Print a message, otherwise the error
		    # below is incomprehensible
		    print $2 ": currently", onoff ": attempt to turn", $(i)
		    break
		}
	    }
	} else if ($(i) == "requires" || $(i) == "if" || $(i) == "enables") {
	    key = $(i)
	} else if (key == "requires") {
	    requires[$2] = requires[$2] " " $(i)
	} else if (key == "if") {
	    iffs[$2] = iffs[$2] " " $(i)
	} else if (key == "enables") {
	    enabledby[$(i)] = enabledby[$(i)] " " $2
	} else
	    break # bad line format
    }

    if (i > NF) {
	# Set the option, defaulting to 'enabled'
	if (onoff == "") onoff = "enabled"
	option[$2] = onoff
	next
    }
    # Else fall through to the error handler
}

# chunk NAME [requires OPT] [on|off|disabled]
#   Expands to the 'option' settings appropriate to the reading and
#   writing of an ancilliary PNG chunk 'NAME':
#
#    option READ_NAME requires READ_ANCILLARY_CHUNKS [READ_OPT]
#    option READ_NAME enables NAME
#    [option READ_NAME off]
#    option WRITE_NAME requires WRITE_ANCILLARY_CHUNKS [WRITE_OPT]
#    option WRITE_NAME enables NAME
#    [option WRITE_NAME off]

pre && $1 == "chunk" && NF >= 2{
    # 'chunk' is handled on the first pass by writing appropriate
    # 'option' lines into the intermediate file.
    onoff = ""
    reqread = ""
    reqwrite = ""
    i = 3 # indicates format error
    if (NF > 2) {
	# read the keywords/additional OPTS
    	req = 0
	for (i=3; i<=NF; ++i) {
	    if ($(i) == "on" || $(i) == "off" || $(i) == "disabled") {
	    	if (onoff != $(i)) {
		    if (onoff == "")
			onoff = $(i)
		    else
		    	break # on/off conflict
		}
	    } else if ($(i) == "requires")
	    	req = 1
	    else if (req != 1)
	    	break # bad line: handled below
	    else {
	    	reqread = reqread " READ_" $(i)
	    	reqwrite = reqwrite " WRITE_" $(i)
	    }
	}
    }
	    	
    if (i > NF) {
    	# Output new 'option' lines to the intermediate file (out)
	print "option READ_" $2,
		"requires READ_ANCILLARY_CHUNKS" reqread,
		"enables", $2, onoff >out
    	print "option WRITE_" $2,
		"requires WRITE_ANCILLARY_CHUNKS" reqwrite,
		"enables", $2, onoff >out
	next
    }
    # Else hit the error handler below - bad line format!
}

# setting MACRO ( requires MACRO* )* [ default VALUE ]
#    Behaves in a similar way to 'option' without looking for NO_ or
#    _SUPPORTED; the macro is enabled if it is defined so long as all
#    the 'requires' macros are also defined.  The definitions may be
#    empty, an error will be issued if the 'requires' macros are
#    *not* defined.  If given the 'default' value is used if the
#    macro is not defined.  The default value will be re-tokenised.
#    (BTW: this is somewhat restrictive, it mainly exists for the
#    support of non-standard configurations and numeric parameters,
#    see the uses in scripts/options.dat 

$1 == "setting" && (NF == 2 || NF >= 3 && ($3 == "requires" || $3 == "default")){
    reqs = ""
    deflt = ""
    isdef = 0
    key = ""
    for (i=3; i<=NF; ++i)
    	if ($(i) == "requires" || $(i) == "default") {
	    key = $(i)
	    if (key == "default") isdef = 1
	} else if (key == "requires")
	    reqs = reqs " " $(i)
	else if (key == "default")
	    deflt = deflt " " $(i)
	else
	    break # Format error, handled below

    setting[$2] = reqs
    # NOTE: this overwrites a previous value silently
    if (isdef && deflt == "")
    	deflt = " " # as a flag to force output
    defaults[$2] = deflt
    next
}

# The order of the dependency lines (option, chunk, setting) is irrelevant
# - the 'enables', 'requires' and 'if' settings will be used to determine
# the correct order in the output and the final values in pnglibconf.h are
# not order dependent.  'requires' and 'if' entries take precedence over
# 'enables' from other options; if an option requires another option it
# won't be set regardless of any options that enable it unless the other
# option is also enabled.
#
# Similarly 'enables' trumps a NO_ definition in CFLAGS or pngusr.h
#
# For simplicity cycles in the definitions are regarded as errors,
# even if they are not ambiguous.
# A given NAME can be specified in as many 'option' lines as required, the
# definitions are additive.

# For backwards compatibility equivalent macros may be listed thus:
#
# = [NO_]NAME MACRO
#   Makes -DMACRO equivalent to -DPNG_NO_NAME or -DPNG_NAME_SUPPORTED
#   as appropriate.
#
# The definition is injected into the C compiler input when encountered
# in the second pass (so all these definitions appear *after* the @
# lines!)
#
# 'NAME' is as above, but 'MACRO' is the full text of the equivalent
# old, deprecated, macro.

$1 == "=" && NF == 3{
    print "#ifdef PNG_" $3 >out
    if ($2 ~ /^NO_/)
	print "#   define PNG_" $2 >out
    else
	print "#   define PNG_" $2 "_SUPPORTED" >out
    print "#endif" >out
    next
}

# Lines may be injected into the C compiler input by preceding them
# with an "@" character.  The line is copied with just the leading
# @ removed.

$1 ~ /^@/{
    sub(/^[ 	]*@/, "")
    print >out
    next
}

# Check for unreognized lines, because of the preprocessing chunk
# format errors will be detected on the first pass independent of
# any other format errors.
{
    print "options.awk: bad line (" NR "):", $0
    err = 1 # prevent END{} running
    exit 1
}

# For checking purposes names that start with "ok_" or "fail_" are
# not output to pnglibconf.h and must be either enabled or disabled
# respectively for the build to succeed.  This allows interdependencies
# between options of the form "at least one of" or "at most one of"
# to be checked.  For example:
#
# option FLOATING_POINT enables ok_math
# option FIXED_POINT enables ok_math
#    This ensures that at least one of FLOATING_POINT and FIXED_POINT
#    must be set for the build to succeed.
#
# option fail_math requires FLOATING_POINT FIXED_POINT
#    This means the build will fail if *both* FLOATING_POINT and
#    FIXED_POINT are set (this is an example; in fact both are allowed.)
#
# If all these options were given the build would require exactly one
# of the names to be enabled.

END{
    # END{} gets run on an exit (a traditional awk feature)
    if (err) exit 1

    if (pre) {
    	# Record the variables
	print "deb =", deb
	if (everything != "")
	    print "everything =", everything
	print "logunsupported =", logunsupported
	exit 0
    }

    # Do the 'setting' values first, the algorithm the standard
    # tree walk (O(1)) done in an O(2) while/for loop; interations
    # settings x depth, outputing the deepest required macros
    # first.
    print "" >out
    print "/* SETTINGS */" >out
    print comment, "settings", cend >out
    finished = 0
    while (!finished) {
    	finished = 1
	movement = 0 # done nothing
	for (i in setting) if (!doneset[i]) {
	    nreqs = split(setting[i], r)
	    if (nreqs > 0) {
		for (j=1; j<=nreqs; ++j) if (!doneset[r[j]])
		    break
	    	if (j<=nreqs) {
		    finished = 0
		    continue # try a different setting
		}
	    }

	    # All the requirements have been processed, output
	    # this setting.
	    if (deb) print "setting", i
	    print "" >out
	    print "/* setting: ", i >out
	    print " *   requires:" setting[i] >out
	    print " *   default: ", defaults[i], "*/" >out
	    if (defaults[i] == "") # no default, only check if defined
		print "#ifdef PNG_" i >out
	    for (j=1; j<=nreqs; ++j) {
	    	print "# ifndef PNG_" r[j] >out
		print error, i, "requires", r[j] end >out
		print "# endif" >out
	    }
	    if (defaults[i] != "") # default handling
		print "#ifdef PNG_" i >out
	    print def i, "PNG_" i end >out
	    if (defaults[i] != "") {
	    	print "#else /*default*/" >out
		# And add the default definition for the benefit
		# of later settings an options test:
		print "# define PNG_" i defaults[i] >out
		print def i defaults[i] end >out
	    }
	    print "#endif" >out

	    doneset[i] = 1
	    ++movement
	}

	if (!finished && !movement) {
	    print "setting: loop or missing setting in 'requires', cannot process:"
	    for (i in setting) if (!doneset[i])
	    	print "  setting", i, "requires" setting[i]
	    exit 1
	}
    }
    print comment, "end of settings", cend >out

    # Now do the options - somewhat more complex.  The dependency
    # tree is thus:
    #
    #   name    >      name
    #	name requires  name
    #   name if        name
    #   name enabledby name
    #
    # First build a list 'tree' by option of all the things on which
    # it depends.
    print "" >out
    print "/* OPTIONS */" >out
    print comment, "options", cend >out
    for (opt in enabledby) tree[opt] = 1  # may not be explicit options
    for (opt in option) if (opt != "") {
    	o = option[opt]
	# option should always be one of the following values
	if (o != "on" && o != "off" && o != "disabled" && o != "enabled") {
	    print "internal option error (" o ")"
	    exit 1
	}
    	tree[opt] = ""    # so unlisted options marked
    }
    for (opt in tree) if (opt != "") {
    	if (tree[opt] == 1) {
	    tree[opt] = ""
	    if (option[opt] != "") {
	    	print "internal error (1)"
		exit 1
	    }
	    # Macros only listed in 'enables' remain off unless
	    # one of the enabling macros is on.
	    option[opt] = "disabled"
	}

    	split("", list) # clear 'list'
	# Now add every requires, iffs or enabledby entry to 'list'
	# so that we can add a unique list of requirements to tree[i]
    	split(requires[opt] iffs[opt] enabledby[opt], r)
	for (i in r) list[r[i]] = 1
	for (i in list) tree[opt] = tree[opt] " " i
    }

    # print the tree for extreme debugging
    if (deb > 2) for (i in tree) if (i != "") print i, "depends-on" tree[i]

    # Ok, now check all options marked explicitly 'on' or 'off':
    #
    # If an option[opt] is 'on' then turn on all requires[opt]
    # If an option[opt] is 'off' then turn off all enabledby[opt]
    #
    # Error out if we have to turn 'on' an 'off' option or vice versa.
    npending = 0
    for (opt in option) if (opt != "") {
    	if (option[opt] == "on" || option[opt] == "off")
	    pending[++npending] = opt
    }

    err = 0 # set on error
    while (npending > 0) {
    	opt = pending[npending--]
	if (option[opt] == "on") {
	    nreqs = split(requires[opt], r)
	    for (j=1; j<=nreqs; ++j) {
	    	if (option[r[j]] == "off") {
		    print "option", opt, "turned on, but requirement", r[j], "is turned off"
		    err = 1
		} else if (option[r[j]] != "on") {
		    option[r[j]] = "on"
		    pending[++npending] = r[j]
		}
	    }
	} else {
	    if (option[opt] != "off") {
	    	print "internal error (2)"
		exit 1
	    }
	    nreqs = split(enabledby[opt], r)
	    for (j=1; j<=nreqs; ++j) {
	    	if (option[r[j]] == "on") {
		    print "option", opt, "turned off, but enabled by", r[j], "which is turned on"
		    err = 1
		} else if (option[r[j]] != "off") {
		    option[r[j]] = "off"
		    pending[++npending] = r[j]
		}
	    }
	}
    }
    if (err) exit 1

    # option[i] is now the complete list of all the tokens we may
    # need to output, go through it as above, depth first.
    finished = 0
    while (!finished) {
    	finished = 1
	movement = 0 # done nothing
	for (i in option) if (!done[i]) {
	    nreqs = split(tree[i], r)
	    if (nreqs > 0) {
		for (j=1; j<=nreqs; ++j) if (!done[r[j]])
		    break
	    	if (j<=nreqs) {
		    finished = 0
		    continue  # next option
		}
	    }

	    # All the requirements have been processed, output
	    # this option.  An option is _SUPPORTED if:
	    #
	    # all 'requires' are _SUPPORTED AND
	    # at least one of the 'if' options are _SUPPORTED AND
	    # EITHER:
	    #   The name is _SUPPORTED (on the command line)
	    # OR:
	    #   an 'enabledby' is _SUPPORTED
	    # OR:
	    #   NO_name is not defined AND
	    #   the option is not disabled; an option is disabled if:
	    #     option == off
	    #     option == disabled && everything != on
	    #     option == "" && everything == off
	    if (deb) print "option", i
	    print "" >out
	    print "/* option:", i, option[i] >out
	    print " *   requires:  " requires[i] >out
	    print " *   if:        " iffs[i] >out
	    print " *   enabled-by:" enabledby[i], "*/" >out
	    print "#undef PNG_on" >out
	    print "#define PNG_on 1" >out

	    # requires
	    nreqs = split(requires[i], r)
	    for (j=1; j<=nreqs; ++j) {
	    	print "#ifndef PNG_" r[j] "_SUPPORTED" >out
		print "#   undef PNG_on /*!" r[j] "*/" >out
		# this error appears in the final output if something
		# was switched 'on' but the processing above to force
		# the requires did not work
		if (option[i] == "on")
		    print error, i, "requires", r[j] end >out
		print "#endif" >out
	    }

	    # if
	    nreqs = split(iffs[i], r)
	    print "#undef PNG_no_if" >out
	    if (nreqs > 0) {
		print "/* if" iffs[i], "*/" >out
	    	print "#define PNG_no_if 1" >out
		for (j=1; j<=nreqs; ++j) {
		    print "#ifdef PNG_" r[j] "_SUPPORTED" >out
		    print "#   undef PNG_no_if /*" r[j] "*/" >out
		    print "#endif" >out
		}
		print "#ifdef PNG_no_if /*missing if*/" >out
		print "#   undef PNG_on" >out
		# There is no checking above for this, because we
		# don't know which 'if' to choose, so whine about
		# it here:
		if (option[i] == "on")
		    print error, i, "needs one of:", iffs[i] end >out
		print "#endif" >out
	    }

	    print "#ifdef PNG_on /*requires, if*/" >out
	    # enables
	    print "#   undef PNG_not_enabled" >out
	    print "#   define PNG_not_enabled 1" >out
	    print "   /* enabled by" enabledby[i], "*/" >out
	    nreqs = split(enabledby[i], r)
	    for (j=1; j<=nreqs; ++j) {
	    	print "#ifdef PNG_" r[j] "_SUPPORTED" >out
		print "#   undef PNG_not_enabled /*" r[j] "*/" >out
		# Oops, probably not intended (should be factored
		# out by the checks above).
		if (option[i] == "off")
		    print error, i, "enabled by:", r[j] end >out
		print "#endif" >out
	    }

	    print "#   ifndef PNG_" i "_SUPPORTED /*!command line*/" >out
	    print "#     ifdef PNG_not_enabled /*!enabled*/" >out
	    if (option[i] == "off" ||
	        option[i] == "disabled" && everything != "on" ||
		option[i] == "enabled" && everything == "off") {
		print "#       undef PNG_on /*default off*/" >out
	    } else {
		print "#       ifdef PNG_NO_" i >out
		print "#         undef PNG_on /*turned off*/" >out
		print "#       endif" >out
		print "#       ifdef PNG_NO_" i "_SUPPORTED" >out
		print "#         undef PNG_on /*turned off*/" >out
		print "#       endif" >out
	    }
	    print "#     endif /*!enabled*/" >out
	    print "#     ifdef PNG_on" >out
	    # The _SUPPORTED macro must be defined so that dependent
	    # options output later work.
	    print "#       define PNG_" i "_SUPPORTED" >out
	    print "#     endif" >out
	    print "#   endif /*!command line*/" >out
	    # If PNG_on is still set the option should be defined in
	    # pnglibconf.h
	    print "#   ifdef PNG_on" >out
	    if (i ~ /^fail_/)
	        print error, i, "is on: enabled by:" iffs[i] enabledby[i] ", requires" requires[i] end >out
	    else if (i !~ /^ok_/)
		print def i sup >out
	    print "#   endif /* definition */" >out
	    print "#endif /*requires, if*/" >out
	    if (logunsupported || i ~ /^ok_/) {
		print "#ifndef  PNG_on" >out
		if (logunsupported)
		    print und i une >out
		if (i ~ /^ok_/)
		    print error, i, "not enabled: requires:" requires[i] ", enabled by:" iffs[i] enabledby[i] end >out
		print "#endif" >out
	    }

	    done[i] = 1
	    ++movement
	}

	if (!finished && !movement) {
	    print "option: loop or missing option in dependency tree, cannot process:"
	    for (i in option) if (!done[i]) {
	    	print "  option", i, "depends on" tree[i], "needs:"
		nreqs = split(tree[i], r)
		if (nreqs > 0) for (j=1; j<=nreqs; ++j) if (!done[r[j]])
		    print "    " r[j]
	    }
	    exit 1
	}
    }
    print comment, "end of options", cend >out

    # Regular end - everything looks ok
    if (protect != "")
    	print start "#endif", cx, protect, "*/" end >out
}
