# Copyright 2001, 2003, 2004, 2006 Free Software Foundation, Inc.

# 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.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.

# Please email any bugs, comments, and/or additions to this file to:
# bug-dejagnu@prep.ai.mit.edu

# Written by DJ Delorie <dj@redhat.com>

if {![istarget "i*86-*-*"] && ![istarget "x86_64-*-mingw64"] } {
    return
}

if {![istarget "i*86-*-*pe*"] \
    && ![istarget "i*86-*-cygwin*"] \
    && ![istarget "i*86-*-mingw32*"] \
    && ![istarget "x86_64-*-mingw64*"] } {
    set target_xfail "yes"
} else {
    set target_xfail "no"
}

if {![info exists WINDRES]} then {
    return
}

if {[which $WINDRES] == 0} then {
    return
}

set wr "$WINDRES --include-dir $srcdir/$subdir"

if [file exists "$srcdir/../../winsup/w32api/include"] {
    set wr "$wr --include-dir $srcdir/../../winsup/w32api/include"
    set target_xfail "no"
} else {
    send_log "\nWarning: Assuming windres can find the win32 headers\n\n"
}

set res_list [lsort [glob -nocomplain $srcdir/$subdir/*.rc]]

proc oneline { file } {
    while { 1 } {
	if { [gets $file line] == -1 } {
	    return ""
	}
	if [regexp "^ \[0-9a-z\]\[0-9a-z\]* " $line] {
	    return $line
	}
    }
}

foreach res $res_list {
    set sroot [file rootname $res]
    set broot [file tail $sroot]
    set done 0

    set rc [open $res]
    while { [gets $rc line] != -1 } {
	if ![regexp "^(//|/\*|#)" $line] {
	    break
	}
	if [regexp "\[xp\]fail *(\[^ \]*)" $line junk sys] {
	    setup_xfail $sys
	    continue
	}
    }

    if { "$broot" != "bmpalign" && "$target_xfail" == "yes" } {
	setup_xfail *-*
    }

    verbose "$wr -J rc -O res $res tmpdir/$broot.res" 1
    catch "exec $wr -J rc -O res $res tmpdir/$broot.res" err

    if ![string match "" $err] then {
	send_log "$err\n"
	verbose "$err" 1
	fail "windres/$broot (parse)"
	continue
    }
    pass "windres/$broot (parse)"

    set rc [open $res]
    while { [gets $rc line] != -1 } {
	if ![regexp "^(//|/\*|#)" $line] {
	    break
	}
	if [regexp "parse-only" $line] {
	    file delete "tmpdir/$broot.res"
	    set done 1
	    break
	}
	if [regexp "\[xc\]fail *(\[^ \]*)" $line junk sys] {
	    setup_xfail $sys
	    continue
	}
    }
    if { $done != 0 } {
	continue
    }

    if { "$broot" != "bmpalign" && "$target_xfail" == "yes" } {
	setup_xfail *-*
    }

    verbose "$OBJDUMP -b binary -s tmpdir/$broot.res > tmpdir/$broot.dump" 1
    catch "exec $OBJDUMP -b binary -s tmpdir/$broot.res > tmpdir/$broot.dump" err

    if ![string match "" $err] then {
	send_log "$err\n"
	verbose "$err" 1
	fail "windres/$broot (compare)"
	continue
    }

    set pat [open "$sroot.rsd"]
    set out [open "tmpdir/$broot.dump"]
    set patline "foo"

    while { ![string match $patline ""] } {
	set patline [oneline $pat]
	set outline [oneline $out]

	if ![string match $patline $outline] {
	    send_log "< $patline\n"
	    send_log "> $outline\n"
	    fail "windres/$broot (compare)"
	    set done 1
	    break
	}
    }
    if { $done == 0 } {
	pass "windres/$broot (compare)"
	file delete "tmpdir/$broot.res"
	file delete "tmpdir/$broot.dump"
    }
}
