# Copyright (C) 92, 93, 94, 95, 96, 97, 98, 1999 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., 675 Mass Ave, Cambridge, MA 02139, USA.

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

# This file was written by Rob Savoye. (rob@cygnus.com)

#
# Run a utility and test the result.
#
# Parameters:
# First one is the command
# Second one is command arguments
# Third one is the file name
# Fourth one is the regexp style pattern to match for a PASS
#
# Returns:
#  1 if the test failed,
#  0 if the test passes,
# -1 if there was an internal error.
#

proc util_test { args } {
    global verbose
    # get the parameters
    set cmd	[lindex $args 0]
    verbose 	"Utility to execute is $cmd" 2
    set cmd_arg [lindex $args 1]
    verbose 	"Command line arguments are $cmd_arg" 2
    set file    [lindex $args 2]
    verbose 	"The file name to use is $file" 2
    set pattern [lindex $args 3]
    verbose	"The pattern to match is \"$pattern\"" 2

    if [info exists file] {
	if ![string match "" $file] {
	    if ![file exists $file] {
		perror "$file doesn't exist"
		return -1
	    }
	}
    }

    # Run the utility to be tested and analyze the results.

    set comp_output [util_start $cmd $cmd_arg $file]

    verbose "Output is \"$comp_output\"" 2
    verbose "Pattern is \"$pattern\"" 2

    if [regexp "$pattern" $comp_output] {
	verbose "Pattern matches." 2
	return 0
    }

    verbose "Pattern does not match." 2
    return 1
}

#
# Run the utility
#
# Return NULL or the output.
#

proc util_start { args } {
    global verbose
    set cmd	[lindex $args 0]
    set cmd_arg [lindex $args 1]
    set file    [lindex $args 2]

    if {[which $cmd] == 0} {
        perror "Can't find $cmd"
	return ""
    }

    if { $verbose > 0 } {
	verbose "Spawning \"$cmd $cmd_arg $file\""
    } else {
	send_log "Spawning \"$cmd $cmd_arg $file\"\n"
    }
    catch "exec $cmd $cmd_arg $file" comp_output
    if ![string match "" $comp_output] {	
        send_log "$comp_output\n"
    }
    return $comp_output
}
