From eb22018c4c91268d4a6a11dc636493082ca33049 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sat, 20 Nov 2010 15:36:34 +0000 Subject: [PATCH] binutils/testsuite/ * lib/binutils-common.exp (regexp_diff): New procedure. * lib/utils-lib.exp (regexp_diff): Delete. gas/testsuite/ * lib/gas-defs.exp (regexp_diff): Delete. (run_dump_test): Remove final "" argument in call to regexp_diff. (run_list_test): Likewise. (run_list_test_stdin): Likewise. * gas/all/gas.exp (test_cond): Likewise. * gas/elf/elf.exp (run_elf_list_test): Likewise. * gas/m68k/all.exp: Likewise. * gas/mep/complex-relocs.exp (regexp_test): Likewise. * gas/mt/relocs.exp (regexp_test): Likewise. * gas/symver/symver.exp (run_error_test): Likewise. ld/testsuite/ * lib/ld-lib.exp (regexp_diff, simple_diff): Delete. --- binutils/testsuite/ChangeLog | 5 + binutils/testsuite/lib/binutils-common.exp | 154 +++++++++++++++++ binutils/testsuite/lib/utils-lib.exp | 108 +----------- gas/testsuite/ChangeLog | 13 ++ gas/testsuite/gas/all/gas.exp | 2 +- gas/testsuite/gas/elf/elf.exp | 4 +- gas/testsuite/gas/m68k/all.exp | 2 +- gas/testsuite/gas/mep/complex-relocs.exp | 2 +- gas/testsuite/gas/mt/relocs.exp | 2 +- gas/testsuite/gas/symver/symver.exp | 2 +- gas/testsuite/lib/gas-defs.exp | 124 +------------- ld/testsuite/ChangeLog | 4 + ld/testsuite/lib/ld-lib.exp | 190 +-------------------- 13 files changed, 192 insertions(+), 420 deletions(-) diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog index 0c29b9c8995..e044acc1372 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-20 Richard Sandiford + + * lib/binutils-common.exp (regexp_diff): New procedure. + * lib/utils-lib.exp (regexp_diff): Delete. + 2010-11-20 Richard Sandiford * lib/binutils-common.exp: New file. diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp index 96b19552f1a..2f8b4265282 100644 --- a/binutils/testsuite/lib/binutils-common.exp +++ b/binutils/testsuite/lib/binutils-common.exp @@ -149,3 +149,157 @@ proc is_elf64 { binary_file } { return 0 } + +# Compare two files line-by-line. FILE_1 is the actual output and FILE_2 +# is the expected output. Ignore blank lines in either file. +# +# FILE_2 is a series of regexps, comments and # directives. The directives +# are: +# +# #pass +# Treat the test as a PASS if everything up till this point has +# matched. Ignore any remaining lines in either FILE_1 or FILE_2. +# +# #failif +# Reverse the sense of the test: expect differences to exist. +# +# #... +# REGEXP +# Skip all lines in FILE_1 until the first that matches REGEXP. +# +# Other # lines are comments. Skip empty lines in both files. +# +# The first optional argument is a list of regexp substitutions of the form: +# +# EXP1 SUBSPEC1 EXP2 SUBSPEC2 ... +# +# This tells the function to apply each regexp substitution EXPi->SUBSPECi +# in order to every line of FILE_2. +# +# Return nonzero if differences exist. +proc regexp_diff { file_1 file_2 args } { + set eof -1 + set end_1 0 + set end_2 0 + set differences 0 + set diff_pass 0 + set fail_if_match 0 + set ref_subst "" + if { [llength $args] > 0 } { + set ref_subst [lindex $args 0] + } + if { [llength $args] > 1 } { + perror "Too many arguments to regexp_diff" + return 1 + } + + if [file exists $file_1] then { + set file_a [open $file_1 r] + } else { + perror "$file_1 doesn't exist" + return 1 + } + + if [file exists $file_2] then { + set file_b [open $file_2 r] + } else { + perror "$file_2 doesn't exist" + close $file_a + return 1 + } + + verbose " Regexp-diff'ing: $file_1 $file_2" 2 + + while { 1 } { + set line_a "" + set line_b "" + while { [string length $line_a] == 0 } { + # Ignore blank line in FILE_1. + if { [gets $file_a line_a] == $eof } { + set end_1 1 + break + } + } + while { [string length $line_b] == 0 || [string match "#*" $line_b] } { + if { [string match "#pass" $line_b] } { + set end_2 1 + set diff_pass 1 + break + } elseif { [string match "#failif" $line_b] } { + send_log "fail if no difference\n" + verbose "fail if no difference" 3 + set fail_if_match 1 + } elseif { [string match "#..." $line_b] } { + if { [gets $file_b line_b] == $eof } { + set end_2 1 + set diff_pass 1 + break + } + # Substitute on the reference. + foreach {name value} $ref_subst { + regsub -- $name $line_b $value line_b + } + verbose "looking for \"^$line_b$\"" 3 + while { ![regexp "^$line_b$" "$line_a"] } { + verbose "skipping \"$line_a\"" 3 + if { [gets $file_a line_a] == $eof } { + set end_1 1 + break + } + } + break + } + if { [gets $file_b line_b] == $eof } { + set end_2 1 + break + } + } + + if { $diff_pass } { + break + } elseif { $end_1 && $end_2 } { + break + } elseif { $end_1 } { + send_log "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1\n" + verbose "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1" 3 + set differences 1 + break + } elseif { $end_2 } { + send_log "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" + verbose "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" 3 + set differences 1 + break + } else { + # Substitute on the reference. + foreach {name value} $ref_subst { + regsub -- $name $line_b $value line_b + } + verbose "regexp \"^$line_b$\"\nline \"$line_a\"" 3 + if { ![regexp "^$line_b$" "$line_a"] } { + send_log "regexp_diff match failure\n" + send_log "regexp \"^$line_b$\"\nline \"$line_a\"\n" + verbose "regexp_diff match failure\n" 3 + set differences 1 + } + } + } + + if { $differences == 0 && !$diff_pass && [eof $file_a] != [eof $file_b] } { + send_log "$file_1 and $file_2 are different lengths\n" + verbose "$file_1 and $file_2 are different lengths" 3 + set differences 1 + } + + if { $fail_if_match } { + if { $differences == 0 } { + set differences 1 + } else { + set differences 0 + } + } + + close $file_a + close $file_b + + return $differences +} diff --git a/binutils/testsuite/lib/utils-lib.exp b/binutils/testsuite/lib/utils-lib.exp index 6dbbecf310d..72e368cbb39 100644 --- a/binutils/testsuite/lib/utils-lib.exp +++ b/binutils/testsuite/lib/utils-lib.exp @@ -242,8 +242,8 @@ proc exe_ext {} { # # After the option lines come regexp lines. `run_dump_test' calls # `regexp_diff' to compare the output of the dumping tool against the -# regexps in FILE.d. `regexp_diff' is defined later in this file; see -# further comments there. +# regexps in FILE.d. `regexp_diff' is defined in binutils-common.exp; +# see further comments there. proc run_dump_test { name {extra_options {}} } { global subdir srcdir @@ -538,110 +538,6 @@ proc slurp_options { file } { return $opt_array } -# regexp_diff, based on simple_diff taken from ld test suite -# compares two files line-by-line -# file1 contains strings, file2 contains regexps and #-comments -# blank lines are ignored in either file -# returns non-zero if differences exist -# -proc regexp_diff { file_1 file_2 } { - - set eof -1 - set end_1 0 - set end_2 0 - set differences 0 - set diff_pass 0 - - if [file exists $file_1] then { - set file_a [open $file_1 r] - } else { - perror "$file_1 doesn't exist" - return 1 - } - - if [file exists $file_2] then { - set file_b [open $file_2 r] - } else { - perror "$file_2 doesn't exist" - close $file_a - return 1 - } - - verbose " Regexp-diff'ing: $file_1 $file_2" 2 - - while { 1 } { - set line_a "" - set line_b "" - while { [string length $line_a] == 0 } { - if { [gets $file_a line_a] == $eof } { - set end_1 1 - break - } - } - while { [string length $line_b] == 0 || [string match "#*" $line_b] } { - if [ string match "#pass" $line_b ] { - set end_2 1 - set diff_pass 1 - break - } elseif [ string match "#..." $line_b ] { - if { [gets $file_b line_b] == $eof } { - set end_2 1 - set diff_pass 1 - break - } - verbose "looking for \"^$line_b$\"" 3 - while { ![regexp "^$line_b$" "$line_a"] } { - verbose "skipping \"$line_a\"" 3 - if { [gets $file_a line_a] == $eof } { - set end_1 1 - break - } - } - break - } - if { [gets $file_b line_b] == $eof } { - set end_2 1 - break - } - } - - if { $diff_pass } { - break - } elseif { $end_1 && $end_2 } { - break - } elseif { $end_1 } { - send_log "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1\n" - verbose "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1" 3 - set differences 1 - break - } elseif { $end_2 } { - send_log "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" - verbose "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" 3 - set differences 1 - break - } else { - verbose "regexp \"^$line_b$\"\nline \"$line_a\"" 3 - if ![regexp "^$line_b$" "$line_a"] { - send_log "regexp_diff match failure\n" - send_log "regexp \"^$line_b$\"\nline \"$line_a\"\n" - verbose "regexp_diff match failure\n" 3 - set differences 1 - } - } - } - - if { $differences == 0 && !$diff_pass && [eof $file_a] != [eof $file_b] } { - send_log "$file_1 and $file_2 are different lengths\n" - verbose "$file_1 and $file_2 are different lengths" 3 - set differences 1 - } - - close $file_a - close $file_b - - return $differences -} - proc file_contents { filename } { set file [open $filename r] set contents [read $file] diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index d1583856ba0..90b3bfce6e3 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2010-11-20 Richard Sandiford + + * lib/gas-defs.exp (regexp_diff): Delete. + (run_dump_test): Remove final "" argument in call to regexp_diff. + (run_list_test): Likewise. + (run_list_test_stdin): Likewise. + * gas/all/gas.exp (test_cond): Likewise. + * gas/elf/elf.exp (run_elf_list_test): Likewise. + * gas/m68k/all.exp: Likewise. + * gas/mep/complex-relocs.exp (regexp_test): Likewise. + * gas/mt/relocs.exp (regexp_test): Likewise. + * gas/symver/symver.exp (run_error_test): Likewise. + 2010-11-20 Richard Sandiford * lib/gas-defs.exp (load_common_lib): New function. Load diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp index 1dd7cbb025b..c41db983c12 100644 --- a/gas/testsuite/gas/all/gas.exp +++ b/gas/testsuite/gas/all/gas.exp @@ -308,7 +308,7 @@ proc test_cond {} { send_log "$comp_output\n" fail $testname } else { - if { [regexp_diff dump.out $srcdir/$subdir/cond.l ""] } { + if { [regexp_diff dump.out $srcdir/$subdir/cond.l] } { fail $testname } else { pass $testname diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp index 1aebf8af69c..3babe0b1cb4 100644 --- a/gas/testsuite/gas/elf/elf.exp +++ b/gas/testsuite/gas/elf/elf.exp @@ -9,7 +9,7 @@ proc run_elf_list_test { name suffix opts readelf_opts readelf_pipe } { set file $srcdir/$subdir/$name gas_run ${name}.s "$opts -o dump.o" ">&dump.out" if { ![string match "" $opts] - && [regexp_diff "dump.out" "${file}.l" ""] } then { + && [regexp_diff "dump.out" "${file}.l"] } then { fail $testname verbose "output is [file_contents "dump.out"]" 2 return @@ -28,7 +28,7 @@ proc run_elf_list_test { name suffix opts readelf_opts readelf_pipe } { return } verbose_eval {[file_contents "dump.out"]} 3 - if { [regexp_diff "dump.out" "${file}.e${suffix}" ""] } then { + if { [regexp_diff "dump.out" "${file}.e${suffix}"] } then { fail $testname verbose "output is [file_contents "dump.out"]" 2 return diff --git a/gas/testsuite/gas/m68k/all.exp b/gas/testsuite/gas/m68k/all.exp index 443fdb62b42..f4bdfa77459 100644 --- a/gas/testsuite/gas/m68k/all.exp +++ b/gas/testsuite/gas/m68k/all.exp @@ -83,7 +83,7 @@ if { [istarget m68*-*-*] || [istarget fido*-*-*] } then { verbose "$comp_output" 3 fail $testname } else { - if [regexp_diff "err.out" "$srcdir/$subdir/op68000.d" ""] then { + if [regexp_diff "err.out" "$srcdir/$subdir/op68000.d"] then { fail $testname } else { pass $testname diff --git a/gas/testsuite/gas/mep/complex-relocs.exp b/gas/testsuite/gas/mep/complex-relocs.exp index a5a3127fb1f..83d89bb6375 100644 --- a/gas/testsuite/gas/mep/complex-relocs.exp +++ b/gas/testsuite/gas/mep/complex-relocs.exp @@ -18,7 +18,7 @@ proc objdump_test { exec flags dest test } { } proc regexp_test { file1 file2 test } { - if [regexp_diff $file1 $file2 ""] then { fail $test } else { pass $test } + if [regexp_diff $file1 $file2] then { fail $test } else { pass $test } } diff --git a/gas/testsuite/gas/mt/relocs.exp b/gas/testsuite/gas/mt/relocs.exp index d47742ebf32..076f428bc73 100644 --- a/gas/testsuite/gas/mt/relocs.exp +++ b/gas/testsuite/gas/mt/relocs.exp @@ -15,7 +15,7 @@ proc objdump_test { exec flags dest test } { } proc regexp_test { file1 file2 test } { - if [regexp_diff $file1 $file2 ""] then { fail $test } else { pass $test } + if [regexp_diff $file1 $file2] then { fail $test } else { pass $test } } diff --git a/gas/testsuite/gas/symver/symver.exp b/gas/testsuite/gas/symver/symver.exp index b4caae97a43..6fcae0edab2 100644 --- a/gas/testsuite/gas/symver/symver.exp +++ b/gas/testsuite/gas/symver/symver.exp @@ -6,7 +6,7 @@ proc run_error_test { name opts } { set testname "symver $name" set file $srcdir/$subdir/$name gas_run ${name}.s $opts ">&dump.out" - if { [regexp_diff "dump.out" "${file}.l" ""] } then { + if { [regexp_diff "dump.out" "${file}.l"] } then { fail $testname verbose "output is [file_contents "dump.out"]" 2 return diff --git a/gas/testsuite/lib/gas-defs.exp b/gas/testsuite/lib/gas-defs.exp index cacfb50ae3b..f10d72adce7 100644 --- a/gas/testsuite/lib/gas-defs.exp +++ b/gas/testsuite/lib/gas-defs.exp @@ -427,8 +427,8 @@ proc run_dump_tests { testcases {extra_options {}} } { # # After the option lines come regexp lines. `run_dump_test' calls # `regexp_diff' to compare the output of the dumping tool against the -# regexps in FILE.d. `regexp_diff' is defined later in this file; see -# further comments there. +# regexps in FILE.d. `regexp_diff' is defined in binutils-common.exp; +# see further comments there. proc run_dump_test { name {extra_options {}} } { global subdir srcdir @@ -679,7 +679,7 @@ proc run_dump_test { name {extra_options {}} } { } set stderrfile $srcdir/$subdir/$opts(stderr) verbose "wrote pruned stderr to dump.stderr" 3 - if { [regexp_diff "dump.stderr" "$stderrfile" ""] } then { + if { [regexp_diff "dump.stderr" "$stderrfile"] } then { if { $opts(error) != "" } { verbose -log "$exitstat with: <$comp_output>, expected: <$opts(error)>" if [regexp $opts(error) $comp_output] { @@ -839,120 +839,6 @@ expect_after -i { eof { perror "eof" } } -# regexp_diff, based on simple_diff taken from ld test suite. -# Compares two files line-by-line. -# FILE_1 contains strings, FILE_2 contains regexps and #-comments -# Blank lines are ignored in either file. -# Subsitutions in REF_SUBST are applied on FILE_2 lines. -# Returns non-zero if differences exist. -# -proc regexp_diff { file_1 file_2 ref_subst} { - - set eof -1 - set end_1 0 - set end_2 0 - set differences 0 - set diff_pass 0 - - if [file exists $file_1] then { - set file_a [open $file_1 r] - } else { - perror "$file_1 doesn't exist" - return 1 - } - - if [file exists $file_2] then { - set file_b [open $file_2 r] - } else { - perror "$file_2 doesn't exist" - close $file_a - return 1 - } - - verbose " Regexp-diff'ing: $file_1 $file_2" 2 - - while { 1 } { - set line_a "" - set line_b "" - while { [string length $line_a] == 0 } { - # Ignore blank line in FILE_1. - if { [gets $file_a line_a] == $eof } { - set end_1 1 - break - } - } - while { [string length $line_b] == 0 || [string match "#*" $line_b] } { - if [ string match "#pass" $line_b ] { - set end_2 1 - set diff_pass 1 - break - } elseif [ string match "#..." $line_b ] { - if { [gets $file_b line_b] == $eof } { - set end_2 1 - set diff_pass 1 - break - } - # Substitute on the reference. - foreach {name value} $ref_subst { - regsub -- $name $line_b $value line_b - } - verbose "looking for \"^$line_b$\"" 3 - while { ![regexp "^$line_b$" "$line_a"] } { - verbose "skipping \"$line_a\"" 3 - if { [gets $file_a line_a] == $eof } { - set end_1 1 - break - } - } - break - } - if { [gets $file_b line_b] == $eof } { - set end_2 1 - break - } - } - - if { $diff_pass } { - break - } elseif { $end_1 && $end_2 } { - break - } elseif { $end_1 } { - send_log "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1\n" - verbose "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1" 3 - set differences 1 - break - } elseif { $end_2 } { - send_log "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" - verbose "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" 3 - set differences 1 - break - } else { - # Substitute on the reference. - foreach {name value} $ref_subst { - regsub -- $name $line_b $value line_b - } - verbose "regexp \"^$line_b$\"\nline \"$line_a\"" 3 - if ![regexp "^$line_b$" "$line_a"] { - send_log "regexp_diff match failure\n" - send_log "regexp \"^$line_b$\"\nline \"$line_a\"\n" - verbose "regexp_diff match failure\n" 3 - set differences 1 - } - } - } - - if { $differences == 0 && !$diff_pass && [eof $file_a] != [eof $file_b] } { - send_log "$file_1 and $file_2 are different lengths\n" - verbose "$file_1 and $file_2 are different lengths" 3 - set differences 1 - } - - close $file_a - close $file_b - - return $differences -} - proc file_contents { filename } { set file [open $filename r] set contents [read $file] @@ -1008,7 +894,7 @@ proc run_list_test { name {opts {}} {testname {}} } { } set file $srcdir/$subdir/$name gas_run ${name}.s $opts ">&dump.out" - if { [regexp_diff "dump.out" "${file}.l" ""] } then { + if { [regexp_diff "dump.out" "${file}.l"] } then { fail $testname verbose "output is [file_contents "dump.out"]" 2 return @@ -1027,7 +913,7 @@ proc run_list_test_stdin { name {opts {}} {testname {}} } { } set file $srcdir/$subdir/$name gas_run_stdin ${name}.s $opts ">&dump.out" - if { [regexp_diff "dump.out" "${file}.l" ""] } then { + if { [regexp_diff "dump.out" "${file}.l"] } then { fail $testname verbose "output is [file_contents "dump.out"]" 2 return diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 30d1a1a3a47..d1fc0c44b9d 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-11-20 Richard Sandiford + + * lib/ld-lib.exp (regexp_diff, simple_diff): Delete. + 2010-11-20 Richard Sandiford * lib/ld-lib.exp (load_common_lib): New function. Load diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp index c1e141a2b41..48e9635d03f 100644 --- a/ld/testsuite/lib/ld-lib.exp +++ b/ld/testsuite/lib/ld-lib.exp @@ -408,75 +408,6 @@ proc ld_simple_link_defsyms {} { return $flags } -# Compares two files line-by-line. -# Returns differences if exist. -# Returns null if file(s) cannot be opened. -# -proc simple_diff { file_1 file_2 } { - global target - - set eof -1 - set differences 0 - - if [file exists $file_1] then { - set file_a [open $file_1 r] - } else { - warning "$file_1 doesn't exist" - return - } - - if [file exists $file_2] then { - set file_b [open $file_2 r] - } else { - fail "$file_2 doesn't exist" - return - } - - verbose "# Diff'ing: $file_1 $file_2\n" 2 - - while { [gets $file_a line] != $eof } { - if [regexp "^#.*$" $line] then { - continue - } else { - lappend list_a $line - } - } - close $file_a - - while { [gets $file_b line] != $eof } { - if [regexp "^#.*$" $line] then { - continue - } else { - lappend list_b $line - } - } - close $file_b - - for { set i 0 } { $i < [llength $list_a] } { incr i } { - set line_a [lindex $list_a $i] - set line_b [lindex $list_b $i] - - verbose "\t$file_1: $i: $line_a\n" 3 - verbose "\t$file_2: $i: $line_b\n" 3 - if [string compare $line_a $line_b] then { - verbose -log "\t$file_1: $i: $line_a\n" - verbose -log "\t$file_2: $i: $line_b\n" - - fail "Test: $target" - return - } - } - - if { [llength $list_a] != [llength $list_b] } { - fail "Test: $target" - return - } - - if $differences<1 then { - pass "Test: $target" - } -} - # run_dump_test FILE # Copied from gas testsuite, tweaked and further extended. # @@ -577,8 +508,8 @@ proc simple_diff { file_1 file_2 } { # # After the option lines come regexp lines. `run_dump_test' calls # `regexp_diff' to compare the output of the dumping tool against the -# regexps in FILE.d. `regexp_diff' is defined later in this file; see -# further comments there. +# regexps in FILE.d. `regexp_diff' is defined in binutils-common.exp; +# see further comments there. # proc run_dump_test { name } { global subdir srcdir @@ -943,123 +874,6 @@ proc slurp_options { file } { return $opt_array } -# regexp_diff, copied from gas, based on simple_diff above. -# compares two files line-by-line -# file1 contains strings, file2 contains regexps and #-comments -# blank lines are ignored in either file -# returns non-zero if differences exist -# -proc regexp_diff { file_1 file_2 } { - - set eof -1 - set end_1 0 - set end_2 0 - set differences 0 - set diff_pass 0 - set fail_if_match 0 - - if [file exists $file_1] then { - set file_a [open $file_1 r] - } else { - warning "$file_1 doesn't exist" - return 1 - } - - if [file exists $file_2] then { - set file_b [open $file_2 r] - } else { - fail "$file_2 doesn't exist" - close $file_a - return 1 - } - - verbose " Regexp-diff'ing: $file_1 $file_2" 2 - - while { 1 } { - set line_a "" - set line_b "" - while { [string length $line_a] == 0 } { - if { [gets $file_a line_a] == $eof } { - set end_1 1 - break - } - } - while { [string length $line_b] == 0 || [string match "#*" $line_b] } { - if [ string match "#pass" $line_b ] { - set end_2 1 - set diff_pass 1 - break - } elseif [ string match "#failif" $line_b ] { - send_log "fail if no difference\n" - verbose "fail if no difference" 3 - set fail_if_match 1 - } elseif [ string match "#..." $line_b ] { - if { [gets $file_b line_b] == $eof } { - set end_2 1 - set diff_pass 1 - break - } - verbose "looking for \"^$line_b$\"" 3 - while { ![regexp "^$line_b$" "$line_a"] } { - verbose "skipping \"$line_a\"" 3 - if { [gets $file_a line_a] == $eof } { - set end_1 1 - break - } - } - break - } - if { [gets $file_b line_b] == $eof } { - set end_2 1 - break - } - } - - if { $diff_pass } { - break - } elseif { $end_1 && $end_2 } { - break - } elseif { $end_1 } { - send_log "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1\n" - verbose "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1" 3 - set differences 1 - break - } elseif { $end_2 } { - send_log "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" - verbose "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" 3 - set differences 1 - break - } else { - verbose "regexp \"^$line_b$\"\nline \"$line_a\"" 3 - if ![regexp "^$line_b$" "$line_a"] { - verbose "regexp_diff match failure\n" 3 - send_log "regexp_diff match failure\n" - send_log "regexp \"^$line_b$\"\nline \"$line_a\"\n" - set differences 1 - } - } - } - - if { $differences == 0 && !$diff_pass && [eof $file_a] != [eof $file_b] } { - send_log "$file_1 and $file_2 are different lengths\n" - verbose "$file_1 and $file_2 are different lengths" 3 - set differences 1 - } - - if { $fail_if_match } { - if { $differences == 0 } { - set differences 1 - } else { - set differences 0 - } - } - - close $file_a - close $file_b - - return $differences -} - proc file_contents { filename } { set file [open $filename r] set contents [read $file]