# Copyright 2001, 2003, 2004, 2006, 2007, 2009 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 3 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-*-mingw*"] } {
    return
}

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"
} 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
	}
    }

    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
	if [string match "*windows.h: No such file*" $err] then {
	    unsupported "windres/$broot (parse)"
	} else {
	    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
    }

    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"
    }
}
