From 8813c6679e78c06d69259993baf8f44537abdc11 Mon Sep 17 00:00:00 2001 From: Rob Savoye Date: Mon, 5 Feb 2001 04:26:49 +0000 Subject: import from redhat cvs --- contrib/bluegnu2.0.3/doc/dejagnu.pdf | 4844 ++++++++++++++ contrib/bluegnu2.0.3/doc/dejagnu.ps | 6690 ++++++++++++++++++++ contrib/bluegnu2.0.3/doc/dejagnu.texi | 3503 ++++++++++ contrib/bluegnu2.0.3/doc/notice.html | 395 ++ contrib/bluegnu2.0.3/doc/notice.pdf | 1165 ++++ contrib/bluegnu2.0.3/doc/notice.ps | 1394 ++++ contrib/bluegnu2.0.3/example/Makefile.in | 98 + contrib/bluegnu2.0.3/example/calc/Makefile.in | 112 + contrib/bluegnu2.0.3/example/calc/calc.1 | 29 + contrib/bluegnu2.0.3/example/calc/calc.c | 65 + contrib/bluegnu2.0.3/example/calc/calc.h.in | 18 + contrib/bluegnu2.0.3/example/calc/configure | 812 +++ contrib/bluegnu2.0.3/example/calc/configure.in | 19 + .../example/calc/testsuite/calc.test/calc.exp | 60 + .../example/calc/testsuite/config/unix.exp | 49 + contrib/bluegnu2.0.3/example/configure | 697 ++ contrib/bluegnu2.0.3/example/configure.in | 8 + contrib/bluegnu2.0.3/lib/BlueGnu_target.itcl | 105 + contrib/bluegnu2.0.3/lib/Default_target.itcl | 82 + contrib/bluegnu2.0.3/lib/Types.itcl | 216 + contrib/bluegnu2.0.3/lib/bluegnu.itcl | 22 + contrib/bluegnu2.0.3/lib/bug.exp | 125 + contrib/bluegnu2.0.3/lib/debugger.exp | 252 + contrib/bluegnu2.0.3/lib/dejagnu.itcl | 81 + contrib/bluegnu2.0.3/lib/dejagnu.tcl | 1130 ++++ contrib/bluegnu2.0.3/lib/dg.exp | 881 +++ contrib/bluegnu2.0.3/lib/foo.itcl | 21 + contrib/bluegnu2.0.3/lib/framework.exp | 677 ++ contrib/bluegnu2.0.3/lib/libgloss.exp | 225 + contrib/bluegnu2.0.3/lib/nonexpect.itcl | 74 + contrib/bluegnu2.0.3/lib/remote.exp | 896 +++ contrib/bluegnu2.0.3/lib/serverUtils.itcl | 51 + contrib/bluegnu2.0.3/lib/target.exp | 520 ++ contrib/bluegnu2.0.3/lib/tclIndex | 21 + .../bluegnu2.0.3/lib/testSessionApplication.itcl | 314 + contrib/bluegnu2.0.3/lib/testSessionClasses.itcl | 1341 ++++ contrib/bluegnu2.0.3/lib/testSessionFramework.itcl | 1386 ++++ contrib/bluegnu2.0.3/lib/testSessionUtils.itcl | 26 + contrib/bluegnu2.0.3/lib/udi.exp | 213 + contrib/bluegnu2.0.3/lib/util-defs.exp | 110 + contrib/bluegnu2.0.3/lib/utils.exp | 454 ++ contrib/bluegnu2.0.3/lib/vrtx.exp | 334 + contrib/bluegnu2.0.3/lib/vxworks.exp | 265 + .../bluegnu2.0.3/testsets/BlueGnu/appendQueue.itcl | 9 + .../testsets/BlueGnu/clone_output.itcl | 156 + .../bluegnu2.0.3/testsets/BlueGnu/locateFile.itcl | 46 + .../testsets/BlueGnu/namespaceVariables.itcl | 36 + .../testsets/BlueGnu/prependQueue.itcl | 6 + contrib/bluegnu2.0.3/testsets/BlueGnu/runtest.itcl | 19 + .../bluegnu2.0.3/testsets/BlueGnu/testNaming.itcl | 19 + contrib/bluegnu2.0.3/testsets/BlueGnu/ts001/A.itcl | 1 + contrib/bluegnu2.0.3/testsets/BlueGnu/ts002/A.itcl | 1 + contrib/bluegnu2.0.3/testsets/BlueGnu/types.itcl | 55 + contrib/bluegnu2.0.3/testsets/BlueGnu/verbose.itcl | 562 ++ .../testsets/examples/lib/benchmark.itcl | 64 + contrib/bluegnu2.0.3/testsets/examples/tc001 | 3 + contrib/bluegnu2.0.3/testsets/examples/tc002 | 3 + contrib/bluegnu2.0.3/testsets/examples/ts_001 | 2 + contrib/bluegnu2.0.3/testsets/examples/ts_002 | 4 + contrib/bluegnu2.0.3/testsets/examples/ts_003 | 2 + .../bluegnu2.0.3/testsets/examples/versionTcl.itcl | 8 + contrib/bluegnu2.0.3/testsets/tclIndex | 5 + contrib/bluegnu2.0.3/testsuite/Makefile.in | 100 + contrib/bluegnu2.0.3/testsuite/T/env.exp | 12 + contrib/bluegnu2.0.3/testsuite/T/env.iexp | 48 + contrib/bluegnu2.0.3/testsuite/T/foo.exp | 5 + contrib/bluegnu2.0.3/testsuite/T/subT/test_002.exp | 20 + contrib/bluegnu2.0.3/testsuite/T/test_000.exp | 8 + contrib/bluegnu2.0.3/testsuite/T/test_001.exp | 19 + contrib/bluegnu2.0.3/testsuite/T/test_002.exp | 22 + contrib/bluegnu2.0.3/testsuite/T/test_003.exp | 3 + contrib/bluegnu2.0.3/testsuite/T/test_004.exp | 3 + .../testsuite/bluegnu.all/clone_output.test | 68 + .../bluegnu2.0.3/testsuite/bluegnu.all/config.test | 138 + .../testsuite/bluegnu.all/default_procs.tcl | 94 + .../bluegnu2.0.3/testsuite/bluegnu.all/libs.exp | 73 + .../bluegnu2.0.3/testsuite/bluegnu.all/options.exp | 91 + .../bluegnu2.0.3/testsuite/bluegnu.all/remote.test | 217 + .../testsuite/bluegnu.all/stats-sub.exp | 16 + .../bluegnu2.0.3/testsuite/bluegnu.all/stats.exp | 49 + .../bluegnu2.0.3/testsuite/bluegnu.all/target.test | 247 + .../testsuite/bluegnu.all/topdir/subdir1/subfile1 | 1 + .../testsuite/bluegnu.all/topdir/subdir1/subfile2 | 2 + .../topdir/subdir1/subsubdir1/subsubfile1 | 2 + .../testsuite/bluegnu.all/topdir/subdir2/subfile2 | 2 + .../bluegnu2.0.3/testsuite/bluegnu.all/utils.test | 118 + contrib/bluegnu2.0.3/testsuite/config/default.exp | 79 + contrib/bluegnu2.0.3/testsuite/configure | 1076 ++++ contrib/bluegnu2.0.3/testsuite/configure.in | 9 + contrib/bluegnu2.0.3/testsuite/lib/libsup.exp | 220 + contrib/bluegnu2.0.3/testsuite/tools/env.exp | 20 + debian/changelog | 79 + debian/conffiles | 1 + debian/control | 18 + debian/copyright | 29 + debian/postinst | 9 + debian/preinst | 15 + debian/rules | 100 + debian/site.exp | 2 + doc/.cvsignore | 2 + doc/Makefile.am | 47 + doc/Makefile.in | 338 + doc/README | 2 + doc/configure | 860 +++ doc/configure.in | 5 + doc/dejagnu.texi | 3572 +++++++++++ doc/overview.sgml | 439 ++ doc/ref.sgml | 4242 +++++++++++++ doc/runtest.1 | 119 + doc/user.sgml | 2355 +++++++ example/Makefile.am | 6 + example/Makefile.in | 210 + example/calc/Makefile.in | 114 + example/calc/calc.1 | 29 + example/calc/calc.c | 65 + example/calc/calc.h.in | 18 + example/calc/configure | 1031 +++ example/calc/configure.in | 20 + example/calc/testsuite/calc.test/calc.exp | 79 + example/calc/testsuite/config/unix.exp | 68 + lib/debugger.exp | 244 + lib/dg.exp | 922 +++ lib/framework.exp | 898 +++ lib/ftp.exp | 246 + lib/kermit.exp | 180 + lib/libgloss.exp | 843 +++ lib/mondfe.exp | 213 + lib/remote.exp | 1265 ++++ lib/rlogin.exp | 173 + lib/rsh.exp | 258 + lib/standard.exp | 42 + lib/target.exp | 759 +++ lib/targetdb.exp | 113 + lib/telnet.exp | 243 + lib/tip.exp | 184 + lib/util-defs.exp | 101 + lib/utils.exp | 441 ++ lib/xsh.exp | 322 + redhat/dejagnu.spec | 77 + testsuite/Makefile.am | 5 + testsuite/Makefile.in | 207 + testsuite/config/default.exp | 79 + testsuite/lib/libsup.exp | 220 + testsuite/runtest.all/clone_output.test | 68 + testsuite/runtest.all/config.test | 138 + testsuite/runtest.all/default_procs.tcl | 94 + testsuite/runtest.all/libs.exp | 92 + testsuite/runtest.all/options.exp | 93 + testsuite/runtest.all/remote.test | 217 + testsuite/runtest.all/stats-sub.exp | 35 + testsuite/runtest.all/stats.exp | 53 + testsuite/runtest.all/target.test | 247 + testsuite/runtest.all/topdir/subdir1/subfile1 | 1 + testsuite/runtest.all/topdir/subdir1/subfile2 | 2 + .../topdir/subdir1/subsubdir1/subsubfile1 | 2 + testsuite/runtest.all/topdir/subdir2/subfile2 | 2 + testsuite/runtest.all/utils.test | 118 + 157 files changed, 56614 insertions(+) create mode 100644 contrib/bluegnu2.0.3/doc/dejagnu.pdf create mode 100644 contrib/bluegnu2.0.3/doc/dejagnu.ps create mode 100644 contrib/bluegnu2.0.3/doc/dejagnu.texi create mode 100644 contrib/bluegnu2.0.3/doc/notice.html create mode 100644 contrib/bluegnu2.0.3/doc/notice.pdf create mode 100644 contrib/bluegnu2.0.3/doc/notice.ps create mode 100644 contrib/bluegnu2.0.3/example/Makefile.in create mode 100644 contrib/bluegnu2.0.3/example/calc/Makefile.in create mode 100644 contrib/bluegnu2.0.3/example/calc/calc.1 create mode 100644 contrib/bluegnu2.0.3/example/calc/calc.c create mode 100644 contrib/bluegnu2.0.3/example/calc/calc.h.in create mode 100755 contrib/bluegnu2.0.3/example/calc/configure create mode 100644 contrib/bluegnu2.0.3/example/calc/configure.in create mode 100644 contrib/bluegnu2.0.3/example/calc/testsuite/calc.test/calc.exp create mode 100644 contrib/bluegnu2.0.3/example/calc/testsuite/config/unix.exp create mode 100755 contrib/bluegnu2.0.3/example/configure create mode 100644 contrib/bluegnu2.0.3/example/configure.in create mode 100644 contrib/bluegnu2.0.3/lib/BlueGnu_target.itcl create mode 100644 contrib/bluegnu2.0.3/lib/Default_target.itcl create mode 100644 contrib/bluegnu2.0.3/lib/Types.itcl create mode 100644 contrib/bluegnu2.0.3/lib/bluegnu.itcl create mode 100644 contrib/bluegnu2.0.3/lib/bug.exp create mode 100644 contrib/bluegnu2.0.3/lib/debugger.exp create mode 100644 contrib/bluegnu2.0.3/lib/dejagnu.itcl create mode 100644 contrib/bluegnu2.0.3/lib/dejagnu.tcl create mode 100644 contrib/bluegnu2.0.3/lib/dg.exp create mode 100644 contrib/bluegnu2.0.3/lib/foo.itcl create mode 100644 contrib/bluegnu2.0.3/lib/framework.exp create mode 100644 contrib/bluegnu2.0.3/lib/libgloss.exp create mode 100644 contrib/bluegnu2.0.3/lib/nonexpect.itcl create mode 100644 contrib/bluegnu2.0.3/lib/remote.exp create mode 100644 contrib/bluegnu2.0.3/lib/serverUtils.itcl create mode 100644 contrib/bluegnu2.0.3/lib/target.exp create mode 100644 contrib/bluegnu2.0.3/lib/tclIndex create mode 100644 contrib/bluegnu2.0.3/lib/testSessionApplication.itcl create mode 100644 contrib/bluegnu2.0.3/lib/testSessionClasses.itcl create mode 100644 contrib/bluegnu2.0.3/lib/testSessionFramework.itcl create mode 100644 contrib/bluegnu2.0.3/lib/testSessionUtils.itcl create mode 100644 contrib/bluegnu2.0.3/lib/udi.exp create mode 100644 contrib/bluegnu2.0.3/lib/util-defs.exp create mode 100644 contrib/bluegnu2.0.3/lib/utils.exp create mode 100644 contrib/bluegnu2.0.3/lib/vrtx.exp create mode 100644 contrib/bluegnu2.0.3/lib/vxworks.exp create mode 100644 contrib/bluegnu2.0.3/testsets/BlueGnu/appendQueue.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/BlueGnu/clone_output.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/BlueGnu/locateFile.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/BlueGnu/namespaceVariables.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/BlueGnu/prependQueue.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/BlueGnu/runtest.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/BlueGnu/testNaming.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/BlueGnu/ts001/A.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/BlueGnu/ts002/A.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/BlueGnu/types.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/BlueGnu/verbose.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/examples/lib/benchmark.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/examples/tc001 create mode 100644 contrib/bluegnu2.0.3/testsets/examples/tc002 create mode 100644 contrib/bluegnu2.0.3/testsets/examples/ts_001 create mode 100644 contrib/bluegnu2.0.3/testsets/examples/ts_002 create mode 100644 contrib/bluegnu2.0.3/testsets/examples/ts_003 create mode 100644 contrib/bluegnu2.0.3/testsets/examples/versionTcl.itcl create mode 100644 contrib/bluegnu2.0.3/testsets/tclIndex create mode 100644 contrib/bluegnu2.0.3/testsuite/Makefile.in create mode 100644 contrib/bluegnu2.0.3/testsuite/T/env.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/T/env.iexp create mode 100644 contrib/bluegnu2.0.3/testsuite/T/foo.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/T/subT/test_002.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/T/test_000.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/T/test_001.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/T/test_002.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/T/test_003.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/T/test_004.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/clone_output.test create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/config.test create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/default_procs.tcl create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/libs.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/options.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/remote.test create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/stats-sub.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/stats.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/target.test create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir1/subfile1 create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir1/subfile2 create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir1/subsubdir1/subsubfile1 create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir2/subfile2 create mode 100644 contrib/bluegnu2.0.3/testsuite/bluegnu.all/utils.test create mode 100644 contrib/bluegnu2.0.3/testsuite/config/default.exp create mode 100755 contrib/bluegnu2.0.3/testsuite/configure create mode 100644 contrib/bluegnu2.0.3/testsuite/configure.in create mode 100644 contrib/bluegnu2.0.3/testsuite/lib/libsup.exp create mode 100644 contrib/bluegnu2.0.3/testsuite/tools/env.exp create mode 100644 debian/changelog create mode 100644 debian/conffiles create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/postinst create mode 100644 debian/preinst create mode 100755 debian/rules create mode 100644 debian/site.exp create mode 100644 doc/.cvsignore create mode 100644 doc/Makefile.am create mode 100644 doc/Makefile.in create mode 100644 doc/README create mode 100755 doc/configure create mode 100644 doc/configure.in create mode 100644 doc/dejagnu.texi create mode 100644 doc/overview.sgml create mode 100644 doc/ref.sgml create mode 100644 doc/runtest.1 create mode 100644 doc/user.sgml create mode 100644 example/Makefile.am create mode 100644 example/Makefile.in create mode 100644 example/calc/Makefile.in create mode 100644 example/calc/calc.1 create mode 100644 example/calc/calc.c create mode 100644 example/calc/calc.h.in create mode 100755 example/calc/configure create mode 100644 example/calc/configure.in create mode 100644 example/calc/testsuite/calc.test/calc.exp create mode 100644 example/calc/testsuite/config/unix.exp create mode 100644 lib/debugger.exp create mode 100644 lib/dg.exp create mode 100644 lib/framework.exp create mode 100644 lib/ftp.exp create mode 100644 lib/kermit.exp create mode 100644 lib/libgloss.exp create mode 100644 lib/mondfe.exp create mode 100644 lib/remote.exp create mode 100644 lib/rlogin.exp create mode 100644 lib/rsh.exp create mode 100644 lib/standard.exp create mode 100644 lib/target.exp create mode 100644 lib/targetdb.exp create mode 100644 lib/telnet.exp create mode 100644 lib/tip.exp create mode 100644 lib/util-defs.exp create mode 100644 lib/utils.exp create mode 100644 lib/xsh.exp create mode 100644 redhat/dejagnu.spec create mode 100644 testsuite/Makefile.am create mode 100644 testsuite/Makefile.in create mode 100644 testsuite/config/default.exp create mode 100644 testsuite/lib/libsup.exp create mode 100644 testsuite/runtest.all/clone_output.test create mode 100644 testsuite/runtest.all/config.test create mode 100644 testsuite/runtest.all/default_procs.tcl create mode 100644 testsuite/runtest.all/libs.exp create mode 100644 testsuite/runtest.all/options.exp create mode 100644 testsuite/runtest.all/remote.test create mode 100644 testsuite/runtest.all/stats-sub.exp create mode 100644 testsuite/runtest.all/stats.exp create mode 100644 testsuite/runtest.all/target.test create mode 100644 testsuite/runtest.all/topdir/subdir1/subfile1 create mode 100644 testsuite/runtest.all/topdir/subdir1/subfile2 create mode 100644 testsuite/runtest.all/topdir/subdir1/subsubdir1/subsubfile1 create mode 100644 testsuite/runtest.all/topdir/subdir2/subfile2 create mode 100644 testsuite/runtest.all/utils.test diff --git a/contrib/bluegnu2.0.3/doc/dejagnu.pdf b/contrib/bluegnu2.0.3/doc/dejagnu.pdf new file mode 100644 index 0000000..6f6d12d --- /dev/null +++ b/contrib/bluegnu2.0.3/doc/dejagnu.pdf @@ -0,0 +1,4844 @@ +%PDF-1.2 +8 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -194.44 +/Flags 4 +/FontBBox [-40 -250 1009 969] +/FontName /CMR10 +/ItalicAngle 0 +/XHeight 431 +/StemV 80 +/FontFile 7 0 R +>> +endobj +9 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F1 +/FontDescriptor 8 0 R +/BaseFont /PNKVMB+CMR10 +/FirstChar 0 +/LastChar 127 +/Widths [625 833.34 777.78 694.45 666.67 750 722.22 777.78 722.22 777.78 722.22 583.34 +555.56 555.56 833.34 833.34 277.78 305.56 500 500 500 500 500 750 444.45 500 722.22 +777.78 500 902.78 1013.89 777.78 277.78 277.78 500 833.34 500 833.34 777.78 277.78 +388.89 388.89 500 777.78 277.78 333.33 277.78 500 500 500 500 500 500 500 500 500 +500 500 277.78 277.78 277.78 777.78 472.22 472.22 777.78 750 708.34 722.22 763.89 +680.56 652.78 784.72 750 361.11 513.89 777.78 625 916.67 750 777.78 680.56 777.78 +736.11 555.56 722.22 750 750 1027.78 750 750 611.11 277.78 500 277.78 500 277.78 +277.78 500 555.56 444.45 555.56 444.45 305.56 500 555.56 277.78 305.56 527.78 277.78 +833.34 555.56 500 555.56 527.78 391.67 394.45 388.89 555.56 527.78 722.22 527.78 +527.78 444.45 500 1000 500 500 500] +>> +endobj +11 0 obj +<< +/Type /FontDescriptor +/CapHeight 686.11 +/Ascent 694.44 +/Descent -194.44 +/Flags 4 +/FontBBox [-296 -251 1139 946] +/FontName /CMBX12 +/ItalicAngle 0 +/XHeight 444 +/StemV 80 +/FontFile 10 0 R +>> +endobj +12 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F2 +/FontDescriptor 11 0 R +/BaseFont /XOEAXU+CMBX12 +/FirstChar 0 +/LastChar 127 +/Widths [675.93 937.5 875 787.04 750 879.63 812.5 875 812.5 875 812.5 656.25 625 +625 937.5 937.5 312.5 343.75 562.5 562.5 562.5 562.5 562.5 849.54 500 574.07 812.5 +875 562.5 1018.52 1143.52 875 312.5 342.59 581.02 937.5 562.5 937.5 875 312.5 437.5 +437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 +562.5 562.5 312.5 312.5 342.59 875 531.25 531.25 875 849.54 799.77 812.5 862.27 738.43 +707.18 884.26 879.63 418.98 581.02 880.79 675.93 1067.13 879.63 844.91 768.52 844.91 +839.12 625 782.41 864.58 849.54 1162.04 849.54 849.54 687.5 312.5 581.02 312.5 562.5 +312.5 312.5 546.88 625 500 625 513.31 343.75 562.5 625 312.5 343.75 593.75 312.5 +937.5 625 562.5 625 593.75 459.49 443.75 437.5 625 593.75 812.5 593.75 593.75 500 +562.5 1125 562.5 562.5 562.5] +>> +endobj +14 0 obj +<< +/Length 480 +>> +stream +0 w 0 g 0 G BT/F1 9.96 Tf 37.93 -9.96 TD[(o)]TJ/F2 20.66 Tf -19.93 -123.44 TD[(The)-374(DejaGn)30(u)-374(T)93(esting)-374(F)92(ramew)32(ork)]TJ ET 18.00 -145.39 m 450.00 -145.39 l 450.00 -141.41 l 18.00 -141.41 l b BT/F1 10.91 Tf 334.5 -156.95 TD[(for)-333(DejaGn)27(u)-332(V)82(ersion)-332(1.3)]TJ 72.92 -26.1 TD[(Jan)-333(1996)]TJ/F2 14.35 Tf -389.42 -425.07 TD[(Rob)-374(Sa)30(v)31(o)31(y)32(e)]TJ ET 18.00 -616.89 m 450.00 -616.89 l 450.00 -614.89 l 18.00 -614.89 l b 0 g 0 G +endstream +endobj +16 0 obj +<< +/F1 9 0 R +/F2 12 0 R +>> +endobj +6 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 16 0 R +>> +endobj +20 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -960 +/Flags 68 +/FontBBox [-29 -960 1116 775] +/FontName /CMSY10 +/ItalicAngle -14 +/XHeight 431 +/StemV 80 +/FontFile 19 0 R +>> +endobj +21 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F3 +/FontDescriptor 20 0 R +/BaseFont /ZRNQXX+CMSY10 +/FirstChar 0 +/LastChar 127 +/Widths [777.78 277.78 777.78 500 777.78 500 777.78 777.78 777.78 777.78 777.78 777.78 +777.78 1000 500 500 777.78 777.78 777.78 777.78 777.78 777.78 777.78 777.78 777.78 +777.78 777.78 777.78 1000 1000 777.78 777.78 1000 1000 500 500 1000 1000 1000 777.78 +1000 1000 611.11 611.11 1000 1000 1000 777.78 275 1000 666.67 666.67 888.89 888.89 +0 0 555.56 555.56 666.67 500 722.22 722.22 777.78 777.78 611.11 798.47 656.81 526.53 +771.39 527.78 718.75 594.87 844.52 544.52 677.78 761.95 689.72 1200.9 820.49 796.11 +695.56 816.67 847.5 605.56 544.64 625.83 612.78 987.78 713.3 668.34 724.73 666.67 +666.67 666.67 666.67 666.67 611.11 611.11 444.45 444.45 444.45 444.45 500 500 388.89 +388.89 277.78 500 500 611.11 500 277.78 833.34 750 833.34 416.67 666.67 666.67 777.78 +777.78 444.45 444.45 444.45 611.11 777.78 777.78 777.78 777.78] +>> +endobj +22 0 obj +<< +/Length 1550 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 372.64 -49.02 TD[(Cygn)27(us)-332(Supp)-28(ort)]TJ -354.64 -488.63 TD[(Cop)27(yrigh)28(t)]TJ 54.27 0.32 TD[(c)]TJ/F3 10.91 Tf -3.03 -0.32 TD[(\015)]TJ/F1 10.91 Tf 14.55 0 TD[(92,)-333(93,)-333(94,)-333(95,)-334(1996)-333(F)82(ree)-332(Soft)27(w)27(are)-332(F)82(oundation,)-332(Inc.)]TJ -65.79 -16.14 TD[(P)27(ermission)-352(is)-354(gran)27(ted)-352(to)-354(mak)27(e)-352(and)-354(distribute)-353(v)27(erbatim)-353(copies)-353(of)-354(this)-353(man)27(ual)-353(pro)27(vided)-352(the)]TJ 0 -13.15 TD[(cop)27(yrigh)28(t)-332(notice)-334(and)-333(this)-333(p)-28(ermission)-333(notice)-334(are)-333(preserv)27(ed)-333(on)-333(all)-333(copies.)]TJ 0 -16.14 TD[(P)27(ermission)-418(is)-419(gran)27(ted)-419(to)-419(cop)27(y)-418(and)-420(distribute)-419(mo)-28(di\014ed)-419(v)27(ersions)-418(of)-419(this)-420(man)27(ual)-418(under)-419(the)]TJ 0 -13.15 TD[(conditions)-460(for)-461(v)27(erbatim)-459(cop)26(ying,)-491(pro)27(vided)-460(also)-460(that)-461(the)-460(en)26(tire)-459(resulting)-461(deriv)27(ed)-459(w)26(ork)-459(is)]TJ 0 -13.16 TD[(distributed)-333(under)-333(the)-333(terms)-334(of)-333(a)-333(p)-28(ermission)-334(notice)-333(iden)27(tical)-332(to)-334(this)-333(one.)]TJ 0 -16.13 TD[(P)27(ermission)-362(is)-364(gran)27(ted)-363(to)-364(cop)27(y)-363(and)-363(distribute)-364(translations)-364(of)-363(this)-364(man)27(ual)-363(in)27(to)-363(another)-363(lan-)]TJ 0 -13.16 TD[(guage,)-333(under)-333(the)-333(ab)-28(o)27(v)27(e)-332(conditions)-333(for)-334(mo)-27(di\014ed)-334(v)27(ersions.)]TJ ET 0 g 0 G +endstream +endobj +23 0 obj +<< +/F1 9 0 R +/F3 21 0 R +>> +endobj +18 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 23 0 R +>> +endobj +27 0 obj +<< +/Type /FontDescriptor +/CapHeight 611.11 +/Ascent 611.11 +/Descent -222.22 +/Flags 5 +/FontBBox [-4 -235 731 800] +/FontName /CMTT10 +/ItalicAngle 0 +/XHeight 431 +/StemV 80 +/FontFile 26 0 R +>> +endobj +28 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F4 +/FontDescriptor 27 0 R +/BaseFont /YSVNVS+CMTT10 +/FirstChar 0 +/LastChar 127 +/Widths [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 +525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 +525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 +525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 +525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 +525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 +525 525 525 525 525] +>> +endobj +30 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -194.44 +/Flags 68 +/FontBBox [-200 -250 1123 969] +/FontName /CMSL10 +/ItalicAngle -9 +/XHeight 431 +/StemV 80 +/FontFile 29 0 R +>> +endobj +31 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F5 +/FontDescriptor 30 0 R +/BaseFont /YXBGJA+CMSL10 +/FirstChar 0 +/LastChar 127 +/Widths [625 833.34 777.78 694.45 666.67 750 722.22 777.78 722.22 777.78 722.22 583.34 +555.56 555.56 833.34 833.34 277.78 305.56 500 500 500 500 500 808.65 444.45 500 722.22 +777.78 500 902.78 1013.89 777.78 277.78 277.78 500 833.34 500 833.34 777.78 277.78 +388.89 388.89 500 777.78 277.78 333.33 277.78 500 500 500 500 500 500 500 500 500 +500 500 277.78 277.78 277.78 777.78 472.22 472.22 777.78 750 708.34 722.22 763.89 +680.56 652.78 784.72 750 361.11 513.89 777.78 625 916.67 750 777.78 680.56 777.78 +736.11 555.56 722.22 750 750 1027.78 750 750 611.11 277.78 500 277.78 500 277.78 +277.78 500 555.56 444.45 555.56 444.45 305.56 500 555.56 277.78 305.56 527.78 277.78 +833.34 555.56 500 555.56 527.78 391.67 394.45 388.89 555.56 527.78 722.22 527.78 +527.78 444.45 500 1000 500 500 500] +>> +endobj +32 0 obj +<< +/Length 3690 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(1:)-444(What)-334(is)-333(DejaGn)27(u?)-25820(1)]TJ/F2 17.22 Tf 0 -25.91 TD[(1)-562(What)-375(is)-375(DejaGn)30(u?)]TJ/F1 10.91 Tf 14.94 -28.09 TD[(DejaGn)27(u)-378(is)-379(a)-379(framew)27(ork)-378(for)-379(testing)-379(other)-379(programs.)-582(Its)-379(purp)-28(ose)-379(is)-379(to)-379(pro)27(vide)-378(a)-379(single)]TJ -14.94 -13.15 TD[(fron)27(t)-332(end)-333(for)-334(all)-333(tests.)-444(Bey)26(ond)-332(this,)-333(DejaGn)26(u)-332(o\013ers)-333(sev)27(eral)-333(adv)55(an)28(tages)-333(for)-333(testing:)]TJ 5.91 -16.14 TD[(1.)-660(The)-359(\015exibilit)27(y)-359(and)-359(consistency)-360(of)-359(the)-360(DejaGn)27(u)-359(framew)27(ork)-359(mak)27(e)-358(it)-360(easy)-359(to)-360(write)-360(tests)]TJ 15.69 -13.15 TD[(for)-333(an)27(y)-332(program.)]TJ -15.69 -16.14 TD[(2.)-660(DejaGn)27(u)-225(pro)27(vides)-225(a)-226(la)26(y)28(er)-225(of)-226(abstraction)-226(whic)27(h)-226(allo)27(ws)-225(y)27(ou)-225(to)-226(write)-226(tests)-227(that)-226(are)-226(p)-28(ortable)]TJ 15.69 -13.15 TD[(to)-372(an)27(y)-372(host)-373(or)-373(target)-372(where)-373(a)-373(program)-372(m)26(ust)-371(b)-28(e)-373(tested.)-562(F)82(or)-372(instance,)-382(a)-373(test)-373(for)-372(GDB)]TJ 0 -13.15 TD[(can)-282(run)-282(\(from)-283(an)27(y)-281(Unix)-283(based)-282(host\))-283(on)-282(an)27(y)-282(target)-282(arc)27(hitecture)-282(that)-282(DejaGn)27(u)-282(supp)-27(orts.)]TJ 0 -13.15 TD[(Curren)27(tly)-284(DejaGn)27(u)-284(runs)-285(tests)-286(on)-285(sev)27(eral)-284(single)-285(b)-28(oard)-285(computers,)-295(whose)-285(op)-28(erating)-285(soft-)]TJ 0 -13.15 TD[(w)27(are)-332(ranges)-333(from)-334(just)-333(a)-333(b)-28(o)-28(ot)-333(monitor)-334(to)-333(a)-333(full-\015edged,)-334(Unix-lik)27(e)-332(realtime)-333(OS.)]TJ -15.69 -16.14 TD[(3.)-660(All)-414(tests)-414(ha)26(v)28(e)-413(the)-415(same)-414(output)-415(format.)-687(This)-415(mak)27(es)-413(it)-415(easy)-414(to)-415(in)27(tegrate)-413(testing)-415(in)27(to)]TJ 15.69 -13.15 TD[(other)-373(soft)27(w)28(are)-372(dev)27(elopmen)28(t)-372(pro)-28(cesses.)-564(DejaGn)27(u's)-372(output)-373(is)-373(designed)-373(to)-373(b)-28(e)-373(parsed)-373(b)27(y)]TJ 0 -13.15 TD[(other)-333(\014ltering)-333(script,)-333(and)-334(it)-333(is)-333(also)-334(h)27(uman)-332(readable.)]TJ -6.66 -19.13 TD[(DejaGn)27(u)-332(is)-333(written)-334(in)]TJ/F4 10.91 Tf 107.9 0 TD[(expect)]TJ/F1 10.91 Tf 34.36 0 TD[(,)-333(whic)27(h)-332(in)-334(turn)-333(uses)]TJ/F5 10.91 Tf 98.03 0 TD[(Tcl)]TJ/F1 10.91 Tf 15.76 0 TD[(|T)83(o)-27(ol)-333(command)-334(language.)]TJ -256.05 -16.14 TD[(Running)-262(tests)-263(requires)-263(t)26(w)28(o)-262(things:)-409(the)-263(testing)-263(framew)27(ork,)-276(and)-263(the)-263(test)-263(suites)-263(themselv)26(es.)]TJ -14.94 -13.15 TD[(T)83(ests)-379(are)-379(usually)-380(written)-380(in)]TJ/F4 10.91 Tf 137.31 0 TD[(expect)]TJ/F1 10.91 Tf 38.51 0 TD[(using)-379(Tcl,)-391(but)-380(y)27(ou)-379(can)-379(also)-380(use)-380(a)-379(Tcl)-380(script)-379(to)-380(run)-380(a)]TJ -175.82 -13.15 TD[(test)-353(suite)-353(that)-353(is)-353(not)-353(based)-353(on)]TJ/F4 10.91 Tf 148.42 0 TD[(expect)]TJ/F1 10.91 Tf 34.37 0 TD[(.)-503(\()]TJ/F4 10.91 Tf 12.77 0 TD[(expect)]TJ/F1 10.91 Tf 38.21 0 TD[(script)-353(\014lenames)-353(con)27(v)28(en)28(tionally)-353(use)-353(`)]TJ/F4 10.91 Tf 172.29 0 TD[(.exp)]TJ/F1 10.91 Tf 22.91 0 TD[(')]TJ -428.97 -13.15 TD[(as)-359(a)-359(su\016x;)-373(for)-359(example,)-366(the)-360(main)-359(implemen)27(tation)-359(of)-359(the)-360(DejaGn)27(u)-358(test)-360(driv)27(er)-359(is)-359(in)-360(the)-359(\014le)]TJ 0 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(runtest.exp)]TJ/F1 10.91 Tf 63 0 TD[('.\))]TJ ET 0 g 0 G +endstream +endobj +33 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +/F5 31 0 R +>> +endobj +25 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 33 0 R +>> +endobj +36 0 obj +<< +/Length 116 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(2)-26498(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ ET 0 g 0 G +endstream +endobj +37 0 obj +<< +/F1 9 0 R +>> +endobj +35 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 37 0 R +>> +endobj +40 0 obj +<< +/Length 4839 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(2:)-444(What)-334(is)-333(new)-333(in)-334(this)-333(release)-333(?)-21300(3)]TJ/F2 17.22 Tf 0 -25.91 TD[(2)-562(What)-375(is)-375(new)-375(in)-375(this)-375(release)-375(?)]TJ/F1 10.91 Tf 14.94 -28.09 TD[(This)-448(release)-448(has)-448(a)-449(n)27(um)28(b)-27(er)-448(of)-449(substan)27(tial)-447(c)27(hanges)-448(o)27(v)28(er)-447(v)26(ersion)-447(1.2.)-789(The)-449(most)-448(visible)]TJ -14.94 -13.15 TD[(c)27(hange)-309(is)-310(that)-310(the)-311(v)27(ersion)-309(of)-310(exp)-28(ect)-310(and)-311(Tcl)-310(included)-310(in)-310(the)-311(release)-310(are)-310(up-to-date)-310(with)-311(the)]TJ 0 -13.15 TD[(curren)27(t)-332(stable)-333(net)-334(releases.)-444(Other)-333(c)26(hanges)-332(are:)]TJ 5.91 -16.14 TD[(1.)-660(The)-390(con\014g)-391(sub-system)-391(in)-391(DejaGn)26(u)-390(has)-391(b)-27(een)-391(completely)-391(redesigned.)-618(It)-390(no)26(w)-390(supp)-27(orts)]TJ 15.69 -13.15 TD[(testing)-333(on)-333(remote)-333(hosts)-334(as)-333(w)27(ell)-333(as)-333(remote)-333(targets.)]TJ -15.69 -16.14 TD[(2.)-660(More)-244(builtin)-244(supp)-28(ort)-245(for)-244(building)-244(target)-245(binaries)-244(with)-245(the)-244(correct)-244(link)26(er)-243(\015ags.)-415(Curren)27(tly)]TJ 15.69 -13.15 TD[(this)-333(only)-333(w)27(orks)-333(with)-333(GCC,)-333(preferably)-334(with)-333(a)-333(target)-334(supp)-27(ort)-334(b)27(y)]TJ/F4 10.91 Tf 305.26 0 TD[(libgloss)]TJ/F1 10.91 Tf 45.82 0 TD[(.)]TJ -366.77 -16.14 TD[(3.)-660(Lots)-333(of)-333(little)-334(bug)-333(\014xes)-333(from)-334(a)-333(y)27(ear)-332(of)-334(hea)27(vy)-332(use)-334(here)-333(at)-333(Cygn)26(us)-332(Supp)-28(ort.)]TJ 0 -16.14 TD[(4.)-660(DejaGn)27(u)-332(no)27(w)-333(uses)]TJ/F4 10.91 Tf 107.55 0 TD[(autoconf)]TJ/F1 10.91 Tf 49.46 0 TD[(for)-333(con\014guration.)]TJ -157.01 -16.14 TD[(5.)-660(New)-412(test)-412(cases)-412(for)-412(DejaGn)26(u)-411(ha)27(v)28(e)-412(b)-27(een)-413(added)-412(for)-412(the)-412(new)-412(features,)-432(plus)-413(the)]TJ/F4 10.91 Tf 390.7 0 TD[(")]TJ/F1 10.91 Tf 5.72 0 TD[({to)-27(ol)]TJ/F4 10.91 Tf 23.94 0 TD[(")]TJ/F1 10.91 Tf -404.67 -13.15 TD[(option)-333(bug)-333(in)-333(the)-334(1.2)-333(testsuite)-333(has)-334(b)-28(een)-333(\014xed.)]TJ -15.69 -16.14 TD[(6.)-660(The)]TJ/F4 10.91 Tf 38.11 0 TD[(--tool)]TJ/F1 10.91 Tf 38 0 TD[(option)-333(is)-333(no)27(w)-333(optional.)]TJ -76.11 -16.14 TD[(7.)]TJ/F4 10.91 Tf 15.69 0 TD[(runtest)]TJ/F1 10.91 Tf 43.39 0 TD[(when)-302(searc)26(hing)-301(for)-303(test)-303(driv)27(ers)-302(ignores)-303(all)-303(directories)-303(named)-302(SCCS,)-303(R)27(CS,)-302(and)]TJ -43.39 -13.15 TD[(CVS.)]TJ -15.69 -16.14 TD[(8.)-660(There)-331(is)-331(no)26(w)-330(a)-331(generic)-332(k)27(eyw)28(ord)-331(based)-331(test)-331(harness)-332(that)-331(uses)-331(commen)26(ts)-330(in)-331(source)-332(co)-28(de)]TJ 15.69 -13.15 TD[(to)-333(con)27(trol)-332(ho)26(w)-332(eac)27(h)-332(test)-334(case)-333(gets)-333(built)-334(and)-333(run.)]TJ -15.69 -16.14 TD[(9.)-660(There)-333(is)-333(no)27(w)-333(some)-333(supp)-28(ort)-333(for)-334(running)-333(a)-333(testsuite)-334(with)-333(m)27(ultiple)-332(passes.)]TJ/F2 14.35 Tf -5.91 -30.88 TD[(2.1)-562(Running)-375(existing)-375(tests)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(T)83(o)-271(run)-272(tests)-271(from)-272(an)-272(existing)-272(collection,)-284(\014rst)-272(use)]TJ/F4 10.91 Tf 229.94 0 TD[(configure)]TJ/F1 10.91 Tf 54.51 0 TD[(as)-271(usual)-272(to)-272(set)-272(up)-271(the)-272(source)]TJ -299.39 -13.15 TD[(directory)-333(con)27(taining)-332(the)-334(tests.)-444(Then)-333(try)-334(running)]TJ/F4 10.91 Tf 28.8 -15.44 TD[(make)-524(check)]TJ/F1 10.91 Tf -13.86 -16.14 TD[(If)-325(the)]TJ/F4 10.91 Tf 29.53 0 TD[(check)]TJ/F1 10.91 Tf 32.19 0 TD[(target)-325(exists,)-327(it)-326(usually)-325(sa)27(v)27(es)-324(y)27(ou)-325(some)-325(trouble|for)-326(instance,)-327(it)-325(can)-326(set)-325(up)]TJ -76.66 -13.15 TD[(an)27(y)-332(auxiliary)-333(programs)-334(or)-333(other)-333(\014les)-334(needed)-333(b)27(y)-333(the)-333(tests.)]TJ 14.94 -16.14 TD[(Once)-329(y)27(ou)-328(ha)27(v)27(e)-328(run)-329(`)]TJ/F4 10.91 Tf 96.52 0 TD[(make)-333(check)]TJ/F1 10.91 Tf 55.18 0 TD[(')-329(to)-329(build)-329(an)27(y)-328(auxiliary)-330(\014les,)-330(y)27(ou)-328(migh)27(t)-328(w)26(an)28(t)-328(to)-329(call)-329(the)]TJ -166.64 -13.15 TD[(test)-293(driv)26(er)]TJ/F4 10.91 Tf 51.99 0 TD[(runtest)]TJ/F1 10.91 Tf 43.3 0 TD[(directly)-293(to)-294(rep)-28(eat)-294(the)-294(tests.)-432(Y)83(ou)-293(ma)27(y)-293(also)-294(ha)26(v)28(e)-293(to)-294(call)]TJ/F4 10.91 Tf 257.32 0 TD[(runtest)]TJ/F1 10.91 Tf 43.3 0 TD[(directly)]TJ -395.91 -13.15 TD[(for)-333(test)-333(collections)-333(with)-334(no)]TJ/F4 10.91 Tf 130.76 0 TD[(check)]TJ/F1 10.91 Tf 32.27 0 TD[(target)-333(in)-333(the)-333(`)]TJ/F4 10.91 Tf 66.7 0 TD[(Makefile)]TJ/F1 10.91 Tf 45.82 0 TD[('.)]TJ ET 0 g 0 G +endstream +endobj +41 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +>> +endobj +39 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 41 0 R +>> +endobj +45 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -194.44 +/Flags 4 +/FontBBox [-286 -250 1122 967] +/FontName /CMR7 +/ItalicAngle 0 +/XHeight 431 +/StemV 80 +/FontFile 44 0 R +>> +endobj +46 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F6 +/FontDescriptor 45 0 R +/BaseFont /AAPMXE+CMR7 +/FirstChar 0 +/LastChar 127 +/Widths [706.35 938.5 876.99 781.75 753.97 843.26 815.48 876.99 815.48 876.99 815.48 +677.58 646.83 646.83 970.24 970.24 323.41 354.17 569.45 569.45 569.45 569.45 569.45 +843.26 507.94 569.45 815.48 876.99 569.45 1013.89 1136.91 876.99 323.41 323.41 569.45 +938.5 569.45 938.5 876.99 323.41 446.43 446.43 569.45 876.99 323.41 384.92 323.41 +569.45 569.45 569.45 569.45 569.45 569.45 569.45 569.45 569.45 569.45 569.45 323.41 +323.41 323.41 876.99 538.69 538.69 876.99 843.26 798.62 815.48 860.12 767.86 737.11 +883.93 843.26 412.7 583.34 874.01 706.35 1027.78 843.26 876.99 767.86 876.99 829.37 +630.96 815.48 843.26 843.26 1150.8 843.26 843.26 692.46 323.41 569.45 323.41 569.45 +323.41 323.41 569.45 630.96 507.94 630.96 507.94 354.17 569.45 630.96 323.41 354.17 +600.2 323.41 938.5 630.96 569.45 630.96 600.2 446.43 452.58 446.43 630.96 600.2 815.48 +600.2 600.2 507.94 569.45 1138.89 569.45 569.45 569.45] +>> +endobj +48 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 513.89 +/Descent -194.44 +/Flags 4 +/FontBBox [-276 -250 1077 969] +/FontName /CMCSC10 +/ItalicAngle 0 +/XHeight 431 +/StemV 80 +/FontFile 47 0 R +>> +endobj +49 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F7 +/FontDescriptor 48 0 R +/BaseFont /NVUTVS+CMCSC10 +/FirstChar 0 +/LastChar 127 +/Widths [683.33 902.77 844.44 755.55 727.77 813.88 786.1 844.44 786.1 844.44 786.1 +552.77 552.77 319.44 319.44 523.61 302.22 424.44 552.77 552.77 552.77 552.77 552.77 +813.88 494.44 915.55 735.55 824.44 635.55 974.99 1091.66 844.44 319.44 319.44 552.77 +902.77 552.77 902.77 844.44 319.44 436.11 436.11 552.77 844.44 319.44 377.77 319.44 +552.77 552.77 552.77 552.77 552.77 552.77 552.77 552.77 552.77 552.77 552.77 319.44 +319.44 844.44 844.44 844.44 523.61 844.44 813.88 770.83 786.1 829.16 741.66 712.49 +851.38 813.88 405.55 566.66 843.05 683.33 988.88 813.88 844.44 741.66 844.44 799.99 +611.1 786.1 813.88 813.88 1105.55 813.88 813.88 669.44 319.44 552.77 319.44 552.77 +319.44 319.44 613.33 580 591.11 624.44 557.78 535.55 641.11 613.33 302.22 424.44 +635.55 513.33 746.66 613.33 635.55 557.78 635.55 602.22 457.78 591.11 613.33 613.33 +835.55 613.33 613.33 502.22 552.77 1105.55 552.77 552.77 552.77] +>> +endobj +51 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -194.44 +/Flags 68 +/FontBBox [-163 -250 1146 969] +/FontName /CMTI10 +/ItalicAngle -14 +/XHeight 431 +/StemV 80 +/FontFile 50 0 R +>> +endobj +52 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F8 +/FontDescriptor 51 0 R +/BaseFont /OXLDNK+CMTI10 +/FirstChar 0 +/LastChar 127 +/Widths [627.22 817.77 766.66 692.22 664.44 743.33 715.55 766.66 715.55 766.66 715.55 +613.33 562.22 587.77 881.66 894.44 306.67 332.22 511.11 511.11 511.11 511.11 511.11 +831.29 460 536.66 715.55 715.55 511.11 882.77 984.99 766.66 255.55 306.67 514.44 +817.77 769.09 817.77 766.66 306.67 408.89 408.89 511.11 766.66 306.67 357.78 306.67 +511.11 511.11 511.11 511.11 511.11 511.11 511.11 511.11 511.11 511.11 511.11 306.67 +306.67 306.67 766.66 511.11 511.11 766.66 743.33 703.89 715.55 755 678.33 652.77 +773.61 743.33 385.55 525 768.88 627.22 896.66 743.33 766.66 678.33 766.66 729.44 +562.22 715.55 743.33 743.33 998.88 743.33 743.33 613.33 306.67 514.44 306.67 511.11 +306.67 306.67 511.11 460 460 511.11 460 306.67 460 511.11 306.67 306.67 460 255.55 +817.77 562.22 511.11 511.11 460 421.66 408.89 332.22 536.66 460 664.44 463.89 485.55 +408.89 511.11 1022.22 511.11 511.11 511.11] +>> +endobj +53 0 obj +<< +/Length 6907 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(4)-26498(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ 14.94 -23.91 TD[(T)27(ypically)84(,)-446(y)27(ou)-422(m)26(ust)-422(use)-424(t)27(w)28(o)-423(command-line)-424(options:)-625(`)]TJ/F4 10.91 Tf 261.34 0 TD[(--tool)]TJ/F1 10.91 Tf 34.37 0 TD[(',)-446(to)-423(sp)-28(ecify)-424(whic)27(h)-423(set)-423(of)]TJ -310.65 -13.15 TD[(tests)-333(to)-333(run)]TJ/F6 6.97 Tf 55.3 3.96 TD[(1)]TJ/F1 10.91 Tf 4.47 -3.96 TD[(,)-333(and)-333(`)]TJ/F4 10.91 Tf 30.91 0 TD[(--srcdir)]TJ/F1 10.91 Tf 45.82 0 TD[(',)-333(to)-333(sp)-28(ecify)-333(where)-334(to)-333(\014nd)-333(test)-334(directories.)]TJ -121.56 -16.14 TD[(F)83(or)-293(example,)-302(if)-294(the)-294(directory)-295(`)]TJ/F4 10.91 Tf 141.53 0 TD[(gdb/testsuite)]TJ/F1 10.91 Tf 74.45 0 TD[(')-294(con)27(tains)-293(a)-294(collection)-294(of)-294(DejaGn)27(u)-294(tests)-294(for)]TJ/F7 10.91 Tf -230.92 -13.15 TD[(gdb)]TJ/F1 10.91 Tf 20.13 0 TD[(,)-333(y)27(ou)-332(can)-334(run)-333(them)-333(lik)26(e)-332(this:)]TJ/F4 10.91 Tf 8.67 -15.45 TD[(eg$)-524(cd)-525(gdb/testsuite)]TJ 0 -12.45 TD[(eg$)-524(runtest)-525(--tool)-525(gdb)]TJ/F8 10.91 Tf -28.8 -12.45 TD[(T)76(est)-357(output)-357(fol)-51(lows,)-358(ending)-358(with:)]TJ/F4 10.91 Tf 28.8 -24.91 TD[(===)-524(gdb)-525(Summary)-525(===)]TJ 0 -24.91 TD[(#)-524(of)-525(expected)-525(passes)-525(508)]TJ 0 -12.45 TD[(#)-524(of)-525(expected)-525(failures)-525(103)]TJ 0 -12.45 TD[(/usr/latest/bin/gdb)-524(version)-525(4.14.4)-525(-nx)]TJ/F1 10.91 Tf -13.86 -16.14 TD[(Y)83(ou)-222(can)-223(use)-223(the)-223(option)-223(`)]TJ/F4 10.91 Tf 111.02 0 TD[(--srcdir)]TJ/F1 10.91 Tf 45.81 0 TD[(')-222(to)-223(p)-28(oin)27(t)-222(to)-223(some)-223(other)-223(directory)-223(con)26(taining)-222(a)-223(collection)]TJ -171.77 -13.15 TD[(of)-333(tests:)]TJ/F4 10.91 Tf 28.8 -15.44 TD[(eg$)-524(runtest)-525(--tool)-525(gdb)-525(--srcdir)-525(/devo/gdb/testsuite)]TJ/F1 10.91 Tf -13.86 -16.14 TD[(These)-468(examples)-468(assume)-468(a)]TJ/F5 10.91 Tf 131.29 0 TD[(nativ)27(e)]TJ/F1 10.91 Tf 34.81 0 TD[(con\014guration,)-502(where)-468(the)-468(same)-468(computer)-469(runs)-468(b)-28(oth)]TJ/F4 10.91 Tf -181.04 -13.15 TD[(runtest)]TJ/F1 10.91 Tf 44.02 0 TD[(and)-360(the)-361(tests)-360(themselv)27(es.)-525(When)-361(y)27(ou)-360(ha)27(v)28(e)-360(a)]TJ/F5 10.91 Tf 214.12 0 TD[(cross)]TJ/F1 10.91 Tf 27.57 0 TD[(con\014guration,)-367(the)-360(tests)-361(run)-360(on)]TJ -285.71 -13.16 TD[(a)-366(di\013eren)27(t)-365(computer,)-374(con)26(trolled)-365(b)27(y)-365(the)-366(host)-366(running)]TJ/F4 10.91 Tf 255.56 0 TD[(runtest)]TJ/F1 10.91 Tf 40.09 0 TD[(.)-542(In)-366(this)-367(situation,)-374(y)27(ou)-365(need)]TJ -295.65 -13.15 TD[(the)-333(option)-333(`)]TJ/F4 10.91 Tf 55.76 0 TD[(--name)]TJ/F1 10.91 Tf 34.36 0 TD[(')-333(to)-333(sp)-28(ecify)-333(the)-334(net)27(w)28(ork)-332(address)-334(for)-333(the)-333(other)-334(computer:)]TJ/F4 10.91 Tf -61.32 -15.44 TD[(eg$)-524(runtest)-525(--tool)-525(gdb)-525(--name)-525(vx9.munist.com)]TJ/F1 10.91 Tf -13.86 -16.14 TD[(If)-270(y)27(ou)-269(alw)27(a)27(ys)-269(use)-270(the)-270(same)-270(option)-271(v)55(alues,)-282(y)27(ou)-269(can)-270(record)-271(them)-270(in)-270(a)-270(\014le)-270(called)-271(`)]TJ/F4 10.91 Tf 365.18 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(',)]TJ -425.94 -13.15 TD[(rather)-362(than)-362(t)27(yping)-361(them)-362(eac)27(h)-361(time.)-531(See)-362(Chapter)-362(4)-362([Setting)-362(defaults)-362(for)]TJ/F4 10.91 Tf 347.29 0 TD[(runtest)]TJ/F1 10.91 Tf 44.04 0 TD[(options],)]TJ -391.33 -13.15 TD[(page)-333(15.)]TJ 14.94 -16.14 TD[(By)-392(default,)]TJ/F4 10.91 Tf 58.26 0 TD[(runtest)]TJ/F1 10.91 Tf 44.37 0 TD[(prin)27(ts)-391(only)-392(the)-392(names)-392(of)-392(the)-392(tests)-392(it)-392(runs,)-407(output)-392(from)-392(an)26(y)-391(tests)]TJ -117.57 -13.15 TD[(that)-439(ha)26(v)28(e)-439(unexp)-27(ected)-440(results,)-467(and)-439(a)-440(summary)-440(sho)27(wing)-439(ho)27(w)-439(man)27(y)-439(tests)-440(passed)-440(and)-440(ho)27(w)]TJ 0 -13.15 TD[(man)27(y)-282(failed.)-427(T)82(o)-282(displa)27(y)-282(output)-282(from)-283(all)-283(tests)-283(\(whether)-283(or)-283(not)-282(they)-283(b)-28(eha)27(v)28(e)-282(as)-283(exp)-28(ected\),)-293(use)]TJ 0 -13.15 TD[(the)-392(`)]TJ/F4 10.91 Tf 22.47 0 TD[(--all)]TJ/F1 10.91 Tf 28.63 0 TD[(')-392(option.)-623(F)83(or)-392(more)-393(v)27(erb)-27(ose)-392(output)-393(ab)-28(out)-392(pro)-28(cesses)-393(b)-28(eing)-392(run,)-408(comm)27(unication,)]TJ -51.1 -13.15 TD[(and)-391(so)-391(on,)-406(use)-391(`)]TJ/F4 10.91 Tf 77.35 0 TD[(--verbose)]TJ/F1 10.91 Tf 51.55 0 TD[('.)-618(T)83(o)-391(see)-391(ev)27(en)-390(more)-391(output,)-406(use)-391(m)26(ultiple)-390(`)]TJ/F4 10.91 Tf 206.62 0 TD[(--verbose)]TJ/F1 10.91 Tf 51.55 0 TD[(')-391(options.)]TJ -387.07 -13.15 TD[(See)-393(Chapter)-394(3)-394([Using)]TJ/F4 10.91 Tf 107.27 0 TD[(runtest)]TJ/F1 10.91 Tf 40.09 0 TD[(],)-408(page)-394(9,)-409(for)-393(a)-394(more)-394(detailed)-393(explanation)-394(of)-394(eac)27(h)]TJ/F4 10.91 Tf 244.55 0 TD[(runtest)]TJ/F1 10.91 Tf -391.91 -13.15 TD[(option.)]TJ 14.94 -16.14 TD[(T)83(est)-302(output)-303(go)-28(es)-303(in)27(to)-302(t)27(w)28(o)-302(\014les)-303(in)-303(y)27(our)-302(curren)27(t)-302(directory:)-429(summary)-303(output)-303(in)-303(`)]TJ/F5 10.91 Tf 369.61 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.48 0 TD[(.sum)]TJ/F1 10.91 Tf 22.91 0 TD[(',)]TJ -425.94 -13.15 TD[(and)-350(detailed)-351(output)-351(in)-351(`)]TJ/F5 10.91 Tf 114.71 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.48 0 TD[(.log)]TJ/F1 10.91 Tf 22.91 0 TD[('.)-497(\()]TJ/F5 10.91 Tf 15.73 0 TD[(to)-27(ol)]TJ/F1 10.91 Tf 22.74 0 TD[(refers)-350(to)-351(the)-351(collection)-351(of)-351(tests;)-360(for)-350(example,)-356(after)]TJ -194.57 -13.15 TD[(a)-401(run)-402(with)-401(`)]TJ/F4 10.91 Tf 59.24 0 TD[(--tool)-333(gdb)]TJ/F1 10.91 Tf 55.18 0 TD[(',)-418(lo)-28(ok)-402(for)-401(output)-402(\014les)-402(`)]TJ/F4 10.91 Tf 114.61 0 TD[(gdb.sum)]TJ/F1 10.91 Tf 40.09 0 TD[(')-401(and)-402(`)]TJ/F4 10.91 Tf 32.4 0 TD[(gdb.log)]TJ/F1 10.91 Tf 40.09 0 TD[('.\))-649(See)-402(Section)-401(5.7)]TJ -341.61 -13.15 TD[([The)-333(\014les)-333(DejaGn)27(u)-333(writes],)-333(page)-333(35.)]TJ ET 18.00 -488.41 m 162.00 -488.41 l 162.00 -488.01 l 18.00 -488.01 l b BT/F6 6.97 Tf 23.02 -496.35 TD[(1)]TJ/F1 10.91 Tf 9.92 -3.96 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(--tool)]TJ/F1 10.91 Tf 34.37 0 TD[(')-373(selects)-373(a)-373(particular)-373(suite)-374(of)-373(tests,)]TJ/F8 10.91 Tf 170.49 0 TD[(not)]TJ/F1 10.91 Tf 20.44 0 TD[(the)-373(name)-373(of)-373(the)-373(executable)-374(program)-373(to)]TJ -228.33 -13.15 TD[(run.)-620(See)-392(Chapter)-392(4)-391([Con\014guration)-392(dep)-28(enden)27(t)-391(v)54(alues],)-405(page)-392(15,)-407(for)-392(information)-392(on)-392(the)]TJ 0 -13.15 TD[(v)55(ariables)-332(that)-334(y)27(ou)-332(can)-334(use)-333(to)-333(sp)-28(ecify)-333(the)-334(names)-333(of)-333(programs)-334(to)-333(run.)]TJ ET 0 g 0 G +endstream +endobj +54 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F6 46 0 R +/F7 49 0 R +/F8 52 0 R +/F5 31 0 R +>> +endobj +43 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 54 0 R +>> +endobj +58 0 obj +<< +/Type /FontDescriptor +/CapHeight 0 +/Ascent 750 +/Descent -2000 +/Flags 4 +/FontBBox [-2000 -2000 2040 2040] +/FontName /LCIRCLE10 +/ItalicAngle 0 +/XHeight 431 +/StemV 80 +/FontFile 57 0 R +>> +endobj +59 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F9 +/FontDescriptor 58 0 R +/BaseFont /BMCYBZ+LCIRCLE10 +/FirstChar 0 +/LastChar 126 +/Widths [400 400 400 400 800 800 800 800 1200 1200 1200 1200 1600 1600 1600 1600 +2000 2000 2000 2000 2400 2400 2400 2400 2800 2800 2800 2800 3200 3200 3200 3200 3600 +3600 3600 3600 4000 4000 4000 4000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 200 300 400 +500 600 700 800 900 1000 1100 1200 1300 1400 1500 0 100 200 300 400 500 600 700 800 +900 1000 1100 1200 1300 1400 1500] +>> +endobj +60 0 obj +<< +/Length 6627 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(2:)-444(What)-334(is)-333(new)-333(in)-334(this)-333(release)-333(?)-21300(5)]TJ/F2 14.35 Tf 0 -23.91 TD[(2.2)-562(What)-375(do)-31(es)-375(a)-375(DejaGn)30(u)-374(test)-375(lo)-31(ok)-375(lik)30(e?)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(Eac)27(h)-353(DejaGn)27(u)-354(test)-354(is)-355(an)]TJ/F4 10.91 Tf 121.65 0 TD[(expect)]TJ/F1 10.91 Tf 38.23 0 TD[(script;)-364(the)-355(tests)-354(v)54(ary)-353(widely)-355(in)-354(complexit)27(y)83(,)-359(dep)-27(ending)]TJ -174.82 -13.15 TD[(on)-333(the)-333(nature)-333(of)-334(the)-333(to)-28(ol)-333(and)-334(the)-333(feature)-333(tested.)]TJ 14.94 -16.14 TD[(Here)-411(is)-411(a)-411(v)26(ery)-410(simple)]TJ/F7 10.91 Tf 108.07 0 TD[(gdb)]TJ/F1 10.91 Tf 24.63 0 TD[(test|one)-411(of)-411(the)-411(simplest)-412(tests)-411(shipp)-28(ed)-411(with)-411(DejaGn)26(u)-410(\(ex-)]TJ -147.64 -13.15 TD[(tracted)-333(from)-333(`)]TJ/F4 10.91 Tf 66.42 0 TD[(gdb.t00/echo.exp)]TJ/F1 10.91 Tf 91.64 0 TD[('\):)]TJ/F6 6.97 Tf 10.3 3.96 TD[(2)]TJ/F9 9.96 Tf -168.36 -14.01 TD[(\013)]TJ ET 23.98 -85.57 m 450.40 -85.57 l 450.40 -85.17 l 23.98 -85.17 l b BT 456.38 -85.57 TD[(\010)]TJ ET 18.00 -219.92 m 18.40 -219.92 l 18.40 -91.30 l 18.00 -91.30 l b BT/F4 10.91 Tf 21.39 -103.94 TD[(#)-524(send)-525(a)-525(string)-525(to)-525(the)-525(GDB)-525(stdin:)]TJ 0 -12.45 TD[(send)-524("echo)-525(Hello)-525(world!\\n")]TJ 0 -24.91 TD[(#)-524(inspect)-525(the)-525(GDB)-525(stdout)-525(for)-525(the)-525(correct)-525(reply,)]TJ 0 -12.45 TD[(#)-524(and)-525(determine)-525(whether)-525(the)-525(test)-525(passes)-525(or)-525(fails:)]TJ 0 -12.46 TD[(expect)-524({)]TJ 11.45 -12.45 TD[(-re)-524("Hello)-525(world.*$prompt)-525($")-2100({)-525(pass)-525("Echo)-525(test")-525(})]TJ 0 -12.45 TD[(-re)-524("$prompt)-525($")-8925({)-525(fail)-525("Echo)-525(test")-525(})]TJ 0 -12.46 TD[(timeout)-13124({)-525(fail)-525("\(timeout\))-525(Echo)-525(test")-525(})]TJ 0 -12.45 TD[(})]TJ ET 456.38 -219.92 m 456.77 -219.92 l 456.77 -91.30 l 456.38 -91.30 l b BT/F9 9.96 Tf 18 -226.14 TD[(\012)]TJ ET 23.98 -226.14 m 450.40 -226.14 l 450.40 -225.74 l 23.98 -225.74 l b BT 456.38 -226.14 TD[(\011)]TJ/F1 10.91 Tf -423.44 -17.39 TD[(Though)-373(brief,)-384(this)-374(example)-373(is)-374(a)-373(complete)-374(test.)-565(It)-374(illustrates)-374(some)-373(of)-374(the)-374(main)-373(features)]TJ -14.94 -13.15 TD[(of)-333(DejaGn)27(u)-332(test)-334(scripts:)]TJ/F3 10.91 Tf 8.95 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(The)-345(test)-346(case)-346(do)-28(es)-345(not)-346(start)-346(the)-346(tested)-345(program)-346(\()]TJ/F7 10.91 Tf 237.07 0 TD[(gdb)]TJ/F1 10.91 Tf 23.9 0 TD[(in)-345(this)-346(case\);)-352(all)-346(test)-345(scripts)-346(for)]TJ -260.97 -13.15 TD[(in)27(teractiv)28(e)-332(to)-28(ols)-333(can)-334(assume)-333(the)-333(corresp)-28(onding)-333(to)-28(ol)-334(is)-333(running.)]TJ/F3 10.91 Tf -12.65 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(Commen)27(ts)-332(start)-333(with)-334(`)]TJ/F4 10.91 Tf 108.33 0 TD[(#)]TJ/F1 10.91 Tf 5.73 0 TD[('.)]TJ/F3 10.91 Tf -126.71 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(The)-223(main)-223(commands)-223(y)27(ou)-222(use)-224(to)-223(con)27(trol)-222(a)-223(tested)-224(program)-223(are)]TJ/F4 10.91 Tf 283.15 0 TD[(send)]TJ/F1 10.91 Tf 25.34 0 TD[(\(to)-223(giv)27(e)-222(it)-223(commands\))]TJ -308.49 -13.15 TD[(and)]TJ/F4 10.91 Tf 21.21 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(\(to)-333(analyze)-333(its)-333(resp)-28(onses\).)]TJ/F3 10.91 Tf -71.86 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(The)]TJ/F4 10.91 Tf 22.77 0 TD[(expect)]TJ/F1 10.91 Tf 38.34 0 TD[(command)-364(uses)-365(a)-364(list)-365(of)-364(pairs;)-381(a)-364(pattern)-365(\(regular)-365(expression)-364(if)-365(`)]TJ/F4 10.91 Tf 301.1 0 TD[(-re)]TJ/F1 10.91 Tf 17.18 0 TD[(')-364(sp)-28(ec-)]TJ -379.39 -13.15 TD[(i\014ed\),)-395(follo)27(w)27(ed)-382(b)27(y)-382(an)-384(action)-383(to)-383(run)-384(if)-383(the)-383(pattern)-383(matc)26(hes)-382(output)-383(from)-383(the)-384(program.)]TJ 0 -13.15 TD[(Only)-333(the)-333(action)-333(for)-334(the)]TJ/F8 10.91 Tf 113.97 0 TD[(\014rst)]TJ/F1 10.91 Tf 23.49 0 TD[(matc)27(hing)-332(pattern)-333(will)-334(execute.)]TJ/F3 10.91 Tf -150.11 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(T)83(est)-332(cases)-334(use)-333(the)-333(commands)]TJ/F4 10.91 Tf 143.03 0 TD[(pass)]TJ/F1 10.91 Tf 26.55 0 TD[(and)]TJ/F4 10.91 Tf 21.21 0 TD[(fail)]TJ/F1 10.91 Tf 26.54 0 TD[(to)-333(record)-333(the)-333(test)-334(outcome.)]TJ/F2 14.35 Tf -238.93 -30.89 TD[(2.3)-562(Design)-375(goals)]TJ/F1 10.91 Tf 14.94 -23.11 TD[(DejaGn)27(u)-464(grew)-465(out)-465(of)-465(the)-465(in)26(ternal)-464(needs)-465(of)-465(Cygn)27(us)-464(Supp)-28(ort.)-840(Cygn)27(us)-465(main)27(tains)-464(and)]TJ -14.94 -13.15 TD[(enhances)-259(a)-259(v)55(ariet)27(y)-258(of)-259(free)-259(programs)-260(in)-259(man)27(y)-258(di\013eren)26(t)-258(en)27(vironmen)28(ts,)-273(and)-260(w)27(e)-258(needed)-259(a)-260(testing)]TJ 0 -13.15 TD[(to)-27(ol)-334(that:)]TJ/F3 10.91 Tf 8.95 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(is)-333(useful)-333(to)-333(dev)26(elop)-26(ers)-334(while)-333(\014xing)-333(bugs;)]TJ/F3 10.91 Tf -12.65 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(automates)-333(running)-333(man)27(y)-333(tests)-333(during)-333(a)-334(soft)27(w)28(are)-332(release)-334(pro)-28(cess;)]TJ/F3 10.91 Tf -12.65 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(is)-333(p)-28(ortable)-333(among)-333(a)-334(v)55(ariet)28(y)-333(of)-333(host)-333(computers;)]TJ/F3 10.91 Tf -12.65 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(supp)-27(orts)-334(cross-dev)27(elopmen)28(t)-332(testing;)]TJ/F3 10.91 Tf -12.65 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(p)-27(ermits)-334(testing)-333(in)27(teractiv)28(e)-333(programs,)-333(lik)27(e)]TJ/F7 10.91 Tf 200.3 0 TD[(gdb)]TJ/F1 10.91 Tf 20.14 0 TD[(;)-333(and)]TJ/F3 10.91 Tf -233.09 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(p)-27(ermits)-334(testing)-333(batc)27(h)-332(orien)26(ted)-332(programs,)-333(lik)26(e)]TJ/F7 10.91 Tf 218.79 0 TD[(gcc)]TJ/F1 10.91 Tf 19.89 0 TD[(.)]TJ ET 18.00 -578.60 m 162.00 -578.60 l 162.00 -578.21 l 18.00 -578.21 l b BT/F6 6.97 Tf 23.02 -586.55 TD[(2)]TJ/F1 10.91 Tf 9.92 -3.96 TD[(More)-460(recen)26(t)]TJ/F7 10.91 Tf 63.45 0 TD[(gdb)]TJ/F1 10.91 Tf 25.16 0 TD[(tests)-460(use)-461(the)-461(`)]TJ/F4 10.91 Tf 70.42 0 TD[(gdb_test)]TJ/F1 10.91 Tf 45.81 0 TD[(')-460(pro)-28(cedure.)-827(An)-461(equiv)55(alen)28(t)-460(test)-461(using)-461(that)]TJ -204.84 -13.15 TD[(pro)-27(cedure)-334(is)-333(`)]TJ/F4 10.91 Tf 68.31 0 TD[(gdb_test)-333("echo)-333(Hello)-333(world!")-334("Hello)-333(world!")]TJ/F1 10.91 Tf 239.45 0 TD[(')]TJ ET 0 g 0 G +endstream +endobj +61 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +/F7 49 0 R +/F6 46 0 R +/F9 59 0 R +/F3 21 0 R +/F8 52 0 R +>> +endobj +56 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 61 0 R +>> +endobj +64 0 obj +<< +/Length 8942 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(6)-26498(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ 14.94 -23.91 TD[(Some)-310(of)-311(the)-310(requiremen)27(ts)-310(pro)27(v)28(ed)-310(c)27(hallenging.)-436(F)82(or)-309(example,)-315(in)27(teractiv)27(e)-309(programs)-311(do)-310(not)]TJ -14.94 -13.15 TD[(lend)-398(themselv)27(es)-398(v)27(ery)-397(w)27(ell)-398(to)-398(automated)-399(testing.)-639(But)-399(all)-398(the)-399(requiremen)27(ts)-397(are)-399(imp)-27(ortan)26(t:)]TJ 0 -13.15 TD[(for)-318(instance,)-321(it)-319(is)-318(imp)-28(erativ)27(e)-318(to)-318(mak)27(e)-318(sure)-318(that)]TJ/F7 10.91 Tf 225.51 0 TD[(gdb)]TJ/F1 10.91 Tf 23.61 0 TD[(w)27(orks)-317(as)-319(w)27(ell)-317(when)-319(cross-debugging)-318(as)]TJ -249.12 -13.15 TD[(it)-333(do)-28(es)-333(in)-333(a)-334(nativ)27(e)-332(con\014guration.)]TJ 14.94 -16.14 TD[(Probably)-328(the)-329(greatest)-329(c)27(hallenge)-328(w)27(as)-328(testing)-329(in)-329(a)-329(cross-dev)27(elopmen)28(t)-328(en)27(vironmen)28(t)-328(\(whic)27(h)]TJ -14.94 -13.15 TD[(can)-410(b)-28(e)-410(a)-411(real)-410(nigh)27(tmare\).)-675(Most)-411(cross-dev)27(elopmen)28(t)-410(en)27(vironmen)28(ts)-410(are)-410(customized)-410(b)26(y)-409(eac)27(h)]TJ 0 -13.16 TD[(dev)27(elop)-26(er.)-668(Ev)27(en)-407(when)-408(buying)-407(pac)26(k)56(aged)-407(b)-27(oards)-408(from)-408(v)27(endors)-407(there)-407(are)-408(man)27(y)-407(di\013erences.)]TJ 0 -13.15 TD[(The)-387(comm)26(unication)-387(in)27(terfaces)-387(v)55(ary)-387(from)-388(a)-388(serial)-388(line)-388(to)-388(ethernet.)-609(DejaGn)27(u)-387(w)27(as)-387(designed)]TJ 0 -13.15 TD[(with)-392(a)-392(mo)-28(dular)-392(comm)27(unication)-391(setup,)-407(so)-393(that)-392(eac)27(h)-391(kind)-393(of)-392(comm)27(unication)-391(can)-393(b)-27(e)-393(added)]TJ 0 -13.15 TD[(as)-323(required,)-325(and)-324(supp)-28(orted)-323(thereafter.)-441(Once)-324(a)-323(comm)27(unication)-323(pro)-27(cedure)-324(is)-323(co)-28(ded,)-325(an)26(y)-322(test)]TJ 0 -13.15 TD[(can)-335(use)-335(it.)-450(Curren)27(tly)-334(DejaGn)26(u)-334(can)-335(use)]TJ/F4 10.91 Tf 188.77 0 TD[(rsh)]TJ/F1 10.91 Tf 17.19 0 TD[(,)]TJ/F4 10.91 Tf 6.69 0 TD[(rlogin)]TJ/F1 10.91 Tf 34.36 0 TD[(,)]TJ/F4 10.91 Tf 6.69 0 TD[(telnet)]TJ/F1 10.91 Tf 34.37 0 TD[(,)]TJ/F4 10.91 Tf 6.69 0 TD[(tip)]TJ/F1 10.91 Tf 17.18 0 TD[(,)]TJ/F4 10.91 Tf 6.69 0 TD[(kermit)]TJ/F1 10.91 Tf 34.37 0 TD[(,)-335(and)]TJ/F4 10.91 Tf 27.92 0 TD[(mondfe)]TJ/F1 10.91 Tf 38.02 0 TD[(for)]TJ -418.94 -13.15 TD[(remote)-333(comm)27(unications.)]TJ 14.94 -16.14 TD[(Julia)-243(Menapace)-243(\014rst)-243(coined)-243(the)-243(term)-243(\\Deja)-243(Gn)27(u")-242(to)-243(describ)-28(e)-243(an)-243(earlier)-243(testing)-243(framew)27(ork)]TJ -14.94 -13.15 TD[(at)-426(Cygn)27(us)-426(Supp)-27(ort.)-724(When)-426(w)26(e)-425(replaced)-426(it)-427(with)-426(the)-427(Exp)-27(ect-based)-427(framew)27(ork,)-449(it)-426(w)27(as)-426(lik)27(e)]TJ 0 -13.15 TD[(DejaGn)27(u)-332(all)-333(o)26(v)28(er)-332(again)-61(.)-242(.)-243(.)]TJ/F2 14.35 Tf 0 -30.88 TD[(2.4)-562(A)-375(POSIX)-375(conforming)-375(test)-375(framew)30(ork)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(DejaGn)27(u)-332(conforms)-333(to)-334(the)]TJ/F7 10.91 Tf 124.56 0 TD[(posix)]TJ/F1 10.91 Tf 31.64 0 TD[(standard)-333(for)-333(test)-333(framew)26(orks.)]TJ/F7 10.91 Tf -156.2 -16.14 TD[(posix)]TJ/F1 10.91 Tf 32.27 0 TD[(standard)-390(1003.3)-391(de\014nes)-391(what)-391(a)-391(testing)-391(framew)27(ork)-390(needs)-391(to)-391(pro)26(vide,)-404(in)-391(order)-391(to)]TJ -47.21 -13.15 TD[(p)-27(ermit)-271(the)-271(creation)-271(of)]TJ/F7 10.91 Tf 105.82 0 TD[(posix)]TJ/F1 10.91 Tf 30.96 0 TD[(conformance)-270(test)-271(suites.)-424(This)-271(standard)-271(is)-271(primarily)-271(orien)27(ted)-270(to)]TJ -136.78 -13.15 TD[(running)]TJ/F7 10.91 Tf 40.66 0 TD[(posix)]TJ/F1 10.91 Tf 31.66 0 TD[(conformance)-335(tests,)-336(but)-336(its)-335(requiremen)26(ts)-334(also)-336(supp)-28(ort)-335(testing)-336(of)-335(features)-336(not)]TJ -72.32 -13.15 TD[(related)-244(to)]TJ/F7 10.91 Tf 47.78 0 TD[(posix)]TJ/F1 10.91 Tf 30.66 0 TD[(conformance.)]TJ/F7 10.91 Tf 67.29 0 TD[(posix)]TJ/F1 10.91 Tf 30.66 0 TD[(1003.3)-244(do)-27(es)-245(not)-244(sp)-27(ecify)-245(a)-244(particular)-244(testing)-244(framew)27(ork,)]TJ -176.39 -13.15 TD[(but)-333(at)-333(this)-333(time)-334(there)-333(is)-333(only)-334(one)-333(other)]TJ/F7 10.91 Tf 190.79 0 TD[(posix)]TJ/F1 10.91 Tf 31.63 0 TD[(conforming)-333(test)-333(framew)27(ork:)]TJ/F7 10.91 Tf 135.91 0 TD[(tet)]TJ/F1 10.91 Tf 18.99 0 TD[(.)]TJ/F6 6.97 Tf 3.03 3.96 TD[(3)]TJ/F1 10.91 Tf -365.41 -20.1 TD[(The)]TJ/F7 10.91 Tf 22.05 0 TD[(posix)]TJ/F1 10.91 Tf 31.25 0 TD[(do)-27(cumen)27(tation)-298(refers)-298(to)]TJ/F5 10.91 Tf 116.24 0 TD[(assertions)]TJ/F1 10.91 Tf 46.28 0 TD[(.)-432(An)-298(assertion)-299(is)-298(a)-298(description)-298(of)-299(b)-27(eha)26(vior.)]TJ -230.76 -13.15 TD[(F)83(or)-445(example,)-475(if)-446(a)-446(standard)-446(sa)27(ys)-445(\\The)-446(sun)-446(shall)-446(shine",)-475(a)-446(corresp)-28(onding)-446(assertion)-446(migh)27(t)]TJ 0 -13.15 TD[(b)-27(e)-405(\\The)-405(sun)-405(is)-405(shining.")-659(A)-405(test)-405(based)-405(on)-405(this)-405(assertion)-405(w)27(ould)-404(pass)-405(or)-405(fail)-405(dep)-28(ending)-405(on)]TJ 0 -13.15 TD[(whether)-342(it)-342(is)-342(da)27(ytime)-341(or)-342(nigh)26(ttime.)-470(It)-342(is)-342(imp)-28(ortan)27(t)-341(to)-342(note)-342(that)-343(the)-342(standard)-342(b)-28(eing)-342(tested)]TJ 0 -13.15 TD[(is)-337(nev)27(er)-337(1003.3;)-339(the)-338(standard)-337(b)-28(eing)-337(tested)-338(is)-337(some)-338(other)-337(standard,)-339(for)-337(whic)26(h)-336(the)-337(assertions)]TJ 0 -13.15 TD[(w)27(ere)-332(written.)]TJ 14.94 -16.14 TD[(As)-343(there)-343(is)-343(no)-343(test)-344(suite)-343(to)-343(test)]TJ/F8 10.91 Tf 153.02 0 TD[(testing)-366(fr)50(ameworks)]TJ/F1 10.91 Tf 93.67 0 TD[(for)]TJ/F7 10.91 Tf 16.81 0 TD[(posix)]TJ/F1 10.91 Tf 31.74 0 TD[(1003.3)-343(conformance,)-345(v)26(eri-)]TJ -310.18 -13.15 TD[(fying)-323(conformance)-323(to)-323(this)-323(standard)-323(is)-323(done)-323(b)27(y)-322(rep)-28(eatedly)-323(reading)-323(the)-323(standard)-323(and)-323(exp)-28(eri-)]TJ 0 -13.15 TD[(men)27(ting.)-437(One)-316(of)-316(the)-316(main)-316(things)-316(1003.3)-316(do)-27(es)-316(sp)-28(ecify)-316(is)-316(the)-316(set)-316(of)-316(allo)27(w)28(ed)-315(output)-316(messages,)]TJ 0 -13.15 TD[(and)-436(their)-437(de\014nitions.)-755(F)82(our)-436(messages)-437(are)-436(supp)-28(orted)-437(for)-437(a)-437(required)-437(feature)-436(of)]TJ/F7 10.91 Tf 379.24 0 TD[(posix)]TJ/F1 10.91 Tf 32.76 0 TD[(con-)]TJ -412 -13.15 TD[(forming)-441(systems,)-468(and)-442(a)-441(\014fth)-442(for)-441(a)-442(conditional)-441(feature.)-769(DejaGn)27(u)-441(supp)-27(orts)-442(the)-441(use)-442(of)-441(all)]TJ 0 -13.16 TD[(\014v)27(e)-443(output)-444(messages;)-499(in)-444(this)-445(sense)-444(a)-444(test)-444(suite)-444(that)-444(uses)-444(exactly)-444(these)-444(messages)-444(can)-444(b)-28(e)]TJ 0 -13.15 TD[(considered)]TJ/F7 10.91 Tf 53.42 0 TD[(posix)]TJ/F1 10.91 Tf 31.64 0 TD[(conforming.)-444(These)-333(de\014nitions)-334(sp)-27(ecify)-334(the)-333(output)-333(of)-334(a)-333(test)-333(case:)]TJ/F4 10.91 Tf -85.06 -28.09 TD[(PASS)]TJ/F1 10.91 Tf 57.6 0 TD[(A)-333(test)-333(has)-333(succeeded.)-445(That)-333(is,)-334(it)-333(demonstrated)-333(that)-334(the)-333(assertion)-333(is)-334(true.)]TJ/F4 10.91 Tf -57.6 -22.12 TD[(XFAIL)]TJ/F7 10.91 Tf 57.6 0 TD[(posix)]TJ/F1 10.91 Tf 33.05 0 TD[(1003.3)-463(do)-28(es)-463(not)-463(incorp)-28(orate)-463(the)-463(notion)-464(of)-463(exp)-28(ected)-463(failures,)-496(so)]TJ/F4 10.91 Tf 315.41 0 TD[(PASS)]TJ/F1 10.91 Tf 22.91 0 TD[(,)]TJ -371.37 -13.15 TD[(instead)-361(of)]TJ/F4 10.91 Tf 50.67 0 TD[(XPASS)]TJ/F1 10.91 Tf 28.64 0 TD[(,)-368(m)27(ust)-361(also)-361(b)-28(e)-361(returned)-362(for)-361(test)-362(cases)-361(whic)27(h)-361(w)27(ere)-361(exp)-27(ected)-362(to)]TJ -79.31 -13.15 TD[(fail)-277(and)-278(did)-278(not.)-426(This)-278(means)-278(that)]TJ/F4 10.91 Tf 160.23 0 TD[(PASS)]TJ/F1 10.91 Tf 25.95 0 TD[(is)-277(in)-278(some)-278(sense)-278(more)-278(am)27(biguous)-277(than)-278(if)]TJ/F4 10.91 Tf -186.18 -13.15 TD[(XPASS)]TJ/F1 10.91 Tf 32.13 0 TD[(is)-320(also)-320(used.)-440(F)83(or)-320(information)-320(on)]TJ/F4 10.91 Tf 155.08 0 TD[(XPASS)]TJ/F1 10.91 Tf 32.13 0 TD[(and)]TJ/F4 10.91 Tf 21.06 0 TD[(XFAIL)]TJ/F1 10.91 Tf 28.64 0 TD[(,)-322(see)-320(Chapter)-320(3)-321([Using)]TJ/F4 10.91 Tf -269.04 -13.15 TD[(runtest)]TJ/F1 10.91 Tf 40.09 0 TD[(],)-333(page)-333(9.)]TJ ET 18.00 -614.63 m 162.00 -614.63 l 162.00 -614.23 l 18.00 -614.23 l b BT/F6 6.97 Tf 23.02 -622.58 TD[(3)]TJ/F7 10.91 Tf 9.92 -3.96 TD[(tet)]TJ/F1 10.91 Tf 22.45 0 TD[(w)27(as)-316(created)-318(b)27(y)-317(Unisoft)-318(for)-317(a)-318(consortium)-318(comprised)-317(of)-318(X/Op)-28(en,)-321(Unix)-317(In)27(ternational,)]TJ -22.45 -13.15 TD[(and)-333(the)-333(Op)-28(en)-333(Soft)27(w)27(are)-332(F)82(oundation.)]TJ ET 0 g 0 G +endstream +endobj +65 0 obj +<< +/F1 9 0 R +/F7 49 0 R +/F4 28 0 R +/F2 12 0 R +/F6 46 0 R +/F5 31 0 R +/F8 52 0 R +>> +endobj +63 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 65 0 R +>> +endobj +68 0 obj +<< +/Length 7942 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(2:)-444(What)-334(is)-333(new)-333(in)-334(this)-333(release)-333(?)-21300(7)]TJ/F4 10.91 Tf 0 -23.91 TD[(FAIL)]TJ/F1 10.91 Tf 57.6 0 TD[(A)-290(test)]TJ/F8 10.91 Tf 32.15 0 TD[(has)]TJ/F1 10.91 Tf 19.67 0 TD[(pro)-27(duced)-290(the)-291(bug)-290(it)-290(w)27(as)-289(in)26(tended)-289(to)-290(capture.)-430(That)-290(is,)-299(it)-290(has)-290(demon-)]TJ -51.82 -13.15 TD[(strated)-348(that)-348(the)-348(assertion)-348(is)-348(false.)-489(The)]TJ/F4 10.91 Tf 188.79 0 TD[(FAIL)]TJ/F1 10.91 Tf 26.7 0 TD[(message)-348(is)-348(based)-348(on)-348(the)-348(test)-348(case)]TJ -215.49 -13.15 TD[(only)83(.)-444(Other)-333(messages)-333(are)-334(used)-333(to)-333(indicate)-334(a)-333(failure)-333(of)-334(the)-333(framew)27(ork.)]TJ 0 -16.14 TD[(As)-301(with)]TJ/F4 10.91 Tf 40.27 0 TD[(PASS)]TJ/F1 10.91 Tf 22.91 0 TD[(,)]TJ/F7 10.91 Tf 6.39 0 TD[(posix)]TJ/F1 10.91 Tf 31.29 0 TD[(tests)-301(m)27(ust)-300(return)]TJ/F4 10.91 Tf 84.95 0 TD[(FAIL)]TJ/F1 10.91 Tf 26.2 0 TD[(rather)-301(than)]TJ/F4 10.91 Tf 57.54 0 TD[(XFAIL)]TJ/F1 10.91 Tf 31.93 0 TD[(ev)27(en)-300(if)-301(a)-302(failure)]TJ -301.48 -13.15 TD[(w)27(as)-332(exp)-28(ected.)]TJ/F4 10.91 Tf -57.6 -22.12 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 57.6 -13.15 TD[(A)-387(test)-387(pro)-28(duced)-387(indeterminate)-388(results.)-606(Usually)82(,)-400(this)-387(means)-387(the)-388(test)-387(executed)]TJ 0 -13.15 TD[(in)-408(an)-408(unexp)-27(ected)-408(fashion;)-446(this)-408(outcome)-408(requires)-408(that)-408(a)-408(h)27(uman)-407(b)-28(eing)-408(go)-408(o)27(v)27(er)]TJ 0 -13.15 TD[(results,)-383(to)-374(determine)-374(if)-374(the)-374(test)-373(should)-374(ha)27(v)27(e)-372(passed)-374(or)-374(failed.)-566(This)-374(message)-374(is)]TJ 0 -13.15 TD[(also)-279(used)-280(for)-280(an)27(y)-279(test)-279(that)-280(requires)-280(h)27(uman)-279(in)27(terv)28(en)27(tion)-278(b)-28(ecause)-280(it)-280(is)-279(b)-28(ey)27(ond)-279(the)]TJ 0 -13.15 TD[(abilities)-309(of)-310(the)-310(testing)-310(framew)26(ork.)-435(An)26(y)-309(unresolv)27(ed)-309(test)-310(should)-310(resolv)27(ed)-309(to)]TJ/F4 10.91 Tf 351.49 0 TD[(PASS)]TJ/F1 10.91 Tf -351.49 -13.16 TD[(or)]TJ/F4 10.91 Tf 13.36 0 TD[(FAIL)]TJ/F1 10.91 Tf 26.55 0 TD[(b)-27(efore)-334(a)-333(test)-333(run)-334(can)-333(b)-28(e)-333(considered)-333(\014nished.)]TJ -39.91 -16.13 TD[(Note)-311(that)-311(for)]TJ/F7 10.91 Tf 65.97 0 TD[(posix)]TJ/F1 10.91 Tf 28 0 TD[(,)-315(eac)27(h)-310(assertion)-312(m)27(ust)-310(pro)-28(duce)-311(a)-311(test)-311(result)-311(co)-28(de.)-437(If)-311(the)-312(test)]TJ -93.97 -13.16 TD[(isn't)-401(actually)-401(run,)-418(it)-402(m)27(ust)-400(pro)-28(duce)]TJ/F4 10.91 Tf 173 0 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 61.65 0 TD[(rather)-401(than)-401(just)-401(lea)26(ving)-400(that)]TJ -234.65 -13.15 TD[(test)-383(out)-383(of)-383(the)-383(output.)-594(This)-383(means)-384(that)-383(y)27(ou)-382(ha)27(v)27(e)-382(to)-383(b)-28(e)-383(careful)-383(when)-383(writing)]TJ 0 -13.15 TD[(tests,)-363(to)-358(not)-357(carelessly)-357(use)-358(tcl)-357(statemen)26(ts)-356(lik)27(e)]TJ/F4 10.91 Tf 221.42 0 TD[(return)]TJ/F1 10.91 Tf 34.36 0 TD[(|if)-357(y)27(ou)-357(alter)-357(the)-358(\015o)27(w)-356(of)]TJ -255.78 -13.15 TD[(con)27(trol)-272(of)-273(the)-273(tcl)-273(co)-28(de)-273(y)27(ou)-272(m)27(ust)-272(insure)-273(that)-273(ev)26(ery)-272(test)-273(still)-273(pro)-28(duces)-273(some)-273(result)]TJ 0 -13.15 TD[(co)-27(de.)]TJ 0 -16.14 TD[(Here)-333(are)-333(some)-333(of)-334(the)-333(w)27(a)27(ys)-332(a)-333(test)-334(ma)27(y)-332(wind)-333(up)]TJ/F4 10.91 Tf 225.39 0 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 57.28 0 TD[(:)]TJ/F3 10.91 Tf -273.72 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(A)-333(test's)-333(execution)-333(is)-334(in)27(terrupted.)]TJ/F3 10.91 Tf -12.65 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(A)-367(test)-367(do)-27(es)-368(not)-367(pro)-27(duce)-368(a)-367(clear)-367(result.)-546(This)-367(is)-367(usually)-367(b)-28(ecause)-367(there)-367(w)27(as)]TJ 0 -13.15 TD[(an)]TJ/F4 10.91 Tf 15.71 0 TD[(ERROR)]TJ/F1 10.91 Tf 32.83 0 TD[(from)-384(DejaGn)27(u)-384(while)-384(pro)-28(cessing)-384(the)-385(test,)-397(or)-384(b)-28(ecause)-384(there)-385(w)27(ere)]TJ -48.54 -13.15 TD[(three)-445(or)-446(more)]TJ/F4 10.91 Tf 72.25 0 TD[(WARNING)]TJ/F1 10.91 Tf 44.96 0 TD[(messages.)-781(An)27(y)]TJ/F4 10.91 Tf 78.72 0 TD[(WARNING)]TJ/F1 10.91 Tf 44.95 0 TD[(or)]TJ/F4 10.91 Tf 14.59 0 TD[(ERROR)]TJ/F1 10.91 Tf 33.5 0 TD[(messages)-445(can)]TJ -288.97 -13.15 TD[(in)27(v)56(alidate)-361(the)-361(output)-362(of)-361(the)-362(test.)-529(This)-362(usually)-361(requires)-362(a)-362(h)27(uman)-360(b)-28(eing)-362(to)]TJ 0 -13.15 TD[(examine)-382(the)-383(output)-382(to)-383(determine)-382(what)-383(really)-382(happ)-28(ened|and)-382(to)-383(impro)27(v)28(e)]TJ 0 -13.15 TD[(the)-333(test)-333(case.)]TJ/F3 10.91 Tf -12.65 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(A)-333(test)-333(dep)-28(ends)-333(on)-334(a)-333(previous)-333(test,)-334(whic)27(h)-332(fails.)]TJ/F3 10.91 Tf -12.65 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(The)-333(test)-333(w)27(as)-333(set)-333(up)-333(incorrectly)82(.)]TJ/F4 10.91 Tf -79.2 -22.12 TD[(UNTESTED)]TJ/F1 10.91 Tf 57.6 0 TD[(A)-341(test)-342(w)27(as)-341(not)-342(run.)-469(This)-342(is)-342(a)-341(placeholder,)-344(used)-342(when)-342(there)-342(is)-341(no)-342(real)-342(test)-341(case)]TJ 0 -13.15 TD[(y)27(et.)]TJ -57.6 -19.12 TD[(The)-395(only)-395(remaining)-395(output)-395(message)-395(left)-395(is)-395(in)27(tended)-394(to)-395(test)-395(features)-395(that)-395(are)-395(sp)-28(eci\014ed)-395(b)27(y)]TJ 0 -13.16 TD[(the)-333(applicable)]TJ/F7 10.91 Tf 70.3 0 TD[(posix)]TJ/F1 10.91 Tf 31.64 0 TD[(standard)-333(as)-333(conditional:)]TJ/F4 10.91 Tf -101.94 -22.11 TD[(UNSUPPORTED)]TJ/F1 10.91 Tf 57.6 -13.15 TD[(There)-444(is)-445(no)-445(supp)-28(ort)-445(for)-445(the)-444(tested)-445(case.)-779(This)-445(ma)27(y)-444(mean)-445(that)-445(a)-445(conditional)]TJ 0 -13.15 TD[(feature)-320(of)-320(an)-320(op)-27(erating)-320(system,)-323(or)-320(of)-320(a)-320(compiler,)-323(is)-320(not)-320(implemen)27(ted.)-439(DejaGn)27(u)]TJ 0 -13.15 TD[(also)-256(uses)-256(this)-256(message)-257(when)-256(a)-256(testing)-257(en)27(vironmen)28(t)-255(\(often)-257(a)-256(\\bare)-256(b)-28(oard")-256(target\))]TJ 0 -13.16 TD[(lac)27(ks)-333(basic)-334(supp)-27(ort)-334(for)-334(compiling)-334(or)-334(running)-334(the)-334(test)-334(case.)-446(F)82(or)-332(example,)-335(a)-333(test)]TJ 0 -13.15 TD[(for)-420(the)-420(system)-420(subroutine)]TJ/F4 10.91 Tf 129.49 0 TD[(gethostname)]TJ/F1 10.91 Tf 67.58 0 TD[(w)27(ould)-419(nev)27(er)-419(w)26(ork)-419(on)-420(a)-420(target)-421(b)-27(oard)]TJ -197.07 -13.15 TD[(running)-333(only)-333(a)-333(b)-28(o)-28(ot)-333(monitor.)]TJ -42.66 -19.13 TD[(DejaGn)27(u)-326(uses)-326(the)-327(same)-327(output)-327(pro)-27(cedures)-327(to)-327(pro)-28(duce)-327(these)-326(messages)-327(for)-327(all)-327(test)-326(suites,)]TJ -14.94 -13.15 TD[(and)-365(these)-366(pro)-28(cedures)-366(are)-366(already)-366(kno)27(wn)-365(to)-366(conform)-366(to)]TJ/F7 10.91 Tf 267.41 0 TD[(posix)]TJ/F1 10.91 Tf 31.99 0 TD[(1003.3.)-542(F)83(or)-365(a)-366(DejaGn)27(u)-365(test)]TJ -299.4 -13.15 TD[(suite)-318(to)-318(conform)-319(to)]TJ/F7 10.91 Tf 94.29 0 TD[(posix)]TJ/F1 10.91 Tf 31.47 0 TD[(1003.3,)-321(y)27(ou)-317(m)26(ust)-317(a)27(v)28(oid)-318(the)]TJ/F4 10.91 Tf 131.4 0 TD[(setup_xfail)]TJ/F1 10.91 Tf 66.47 0 TD[(pro)-27(cedure)-319(as)-318(describ)-28(ed)]TJ -323.63 -13.15 TD[(in)-246(the)]TJ/F4 10.91 Tf 29.63 0 TD[(PASS)]TJ/F1 10.91 Tf 25.6 0 TD[(section)-246(ab)-28(o)27(v)27(e,)-263(and)-246(y)26(ou)-245(m)26(ust)-245(b)-28(e)-247(careful)-247(to)-247(return)]TJ/F4 10.91 Tf 227.96 0 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 59.97 0 TD[(where)-246(appropriate,)]TJ -343.16 -13.15 TD[(as)-333(describ)-28(ed)-333(in)-333(the)]TJ/F4 10.91 Tf 93.18 0 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 60.91 0 TD[(section)-333(ab)-28(o)27(v)28(e.)]TJ ET 0 g 0 G +endstream +endobj +69 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F8 52 0 R +/F7 49 0 R +/F3 21 0 R +>> +endobj +67 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 69 0 R +>> +endobj +72 0 obj +<< +/Length 3732 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(8)-26498(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F2 14.35 Tf 0 -23.91 TD[(2.5)-562(F)93(uture)-374(directions)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(In)-318(the)-318(near)-318(future,)-321(there)-318(are)-318(t)27(w)28(o)-318(parallel)-318(directions)-318(for)-318(DejaGn)27(u)-317(dev)27(elopmen)28(t.)-439(The)-318(\014rst)]TJ -14.94 -13.15 TD[(is)-333(to)-333(add)-333(supp)-28(ort)-334(for)-333(more)-333(hosts)-334(and)-333(targets.)]TJ 14.94 -16.14 TD[(The)-302(second)-303(w)26(ould)-302(p)-27(ermit)-303(testing)-303(programs)-303(with)-303(a)-303(more)-303(complex)-303(in)27(terface,)-308(whether)-303(text)]TJ -14.94 -13.15 TD[(based)-338(or)-338(GUI)-338(based.)-459(Tw)27(o)-337(comp)-28(onen)27(ts)-337(already)-338(exist:)-454(a)-338(Tcl)-339(based)-338(X)-338(windo)27(w)-337(to)-28(olkit,)-339(and)-338(a)]TJ 0 -13.15 TD[(terminal)-371(pac)27(k)55(age)-370(for)]TJ/F4 10.91 Tf 102.22 0 TD[(expect)]TJ/F1 10.91 Tf 34.37 0 TD[(.)-559(Both)-372(of)-371(these)-372(could)-371(b)-28(e)-372(merged)-372(in)27(to)-370(DejaGn)26(u)-370(in)-372(a)-372(w)27(a)28(y)-371(that)]TJ -136.59 -13.15 TD[(p)-27(ermits)-334(testing)-333(programs)-333(that)-334(run)-333(in)-333(eac)27(h)-333(en)27(vironmen)28(t.)]TJ 14.94 -16.14 TD[(Mean)27(while,)-292(w)27(e)-282(hop)-28(e)-283(DejaGn)26(u)-282(enables)-283(the)-283(creation)-284(of)-283(test)-283(suites)-283(for)-284(conformance)-283(to)]TJ/F7 10.91 Tf 395.39 0 TD[(ansi)]TJ/F1 10.91 Tf -410.33 -13.15 TD[(C)-369(and)-370(C)]TJ/F4 10.91 Tf 41.4 0 TD[(++)]TJ/F1 10.91 Tf 11.45 0 TD[(,)-378(to)]TJ/F7 10.91 Tf 20.89 0 TD[(posix)]TJ/F1 10.91 Tf 28 0 TD[(,)-378(and)-370(to)-369(other)-370(standards.)-553(W)83(e)-369(encourage)-369(y)26(ou)-368(to)-370(mak)27(e)-368(an)26(y)-368(test)-370(suites)]TJ -101.74 -13.15 TD[(y)27(ou)-332(create)-333(freely)-334(a)27(v)56(ailable,)-333(under)-333(the)-333(same)-334(terms)-333(as)-333(DejaGn)26(u)-332(itself.)]TJ/F2 14.35 Tf 0 -30.88 TD[(2.6)-562(Tcl)-375(and)-375(Exp)-31(ect)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(Tcl)-284(w)27(as)-284(in)27(tro)-27(duced)-285(in)-284(a)-285(pap)-27(er)-285(b)27(y)-284(John)-285(K.)-284(Ousterhout)-285(at)-284(the)-285(1990)-285(Win)27(ter)-283(Usenix)-285(confer-)]TJ -14.94 -13.15 TD[(ence,)]TJ/F5 10.91 Tf 26.8 0 TD[(Tcl:)-417(An)-280(Em)27(b)-27(eddable)-279(Command)-280(Language)]TJ/F1 10.91 Tf 200.37 0 TD[(.)-426(That)-280(pap)-27(er)-280(is)-279(included)-280(in)-279(P)26(ostScript)-278(form)]TJ -227.17 -13.15 TD[(in)-368(the)-368(`)]TJ/F4 10.91 Tf 35.31 0 TD[(doc)]TJ/F1 10.91 Tf 17.18 0 TD[(')-368(sub)-28(directory)-368(of)-368(the)-369(Tcl)-368(distribution.)-549(The)-369(v)27(ersion)-367(of)-368(Tcl)-369(included)-368(in)-368(DejaGn)26(u)]TJ -52.49 -13.15 TD[(at)-333(this)-333(time)-333(is)-334(Tcl)-333(7.4p3.)]TJ 14.94 -16.14 TD[(Don)-331(Lib)-28(es)-331(in)27(tro)-27(duced)]TJ/F4 10.91 Tf 107 0 TD[(expect)]TJ/F1 10.91 Tf 37.98 0 TD[(in)-331(his)-331(pap)-28(er)]TJ/F5 10.91 Tf 60.33 0 TD[(exp)-27(ect:)-444(Curing)-331(Those)-331(Uncon)26(trollable)-330(Fits)-331(of)]TJ -220.25 -13.15 TD[(In)27(teraction)]TJ/F1 10.91 Tf 56.68 0 TD[(at)-414(the)-415(1990)-415(Summer)-414(Usenix)-415(conference.)-688(The)-415(pap)-28(er)-415(is)-414(included)-415(in)-415(P)27(ostScript)]TJ -56.68 -13.15 TD[(form)-306(in)-306(the)]TJ/F4 10.91 Tf 56.42 0 TD[(expect)]TJ/F1 10.91 Tf 37.71 0 TD[(distribution)-306(\(as)-306(are)-307(sev)27(eral)-306(other)-306(pap)-28(ers)-306(ab)-28(out)]TJ/F4 10.91 Tf 223.8 0 TD[(expect)]TJ/F1 10.91 Tf 34.36 0 TD[(\).)-435(The)-306(v)26(ersion)-305(of)]TJ -352.29 -13.15 TD[(exp)-27(ect)-334(included)-333(in)-333(DejaGn)27(u)-333(at)-333(this)-333(time)-334(is)-333(exp)-28(ect)-333(5.18.0.)]TJ ET 0 g 0 G +endstream +endobj +73 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +/F7 49 0 R +/F5 31 0 R +>> +endobj +71 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 73 0 R +>> +endobj +77 0 obj +<< +/Type /FontDescriptor +/CapHeight 611.11 +/Ascent 611.11 +/Descent -222.22 +/Flags 5 +/FontBBox [-1 -234 716 801] +/FontName /CMTT12 +/ItalicAngle 0 +/XHeight 431 +/StemV 80 +/FontFile 76 0 R +>> +endobj +78 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F10 +/FontDescriptor 77 0 R +/BaseFont /QZZRHI+CMTT12 +/FirstChar 0 +/LastChar 127 +/Widths [514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58] +>> +endobj +79 0 obj +<< +/Length 7234 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(3:)-444(Using)]TJ/F4 10.91 Tf 86.45 0 TD[(runtest)]TJ/F1 10.91 Tf 340.1 0 TD[(9)]TJ/F2 17.22 Tf -426.55 -25.91 TD[(3)-562(Using)]TJ/F10 17.22 Tf 74.17 0 TD[(runtest)]TJ/F4 10.91 Tf -59.23 -28.09 TD[(runtest)]TJ/F1 10.91 Tf 43.77 0 TD[(is)-336(the)-337(executable)-337(test)-336(driv)27(er)-336(for)-337(DejaGn)27(u.)-454(Y)83(ou)-336(can)-337(sp)-27(ecify)-337(t)27(w)27(o)-335(kinds)-337(of)-337(things)]TJ -58.71 -13.15 TD[(on)-274(the)]TJ/F4 10.91 Tf 32.66 0 TD[(runtest)]TJ/F1 10.91 Tf 43.09 0 TD[(command)-274(line:)-416(command)-274(line)-275(options,)-287(and)-275(Tcl)-275(v)55(ariables)-274(for)-275(the)-275(test)-274(scripts.)]TJ -75.75 -13.15 TD[(The)-333(options)-333(are)-333(listed)-334(alphab)-28(etically)-333(b)-28(elo)27(w.)]TJ/F4 10.91 Tf 14.94 -16.14 TD[(runtest)]TJ/F1 10.91 Tf 43.74 0 TD[(returns)-334(an)-334(exit)-335(co)-28(de)-334(of)]TJ/F4 10.91 Tf 112.01 0 TD[(1)]TJ/F1 10.91 Tf 9.37 0 TD[(if)-334(an)27(y)-334(test)-334(has)-335(an)-334(unexp)-28(ected)-334(result;)-335(otherwise)-335(\(if)-334(all)]TJ -180.06 -13.15 TD[(tests)-333(pass)-333(or)-333(fail)-334(as)-333(exp)-28(ected\))-333(it)-334(returns)]TJ/F4 10.91 Tf 192.88 0 TD[(0)]TJ/F1 10.91 Tf 9.36 0 TD[(as)-333(the)-333(exit)-333(co)-28(de.)]TJ/F4 10.91 Tf -187.3 -16.14 TD[(runtest)]TJ/F1 10.91 Tf 43.34 0 TD[(\015ags)-297(the)-298(outcome)-297(of)-298(eac)27(h)-297(test)-297(as)-298(one)-298(of)-297(these)-298(cases.)-432(\(See)-298(Section)-298(2.4)-297([A)-298(POSIX)]TJ -58.28 -13.15 TD[(conforming)-301(test)-301(framew)26(ork],)-307(page)-301(6,)-308(for)-301(a)-302(discussion)-301(of)-302(ho)27(w)]TJ/F7 10.91 Tf 284 0 TD[(posix)]TJ/F1 10.91 Tf 31.29 0 TD[(sp)-27(eci\014es)-302(the)-301(meanings)-302(of)]TJ -315.29 -13.15 TD[(these)-333(cases.\))]TJ/F4 10.91 Tf 0 -19.13 TD[(PASS)]TJ/F1 10.91 Tf 57.6 0 TD[(The)-320(most)-320(desirable)-321(outcome:)-438(the)-320(test)-321(succeeded,)-323(and)-320(w)27(as)-320(exp)-28(ected)-320(to)-320(succeed.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(XPASS)]TJ/F1 10.91 Tf 57.6 0 TD[(A)-288(pleasan)27(t)-287(kind)-288(of)-288(failure:)-422(a)-288(test)-288(w)27(as)-287(exp)-28(ected)-288(to)-288(fail,)-297(but)-288(succeeded.)-430(This)-288(ma)27(y)]TJ 0 -13.15 TD[(indicate)-283(progress;)-300(insp)-28(ect)-284(the)-283(test)-284(case)-284(to)-283(determine)-284(whether)-284(y)27(ou)-282(should)-284(amend)]TJ 0 -13.15 TD[(it)-333(to)-333(stop)-333(exp)-28(ecting)-334(failure.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(FAIL)]TJ/F1 10.91 Tf 57.6 0 TD[(A)-358(test)-359(failed,)-366(although)-358(it)-359(w)26(as)-358(exp)-27(ected)-359(to)-359(succeed.)-521(This)-359(ma)27(y)-358(indicate)-359(regress;)]TJ 0 -13.15 TD[(insp)-27(ect)-334(the)-333(test)-333(case)-334(and)-333(the)-333(failing)-334(soft)27(w)28(are)-332(to)-334(lo)-28(cate)-333(the)-333(bug.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(XFAIL)]TJ/F1 10.91 Tf 57.6 0 TD[(A)-414(test)-414(failed,)-435(but)-414(it)-415(w)27(as)-413(exp)-28(ected)-414(to)-415(fail.)-687(This)-415(result)-414(indicates)-415(no)-414(c)27(hange)-414(in)]TJ 0 -13.15 TD[(a)-360(kno)26(wn)-359(bug.)-527(If)-361(a)-361(test)-361(fails)-360(b)-28(ecause)-361(the)-361(op)-27(erating)-361(system)-361(where)-361(the)-361(test)-360(runs)]TJ 0 -13.15 TD[(lac)27(ks)-332(some)-333(facilit)26(y)-332(required)-333(b)27(y)-333(the)-333(test,)-333(the)-334(outcome)-333(is)]TJ/F4 10.91 Tf 264.55 0 TD[(UNSUPPORTED)]TJ/F1 10.91 Tf 66.63 0 TD[(instead.)]TJ/F4 10.91 Tf -388.78 -19.13 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 57.6 -13.15 TD[(Output)-444(from)-445(a)-445(test)-445(requires)-445(man)27(ual)-444(insp)-28(ection;)-501(the)-445(test)-445(suite)-445(could)-445(not)-444(au-)]TJ 0 -13.15 TD[(tomatically)-430(determine)-431(the)-430(outcome.)-737(F)82(or)-429(example,)-455(y)27(our)-430(tests)-431(can)-430(rep)-28(ort)-431(this)]TJ 0 -13.15 TD[(outcome)-333(is)-333(when)-333(a)-334(test)-333(do)-28(es)-333(not)-334(complete)-333(as)-333(exp)-28(ected.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(UNTESTED)]TJ/F1 10.91 Tf 57.6 0 TD[(A)-305(test)-305(case)-305(is)-305(not)-305(y)27(et)-304(complete,)-311(and)-305(in)-305(particular)-305(cannot)-305(y)27(et)-304(pro)-28(duce)-305(a)]TJ/F4 10.91 Tf 338.44 0 TD[(PASS)]TJ/F1 10.91 Tf 26.23 0 TD[(or)]TJ/F4 10.91 Tf -364.67 -13.15 TD[(FAIL)]TJ/F1 10.91 Tf 22.91 0 TD[(.)-436(Y)83(ou)-308(can)-308(also)-308(use)-309(this)-308(outcome)-309(in)-308(dumm)27(y)-308(\\tests")-308(that)-308(note)-309(explicitly)-308(the)]TJ -22.91 -13.15 TD[(absence)-333(of)-333(a)-333(real)-334(test)-333(case)-333(for)-334(a)-333(particular)-333(prop)-28(ert)27(y)83(.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(UNSUPPORTED)]TJ/F1 10.91 Tf 57.6 -13.15 TD[(A)-351(test)-352(dep)-28(ends)-352(on)-351(a)-352(conditionally)-352(a)27(v)56(ailable)-351(feature)-352(that)-352(do)-27(es)-352(not)-352(exist)-352(\(in)-351(the)]TJ 0 -13.15 TD[(con\014gured)-446(testing)-447(en)26(vironmen)28(t\).)-784(F)82(or)-446(example,)-475(y)26(ou)-446(can)-447(use)-446(this)-447(outcome)-447(to)]TJ 0 -13.15 TD[(rep)-27(ort)-462(on)-463(a)-462(test)-462(case)-462(that)-462(do)-28(es)-462(not)-462(w)27(ork)-462(on)-462(a)-462(particular)-462(target)-462(b)-28(ecause)-462(its)]TJ 0 -13.15 TD[(op)-27(erating)-334(system)-333(supp)-28(ort)-333(do)-28(es)-333(not)-334(include)-333(a)-333(required)-334(subroutine.)]TJ/F4 10.91 Tf -42.66 -19.13 TD[(runtest)]TJ/F1 10.91 Tf 43.73 0 TD[(ma)27(y)-332(also)-333(displa)26(y)-332(the)-333(follo)27(wing)-333(messages:)]TJ/F4 10.91 Tf -58.67 -19.13 TD[(ERROR)]TJ/F1 10.91 Tf 57.6 0 TD[(Indicates)-473(a)-474(ma)-55(jor)-474(problem)-474(\(detected)-473(b)26(y)-472(the)-474(test)-474(case)-473(itself)-78(\))-474(in)-473(running)-474(the)]TJ 0 -13.15 TD[(test.)-705(This)-420(is)-421(usually)-420(an)-421(unreco)27(v)28(erable)-419(error,)-443(suc)27(h)-419(as)-420(a)-421(missing)-420(\014le)-421(or)-420(loss)-420(of)]TJ 0 -13.15 TD[(comm)27(unication)-338(to)-339(the)-339(target.)-461(\()]TJ/F7 10.91 Tf 149.18 0 TD[(posix)]TJ/F1 10.91 Tf 31.7 0 TD[(test)-338(suites)-339(should)-339(not)-339(emit)-339(this)-339(message;)]TJ -180.88 -13.15 TD[(use)]TJ/F4 10.91 Tf 18.85 0 TD[(UNSUPPORTED)]TJ/F1 10.91 Tf 63 0 TD[(,)]TJ/F4 10.91 Tf 6.66 0 TD[(UNTESTED)]TJ/F1 10.91 Tf 45.82 0 TD[(,)-333(or)]TJ/F4 10.91 Tf 20.03 0 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 60.91 0 TD[(instead,)-333(as)-333(appropriate.\))]TJ/F4 10.91 Tf -272.87 -19.13 TD[(WARNING)]TJ/F1 10.91 Tf 57.6 0 TD[(Indicates)-337(a)-337(p)-27(ossible)-338(problem)-337(in)-337(running)-337(the)-337(test.)-456(Usually)-337(w)27(arnings)-336(corresp)-28(ond)]TJ 0 -13.15 TD[(to)-250(reco)27(v)28(erable)-249(errors,)-267(or)-250(displa)27(y)-249(an)-250(imp)-28(ortan)27(t)-249(message)-250(ab)-28(out)-250(the)-250(follo)27(wing)-249(tests.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(NOTE)]TJ/F1 10.91 Tf 57.6 0 TD[(An)-333(informational)-333(message)-333(ab)-28(out)-334(the)-333(test)-333(case.)]TJ -42.66 -19.12 TD[(This)-371(is)-371(the)-372(full)-371(set)-372(of)-371(command)-372(line)-371(options)-372(that)]TJ/F4 10.91 Tf 239.56 0 TD[(runtest)]TJ/F1 10.91 Tf 44.14 0 TD[(recognizes.)-558(Argumen)26(ts)-370(ma)27(y)]TJ -298.64 -13.15 TD[(b)-27(e)-334(abbreviated)-333(to)-333(the)-334(shortest)-333(unique)-333(string.)]TJ ET 0 g 0 G +endstream +endobj +80 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F2 12 0 R +/F10 78 0 R +/F7 49 0 R +>> +endobj +75 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 80 0 R +>> +endobj +83 0 obj +<< +/Length 9347 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(10)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F4 10.91 Tf 28.8 -23.91 TD[(runtest)-524(--tool)]TJ/F5 10.91 Tf 85.91 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 30.37 0 TD[([)]TJ/F5 10.91 Tf 11.45 0 TD[(testsuite)]TJ/F4 10.91 Tf 40.12 0 TD[(.exp)-524(...)-525(])]TJ -167.85 -12.46 TD[([)]TJ/F5 10.91 Tf 11.45 0 TD[(testsuite)]TJ/F4 10.91 Tf 40.13 0 TD[(.exp="testfile1)-524(...")-525(])]TJ -51.58 -12.45 TD[([)]TJ/F5 10.91 Tf 11.45 0 TD[(tclv)55(ar)]TJ/F4 10.91 Tf 27.79 0 TD[(=)]TJ/F5 10.91 Tf 5.72 0 TD[(v)55(alue)]TJ/F4 10.91 Tf 25.16 0 TD[(...)-524(])]TJ -70.12 -12.45 TD[([)-524(--all)-525(])-1050([)-525(--baud)]TJ/F5 10.91 Tf 114.54 0 TD[(baud-rate)]TJ/F4 10.91 Tf 52.43 0 TD[(])-1049([)-525(--connect)]TJ/F5 10.91 Tf 85.91 0 TD[(t)27(yp)-26(e)]TJ/F4 10.91 Tf 27.25 0 TD[(])]TJ -280.13 -12.46 TD[([)-524(--debug)-525(])-1050([)-525(--help)-525(])-1050([)-525(--host)]TJ/F5 10.91 Tf 194.73 0 TD[(string)]TJ/F4 10.91 Tf 34.02 0 TD[(])]TJ -228.75 -12.45 TD[([)-524(--mail)-525(")]TJ/F5 10.91 Tf 57.27 0 TD[(name)]TJ/F4 10.91 Tf 31.79 0 TD[(...")-524(])-1050([)-525(--name)]TJ/F5 10.91 Tf 97.37 0 TD[(string)]TJ/F4 10.91 Tf 34.02 0 TD[(])]TJ -220.45 -12.45 TD[([)-524(--name)]TJ/F5 10.91 Tf 51.54 0 TD[(name)]TJ/F4 10.91 Tf 31.8 0 TD[(])-1049([)-525(--outdir)]TJ/F5 10.91 Tf 80.18 0 TD[(path)]TJ/F4 10.91 Tf 27.54 0 TD[(])]TJ -191.06 -12.46 TD[([)-524(--objdir)]TJ/F5 10.91 Tf 63 0 TD[(path)]TJ/F4 10.91 Tf 27.54 0 TD[(])-1049([)-525(--reboot)-525(])]TJ -90.54 -12.45 TD[([)-524(--srcdir)]TJ/F5 10.91 Tf 63 0 TD[(path)]TJ/F4 10.91 Tf 27.54 0 TD[(])-1049([)-525(--strace)]TJ/F5 10.91 Tf 80.19 0 TD[(n)]TJ/F4 10.91 Tf 11.78 0 TD[(])]TJ -182.51 -12.45 TD[([)-524(--target)]TJ/F5 10.91 Tf 63 0 TD[(string)]TJ/F4 10.91 Tf 34.02 0 TD[(--build)]TJ/F5 10.91 Tf 45.82 0 TD[(string)]TJ/F4 10.91 Tf 34.03 0 TD[(])]TJ -176.87 -12.46 TD[([)-524(-v)-525(|)-525(--verbose)-525(])-1050([)-525(-V)-525(|)-525(--version)-525(])-1050([)-525(--D)]TJ/F5 10.91 Tf 257.72 0 TD[(n)]TJ/F4 10.91 Tf 11.79 0 TD[(])]TJ -298.31 -18.2 TD[(--tool)]TJ/F5 10.91 Tf 38 0 TD[(to)-27(ol)]TJ 19.6 -13.15 TD[(to)-27(ol)]TJ/F1 10.91 Tf 23.21 0 TD[(sp)-27(eci\014es)-394(what)-394(set)-393(of)-394(tests)-394(to)-394(run,)-408(and)-394(what)-394(initialization)-394(mo)-27(dule)-394(to)-394(use.)]TJ/F5 10.91 Tf -23.21 -13.16 TD[(to)-27(ol)]TJ/F1 10.91 Tf 22.47 0 TD[(is)-325(used)]TJ/F8 10.91 Tf 35.71 0 TD[(only)]TJ/F1 10.91 Tf 24.31 0 TD[(for)-325(these)-326(t)27(w)28(o)-325(purp)-28(oses:)-440(it)-326(is)]TJ/F8 10.91 Tf 136.2 0 TD[(not)]TJ/F1 10.91 Tf 19.92 0 TD[(used)-325(to)-326(name)-325(the)-326(executable)]TJ -238.61 -13.15 TD[(program)-276(to)-276(test.)-425(Executable)-276(to)-28(ol)-276(names)-276(\(and)-276(paths\))-277(are)-276(recorded)-276(in)-276(`)]TJ/F4 10.91 Tf 325.55 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(')]TJ -371.37 -13.15 TD[(\(see)-251(Chapter)-251(4)-252([Con\014guration)-251(dep)-28(enden)27(t)-250(v)54(alues],)-266(page)-252(15\),)-268(and)-251(y)27(ou)-251(can)-251(o)27(v)28(erride)]TJ 0 -13.15 TD[(them)-333(b)27(y)-332(sp)-28(ecifying)-333(Tcl)-334(v)55(ariables)-333(on)-333(the)-333(command)-334(line.)]TJ 0 -15.68 TD[(F)83(or)-356(example,)-364(including)-357(`)]TJ/F4 10.91 Tf 116.48 0 TD[(--tool)-333(gcc)]TJ/F1 10.91 Tf 55.19 0 TD[(')-357(on)-357(the)]TJ/F4 10.91 Tf 41.38 0 TD[(runtest)]TJ/F1 10.91 Tf 43.99 0 TD[(command)-357(line)-357(runs)-357(tests)]TJ -257.04 -13.15 TD[(from)-413(all)-413(test)-414(sub)-28(directories)-413(whose)-413(names)-414(matc)27(h)-412(`)]TJ/F4 10.91 Tf 239.54 0 TD[(gcc.*)]TJ/F1 10.91 Tf 28.64 0 TD[(',)-433(and)-413(uses)-414(one)-413(of)-414(the)]TJ -268.18 -13.15 TD[(initialization)-329(mo)-27(dules)-329(named)-329(`)]TJ/F4 10.91 Tf 144.47 0 TD[(config/*-gcc.exp)]TJ/F1 10.91 Tf 91.63 0 TD[('.)-443(T)83(o)-328(sp)-28(ecify)-329(the)-329(name)-329(of)-329(the)]TJ -236.1 -13.15 TD[(compiler)-225(\(p)-28(erhaps)-225(as)-225(an)-225(alternativ)26(e)-224(path)-225(to)-225(what)]TJ/F4 10.91 Tf 229.27 0 TD[(runtest)]TJ/F1 10.91 Tf 42.55 0 TD[(w)27(ould)-224(use)-225(b)27(y)-225(default\),)]TJ -271.82 -13.15 TD[(use)-333(`)]TJ/F4 10.91 Tf 21.88 0 TD[(GCC=)]TJ/F5 10.91 Tf 22.91 0 TD[(binname)]TJ/F1 10.91 Tf 41.22 0 TD[(')-333(on)-333(the)]TJ/F4 10.91 Tf 40.6 0 TD[(runtest)]TJ/F1 10.91 Tf 43.73 0 TD[(command)-333(line.)]TJ/F5 10.91 Tf -227.94 -18.21 TD[(testsuite)]TJ/F4 10.91 Tf 40.12 0 TD[(.exp)-333(...)]TJ/F1 10.91 Tf 17.48 -13.15 TD[(Sp)-27(ecify)-379(the)-379(names)-379(of)-379(testsuites)-379(to)-379(run.)-581(By)-379(default,)]TJ/F4 10.91 Tf 250.56 0 TD[(runtest)]TJ/F1 10.91 Tf 44.23 0 TD[(runs)-378(all)-379(tests)-379(for)]TJ -294.79 -13.15 TD[(the)-339(to)-28(ol,)-341(but)-339(y)27(ou)-339(can)-339(restrict)-339(it)-340(to)-339(particular)-340(testsuites)-339(b)27(y)-339(giving)-339(the)-340(names)-339(of)]TJ 0 -13.15 TD[(the)-333(`)]TJ/F4 10.91 Tf 21.82 0 TD[(.exp)]TJ/F1 10.91 Tf 22.91 0 TD[(')]TJ/F4 10.91 Tf 6.66 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(scripts)-333(that)-333(con)27(trol)-333(them.)]TJ/F5 10.91 Tf -89.39 -15.68 TD[(testsuite)]TJ/F1 10.91 Tf 40.12 0 TD[(.exp)-333(ma)27(y)-332(not)-334(include)-333(path)-333(information;)-334(use)-333(plain)-333(\014lenames.)]TJ/F5 10.91 Tf -97.72 -18.21 TD[(test\014le)]TJ/F4 10.91 Tf 31.58 0 TD[(.exp="testfile1)-333(...")]TJ/F1 10.91 Tf 26.02 -13.15 TD[(Sp)-27(ecify)-441(a)-440(subset)-441(of)-440(tests)-441(in)-440(a)-441(suite)-440(to)-441(run.)-766(F)83(or)-440(compiler)-440(or)-441(assem)27(bler)-439(tests,)]TJ 0 -13.15 TD[(whic)27(h)-353(often)-355(use)-354(a)-355(single)-354(`)]TJ/F4 10.91 Tf 121.27 0 TD[(.exp)]TJ/F1 10.91 Tf 22.91 0 TD[(')-354(script)-354(co)26(v)28(ering)-353(man)26(y)-353(di\013eren)27(t)-354(source)-354(\014les,)-360(this)]TJ -144.18 -13.15 TD[(option)-373(allo)27(ws)-373(y)27(ou)-373(to)-374(further)-373(restrict)-374(the)-374(tests)-373(b)27(y)-373(listing)-374(particular)-373(source)-374(\014les)]TJ 0 -13.15 TD[(to)-339(compile.)-462(Some)-340(to)-27(ols)-340(ev)27(en)-338(supp)-28(ort)-339(wildcards)-340(here.)-462(The)-339(wildcards)-340(supp)-27(orted)]TJ 0 -13.15 TD[(dep)-27(end)-334(up)-27(on)-334(the)-333(to)-28(ol,)-333(but)-334(t)27(ypically)-332(they)-333(are)]TJ/F4 10.91 Tf 216.7 0 TD[(?)]TJ/F1 10.91 Tf 5.72 0 TD[(,)]TJ/F4 10.91 Tf 6.67 0 TD[(*)]TJ/F1 10.91 Tf 5.73 0 TD[(,)-333(and)]TJ/F4 10.91 Tf 27.88 0 TD[([chars])]TJ/F1 10.91 Tf 40.09 0 TD[(.)]TJ/F5 10.91 Tf -360.39 -18.21 TD[(tclv)55(ar)]TJ/F4 10.91 Tf 27.78 0 TD[(=)]TJ/F5 10.91 Tf 5.73 0 TD[(v)55(alue)]TJ/F1 10.91 Tf 24.09 -13.15 TD[(Y)83(ou)-324(can)-325(de\014ne)-325(Tcl)-325(v)54(ariables)-324(for)-325(use)-325(b)27(y)-324(y)27(our)-324(test)-325(scripts)-325(in)-325(the)-325(same)-326(st)27(yle)-324(used)]TJ 0 -13.15 TD[(with)]TJ/F4 10.91 Tf 26.57 0 TD[(make)]TJ/F1 10.91 Tf 28.27 0 TD[(for)-491(en)27(vironmen)28(t)-491(v)55(ariables.)-918(F)83(or)-491(example,)-531(`)]TJ/F4 10.91 Tf 209.8 0 TD[(runtest)-333(GDB=gdb.old)]TJ/F1 10.91 Tf 106.73 0 TD[(')]TJ -371.37 -13.15 TD[(de\014nes)-435(a)-436(v)54(ariable)-434(called)-436(`)]TJ/F4 10.91 Tf 124.26 0 TD[(GDB)]TJ/F1 10.91 Tf 17.18 0 TD[(';)-487(when)-435(y)26(our)-435(scripts)-435(refer)-436(to)-436(`)]TJ/F4 10.91 Tf 146.61 0 TD[($GDB)]TJ/F1 10.91 Tf 22.9 0 TD[(')-435(in)-436(this)-436(run,)]TJ -310.95 -13.15 TD[(they)-333(use)-333(the)-333(v)54(alue)-332(`)]TJ/F4 10.91 Tf 93.39 0 TD[(gdb.old)]TJ/F1 10.91 Tf 40.09 0 TD[('.)]TJ -133.48 -15.68 TD[(The)-326(default)-326(Tcl)-326(v)54(ariables)-325(used)-326(for)-326(most)-326(to)-28(ols)-326(are)-327(de\014ned)-326(in)-326(the)-326(main)-327(DejaGn)27(u)]TJ/F4 10.91 Tf 0 -13.15 TD[(Makefile)]TJ/F1 10.91 Tf 45.82 0 TD[(;)-572(their)-493(v)55(alues)-492(are)-493(captured)-493(in)-493(the)-493(`)]TJ/F4 10.91 Tf 176.53 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(')-492(\014le.)-923(See)-493(Chapter)-493(4)]TJ -268.17 -13.15 TD[([Con\014guration)-333(dep)-28(enden)27(t)-332(v)54(alues],)-332(page)-333(15.)]TJ/F4 10.91 Tf -57.6 -18.21 TD[(--all)]TJ/F1 10.91 Tf 57.6 0 TD[(Displa)27(y)-422(all)-423(test)-423(output.)-713(By)-423(default,)]TJ/F4 10.91 Tf 180.62 0 TD[(runtest)]TJ/F1 10.91 Tf 44.71 0 TD[(sho)27(ws)-422(only)-423(the)-423(output)-423(of)-423(tests)]TJ -225.33 -13.15 TD[(that)-357(pro)-28(duce)-357(unexp)-28(ected)-357(results;)-370(that)-357(is,)-364(tests)-357(with)-357(status)-358(`)]TJ/F4 10.91 Tf 286.38 0 TD[(FAIL)]TJ/F1 10.91 Tf 22.91 0 TD[(')-357(\(unexp)-28(ected)]TJ -309.29 -13.15 TD[(failure\),)-286(`)]TJ/F4 10.91 Tf 43.46 0 TD[(XPASS)]TJ/F1 10.91 Tf 28.64 0 TD[(')-275(\(unexp)-27(ected)-276(success\),)-286(or)-276(`)]TJ/F4 10.91 Tf 126.89 0 TD[(ERROR)]TJ/F1 10.91 Tf 28.64 0 TD[(')-275(\(a)-275(sev)27(ere)-274(error)-275(in)-276(the)-275(test)-275(case)]TJ -227.63 -13.16 TD[(itself)-77(\).)-629(Sp)-28(ecify)-395(`)]TJ/F4 10.91 Tf 79.35 0 TD[(--all)]TJ/F1 10.91 Tf 28.63 0 TD[(')-394(to)-395(see)-395(output)-395(for)-394(tests)-395(with)-395(status)-395(`)]TJ/F4 10.91 Tf 181.15 0 TD[(PASS)]TJ/F1 10.91 Tf 22.91 0 TD[(')-394(\(success,)-410(as)]TJ -312.04 -13.15 TD[(exp)-27(ected\))-369(`)]TJ/F4 10.91 Tf 53.12 0 TD[(XFAIL)]TJ/F1 10.91 Tf 28.63 0 TD[(')-368(\(failure,)-378(as)-369(exp)-28(ected\),)-378(or)-369(`)]TJ/F4 10.91 Tf 132.26 0 TD[(WARNING)]TJ/F1 10.91 Tf 40.09 0 TD[(')-368(\(minor)-369(error)-369(in)-369(the)-369(test)]TJ -254.1 -13.15 TD[(case)-333(itself)-78(\).)]TJ ET 0 g 0 G +endstream +endobj +84 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F5 31 0 R +/F8 52 0 R +>> +endobj +82 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 84 0 R +>> +endobj +87 0 obj +<< +/Length 8947 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(3:)-444(Using)]TJ/F4 10.91 Tf 86.45 0 TD[(runtest)]TJ/F1 10.91 Tf 334.64 0 TD[(11)]TJ/F4 10.91 Tf -421.09 -23.91 TD[(--baud)]TJ/F5 10.91 Tf 38 0 TD[(baud-rate)]TJ/F4 10.91 Tf -38 -13.15 TD[(-b)]TJ/F5 10.91 Tf 15.09 0 TD[(baud-rate)]TJ/F1 10.91 Tf 42.51 -13.15 TD[(Set)-322(the)-323(default)-323(baud)-323(rate)-323(to)-323(something)-322(other)-323(than)-323(9600.)-441(\(Some)-323(serial)-323(in)27(terface)]TJ 0 -13.15 TD[(programs,)-333(lik)27(e)]TJ/F4 10.91 Tf 71.03 0 TD[(tip)]TJ/F1 10.91 Tf 17.18 0 TD[(,)-333(use)-333(a)-333(separate)-334(initialization)-333(\014le)-333(instead)-334(of)-333(this)-333(v)54(alue.\))]TJ/F4 10.91 Tf -145.81 -19.13 TD[(--connect)]TJ/F5 10.91 Tf 55.18 0 TD[(t)27(yp)-26(e)]TJ/F1 10.91 Tf 2.42 -13.15 TD[(Connect)-269(to)-270(a)-270(target)-270(testing)-269(en)26(vironmen)28(t)-269(as)-269(sp)-28(eci\014ed)-270(b)27(y)]TJ/F5 10.91 Tf 262.49 0 TD[(t)27(yp)-26(e)]TJ/F1 10.91 Tf 20.91 0 TD[(,)-282(if)-270(the)-269(target)-270(is)-270(not)]TJ -283.4 -13.15 TD[(the)-397(computer)-397(running)]TJ/F4 10.91 Tf 110.03 0 TD[(runtest)]TJ/F1 10.91 Tf 40.09 0 TD[(.)-635(F)82(or)-396(example,)-413(use)-397(`)]TJ/F4 10.91 Tf 99.44 0 TD[(--connect)]TJ/F1 10.91 Tf 51.54 0 TD[(')-397(to)-397(c)27(hange)-396(the)]TJ -301.1 -13.15 TD[(program)-302(used)-303(to)-303(connect)-303(to)-303(a)-303(\\bare)-303(b)-28(oard")-303(b)-28(o)-28(ot)-303(monitor.)-434(The)-303(c)27(hoices)-302(for)]TJ/F5 10.91 Tf 353.49 0 TD[(t)27(yp)-26(e)]TJ/F1 10.91 Tf -353.49 -13.16 TD[(in)-368(the)-368(DejaGn)27(u)-367(1.0)-368(distribution)-368(are)-368(`)]TJ/F4 10.91 Tf 178.08 0 TD[(rlogin)]TJ/F1 10.91 Tf 34.36 0 TD[(',)-376(`)]TJ/F4 10.91 Tf 13.21 0 TD[(telnet)]TJ/F1 10.91 Tf 34.36 0 TD[(',)-376(`)]TJ/F4 10.91 Tf 13.2 0 TD[(rsh)]TJ/F1 10.91 Tf 17.18 0 TD[(',)-376(`)]TJ/F4 10.91 Tf 13.2 0 TD[(tip)]TJ/F1 10.91 Tf 17.19 0 TD[(',)-376(`)]TJ/F4 10.91 Tf 13.2 0 TD[(kermit)]TJ/F1 10.91 Tf 34.36 0 TD[(',)]TJ -368.34 -13.15 TD[(and)-333(`)]TJ/F4 10.91 Tf 24.24 0 TD[(mondfe)]TJ/F1 10.91 Tf 34.37 0 TD[('.)]TJ -58.61 -16.14 TD[(The)-363(default)-364(for)-364(this)-364(option)-364(dep)-28(ends)-364(on)-364(the)-364(con\014guration)-364(\(see)-364(Section)-364(5.5)-363([Re-)]TJ 0 -13.15 TD[(mote)-370(targets)-370(supp)-28(orted],)-380(page)-370(32\).)-555(The)-371(default)-370(is)-370(c)26(hosen)-369(to)-370(b)-28(e)-370(the)-371(most)-370(con-)]TJ 0 -13.15 TD[(v)27(enien)28(t)-347(comm)27(unication)-347(metho)-28(d)-347(a)26(v)56(ailable,)-350(but)-348(often)-348(other)-348(alternativ)27(es)-347(w)27(ork)-347(as)]TJ 0 -13.15 TD[(w)27(ell;)-316(y)26(ou)-309(ma)27(y)-309(\014nd)-310(it)-310(useful)-310(to)-310(try)-310(alternativ)27(e)-309(connect)-310(metho)-28(ds)-310(if)-310(y)27(ou)-309(susp)-28(ect)-310(a)]TJ 0 -13.15 TD[(comm)27(unication)-332(problem)-333(with)-334(y)27(our)-332(testing)-334(target.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(--debug)]TJ/F1 10.91 Tf 57.6 0 TD[(T)83(urns)-269(on)-271(the)]TJ/F4 10.91 Tf 63.18 0 TD[(expect)]TJ/F1 10.91 Tf 37.31 0 TD[(in)27(ternal)-269(debugging)-270(output.)-424(Debugging)-270(output)-270(is)-271(displa)27(y)28(ed)]TJ -100.49 -13.15 TD[(as)-482(part)-482(of)-482(the)]TJ/F4 10.91 Tf 74.76 0 TD[(runtest)]TJ/F1 10.91 Tf 45.35 0 TD[(output,)-519(and)-482(logged)-482(to)-482(a)-482(\014le)-482(called)-482(`)]TJ/F4 10.91 Tf 179.64 0 TD[(dbg.log)]TJ/F1 10.91 Tf 40.09 0 TD[('.)-890(The)]TJ -339.84 -13.15 TD[(extra)-261(debugging)-262(output)-261(do)-28(es)]TJ/F8 10.91 Tf 137.57 0 TD[(not)]TJ/F1 10.91 Tf 19.22 0 TD[(app)-27(ear)-262(on)-261(standard)-262(output,)-276(unless)-262(the)-261(v)27(erb)-27(ose)]TJ -156.79 -13.15 TD[(lev)27(el)-369(is)-369(greater)-370(than)-370(2)-370(\(for)-370(instance,)-379(to)-369(see)-370(debug)-370(output)-370(immediately)82(,)-377(sp)-28(ecify)]TJ 0 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(--debug)-333(-v)-333(-v)]TJ/F1 10.91 Tf 70.27 0 TD[('\).)-618(The)-392(debugging)-391(output)-392(sho)27(ws)-390(all)-392(attempts)-391(at)-392(matc)27(hing)-391(the)]TJ -73.3 -13.15 TD[(test)-364(output)-365(of)-365(the)-364(to)-28(ol)-365(with)-364(the)-365(scripted)-365(patterns)-365(describing)-364(exp)-28(ected)-365(output.)]TJ 0 -13.15 TD[(The)-333(output)-333(generated)-333(with)-334(`)]TJ/F4 10.91 Tf 135.79 0 TD[(--strace)]TJ/F1 10.91 Tf 45.82 0 TD[(')-333(also)-333(go)-28(es)-333(in)27(to)-333(`)]TJ/F4 10.91 Tf 77.69 0 TD[(dbg.log)]TJ/F1 10.91 Tf 40.09 0 TD[('.)]TJ/F4 10.91 Tf -356.99 -19.13 TD[(--help)]TJ 0 -13.15 TD[(-he)]TJ/F1 10.91 Tf 57.6 0 TD[(Prin)27(ts)-284(out)-286(a)-285(short)-286(summary)-285(of)-286(the)]TJ/F4 10.91 Tf 164.35 0 TD[(runtest)]TJ/F1 10.91 Tf 43.2 0 TD[(options,)-295(then)-285(exits)-285(\(ev)26(en)-284(if)-286(y)27(ou)-284(also)]TJ -207.55 -13.15 TD[(sp)-27(ecify)-334(other)-333(options\).)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(--host)]TJ/F5 10.91 Tf 38 0 TD[(string)]TJ 19.6 -13.15 TD[(string)]TJ/F1 10.91 Tf 33.12 0 TD[(is)-442(a)-442(full)-442(con\014guration)-442(\\triple")-442(name)-442(as)-442(used)-443(b)27(y)]TJ/F4 10.91 Tf 238.5 0 TD[(configure)]TJ/F1 10.91 Tf 51.55 0 TD[(.)-770(Use)-442(this)]TJ -323.17 -13.15 TD[(option)-334(to)-334(o)26(v)28(erride)-333(the)-335(default)-334(string)-334(recorded)-335(b)27(y)-333(y)26(our)-333(con\014guration's)-334(c)26(hoice)-333(of)]TJ 0 -13.15 TD[(host.)-438(This)-317(c)27(hoice)-316(do)-28(es)-317(not)-316(c)27(hange)-316(ho)27(w)-316(an)27(ything)-316(is)-317(actually)-316(con\014gured)-317(unless)-317({)]TJ 0 -13.15 TD[(build)-258(is)-259(also)-259(sp)-28(eci\014ed;)-284(it)-259(a\013ects)]TJ/F8 10.91 Tf 147.77 0 TD[(only)]TJ/F1 10.91 Tf 23.58 0 TD[(DejaGn)27(u)-258(pro)-27(cedures)-259(that)-259(compare)-259(the)-259(host)]TJ -171.35 -13.15 TD[(string)-435(with)-436(particular)-435(v)55(alues.)-750(The)-436(pro)-28(cedures)]TJ/F4 10.91 Tf 229.25 0 TD[(ishost)]TJ/F1 10.91 Tf 34.36 0 TD[(,)]TJ/F4 10.91 Tf 8.06 0 TD[(istarget)]TJ/F1 10.91 Tf 45.82 0 TD[(,)]TJ/F4 10.91 Tf 8.06 0 TD[(isnative)]TJ/F1 10.91 Tf 45.82 0 TD[(,)]TJ -371.37 -13.15 TD[(and)]TJ/F4 10.91 Tf 22.08 0 TD[(setup_xfail)]TJ/F1 10.91 Tf 67.5 0 TD[(are)-412(a\013ected)-413(b)27(y)-412(`)]TJ/F4 10.91 Tf 79.3 0 TD[(--host)]TJ/F1 10.91 Tf 34.36 0 TD[('.)-682(In)-413(this)-413(usage,)]TJ/F4 10.91 Tf 84.02 0 TD[(host)]TJ/F1 10.91 Tf 27.41 0 TD[(refers)-412(to)-413(the)]TJ -314.67 -13.15 TD[(mac)27(hine)-418(that)-420(the)-420(tests)-419(are)-420(to)-420(b)-28(e)-419(run)-420(on,)-441(whic)26(h)-418(ma)27(y)-419(not)-420(b)-28(e)-419(the)-420(same)-420(as)-419(the)]TJ/F4 10.91 Tf 0 -13.15 TD[(build)]TJ/F1 10.91 Tf 32.01 0 TD[(mac)27(hine.)-435(If)]TJ/F4 10.91 Tf 57.53 0 TD[(--build)]TJ/F1 10.91 Tf 43.46 0 TD[(is)-309(also)-309(sp)-28(eci\014ed,)-314(then)]TJ/F4 10.91 Tf 103.73 0 TD[(--host)]TJ/F1 10.91 Tf 37.73 0 TD[(refers)-309(to)-309(the)-309(mac)27(hine)]TJ -274.46 -13.15 TD[(that)-333(the)-333(tests)-333(wil,)-334(b)-28(e)-333(run)-333(on,)-334(not)-333(the)-333(mac)27(hine)-333(DejaGn)27(u)-332(is)-334(run)-333(on.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(--build)]TJ/F5 10.91 Tf 43.73 0 TD[(string)]TJ 13.87 -13.15 TD[(string)]TJ/F1 10.91 Tf 32.21 0 TD[(is)-358(a)-359(full)-359(con\014guration)-359(\\triple")-359(name)-359(as)-359(used)-359(b)27(y)]TJ/F4 10.91 Tf 230.34 0 TD[(configure)]TJ/F1 10.91 Tf 51.54 0 TD[(.)-521(This)-359(is)-359(the)]TJ -314.09 -13.15 TD[(t)27(yp)-26(e)-310(of)-309(mac)27(hine)-308(DejaGn)26(u)-308(and)-309(the)-309(to)-28(ols)-309(to)-310(b)-27(e)-310(tested)-309(are)-309(built)-309(on.)-437(F)83(or)-309(a)-309(normal)]TJ 0 -13.16 TD[(cross)-333(this)-333(is)-333(the)-334(same)-333(as)-333(the)-334(host,)-333(but)-333(for)-334(a)-333(canadian)-333(cross,)-334(they)-333(are)-333(sep)-28(erate.)]TJ/F4 10.91 Tf -57.6 -19.12 TD[(--name)]TJ/F5 10.91 Tf 38 0 TD[(name)]TJ 19.6 -13.15 TD[(name)]TJ/F1 10.91 Tf 30.68 0 TD[(is)-423(a)-423(name)-424(for)-423(the)-423(particular)-424(testing)-423(target)-424(mac)27(hine)-422(\(for)-424(cross)-423(testing\).)]TJ -30.68 -13.15 TD[(If)-350(the)-351(testing)-351(target)-351(has)-351(IP)-350(net)26(w)28(ork)-350(supp)-27(ort)-351(\(for)-351(example,)]TJ/F4 10.91 Tf 282.71 0 TD[(RPC)]TJ/F1 10.91 Tf 21.01 0 TD[(or)]TJ/F4 10.91 Tf 13.55 0 TD[(NFS)]TJ/F1 10.91 Tf 17.19 0 TD[(\),)-355(this)-350(is)]TJ -334.46 -13.16 TD[(the)-412(net)27(w)28(ork)-411(name)-413(for)-412(the)-412(target)-412(itself.)-682(\()]TJ/F5 10.91 Tf 199.72 0 TD[(name)]TJ/F1 10.91 Tf 30.56 0 TD[(is)]TJ/F8 10.91 Tf 11.83 0 TD[(not)-430(the)-430(c)50(on\014gur)51(ation)-429(string)]TJ/F1 10.91 Tf -242.11 -13.15 TD[(y)27(ou)-285(sp)-28(ecify)-286(as)-286(a)-286(target)-286(with)]TJ/F4 10.91 Tf 133.11 0 TD[(configure)]TJ/F1 10.91 Tf 51.55 0 TD[(;)-301(the)-286(`)]TJ/F4 10.91 Tf 27.62 0 TD[(--name)]TJ/F1 10.91 Tf 34.37 0 TD[(')-286(option)-286(names)-286(a)-286(particular)]TJ -246.65 -13.15 TD[(target,)-402(rather)-388(than)-389(describing)-388(a)-389(class)-389(of)-388(targets.\))-610(F)82(or)-387(targets)-389(that)-388(connect)-389(in)]TJ ET 0 g 0 G +endstream +endobj +88 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F5 31 0 R +/F8 52 0 R +>> +endobj +86 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 88 0 R +>> +endobj +91 0 obj +<< +/Length 8100 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(12)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ 57.6 -23.91 TD[(other)-273(w)26(a)28(ys,)-284(the)-274(meaning)-274(of)-274(the)]TJ/F5 10.91 Tf 147.84 0 TD[(name)]TJ/F1 10.91 Tf 29.05 0 TD[(string)-273(dep)-28(ends)-274(on)-274(the)-273(connection)-274(metho)-28(d.)]TJ -176.89 -13.15 TD[(See)-333(Section)-333(5.5)-333([Remote)-334(targets)-333(supp)-28(orted],)-333(page)-334(32.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(--name)]TJ/F5 10.91 Tf 38 0 TD[(string)]TJ/F1 10.91 Tf 19.6 -13.15 TD[(Sp)-27(ecify)-287(a)-286(net)26(w)28(ork)-285(name)-287(of)-286(testing)-287(target)-286(or)-287(its)-286(host.)-429(The)-287(particular)-286(names)-287(that)]TJ 0 -13.15 TD[(are)-271(meaningful)-271(with)-271(`)]TJ/F4 10.91 Tf 100.12 0 TD[(--name)]TJ/F1 10.91 Tf 34.36 0 TD[(')-271(will)-271(dep)-28(end)-271(on)-271(y)27(our)-271(site)-271(con\014guration,)-284(and)-271(on)-271(the)]TJ -134.48 -13.15 TD[(connection)-339(proto)-28(col:)-457(for)-340(example,)]TJ/F4 10.91 Tf 164.37 0 TD[(tip)]TJ/F1 10.91 Tf 20.89 0 TD[(connections)-339(require)-340(names)-340(from)-340(a)-339(serial)]TJ -185.26 -13.15 TD[(line)-286(con\014guration)-286(\014le)-286(\(usually)-286(called)-286(`)]TJ/F4 10.91 Tf 177.21 0 TD[(/etc/remote)]TJ/F1 10.91 Tf 63 0 TD[('\),)-295(while)]TJ/F4 10.91 Tf 41.49 0 TD[(telnet)]TJ/F1 10.91 Tf 37.49 0 TD[(connections)]TJ -319.19 -13.15 TD[(use)-333(IP)-333(hostnames.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(--objdir)]TJ/F5 10.91 Tf 49.45 0 TD[(path)]TJ/F1 10.91 Tf 8.15 -13.15 TD[(Use)]TJ/F5 10.91 Tf 22.69 0 TD[(path)]TJ/F1 10.91 Tf 27.18 0 TD[(as)-491(the)-491(top)-492(directory)-491(con)26(taining)-490(an)27(y)-491(auxiliary)-491(compiled)-492(test)-491(co)-28(de.)]TJ -49.87 -13.15 TD[(This)-332(defaults)-332(to)-332(`)]TJ/F4 10.91 Tf 82.21 0 TD[(.)]TJ/F1 10.91 Tf 5.72 0 TD[('.)-444(Use)-332(this)-332(option)-332(to)-332(lo)-28(cate)-332(pre-compiled)-332(test)-333(co)-27(de.)-444(Y)82(ou)-331(can)]TJ -87.93 -13.16 TD[(normally)-333(prepare)-333(an)27(y)-333(auxiliary)-333(\014les)-333(needed)-334(with)]TJ/F4 10.91 Tf 234.43 0 TD[(make)]TJ/F1 10.91 Tf 22.9 0 TD[(.)]TJ/F4 10.91 Tf -314.93 -19.12 TD[(--outdir)]TJ/F5 10.91 Tf 49.45 0 TD[(path)]TJ/F1 10.91 Tf 8.15 -13.15 TD[(W)83(rite)-297(output)-298(logs)-299(in)-298(directory)]TJ/F5 10.91 Tf 145.2 0 TD[(path)]TJ/F1 10.91 Tf 21.82 0 TD[(.)-432(The)-298(default)-298(is)-299(`)]TJ/F4 10.91 Tf 79.69 0 TD[(.)]TJ/F1 10.91 Tf 5.73 0 TD[(',)-305(the)-298(directory)-298(where)-298(y)27(ou)]TJ -252.44 -13.15 TD[(start)]TJ/F4 10.91 Tf 26.17 0 TD[(runtest)]TJ/F1 10.91 Tf 40.09 0 TD[(.)-450(This)-335(option)-336(a\013ects)-335(only)-335(the)-336(summary)-335(and)-336(the)-335(detailed)-335(log)-336(\014les)]TJ -66.26 -13.16 TD[(`)]TJ/F5 10.91 Tf 3.03 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.49 0 TD[(.sum)]TJ/F1 10.91 Tf 22.9 0 TD[(')-393(and)-393(`)]TJ/F5 10.91 Tf 32.22 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.49 0 TD[(.log)]TJ/F1 10.91 Tf 22.91 0 TD[('.)-624(The)-393(DejaGn)26(u)-392(debug)-393(log)-394(`)]TJ/F4 10.91 Tf 136.63 0 TD[(dbg.log)]TJ/F1 10.91 Tf 40.09 0 TD[(')-393(alw)27(a)28(ys)-393(app)-27(ears)]TJ -294.76 -13.15 TD[(\(when)-333(requested\))-333(in)-333(the)-334(lo)-28(cal)-333(directory)82(.)]TJ/F4 10.91 Tf -57.6 -19.12 TD[(--reboot)]TJ/F1 10.91 Tf 57.6 0 TD[(Reb)-27(o)-28(ot)-296(the)-295(target)-296(b)-28(oard)-296(when)]TJ/F4 10.91 Tf 146.95 0 TD[(runtest)]TJ/F1 10.91 Tf 43.31 0 TD[(initializes.)-431(Usually)82(,)-302(when)-296(running)-296(tests)]TJ -190.26 -13.16 TD[(on)-364(a)-364(separate)-364(target)-364(b)-28(oard,)-372(it)-364(is)-364(safer)-364(to)-364(reb)-28(o)-28(ot)-364(the)-364(target)-364(to)-364(b)-28(e)-364(certain)-364(of)-364(its)]TJ 0 -13.15 TD[(state.)-444(Ho)27(w)28(ev)27(er,)-332(when)-333(dev)27(eloping)-333(test)-333(scripts,)-333(reb)-28(o)-28(oting)-333(tak)26(es)-332(a)-333(lot)-334(of)-333(time.)]TJ/F4 10.91 Tf -57.6 -19.12 TD[(--srcdir)]TJ/F5 10.91 Tf 49.45 0 TD[(path)]TJ/F1 10.91 Tf 8.15 -13.15 TD[(Use)]TJ/F5 10.91 Tf 22.07 0 TD[(path)]TJ/F1 10.91 Tf 26.56 0 TD[(as)-434(the)-435(top)-434(directory)-435(for)-434(test)-435(scripts)-435(to)-434(run.)]TJ/F4 10.91 Tf 220.43 0 TD[(runtest)]TJ/F1 10.91 Tf 44.83 0 TD[(lo)-27(oks)-435(in)-434(this)]TJ -313.89 -13.16 TD[(directory)-303(for)-303(an)27(y)-303(sub)-28(directory)-303(whose)-303(name)-304(b)-28(egins)-303(with)-303(the)-304(to)-28(olname)-303(\(sp)-28(eci\014ed)]TJ 0 -13.15 TD[(with)-366(`)]TJ/F4 10.91 Tf 28.24 0 TD[(--tool)]TJ/F1 10.91 Tf 34.36 0 TD[('\).)-543(F)82(or)-366(instance,)-374(with)-367(`)]TJ/F4 10.91 Tf 110.39 0 TD[(--tool)-333(gdb)]TJ/F1 10.91 Tf 55.18 0 TD[(',)]TJ/F4 10.91 Tf 10.15 0 TD[(runtest)]TJ/F1 10.91 Tf 44.09 0 TD[(uses)-366(tests)-366(in)-367(sub)-28(di-)]TJ -282.41 -13.15 TD[(rectories)-378(`)]TJ/F4 10.91 Tf 47.28 0 TD[(gdb.*)]TJ/F1 10.91 Tf 28.63 0 TD[(')-378(\(with)-378(the)-378(usual)-378(shell-lik)26(e)-377(\014lename)-378(expansion\).)-579(If)-379(y)27(ou)-377(do)-378(not)]TJ -75.91 -13.15 TD[(use)-416(`)]TJ/F4 10.91 Tf 22.78 0 TD[(--srcdir)]TJ/F1 10.91 Tf 45.82 0 TD[(',)]TJ/F4 10.91 Tf 10.82 0 TD[(runtest)]TJ/F1 10.91 Tf 44.63 0 TD[(lo)-27(oks)-416(for)-416(test)-416(directories)-416(under)-417(the)-416(curren)27(t)-415(w)27(orking)]TJ -124.05 -13.15 TD[(directory)83(.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(--strace)]TJ/F5 10.91 Tf 49.45 0 TD[(n)]TJ/F1 10.91 Tf 8.15 -13.15 TD[(T)83(urn)-240(on)-240(in)26(ternal)-239(tracing)-241(for)]TJ/F4 10.91 Tf 131.12 0 TD[(expect)]TJ/F1 10.91 Tf 34.37 0 TD[(,)-259(to)]TJ/F5 10.91 Tf 18.18 0 TD[(n)]TJ/F1 10.91 Tf 8.68 0 TD[(lev)27(els)-239(deep.)-414(By)-240(adjusting)-241(the)-241(lev)27(el,)-258(y)27(ou)]TJ -192.35 -13.15 TD[(can)-256(con)26(trol)-255(the)-257(exten)26(t)-255(to)-257(whic)27(h)-256(y)26(our)-255(output)-257(expands)-257(m)27(ulti-lev)27(el)-255(Tcl)-257(statemen)26(ts.)]TJ 0 -13.15 TD[(This)-281(allo)27(ws)-281(y)27(ou)-281(to)-281(ignore)-282(some)-281(lev)26(els)-280(of)]TJ/F4 10.91 Tf 188.48 0 TD[(case)]TJ/F1 10.91 Tf 25.98 0 TD[(or)]TJ/F4 10.91 Tf 12.8 0 TD[(if)]TJ/F1 10.91 Tf 14.53 0 TD[(statemen)27(ts.)-426(Eac)27(h)-281(pro)-27(cedure)]TJ -241.79 -13.15 TD[(call)-333(or)-333(con)27(trol)-333(structure)-333(coun)27(ts)-333(as)-333(one)-333(\\lev)27(el".)]TJ 0 -16.14 TD[(The)-547(output)-547(is)-547(recorded)-547(in)-547(the)-547(same)-548(\014le,)-600(`)]TJ/F4 10.91 Tf 215.18 0 TD[(dbg.log)]TJ/F1 10.91 Tf 40.09 0 TD[(',)-600(used)-547(for)-547(output)-548(from)]TJ -255.27 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(--debug)]TJ/F1 10.91 Tf 40.09 0 TD[('.)]TJ/F4 10.91 Tf -100.72 -19.13 TD[(--target)]TJ/F5 10.91 Tf 49.45 0 TD[(string)]TJ/F1 10.91 Tf 8.15 -13.15 TD[(Use)-340(this)-341(option)-340(to)-341(o)27(v)28(erride)-340(the)-340(default)-341(setting)-340(\(running)-341(nativ)27(e)-340(tests\).)]TJ/F5 10.91 Tf 335.05 0 TD[(string)]TJ/F1 10.91 Tf 32.02 0 TD[(is)]TJ -367.07 -13.15 TD[(a)-316(full)-316(con\014guration)-316(\\triple")-317(name)]TJ/F6 6.97 Tf 159.02 3.96 TD[(1)]TJ/F1 10.91 Tf 7.92 -3.96 TD[(as)-316(used)-316(b)27(y)]TJ/F4 10.91 Tf 52.89 0 TD[(configure)]TJ/F1 10.91 Tf 51.55 0 TD[(.)-438(This)-317(option)-316(c)27(hanges)]TJ -271.38 -13.15 TD[(the)-469(con\014guration)]TJ/F4 10.91 Tf 87.85 0 TD[(runtest)]TJ/F1 10.91 Tf 45.21 0 TD[(uses)-469(for)-469(the)-470(default)-469(to)-28(ol)-469(names,)-504(and)-469(other)-470(setup)]TJ -133.06 -13.15 TD[(information.)-661(See)-406(section)-405(\\Using)]TJ/F4 10.91 Tf 160.04 0 TD[(configure)]TJ/F1 10.91 Tf 51.54 0 TD[(")-405(in)]TJ/F5 10.91 Tf 23.4 0 TD[(Cygn)27(us)-404(con\014gure)]TJ/F1 10.91 Tf 83.31 0 TD[(,)-423(for)-406(details)]TJ -318.29 -13.15 TD[(ab)-27(out)]TJ/F4 10.91 Tf 31.21 0 TD[(configure)]TJ/F1 10.91 Tf 55.18 0 TD[(names.)]TJ ET 18.00 -579.46 m 162.00 -579.46 l 162.00 -579.06 l 18.00 -579.06 l b BT/F6 6.97 Tf 23.02 -587.41 TD[(1)]TJ/F1 10.91 Tf 9.92 -3.96 TD[(Con\014guration)-333(triples)-333(ha)27(v)27(e)-332(the)-333(form)-334(`)]TJ/F5 10.91 Tf 175.31 0 TD[(cpu)]TJ/F4 10.91 Tf 16.97 0 TD[(-)]TJ/F5 10.91 Tf 5.72 0 TD[(v)27(endor)]TJ/F4 10.91 Tf 32.16 0 TD[(-)]TJ/F5 10.91 Tf 5.72 0 TD[(os)]TJ/F1 10.91 Tf 10.21 0 TD[('.)]TJ ET 0 g 0 G +endstream +endobj +92 0 obj +<< +/F1 9 0 R +/F5 31 0 R +/F4 28 0 R +/F6 46 0 R +>> +endobj +90 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 92 0 R +>> +endobj +96 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -958 +/Flags 68 +/FontBBox [-30 -958 1146 777] +/FontName /CMSY9 +/ItalicAngle -14 +/XHeight 431 +/StemV 80 +/FontFile 95 0 R +>> +endobj +97 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F11 +/FontDescriptor 96 0 R +/BaseFont /UJKJVH+CMSY9 +/FirstChar 0 +/LastChar 127 +/Widths [799.38 285.49 799.38 513.89 799.38 513.89 799.38 799.38 799.38 799.38 799.38 +799.38 799.38 1027.77 513.89 513.89 799.38 799.38 799.38 799.38 799.38 799.38 799.38 +799.38 799.38 799.38 799.38 799.38 1027.77 1027.77 799.38 799.38 1027.77 1027.77 +513.89 513.89 1027.77 1027.77 1027.77 799.38 1027.77 1027.77 628.08 628.08 1027.77 +1027.77 1027.77 799.38 279.32 1027.77 685.18 685.18 913.57 913.57 0 0 570.98 570.98 +685.18 513.89 742.28 742.28 799.38 799.38 628.08 821.12 673.62 542.57 793.76 542.43 +736.33 610.91 871.05 562.72 696.6 782.16 707.93 1229.16 842.08 816.32 716.77 839.34 +873.88 622.37 563.16 642.26 632.06 1017.48 732.43 685 742 685.18 685.18 685.18 685.18 +685.18 628.08 628.08 456.79 456.79 456.79 456.79 513.89 513.89 399.69 399.69 285.49 +513.89 513.89 628.08 513.89 285.49 856.48 770.67 856.48 428.24 685.18 685.18 799.38 +799.38 456.79 456.79 456.79 628.08 799.38 799.38 799.38 799.38] +>> +endobj +99 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -194.44 +/Flags 4 +/FontBBox [-267 -250 1070 968] +/FontName /CMR8 +/ItalicAngle 0 +/XHeight 431 +/StemV 80 +/FontFile 98 0 R +>> +endobj +100 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F12 +/FontDescriptor 99 0 R +/BaseFont /PLCKEA+CMR8 +/FirstChar 0 +/LastChar 127 +/Widths [663.55 885.43 826.4 736.82 708.34 795.85 767.37 826.4 767.37 826.4 767.37 +619.8 590.29 590.29 885.43 885.43 295.14 324.66 531.26 531.26 531.26 531.26 531.26 +795.85 472.23 531.26 767.37 826.4 531.26 958.69 1076.75 826.4 295.14 295.14 531.26 +885.43 531.26 885.43 826.4 295.14 413.2 413.2 531.26 826.4 295.14 354.17 295.14 531.26 +531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 295.14 295.14 +295.14 826.4 501.74 501.74 826.4 795.85 752.09 767.37 811.12 722.58 693.07 833.52 +795.85 382.64 545.49 825.36 663.55 972.93 795.85 826.4 722.58 826.4 781.61 590.29 +767.37 795.85 795.85 1090.99 795.85 795.85 649.31 295.14 531.26 295.14 531.26 295.14 +295.14 531.26 590.29 472.23 590.29 472.23 324.66 531.26 590.29 295.14 324.66 560.77 +295.14 885.43 590.29 531.26 590.29 560.77 414.07 419.1 413.2 590.29 560.77 767.37 +560.77 560.77 472.23 531.26 1062.52 531.26 531.26 531.26] +>> +endobj +101 0 obj +<< +/Length 3470 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(3:)-444(Using)]TJ/F4 10.91 Tf 86.45 0 TD[(runtest)]TJ/F1 10.91 Tf 334.64 0 TD[(13)]TJ/F4 10.91 Tf -421.09 -23.91 TD[(--verbose)]TJ 0 -13.15 TD[(-v)]TJ/F1 10.91 Tf 57.6 0 TD[(T)83(urns)-367(on)-367(more)-367(output.)-547(Rep)-27(eating)-368(this)-367(option)-368(increases)-367(the)-367(amoun)27(t)-367(of)-367(output)]TJ 0 -13.15 TD[(displa)27(y)28(ed.)-726(Lev)27(el)-427(one)-428(\(`)]TJ/F4 10.91 Tf 112.93 0 TD[(-v)]TJ/F1 10.91 Tf 11.46 0 TD[('\))-427(is)-428(simply)-427(test)-428(output.)-727(Lev)26(el)-426(t)27(w)27(o)-426(\(`)]TJ/F4 10.91 Tf 183.83 0 TD[(-v)-333(-v)]TJ/F1 10.91 Tf 26.55 0 TD[('\))-427(sho)27(ws)]TJ -334.77 -13.15 TD[(messages)-497(on)-498(options,)-539(con\014guration,)-538(and)-498(pro)-28(cess)-497(con)26(trol.)-936(V)82(erb)-27(ose)-497(messages)]TJ 0 -13.16 TD[(app)-27(ear)-342(in)-342(the)-342(detailed)-342(\(`)]TJ/F4 10.91 Tf 116.47 0 TD[(*.log)]TJ/F1 10.91 Tf 28.63 0 TD[('\))-341(log)-342(\014le,)-345(but)-342(not)-342(in)-341(the)-342(summary)-342(\(`)]TJ/F4 10.91 Tf 175.72 0 TD[(*.sum)]TJ/F1 10.91 Tf 28.64 0 TD[('\))-341(log)]TJ -349.46 -13.15 TD[(\014le.)]TJ/F4 10.91 Tf -57.6 -19.12 TD[(--version)]TJ 0 -13.15 TD[(-V)]TJ/F1 10.91 Tf 57.6 0 TD[(Prin)27(ts)-296(out)-296(the)-297(v)26(ersion)-295(n)26(um)28(b)-27(ers)-296(of)-297(DejaGn)26(u,)]TJ/F4 10.91 Tf 210.67 0 TD[(expect)]TJ/F1 10.91 Tf 37.61 0 TD[(and)-296(Tcl,)-305(and)-296(exits)-297(without)]TJ -248.28 -13.16 TD[(running)-333(an)27(y)-332(tests.)]TJ/F4 10.91 Tf -57.6 -19.12 TD[(-D0)]TJ 0 -13.15 TD[(-D1)]TJ/F1 10.91 Tf 57.6 0 TD[(Start)-281(the)-282(in)26(ternal)-281(Tcl)-282(debugger.)-427(The)-282(Tcl)-282(debugger)-282(supp)-28(orts)-282(breakp)-28(oin)27(ts,)-291(single)]TJ 0 -13.16 TD[(stepping,)-470(and)-443(other)-443(common)-443(debugging)-442(activities.)-774(\(See)]TJ/F5 10.91 Tf 277.57 0 TD[(A)-442(Debugger)-443(for)-443(Tcl)]TJ -277.57 -13.15 TD[(Applications)]TJ/F1 10.91 Tf 63.84 0 TD[(b)27(y)-332(Don)-333(Lib)-28(es.)]TJ/F6 6.97 Tf 67.03 3.96 TD[(2)]TJ/F1 10.91 Tf 4.47 -3.96 TD[(\))]TJ -135.34 -16.14 TD[(If)-303(y)27(ou)-303(sp)-27(ecify)-304(`)]TJ/F4 10.91 Tf 69.69 0 TD[(-D1)]TJ/F1 10.91 Tf 17.18 0 TD[(',)-309(the)]TJ/F4 10.91 Tf 27.9 0 TD[(expect)]TJ/F1 10.91 Tf 37.67 0 TD[(shell)-303(stops)-303(at)-304(a)-303(breakp)-28(oin)27(t)-303(as)-303(so)-28(on)-304(as)-303(DejaGn)27(u)]TJ -152.44 -13.15 TD[(in)27(v)28(ok)28(es)-332(it.)]TJ 0 -16.14 TD[(If)-369(y)26(ou)-369(sp)-27(ecify)-370(`)]TJ/F4 10.91 Tf 71.86 0 TD[(-D0)]TJ/F1 10.91 Tf 17.19 0 TD[(',)-379(DejaGn)27(u)-369(starts)-370(as)-369(usual,)-379(but)-370(y)26(ou)-368(can)-370(en)26(ter)-368(the)-370(debugger)]TJ -89.05 -13.15 TD[(b)27(y)-332(sending)-333(an)-334(in)27(terrupt)-332(\(e.g.)-445(b)27(y)-332(t)27(yping)]TJ/F11 8.97 Tf 190.73 0.4 TD[(h)]TJ ET 269.23 -231.58 m 281.94 -231.58 l 281.94 -231.18 l 269.23 -231.18 l b BT/F12 7.97 Tf 269.23 -238.31 TD[(C-c)]TJ ET 269.23 -240.15 m 281.94 -240.15 l 281.94 -239.75 l 269.23 -239.75 l b BT/F11 8.97 Tf 281.43 -237.91 TD[(i)]TJ/F1 10.91 Tf 3.58 -0.4 TD[(\).)]TJ ET 18.00 -611.91 m 162.00 -611.91 l 162.00 -611.51 l 18.00 -611.51 l b BT/F6 6.97 Tf 23.02 -619.85 TD[(2)]TJ/F1 10.91 Tf 9.92 -3.96 TD[(Distributed)-333(in)-333(P)27(ostScript)-333(form)-333(with)]TJ/F4 10.91 Tf 174.76 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(as)-333(the)-333(\014le)]TJ -212.76 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(expect/tcl-debug.ps)]TJ/F1 10.91 Tf 108.82 0 TD[('.)]TJ ET 0 g 0 G +endstream +endobj +102 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F5 31 0 R +/F6 46 0 R +/F11 97 0 R +/F12 100 0 R +>> +endobj +94 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 102 0 R +>> +endobj +105 0 obj +<< +/Length 117 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(14)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ ET 0 g 0 G +endstream +endobj +106 0 obj +<< +/F1 9 0 R +>> +endobj +104 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 106 0 R +>> +endobj +109 0 obj +<< +/Length 8271 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(4:)-444(Setting)]TJ/F4 10.91 Tf 93.36 0 TD[(runtest)]TJ/F1 10.91 Tf 43.73 0 TD[(defaults)-22611(15)]TJ/F2 17.22 Tf -137.09 -25.91 TD[(4)-562(Setting)]TJ/F10 17.22 Tf 86.31 0 TD[(runtest)]TJ/F2 17.22 Tf 68.46 0 TD[(defaults)]TJ/F1 10.91 Tf -139.83 -28.09 TD[(The)-513(site)-514(con\014guration)-514(\014le,)-558(`)]TJ/F4 10.91 Tf 140.58 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(',)-558(captures)-514(con\014guration-dep)-28(enden)27(t)-513(v)55(alues)-513(and)]TJ -201.34 -13.15 TD[(propagates)-386(them)-387(to)-387(the)-387(DejaGn)27(u)-386(test)-386(en)27(vironmen)27(t)-385(using)-387(Tcl)-387(v)55(ariables.)-604(This)-387(ties)-387(the)-386(De-)]TJ 0 -13.15 TD[(jaGn)27(u)-332(test)-333(scripts)-334(in)27(to)-332(the)]TJ/F4 10.91 Tf 129.68 0 TD[(configure)]TJ/F1 10.91 Tf 55.18 0 TD[(and)]TJ/F4 10.91 Tf 21.22 0 TD[(make)]TJ/F1 10.91 Tf 26.54 0 TD[(programs.)]TJ -217.68 -16.14 TD[(DejaGn)27(u)-332(supp)-28(orts)-334(more)-333(than)-334(one)-334(`)]TJ/F4 10.91 Tf 166.49 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(')-333(\014le.)-445(The)-334(m)27(ultiple)-333(instances)-334(of)-333(`)]TJ/F4 10.91 Tf 155.9 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(')]TJ -428.97 -13.15 TD[(are)-326(loaded)-326(in)-326(a)-326(\014xed)-326(order)-326(built)-326(in)27(to)-326(DejaGn)27(u)-325(\(the)-326(more)-326(lo)-28(cal)-326(last\).)-442(The)-326(\014rst)-326(\014le)-326(loaded)-326(is)]TJ 0 -13.15 TD[(the)-333(optional)]TJ/F4 10.91 Tf 61.21 0 TD[(~/.dejagnurc)]TJ/F1 10.91 Tf 68.73 0 TD[(,)-333(then)-333(the)-333(lo)-28(cal)-334(\014les,)-333(and)-333(\014nally)-334(the)-333(global)-333(\014le.)]TJ -124.03 -16.14 TD[(1.)-660(There)-256(is)-256(am)-257(optional)-256(\\master")-257(`)]TJ/F4 10.91 Tf 164.41 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(',)-271(capturing)-257(con\014guration)-256(v)54(alues)-255(that)-257(apply)-256(to)]TJ -194.54 -13.15 TD[(DejaGn)27(u)-342(across)-342(the)-343(b)-28(oard,)-345(in)-343(eac)27(h)-342(con\014guration-sp)-28(eci\014c)-343(sub)-28(directory)-343(of)-342(the)-343(DejaGn)26(u)]TJ 0 -13.15 TD[(library)-364(directory)83(.)]TJ/F4 10.91 Tf 86.62 0 TD[(runtest)]TJ/F1 10.91 Tf 44.06 0 TD[(loads)-364(these)-364(v)55(alues)-363(\014rst.)-537(See)-364(App)-28(endix)-364(A)-364([Con\014guring)-364(and)]TJ -130.68 -13.15 TD[(Installing)-390(DejaGn)27(u],)-404(page)-391(49.)-617(The)-390(master)-391(`)]TJ/F4 10.91 Tf 211 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(')-390(con)27(tains)-390(the)-391(default)-391(v)55(alues)-390(for)]TJ -256.82 -13.15 TD[(all)-386(targets)-386(and)-387(hosts)-386(supp)-28(orted)-386(b)26(y)-385(DejaGn)27(u.)-603(This)-386(master)-387(\014le)-386(is)-387(iden)27(ti\014ed)-385(b)26(y)-385(setting)]TJ 0 -13.15 TD[(the)-298(en)27(vironmen)27(t)-297(v)54(ariable)]TJ/F4 10.91 Tf 121.35 0 TD[(DEJAGNU)]TJ/F1 10.91 Tf 43.35 0 TD[(to)-298(the)-299(name)-298(of)-299(the)-298(\014le.)-433(This)-299(is)-298(also)-299(refered)-299(to)-298(as)-299(the)]TJ -164.7 -13.16 TD[(\\global")-333(con\014g)-333(\014le.)]TJ -15.69 -16.14 TD[(2.)-660(An)27(y)-334(directory)-336(con)27(taining)-334(a)-336(con\014gured)-335(test)-336(suite)-335(also)-335(has)-336(a)-335(`)]TJ/F4 10.91 Tf 301.4 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(',)-335(capturing)-336(con-)]TJ -331.53 -13.15 TD[(\014guration)-325(v)55(alues)-324(sp)-28(eci\014c)-326(to)-325(the)-325(to)-28(ol)-325(under)-325(test.)-442(Since)]TJ/F4 10.91 Tf 258.6 0 TD[(runtest)]TJ/F1 10.91 Tf 43.64 0 TD[(loads)-325(these)-325(v)55(alues)-325(last,)]TJ -302.24 -13.15 TD[(the)-435(individual)-435(test)-436(con\014guration)-435(can)-436(either)-435(rely)-436(on)-435(and)-436(use,)-461(or)-435(o)27(v)27(erride,)-460(an)27(y)-434(of)-436(the)]TJ 0 -13.15 TD[(global)-333(v)55(alues)-333(from)-333(the)-333(\\master")-334(`)]TJ/F4 10.91 Tf 158.97 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[('.)]TJ -204.79 -16.14 TD[(Y)83(ou)-261(can)-261(usually)-261(generate)-262(or)-261(up)-28(date)-261(the)-262(testsuite)-261(`)]TJ/F4 10.91 Tf 232.76 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.81 0 TD[(')-261(b)27(y)-261(t)27(yping)-260(`)]TJ/F4 10.91 Tf 56.44 0 TD[(make)-333(site.exp)]TJ/F1 10.91 Tf 72.36 0 TD[(')]TJ -407.37 -13.15 TD[(in)-333(the)-333(test)-333(suite)-334(directory)83(,)-333(after)-333(the)-333(test)-334(suite)-333(is)-333(con\014gured.)]TJ -15.69 -16.14 TD[(3.)-660(Y)83(ou)-371(can)-373(also)-372(ha)27(v)28(e)-372(a)-372(\014le)-372(in)-372(y)26(our)-371(home)-372(directory)-372(called)]TJ/F4 10.91 Tf 280.51 0 TD[(.dejagnurc)]TJ/F1 10.91 Tf 57.28 0 TD[(.)-561(This)-372(gets)-372(loaded)]TJ -322.1 -13.15 TD[(\014rst)-410(b)-28(efore)-410(the)-410(other)-410(con\014g)-411(\014les.)-675(Usually)-410(this)-411(is)-410(used)-410(for)-410(p)-28(ersonal)-411(stu\013,)-429(lik)27(e)-410(setting)]TJ/F4 10.91 Tf 0 -13.15 TD[(all_flag)]TJ/F1 10.91 Tf 49.45 0 TD[(so)-333(all)-333(the)-333(output)-334(gets)-333(prin)27(ted,)-333(or)-333(v)27(erb)-27(osit)27(y)-333(lev)27(els.)]TJ -56.11 -19.13 TD[(Y)83(ou)-318(can)-318(further)-318(o)27(v)27(erride)-317(the)-318(default)-319(v)55(alues)-317(in)-319(a)-318(user-editable)-319(section)-318(of)-318(an)27(y)-318(`)]TJ/F4 10.91 Tf 365.18 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(',)]TJ -425.94 -13.15 TD[(or)-333(b)27(y)-332(setting)-334(v)55(ariables)-332(on)-334(the)]TJ/F4 10.91 Tf 143.52 0 TD[(runtest)]TJ/F1 10.91 Tf 43.72 0 TD[(command)-333(line.)]TJ/F2 13.09 Tf -187.24 -26.9 TD[(4.0.1)-562(Con\014g)-375(V)93(ariables)]TJ/F1 10.91 Tf 14.94 -23.11 TD[(DejaGn)27(u)-380(uses)-381(a)-381(named)-381(arra)27(y)-380(in)-381(Tcl)-381(to)-381(hold)-381(all)-381(the)-381(info)-381(for)-382(eac)27(h)-380(mac)27(hine.)-587(In)-381(the)-381(case)]TJ -14.94 -13.15 TD[(of)-324(a)-324(canadian)-325(cross,)-326(this)-325(means)-324(host)-324(information)-325(as)-324(w)26(ell)-323(as)-324(target)-325(information.)-441(The)-325(named)]TJ 0 -13.15 TD[(arra)27(y)-405(is)-407(called)]TJ/F4 10.91 Tf 72.82 0 TD[(target_info)]TJ/F1 10.91 Tf 63 0 TD[(,)-424(and)-407(it)-407(has)-406(t)27(w)27(o)-405(indices.)-665(The)-406(follo)27(wing)-406(\014elds)-407(are)-406(part)-407(of)-406(the)]TJ -135.82 -13.15 TD[(arra)27(y)84(.)]TJ/F4 10.91 Tf 0 -19.13 TD[(name)]TJ/F1 10.91 Tf 57.6 0 TD[(The)-395(name)-396(of)-395(the)-396(target.)-631(\(mostly)-396(for)-395(error)-396(messages\))-395(This)-396(should)-396(also)-395(b)-28(e)-396(the)]TJ 0 -13.15 TD[(string)-273(used)-273(for)-273(this)-274(target's)-273(arra)27(y)83(.)-423(It)-274(should)-273(also)-273(b)-28(e)-273(the)-274(same)-273(as)-273(the)-273(link)26(er)-272(script)]TJ 0 -13.15 TD[(so)-411(w)26(e)-410(can)-412(\014nd)-412(them)-412(dynamically)82(.)-679(This)-412(should)-412(b)-27(e)-412(the)-412(same)-412(as)-412(the)-412(argumen)27(t)]TJ 0 -13.15 TD[(used)-333(for)]TJ/F4 10.91 Tf 41.61 0 TD[(push_target{})]TJ/F1 10.91 Tf 74.45 0 TD[(.)]TJ/F4 10.91 Tf -173.66 -19.13 TD[(ldflags)]TJ/F1 10.91 Tf 57.6 0 TD[(This)-509(is)-510(the)-510(link)27(er)-509(\015ags)-510(required)-509(to)-510(pro)-28(duce)-510(a)-509(fully)-510(link)27(ed)-509(executable.)-974(F)83(or)]TJ/F4 10.91 Tf 0 -13.15 TD[(libgloss)]TJ/F1 10.91 Tf 49.45 0 TD[(supp)-27(orted)-334(targets)-333(this)-333(is)-334(usually)-333(just)-333(the)-334(name)-333(of)-333(the)-334(link)27(er)-332(script.)]TJ/F4 10.91 Tf -107.05 -19.13 TD[(config)]TJ/F1 10.91 Tf 57.6 0 TD[(The)-414(target)-415(canonical)-415(for)-415(this)-415(target.)-690(This)-415(is)-415(used)-415(b)27(y)-414(some)-415(init)-415(\014les)-415(to)-415(mak)27(e)]TJ 0 -13.15 TD[(sure)-333(the)-333(target)-333(is)-334(supp)-28(orted.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(cflags)]TJ/F1 10.91 Tf 57.6 0 TD[(The)-333(\015ags)-333(required)-333(to)-334(pro)-28(duce)-333(an)-333(ob)-56(ject)-333(\014le)-333(from)-334(a)-333(source)-333(\014le.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(connect)]TJ/F1 10.91 Tf 57.6 0 TD[(This)-337(is)-338(the)-337(connectmo)-28(de)-337(for)-338(this)-337(target.)-458(This)-337(is)-338(for)-337(b)-28(oth)-337(IP)-338(and)-337(serial)-338(connec-)]TJ 0 -13.15 TD[(tions.)-444(T)27(ypically)-332(this)-334(is)-333(either)]TJ/F4 10.91 Tf 142.33 0 TD[(telnet)]TJ/F1 10.91 Tf 34.37 0 TD[(,)]TJ/F4 10.91 Tf 6.66 0 TD[(rlogin)]TJ/F1 10.91 Tf 34.37 0 TD[(,)-333(or)]TJ/F4 10.91 Tf 20.03 0 TD[(rsh)]TJ/F1 10.91 Tf 17.18 0 TD[(.)]TJ ET 0 g 0 G +endstream +endobj +110 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F2 12 0 R +/F10 78 0 R +>> +endobj +108 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 110 0 R +>> +endobj +113 0 obj +<< +/Length 6054 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(16)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F4 10.91 Tf 0 -23.91 TD[(target)]TJ/F1 10.91 Tf 57.6 0 TD[(This)-310(is)-310(the)-310(hostname)-311(of)-310(the)-310(target.)-437(This)-310(is)-310(for)-311(TCP/IP)-310(based)-310(connections,)-315(and)]TJ 0 -13.15 TD[(is)-333(also)-333(used)-333(for)-334(v)27(ersion)-332(of)-334(tip)-333(that)-333(use)-334(/etc/remote.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(serial)]TJ/F1 10.91 Tf 57.6 0 TD[(This)-333(is)-333(the)-333(serial)-334(p)-28(ort.)-444(This)-333(is)-334(t)27(ypically)-332(/dev/tt)27(y?)-444(or)-333(com?:.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(netport)]TJ/F1 10.91 Tf 57.6 0 TD[(This)-334(is)-334(the)-334(IP)-334(p)-28(ort.)-446(This)-334(is)-334(commonly)-334(used)-334(for)-334(telneting)-334(to)-335(target)-334(b)-27(oards)-334(that)]TJ 0 -13.15 TD[(are)-309(connected)-310(to)-310(a)-310(terminal)-310(serv)27(er.)-435(In)-310(that)-310(case)-310(the)-310(IP)-310(p)-27(ort)-310(sp)-28(eci\014es)-310(the)-310(whic)27(h)]TJ 0 -13.15 TD[(serial)-333(p)-28(ort)-333(to)-333(use.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(baud)]TJ/F1 10.91 Tf 57.6 0 TD[(This)-333(is)-333(the)-333(baud)-334(rate)-333(for)-333(a)-334(serial)-333(p)-28(ort)-333(connection.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(x10)]TJ/F1 10.91 Tf 57.6 0 TD[(This)-340(is)-340(the)-340(parameters)-340(for)-341(an)-340(x10)-340(con)27(troller.)-464(These)-341(are)-340(simple)-340(devices)-340(that)-340(let)]TJ 0 -13.15 TD[(us)-333(p)-28(o)27(w)28(er)-332(cycle)-334(or)-333(reset)-333(a)-334(target)-333(b)-28(oard)-333(remotely)82(.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(fileid)]TJ/F1 10.91 Tf 57.6 0 TD[(This)-333(is)-333(the)-333(\014leid)-334(or)-333(spa)27(wn)-333(id)-333(of)-333(of)-334(the)-333(connection.)]TJ/F4 10.91 Tf -57.6 -19.12 TD[(prompt)]TJ/F1 10.91 Tf 57.6 0 TD[(a)-333(glob)-333(st)27(yle)-333(pattern)-333(to)-333(recognize)-334(the)-333(prompt.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(abbrev)]TJ/F1 10.91 Tf 57.6 0 TD[(abbreviation)-333(for)-333(to)-28(ol)-333(init)-334(\014les.)]TJ/F4 10.91 Tf -57.6 -19.13 TD[(ioport)]TJ/F1 10.91 Tf 57.6 0 TD[(This)-350(is)-350(the)-350(p)-28(ort)-350(for)-351(I/O)-350(on)-350(dual)-351(p)-27(ort)-351(systems.)-495(In)-350(this)-351(con\014guration,)-354(the)-350(main)]TJ 0 -13.15 TD[(serial)-351(p)-28(ort)]TJ/F4 10.91 Tf 52.95 0 TD[(0)]TJ/F1 10.91 Tf 9.57 0 TD[(is)-351(usually)-352(used)-352(for)-352(stdin)-352(and)-352(stdout,)-356(whic)26(h)-350(the)-352(second)-352(serial)-352(p)-28(ort)]TJ -62.52 -13.15 TD[(can)-333(b)-28(e)-333(used)-333(for)-334(debugging.)]TJ -42.66 -19.13 TD[(The)-302(\014rst)-303(index)-302(in)27(to)-302(the)-302(arra)26(y)-301(is)-303(the)-302(same)-303(v)55(alue)-302(as)-302(used)-303(in)-302(the)]TJ/F4 10.91 Tf 294.18 0 TD[(name)]TJ/F1 10.91 Tf 26.21 0 TD[(\014eld.)-434(This)-302(is)-303(usually)]TJ -335.33 -13.15 TD[(a)-359(short)-360(v)27(ersion)-359(of)-360(the)-359(name)-360(of)-360(the)-360(target)-359(b)-28(oard.)-524(F)83(or)-359(an)-360(example,)-366(here's)-360(the)-360(settings)-360(I)-359(use)]TJ 0 -13.15 TD[(for)-347(m)26(y)]TJ/F4 10.91 Tf 35.19 0 TD[(Motorola's)-347(IDP)]TJ/F1 10.91 Tf 82.05 0 TD[(b)-27(oard)-348(and)-348(m)27(y)]TJ/F4 10.91 Tf 71.11 0 TD[(Motorola)]TJ/F1 10.91 Tf 49.61 0 TD[(6U)-347(VME)]TJ/F4 10.91 Tf 46.83 0 TD[(MVME135-1)]TJ/F1 10.91 Tf 55.34 0 TD[(b)-27(oard.)-488(\(b)-28(oth)-348(m68k)]TJ -340.13 -13.15 TD[(targets\))]TJ/F9 9.96 Tf 0 -10.05 TD[(\013)]TJ ET 23.98 -310.52 m 450.40 -310.52 l 450.40 -310.12 l 23.98 -310.12 l b BT 456.38 -310.52 TD[(\010)]TJ ET 18.00 -570.92 m 18.40 -570.92 l 18.40 -316.25 l 18.00 -316.25 l b BT/F4 10.91 Tf 21.39 -328.9 TD[(#)-524(IDP)-525(board)]TJ 0 -12.45 TD[(set)-524(target_info\(idp,name\))-3675("idp")]TJ 0 -12.45 TD[(set)-524(target_info\(idp,ldflags\))-2100("-Tidp.ld")]TJ 0 -12.46 TD[(set)-524(target_info\(idp,config\))-2625(m68k-unknown-aout)]TJ 0 -12.45 TD[(set)-524(target_info\(idp,cflags\))-2625("")]TJ 0 -12.45 TD[(set)-524(target_info\(idp,connect\))-2100(telnet)]TJ 0 -12.46 TD[(set)-524(target_info\(idp,target\))-2625("s7")]TJ 0 -12.45 TD[(set)-524(target_info\(idp,serial\))-2625("tstty7")]TJ 0 -12.45 TD[(set)-524(target_info\(idp,netport\))-2100("wharfrat:1007")]TJ 0 -12.46 TD[(set)-524(target_info\(idp,baud\))-3675("9600")]TJ 0 -12.45 TD[(#)-524(MVME)-525(135)-525(board)]TJ 0 -12.45 TD[(set)-524(target_info\(idp,name\))-3675("mvme")]TJ 0 -12.46 TD[(set)-524(target_info\(idp,ldflags\))-2100("-Tmvme.ld")]TJ 0 -12.45 TD[(set)-524(target_info\(idp,config\))-2625(m68k-unknown-aout)]TJ 0 -12.45 TD[(set)-524(target_info\(idp,cflags\))-2625("")]TJ 0 -12.46 TD[(set)-524(target_info\(idp,connect\))-2100(telnet)]TJ 0 -12.45 TD[(set)-524(target_info\(idp,target\))-2625("s8")]TJ 0 -12.45 TD[(set)-524(target_info\(idp,serial\))-2625("tstty8")]TJ 0 -12.46 TD[(set)-524(target_info\(idp,netport\))-2100("wharfrat:1008")]TJ 0 -12.45 TD[(set)-524(target_info\(idp,baud\))-3675("9600")]TJ ET 456.38 -570.92 m 456.77 -570.92 l 456.77 -316.25 l 456.38 -316.25 l b BT/F9 9.96 Tf 18 -577.15 TD[(\012)]TJ ET 23.98 -577.15 m 450.40 -577.15 l 450.40 -576.75 l 23.98 -576.75 l b BT 456.38 -577.15 TD[(\011)]TJ/F1 10.91 Tf -423.44 -17.39 TD[(DejaGn)27(u)-403(can)-404(use)-405(this)-404(information)-404(to)-405(switc)27(h)-403(b)-28(et)27(w)27(een)-403(m)27(ultiple)-403(targets)-405(in)-404(one)-405(test)-404(run.)]TJ -14.94 -13.15 TD[(This)-333(is)-333(done)-333(through)-334(the)-333(use)-333(of)-334(the)]TJ/F4 10.91 Tf 172.03 0 TD[(push_target)]TJ/F1 10.91 Tf 66.64 0 TD[(pro)-27(cedure,)-334(whic)27(h)-332(is)-334(discussed)-333(elsewhere.)]TJ -223.73 -16.14 TD[(This)-409(arra)27(y)-408(can)-409(also)-409(hold)-409(information)-409(for)-409(a)-409(remote)-409(host,)-428(whic)26(h)-408(is)-409(used)-409(when)-409(testing)-409(a)]TJ -14.94 -13.15 TD[(candain)-397(cross.)-639(In)-398(this)-398(case,)-414(the)-398(only)-398(thing)-398(di\013eren)27(t)-397(is)-398(the)-398(index)-397(is)-398(just)]TJ/F4 10.91 Tf 350.12 0 TD[(host)]TJ/F1 10.91 Tf 22.91 0 TD[(.)-638(Here's)-398(the)]TJ ET 0 g 0 G +endstream +endobj +114 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F9 59 0 R +>> +endobj +112 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 114 0 R +>> +endobj +117 0 obj +<< +/Length 7261 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(4:)-444(Setting)]TJ/F4 10.91 Tf 93.36 0 TD[(runtest)]TJ/F1 10.91 Tf 43.73 0 TD[(defaults)-22611(17)]TJ -137.09 -23.91 TD[(settings)-348(I)-348(use)-349(to)-348(run)-348(tests)-349(on)-348(m)27(y)-348(NT)-348(mac)27(hine)-347(while)-349(running)-348(DejaGn)27(u)-348(on)-348(a)-348(Unix)-349(mac)27(hine.)]TJ 0 -13.15 TD[(\(in)-333(this)-333(case)-333(a)-334(Lin)27(ux)-332(b)-28(o)27(x\))]TJ/F9 9.96 Tf 0 -10.05 TD[(\013)]TJ ET 23.98 -33.16 m 450.40 -33.16 l 450.40 -32.76 l 23.98 -32.76 l b BT 456.38 -33.16 TD[(\010)]TJ ET 18.00 -95.22 m 18.40 -95.22 l 18.40 -38.89 l 18.00 -38.89 l b BT/F4 10.91 Tf 21.39 -52.44 TD[(set)-524(target_info\(host,name\))-3150("nt-host")]TJ 0 -12.46 TD[(set)-524(target_info\(host,config\))-2100("386-unknown-winnt")]TJ 0 -12.45 TD[(set)-524(target_info\(host,connect\))-1575("telnet")]TJ 0 -12.45 TD[(set)-524(target_info\(host,target\))-2100("ripple")]TJ ET 456.38 -95.22 m 456.77 -95.22 l 456.77 -38.89 l 456.38 -38.89 l b BT/F9 9.96 Tf 18 -101.44 TD[(\012)]TJ ET 23.98 -101.44 m 450.40 -101.44 l 450.40 -101.05 l 23.98 -101.05 l b BT 456.38 -101.44 TD[(\011)]TJ/F1 10.91 Tf -423.44 -17.39 TD[(There)-347(is)-347(more)-348(info)-347(on)-347(ho)27(w)-347(to)-347(use)-347(these)-348(v)55(ariables)-347(in)-347(the)-347(sections)-348(on)-347(the)-347(con\014g)-348(\014les.)-486(See)]TJ -14.94 -13.15 TD[(Chapter)-333(4)-333([Con\014guration)-333(Files],)-334(page)-333(18.)]TJ 14.94 -16.14 TD[(In)-419(the)-419(user)-420(editable)-419(second)-420(section)-419(of)-420(`)]TJ/F4 10.91 Tf 190.43 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(',)-440(y)26(ou)-418(can)-420(not)-419(only)-420(o)27(v)28(erride)-418(the)-420(con-)]TJ -251.19 -13.15 TD[(\014guration)-358(v)55(ariables)-358(captured)-358(in)-359(the)-358(\014rst)-359(section,)-365(but)-358(also)-359(sp)-27(ecify)-359(default)-358(v)54(alues)-357(for)-359(all)-358(the)]TJ/F4 10.91 Tf 0 -13.15 TD[(runtest)]TJ/F1 10.91 Tf 43.78 0 TD[(command)-337(line)-338(options.)-458(Sa)27(v)28(e)-337(for)-338(`)]TJ/F4 10.91 Tf 158 0 TD[(--debug)]TJ/F1 10.91 Tf 40.09 0 TD[(',)-338(`)]TJ/F4 10.91 Tf 12.79 0 TD[(--help)]TJ/F1 10.91 Tf 34.36 0 TD[(',)-338(and)-338(`)]TJ/F4 10.91 Tf 34.05 0 TD[(--version)]TJ/F1 10.91 Tf 51.55 0 TD[(',)-338(eac)26(h)-336(com-)]TJ -374.62 -13.16 TD[(mand)-395(line)-395(option)-395(has)-395(an)-395(asso)-28(ciated)-395(Tcl)-395(v)55(ariable.)-629(Use)-395(the)-395(Tcl)]TJ/F4 10.91 Tf 303.88 0 TD[(set)]TJ/F1 10.91 Tf 21.49 0 TD[(command)-395(to)-395(sp)-27(ecify)-396(a)]TJ -325.37 -13.15 TD[(new)-427(default)-427(v)54(alue)-426(\(as)-427(for)-428(the)-427(con\014guration)-428(v)55(ariables\).)-726(The)-427(follo)27(wing)-427(table)-427(describ)-28(es)-427(the)]TJ 0 -13.15 TD[(corresp)-27(ondence)-445(b)-28(et)27(w)27(een)-444(command)-445(line)-445(options)-446(and)-445(v)55(ariables)-444(y)26(ou)-444(can)-445(set)-445(in)-445(`)]TJ/F4 10.91 Tf 380.12 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[('.)]TJ -425.94 -13.15 TD[(See)-333(Chapter)-333(3)-333([Running)-334(the)-333(T)82(ests],)-332(page)-333(9,)-334(for)-333(explanations)-333(of)-334(the)-333(command-line)-333(options.)]TJ/F8 10.91 Tf 23.96 -16.97 TD[(runtest)-2049(Tcl)]TJ 3.48 -13.15 TD[(option)-2049(variable)-4342(description)]TJ ET 18.00 -261.39 m 450.00 -261.39 l 450.00 -260.99 l 18.00 -260.99 l b BT/F4 10.91 Tf 40.91 -274.54 TD[(--all)-2574(all)]TJ ET 115.50 -274.54 m 118.94 -274.54 l 118.94 -274.07 l 115.50 -274.07 l b BT 118.94 -274.54 TD[(flag)]TJ/F1 10.91 Tf 63 0 TD[(displa)27(y)-332(all)-333(test)-334(results)-333(if)-333(set)]TJ/F4 10.91 Tf -146.76 -13.15 TD[(--baud)-2574(baud)]TJ/F1 10.91 Tf 146.76 0 TD[(set)-333(the)-333(default)-333(baud)-334(rate)-333(to)-333(something)]TJ 0 -13.15 TD[(other)-333(than)-333(9600.)]TJ/F4 10.91 Tf -163.94 -12.51 TD[(--connect)-2574(connectmode)]TJ/F1 10.91 Tf 163.94 0 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(rlogin)]TJ/F1 10.91 Tf 34.36 0 TD[(',)-333(`)]TJ/F4 10.91 Tf 12.73 0 TD[(telnet)]TJ/F1 10.91 Tf 34.36 0 TD[(',)-333(`)]TJ/F4 10.91 Tf 12.73 0 TD[(rsh)]TJ/F1 10.91 Tf 17.18 0 TD[(',)-333(`)]TJ/F4 10.91 Tf 12.73 0 TD[(kermit)]TJ/F1 10.91 Tf 34.36 0 TD[(',)-333(`)]TJ/F4 10.91 Tf 12.73 0 TD[(tip)]TJ/F1 10.91 Tf 17.18 0 TD[(',)]TJ -191.39 -13.15 TD[(or)-333(`)]TJ/F4 10.91 Tf 16.39 0 TD[(mondfe)]TJ/F1 10.91 Tf 34.37 0 TD[(')]TJ/F4 10.91 Tf -197.52 -14.24 TD[(--mail)-2574(mailing)]TJ ET 138.41 -340.74 m 141.85 -340.74 l 141.85 -340.27 l 138.41 -340.27 l b BT 141.85 -340.74 TD[(list)]TJ/F1 10.91 Tf 40.09 0 TD[(address)-333(list)-333(for)-333(mailing)-334(test)-333(output)]TJ/F4 10.91 Tf -146.76 -13.15 TD[(--name)-2574(targetname)]TJ/F1 10.91 Tf 146.76 0 TD[(net)27(w)28(ork)-332(name)-334(of)-333(testing)-333(target)-333(or)-334(its)]TJ 0 -13.15 TD[(host)]TJ/F4 10.91 Tf -158.21 -14.25 TD[(--outdir)-2574(outdir)]TJ/F1 10.91 Tf 158.21 0 TD[(directory)-333(for)-333(`)]TJ/F5 10.91 Tf 66.15 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.49 0 TD[(.sum)]TJ/F1 10.91 Tf 22.9 0 TD[(')-333(and)-333(`)]TJ/F5 10.91 Tf 30.91 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.49 0 TD[(.log)]TJ/F1 10.91 Tf 22.91 0 TD[(')]TJ/F4 10.91 Tf -338.06 -13.15 TD[(--objdir)-2574(objdir)]TJ/F1 10.91 Tf 158.21 0 TD[(directory)-333(for)-333(compiled)-333(binaries)]TJ/F4 10.91 Tf -158.21 -13.15 TD[(--reboot)-2574(reboot)]TJ/F1 10.91 Tf 158.21 0 TD[(reb)-27(o)-28(ot)-333(the)-334(target)-333(if)-333(set)-334(to)]TJ/F4 10.91 Tf 125.88 0 TD[("1")]TJ/F1 10.91 Tf 17.18 0 TD[(;)-333(do)-333(not)]TJ -143.06 -13.15 TD[(reb)-27(o)-28(ot)-333(if)-334(set)-333(to)]TJ/F4 10.91 Tf 74.94 0 TD[("0")]TJ/F1 10.91 Tf 20.82 0 TD[(\(the)-333(default\))]TJ/F4 10.91 Tf -253.97 -14.25 TD[(--srcdir)-2574(srcdir)]TJ/F1 10.91 Tf 158.21 0 TD[(directory)-333(of)-333(test)-333(sub)-28(directories)]TJ/F4 10.91 Tf -158.21 -13.15 TD[(--strace)-2574(tracelevel)]TJ/F1 10.91 Tf 158.21 0 TD[(a)-333(n)27(um)28(b)-27(er:)-500(Tcl)-333(trace)-334(depth)]TJ/F4 10.91 Tf -146.76 -13.15 TD[(--tool)-2574(tool)]TJ/F1 10.91 Tf 146.76 0 TD[(name)-333(of)-333(to)-28(ol)-333(to)-333(test;)-334(iden)27(ti\014es)-332(init,)-334(test)]TJ 0 -13.15 TD[(sub)-27(dir)]TJ/F4 10.91 Tf -163.94 -12.51 TD[(--verbose)-2574(verbose)]TJ/F1 10.91 Tf 163.94 0 TD[(v)27(erb)-26(osit)26(y)-332(lev)27(el.)-499(As)-334(option,)-333(use)-333(m)27(ultiple)]TJ 0 -13.15 TD[(times;)-333(as)-333(v)54(ariable,)-332(set)-333(a)-333(n)26(um)28(b)-27(er,)-333(0)-333(or)]TJ 0 -13.15 TD[(greater)]TJ/F4 10.91 Tf -158.21 -12.51 TD[(--target)-2574(target)]TJ ET 132.69 -525.76 m 136.12 -525.76 l 136.12 -525.29 l 132.69 -525.29 l b BT 136.12 -525.76 TD[(triplet)]TJ/F1 10.91 Tf 45.82 0 TD[(The)-333(canonical)-333(con\014guration)-333(string)-334(for)]TJ 0 -13.15 TD[(the)-333(target.)]TJ/F4 10.91 Tf -146.76 -12.5 TD[(--host)-2574(host)]TJ ET 121.23 -551.41 m 124.67 -551.41 l 124.67 -550.95 l 121.23 -550.95 l b BT 124.67 -551.41 TD[(triplet)]TJ/F1 10.91 Tf 57.27 0 TD[(The)-333(canonical)-333(con\014guration)-333(string)-334(for)]TJ 0 -13.16 TD[(the)-333(host.)]TJ/F4 10.91 Tf -152.49 -12.5 TD[(--build)-2574(build)]TJ ET 126.96 -577.07 m 130.40 -577.07 l 130.40 -576.60 l 126.96 -576.60 l b BT 130.4 -577.07 TD[(triplet)]TJ/F1 10.91 Tf 51.54 0 TD[(The)-333(canonical)-333(con\014guration)-333(string)-334(for)]TJ 0 -13.15 TD[(the)-333(build)-333(host.)]TJ ET 0 g 0 G +endstream +endobj +118 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F9 59 0 R +/F8 52 0 R +/F5 31 0 R +>> +endobj +116 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 118 0 R +>> +endobj +121 0 obj +<< +/Length 5295 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(18)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F2 13.09 Tf 0 -23.91 TD[(4.0.2)-562(Master)-375(Con\014g)-375(File)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(The)-322(master)-323(con\014g)-322(\014le)-323(is)-322(where)-323(all)-322(the)-323(target)-322(sp)-28(eci\014c)-323(con\014g)-322(v)54(ariables)-321(get)-323(set)-322(for)-323(a)-322(whole)]TJ -14.94 -13.15 TD[(site)-427(get)-427(set.)-726(The)-427(idea)-427(is)-427(that)-428(for)-427(a)-427(cen)27(tralized)-426(testing)-428(lab)-427(where)-427(p)-28(eople)-427(ha)27(v)28(e)-427(to)-427(share)-427(a)]TJ 0 -13.15 TD[(target)-321(b)-27(et)26(w)28(een)-320(m)27(ultiple)-320(dev)27(elop)-27(ers.)-441(There)-321(are)-321(settings)-321(for)-321(b)-28(oth)-321(remote)-321(targets)-321(and)-321(remote)]TJ 0 -13.15 TD[(hosts.)-562(Here's)-373(an)-373(example)-373(of)-372(a)-373(Master)-373(Con\014g)-373(File)-372(\(also)-373(called)-373(the)-373(Global)-372(con\014g)-373(\014le\))-373(for)-373(a)]TJ/F8 10.91 Tf 0 -13.15 TD[(c)51(anadian)-333(cr)50(oss)]TJ/F1 10.91 Tf 69.57 0 TD[(.)-435(A)-307(canadian)-308(cross)-307(is)-307(when)-307(y)27(ou)-307(build)-307(and)-307(test)-307(a)-307(cross)-307(compiler)-308(on)-307(a)-307(mac)27(hine)]TJ -69.57 -13.15 TD[(other)-333(than)-333(the)-333(one)-334(it's)-333(to)-333(b)-28(e)-334(hosted)-333(on.)]TJ 14.94 -16.14 TD[(Here)-314(w)27(e)-313(ha)26(v)28(e)-313(the)-314(con\014g)-315(settings)-314(for)-314(our)-315(California)-314(o\016ce.)-438(Note)-314(that)-315(all)-314(con\014g)-314(v)54(alues)-313(are)]TJ -14.94 -13.15 TD[(site)-398(dep)-27(endan)26(t.)-638(Here)-398(w)27(e)-397(ha)26(v)28(e)-397(t)27(w)28(o)-398(sets)-398(of)-398(v)54(alues)-397(that)-398(w)27(e)-397(use)-399(for)-398(testing)-398(m68k-aout)-398(cross)]TJ 0 -13.15 TD[(compilers.)-628(As)-395(b)-28(oth)-394(of)-395(these)-395(target)-394(b)-28(oards)-395(has)-394(a)-395(di\013eren)27(t)-394(debugging)-395(proto)-28(col,)-410(w)27(e)-394(test)-394(on)]TJ 0 -13.15 TD[(b)-27(oth)-334(of)-333(them)-333(in)-334(sequence.)]TJ/F9 9.96 Tf 0 -9.44 TD[(\013)]TJ ET 23.98 -163.86 m 450.40 -163.86 l 450.40 -163.47 l 23.98 -163.47 l b BT 456.38 -163.86 TD[(\010)]TJ ET 18.00 -559.73 m 18.40 -559.73 l 18.40 -169.59 l 18.00 -169.59 l b BT/F4 10.91 Tf 21.39 -182.24 TD[(global)-524(CFLAGS)]TJ 0 -12.45 TD[(global)-524(CXXFLAGS)]TJ 0 -24.91 TD[(case)-524("$target_triplet")-525(in)-525({)]TJ 22.91 -12.45 TD[({)-524("native")-525(})-525({)]TJ 22.9 -12.45 TD[(set)-524(target_abbrev)-525(unix)]TJ -22.9 -12.46 TD[(})]TJ 0 -12.45 TD[({)-524("m68*-unknown-aout")-525(})-525({)]TJ 22.9 -12.45 TD[(set)-524(target_abbrev)-7875("rom68k")]TJ 0 -12.46 TD[(#)-524(IDP)-525(target)-10500(#)-525(IDP)-525(board)-525(with)-525(rom68k)-525(monitor)]TJ 0 -12.45 TD[(set)-524(target_info\(idp,name\))-3675("idp")]TJ 0 -12.45 TD[(set)-524(target_info\(idp,ldflags\))-2100("-Tidp.ld")]TJ 0 -12.46 TD[(set)-524(target_info\(idp,config\))-2625(m68k-unknown-aout)]TJ 0 -12.45 TD[(set)-524(target_info\(idp,cflags\))-2625("")]TJ 0 -12.45 TD[(set)-524(target_info\(idp,connect\))-2100(telnet)]TJ 0 -12.46 TD[(set)-524(target_info\(idp,target\))-2625("s7")]TJ 0 -12.45 TD[(set)-524(target_info\(idp,serial\))-2625("tstty12")]TJ 0 -12.45 TD[(set)-524(target_info\(idp,netport\))-2100("truckin:1007")]TJ 0 -12.46 TD[(set)-524(target_info\(idp,baud\))-3675("9600")]TJ 0 -12.45 TD[(#)-524(MVME)-525(target)-9975(#)-525(Motorola)-525(MVME)-525(135)-525(with)-525(BUG)-525(monitor)]TJ 0 -12.45 TD[(set)-524(target_info\(mvme,name\))-3150("mvme")]TJ 0 -12.46 TD[(set)-524(target_info\(mvme,ldflags\))-1575("-Tmvme.ld")]TJ 0 -12.45 TD[(set)-524(target_info\(mvme,config\))-2100(m68k-unknown-aout)]TJ 0 -12.45 TD[(set)-524(target_info\(mvme,cflags\))-2100("")]TJ 0 -12.46 TD[(set)-524(target_info\(mvme,connect\))-1575(telnet)]TJ 0 -12.45 TD[(set)-524(target_info\(mvme,target\))-2100("s4")]TJ 0 -12.45 TD[(set)-524(target_info\(mvme,serial\))-2100("tstty8")]TJ 0 -12.46 TD[(set)-524(target_info\(mvme,netport\))-1575("truckin:1004")]TJ 0 -12.45 TD[(set)-524(target_info\(mvme,baud\))-3150("9600")]TJ -17.18 -12.45 TD[(})]TJ -28.63 -12.46 TD[(})]TJ ET 456.38 -559.73 m 456.77 -559.73 l 456.77 -169.59 l 456.38 -169.59 l b BT/F9 9.96 Tf 18 -565.96 TD[(\012)]TJ ET 23.98 -565.96 m 450.40 -565.96 l 450.40 -565.56 l 23.98 -565.56 l b BT 456.38 -565.96 TD[(\011)]TJ/F1 10.91 Tf -423.44 -17.39 TD[(In)-310(this)-311(case,)-316(w)27(e)-310(ha)27(v)28(e)-310(supp)-28(ort)-311(for)-311(sev)27(eral)-310(remote)-311(hosts)-311(for)-311(our)-311(m68k-aout)-311(cross)-311(compiler.)]TJ -14.94 -13.15 TD[(T)27(ypically)-341(the)-343(remote)-342(Unix)-343(hosts)-343(run)-342(DejaGn)27(u)-342(lo)-28(cally)82(,)-343(but)-343(w)27(e)-342(also)-342(use)-343(them)-343(for)-342(debugging)]TJ 0 -13.15 TD[(the)-291(testsuites)-292(when)-291(w)26(e)-290(\014nd)-292(problems)-292(in)-291(running)-292(on)-292(remote)-291(hosts.)-431(Exp)-28(ect)-291(w)26(on't)-290(run)-292(on)-292(NT,)]TJ 0 -13.15 TD[(so)-327(DejaGn)27(u)-326(is)-327(run)-327(on)-328(the)-327(lo)-28(cal)-327(build)-327(mac)27(hine,)-327(and)-328(it'll)-327(connect)-327(to)-327(the)-327(NT)-327(host)-328(and)-327(run)-327(all)]TJ 0 -13.15 TD[(the)-333(tests)-333(for)-333(this)-334(cross)-333(compiler)-333(on)-334(that)-333(host.)]TJ ET 0 g 0 G +endstream +endobj +122 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F8 52 0 R +/F9 59 0 R +/F4 28 0 R +>> +endobj +120 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 122 0 R +>> +endobj +125 0 obj +<< +/Length 5912 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(4:)-444(Setting)]TJ/F4 10.91 Tf 93.36 0 TD[(runtest)]TJ/F1 10.91 Tf 43.73 0 TD[(defaults)-22611(19)]TJ/F9 9.96 Tf -108.29 -20.18 TD[(\013)]TJ ET 52.78 -6.23 m 450.40 -6.23 l 450.40 -5.83 l 52.78 -5.83 l b BT 456.38 -6.23 TD[(\010)]TJ ET 46.80 -367.53 m 47.20 -367.53 l 47.20 -11.96 l 46.80 -11.96 l b BT/F4 10.91 Tf 50.19 -27.4 TD[(case)-524("$host_triplet")-525(in)-525({)]TJ 22.91 -12.45 TD[("native")-524({)]TJ 0 -12.45 TD[(})]TJ 0 -12.46 TD[("i?86-*-linux*")-524({)-9975(#)-525(Linux)-525(host)]TJ 22.9 -12.45 TD[(set)-524(target_info\(host,name\))-3150("linux-host")]TJ 0 -12.45 TD[(set)-524(target_info\(host,config\))-2100($host_triplet)]TJ 0 -12.46 TD[(set)-524(target_info\(host,connect\))-1575(rlogin)]TJ 0 -12.45 TD[(set)-524(target_info\(host,target\))-2100(chinadoll)]TJ -22.9 -12.45 TD[(})]TJ 0 -12.46 TD[("i?86-*-winnt)-12074(#)-525(NT)-525(host)]TJ 22.9 -12.45 TD[(set)-524(target_info\(host,name\))-3150("nt-host")]TJ 0 -12.45 TD[(set)-524(target_info\(host,config\))-2100(i386-unknown-winnt)]TJ 0 -12.46 TD[(set)-524(target_info\(host,connect\))-1575(telnet)]TJ 0 -12.45 TD[(set)-524(target_info\(host,target\))-2100(ripple)]TJ -22.9 -12.45 TD[(})]TJ 0 -12.46 TD[("hppa*-hp-hpux*")-524({)-9450(#)-525(HP-UX)-525(host)]TJ 22.9 -12.45 TD[(set)-524(target_info\(host,name\))-3150("hpux-host")]TJ 0 -12.45 TD[(set)-524(target_info\(host,config\))-2100($host_triplet)]TJ 0 -12.46 TD[(set)-524(target_info\(host,connect\))-1575(rlogin)]TJ 0 -12.45 TD[(set)-524(target_info\(host,target\))-2100(slipknot)]TJ 0 -12.45 TD[(})]TJ -22.9 -12.46 TD[("sparc-sun-sunos*")-524({)-8400(#)-525(SunOS)-525(\(sun4\))]TJ 22.9 -12.45 TD[(set)-524(target_info\(host,name\))-3150("sunos-host")]TJ 0 -12.45 TD[(set)-524(target_info\(host,config\))-2100($host_triplet)]TJ 0 -12.46 TD[(set)-524(target_info\(host,connect\))-1575(rlogin)]TJ 0 -12.45 TD[(set)-524(target_info\(host,target\))-2100(darkstar)]TJ -22.9 -12.45 TD[(})]TJ -22.91 -12.46 TD[(})]TJ ET 456.38 -367.53 m 456.77 -367.53 l 456.77 -11.96 l 456.38 -11.96 l b BT/F9 9.96 Tf 46.8 -373.76 TD[(\012)]TJ ET 52.78 -373.76 m 450.40 -373.76 l 450.40 -373.36 l 52.78 -373.36 l b BT 456.38 -373.76 TD[(\011)]TJ/F2 13.09 Tf -438.38 -26.9 TD[(4.0.3)-562(Lo)-31(cal)-375(Con\014g)-375(File)]TJ/F1 10.91 Tf 14.94 -23.11 TD[(It)-369(is)-370(usually)-369(more)-370(con)27(v)28(enien)27(t)-368(to)-370(k)27(eep)-369(these)-369(\\man)26(ual)-368(o)27(v)27(errides")-368(in)-370(the)-370(`)]TJ/F4 10.91 Tf 342.06 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(')-369(lo)-28(cal)]TJ -402.82 -13.15 TD[(to)-333(eac)27(h)-332(test)-334(directory)83(,)-333(rather)-333(than)-333(in)-334(the)-333(\\master")-333(`)]TJ/F4 10.91 Tf 247.24 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(')-333(in)-333(the)-333(DejaGn)26(u)-332(library)82(.)]TJ -278.12 -16.14 TD[(All)-411(lo)-28(cal)-411(`)]TJ/F4 10.91 Tf 48.37 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(')-411(usually)-411(\014les)-411(ha)26(v)28(e)-410(t)27(w)27(o)-410(sections,)-431(separated)-411(b)27(y)-410(commen)26(t)-410(text.)-678(The)]TJ -109.13 -13.15 TD[(\014rst)-263(section)-264(is)-264(the)-264(part)-264(that)-264(is)-264(generated)-264(b)27(y)]TJ/F4 10.91 Tf 205.04 0 TD[(make)]TJ/F1 10.91 Tf 22.91 0 TD[(.)-421(It)-264(is)-264(essen)27(tially)-263(a)-264(collection)-264(of)-264(Tcl)-264(v)55(ariable)]TJ -227.95 -13.15 TD[(de\014nitions)-360(based)-361(on)-361(`)]TJ/F4 10.91 Tf 102.23 0 TD[(Makefile)]TJ/F1 10.91 Tf 45.82 0 TD[(')-360(en)27(vironmen)27(t)-359(v)54(ariables.)-525(Since)-361(they)-361(are)-360(generated)-361(b)27(y)]TJ/F4 10.91 Tf 258.01 0 TD[(make)]TJ/F1 10.91 Tf 22.91 0 TD[(,)]TJ -428.97 -13.16 TD[(they)-298(con)27(tain)-297(the)-298(v)54(alues)-297(as)-298(sp)-28(eci\014ed)-298(b)27(y)]TJ/F4 10.91 Tf 184.16 0 TD[(configure)]TJ/F1 10.91 Tf 51.55 0 TD[(.)-432(\(Y)82(ou)-297(can)-298(also)-298(customize)-298(these)-299(v)55(alues)-297(b)27(y)]TJ -235.71 -13.15 TD[(using)-263(the)-263(`)]TJ/F4 10.91 Tf 48.83 0 TD[(--site)]TJ/F1 10.91 Tf 34.37 0 TD[(')-263(option)-263(to)]TJ/F4 10.91 Tf 51.64 0 TD[(configure)]TJ/F1 10.91 Tf 51.55 0 TD[(.\))-421(In)-263(particular,)-277(this)-263(section)-264(con)27(tains)-262(the)-263(`)]TJ/F4 10.91 Tf 196.76 0 TD[(Makefile)]TJ/F1 10.91 Tf 45.82 0 TD[(')]TJ -428.97 -13.15 TD[(v)55(ariables)-389(for)-390(host)-389(and)-390(target)-390(con\014guration)-390(data.)-614(Do)-390(not)-390(edit)-389(this)-390(\014rst)-390(section;)-418(if)-390(y)27(ou)-389(do,)]TJ 0 -13.15 TD[(y)27(our)-332(c)27(hanges)-333(are)-333(replaced)-333(next)-334(time)-333(y)27(ou)-332(run)]TJ/F4 10.91 Tf 216.55 0 TD[(make)]TJ/F1 10.91 Tf 22.9 0 TD[(.)]TJ -224.51 -16.14 TD[(The)-333(\014rst)-333(section)-333(starts)-334(with:)]TJ/F9 9.96 Tf -14.94 -7.32 TD[(\013)]TJ ET 23.98 -555.43 m 450.40 -555.43 l 450.40 -555.03 l 23.98 -555.03 l b BT 456.38 -555.43 TD[(\010)]TJ ET 18.00 -601.70 m 18.40 -601.70 l 18.40 -561.16 l 18.00 -561.16 l b BT/F4 10.91 Tf 21.39 -573.8 TD[(##)-524(these)-525(variables)-525(are)-525(automatically)-525(generated)-525(by)-525(make)-525(##)]TJ 0 -12.46 TD[(#)-524(Do)-525(not)-525(edit)-525(here.)-525(If)-525(you)-525(wish)-525(to)-525(override)-525(these)-525(values)]TJ 0 -12.45 TD[(#)-524(add)-525(them)-525(to)-525(the)-525(last)-525(section)]TJ ET 456.38 -601.70 m 456.77 -601.70 l 456.77 -561.16 l 456.38 -561.16 l b BT/F9 9.96 Tf 18 -607.92 TD[(\012)]TJ ET 23.98 -607.92 m 450.40 -607.92 l 450.40 -607.53 l 23.98 -607.53 l b BT 456.38 -607.92 TD[(\011)]TJ/F1 10.91 Tf -423.44 -18 TD[(In)-263(the)-263(second)-263(section,)-277(y)26(ou)-262(can)-263(o)27(v)28(erride)-263(an)27(y)-262(default)-263(v)54(alues)-262(\(lo)-28(cally)-263(to)-263(DejaGn)27(u\))-262(for)-264(all)-263(the)]TJ -14.94 -13.15 TD[(v)55(ariables.)-441(The)-327(second)-326(section)-327(can)-326(also)-327(con)27(tain)-326(y)27(our)-326(preferred)-326(defaults)-327(for)-326(all)-327(the)-326(command)]TJ ET 0 g 0 G +endstream +endobj +126 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F9 59 0 R +/F2 12 0 R +>> +endobj +124 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 126 0 R +>> +endobj +129 0 obj +<< +/Length 5100 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(20)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ 0 -23.91 TD[(line)-347(options)-347(to)]TJ/F4 10.91 Tf 72.63 0 TD[(runtest)]TJ/F1 10.91 Tf 40.09 0 TD[(.)-485(This)-347(allo)27(ws)-346(y)26(ou)-346(to)-347(easily)-347(customize)]TJ/F4 10.91 Tf 180.98 0 TD[(runtest)]TJ/F1 10.91 Tf 43.88 0 TD[(for)-347(y)27(our)-346(preferences)]TJ -337.58 -13.15 TD[(in)-466(eac)26(h)-465(con\014gured)-467(test-suite)-467(tree,)-500(so)-467(that)-467(y)27(ou)-466(need)-467(not)-467(t)27(yp)-27(e)-467(options)-467(rep)-27(eatedly)-467(on)-467(the)]TJ 0 -13.15 TD[(command)-340(line.)-465(\(The)-341(second)-340(section)-340(ma)27(y)-340(also)-340(b)-28(e)-340(empt)27(y)83(,)-341(if)-341(y)27(ou)-339(do)-340(not)-341(wish)-340(to)-340(o)26(v)28(erride)-339(an)27(y)]TJ 0 -13.15 TD[(defaults.\))]TJ 14.94 -16.14 TD[(The)-333(\014rst)-333(section)-333(ends)-334(with)-333(this)-333(line:)]TJ/F9 9.96 Tf -14.94 -7.33 TD[(\013)]TJ ET 23.98 -72.88 m 450.40 -72.88 l 450.40 -72.48 l 23.98 -72.48 l b BT 456.38 -72.88 TD[(\010)]TJ ET 18.00 -96.66 m 18.40 -96.66 l 18.40 -78.61 l 18.00 -78.61 l b BT/F4 10.91 Tf 21.39 -91.25 TD[(##)-524(All)-525(variables)-525(above)-525(are)-525(generated)-525(by)-525(configure.)-525(Do)-525(Not)-525(Edit)-525(##)]TJ ET 456.38 -96.66 m 456.77 -96.66 l 456.77 -78.61 l 456.38 -78.61 l b BT/F9 9.96 Tf 18 -102.89 TD[(\012)]TJ ET 23.98 -102.89 m 450.40 -102.89 l 450.40 -102.49 l 23.98 -102.49 l b BT 456.38 -102.89 TD[(\011)]TJ/F1 10.91 Tf -423.44 -17.39 TD[(Y)83(ou)-335(can)-335(mak)27(e)-334(an)26(y)-334(c)27(hanges)-335(under)-335(this)-335(line.)-451(If)-335(y)27(ou)-335(wish)-335(to)-335(rede\014ne)-336(a)-335(v)54(ariable)-334(in)-335(the)-336(top)]TJ -14.94 -13.15 TD[(section,)-382(then)-373(just)-373(put)-373(a)-373(duplicate)-373(v)54(alue)-372(in)-373(this)-373(second)-373(section.)-563(Usually)-373(the)-373(v)54(alues)-372(de\014ned)]TJ 0 -13.15 TD[(in)-338(this)-338(con\014g)-338(\014le)-338(are)-338(related)-338(to)-338(the)-338(con\014guration)-338(of)-338(the)-338(test)-338(run.)-459(This)-338(is)-338(the)-338(ideal)-338(place)-338(to)]TJ 0 -13.15 TD[(set)-334(the)-335(v)55(ariables)]TJ/F4 10.91 Tf 81.1 0 TD[(host_triplet)]TJ/F1 10.91 Tf 68.73 0 TD[(,)]TJ/F4 10.91 Tf 6.68 0 TD[(build_triplet)]TJ/F1 10.91 Tf 74.45 0 TD[(,)]TJ/F4 10.91 Tf 6.69 0 TD[(target_triplet)]TJ/F1 10.91 Tf 80.18 0 TD[(.)-448(All)-334(other)-335(v)55(ariables)-334(are)]TJ -317.83 -13.15 TD[(to)-27(ol)-356(dep)-28(endan)27(t.)-511(ie)-355(for)-356(testing)-356(a)-355(compiler,)-362(the)-355(v)54(alue)-354(for)]TJ/F5 10.91 Tf 266.78 0 TD[(CC)]TJ/F1 10.91 Tf 20.57 0 TD[(migh)27(t)-354(b)-28(e)-356(set)-356(to)-355(a)-356(freshly)-356(built)]TJ -287.35 -13.15 TD[(binary)83(,)-332(as)-334(opp)-28(osed)-333(to)-333(one)-334(in)-333(the)-333(user's)-334(path.)]TJ/F2 13.09 Tf 0 -26.9 TD[(4.0.4)-562(P)30(ersonal)-374(Con\014g)-375(File)]TJ/F1 10.91 Tf 14.94 -23.11 TD[(The)-494(p)-28(ersonal)-495(con\014g)-495(\014le)-495(is)-495(used)-495(to)-494(customize)]TJ/F4 10.91 Tf 228.62 0 TD[(runtest's)]TJ/F1 10.91 Tf 56.94 0 TD[(b)-27(eha)27(viour)-494(for)-495(eac)27(h)-494(p)-28(erson.)]TJ -300.5 -13.15 TD[(It's)-362(t)27(ypically)-361(used)-362(to)-362(set)-363(the)-362(user)-362(prefered)-362(setting)-362(for)-363(v)27(erb)-27(osit)27(y)84(,)-369(and)-362(an)27(y)-361(exp)-28(erimen)27(tal)-362(Tcl)]TJ 0 -13.16 TD[(pro)-27(cedures.)-445(My)-333(p)-28(ersonal)-333(`)]TJ/F4 10.91 Tf 125.06 0 TD[(~/.dejagnurc)]TJ/F1 10.91 Tf 68.73 0 TD[(')-333(\014le)-333(lo)-28(oks)-333(lik)27(e:)]TJ/F9 9.96 Tf -193.79 -9.74 TD[(\013)]TJ ET 23.98 -272.09 m 450.40 -272.09 l 450.40 -271.69 l 23.98 -271.69 l b BT 456.38 -272.09 TD[(\010)]TJ ET 18.00 -319.27 m 18.40 -319.27 l 18.40 -277.82 l 18.00 -277.82 l b BT/F4 10.91 Tf 21.39 -290.46 TD[(set)-524(all_flag)-525(1)]TJ 0 -12.46 TD[(set)-524(RLOGIN)-525(/usr/ucb/rlogin)]TJ 0 -12.45 TD[(set)-524(RSH)-525(/usr/ucb/rsh)]TJ ET 456.38 -319.27 m 456.77 -319.27 l 456.77 -277.82 l 456.38 -277.82 l b BT/F9 9.96 Tf 18 -325.5 TD[(\012)]TJ ET 23.98 -325.50 m 450.40 -325.50 l 450.40 -325.10 l 23.98 -325.10 l b BT 456.38 -325.5 TD[(\011)]TJ/F1 10.91 Tf -423.44 -17.38 TD[(Here)-299(I)-300(set)]TJ/F4 10.91 Tf 49.29 0 TD[(all_flag)]TJ/F1 10.91 Tf 49.09 0 TD[(so)-299(I)-300(see)-299(all)-300(the)-299(test)-300(cases)-299(that)-300(P)83(ASS)-299(along)-299(with)-300(the)-299(ones)-300(that)-299(F)110(AIL.)]TJ -113.32 -13.16 TD[(I)-398(also)-398(set)]TJ/F5 10.91 Tf 48.61 0 TD[(RLOGIN)]TJ/F1 10.91 Tf 49.54 0 TD[(and)]TJ/F4 10.91 Tf 21.92 0 TD[(RSH)]TJ/F1 10.91 Tf 21.53 0 TD[(to)-398(the)-398(BSD)-398(v)27(ersion.)-639(I)-398(ha)27(v)28(e)]TJ/F4 10.91 Tf 137.57 0 TD[(kerberos)]TJ/F1 10.91 Tf 50.16 0 TD[(installed,)-414(and)-398(when)-399(I)]TJ -329.33 -13.15 TD[(rlogin)-285(to)-286(a)-286(target)-286(b)-28(oard,)-295(it)-286(usually)-285(isn't)-286(supp)-28(orted.)-429(So)-285(I)-286(use)-286(the)-286(non)-286(secure)-286(v)27(ersions)-285(of)-285(these)]TJ 0 -13.15 TD[(programs)-333(rather)-333(than)-333(the)-334(default)-333(that's)-333(in)-334(m)27(y)-332(path.)]TJ ET 0 g 0 G +endstream +endobj +130 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F9 59 0 R +/F5 31 0 R +/F2 12 0 R +>> +endobj +128 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 130 0 R +>> +endobj +133 0 obj +<< +/Length 8099 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(5:)-444(The)-334(DejaGn)27(u)-332(Implemen)27(tation)-20326(21)]TJ/F2 17.22 Tf 0 -25.91 TD[(5)-562(The)-375(DejaGn)30(u)-374(Implemen)31(tation)]TJ/F1 10.91 Tf 14.94 -28.09 TD[(DejaGn)27(u)-322(is)-324(en)27(tirely)-323(written)-323(in)]TJ/F4 10.91 Tf 146.79 0 TD[(expect)]TJ/F1 10.91 Tf 34.36 0 TD[(,)-325(whic)27(h)-323(uses)-323(Tcl)-324(as)-324(a)-323(command)-324(language.)]TJ/F4 10.91 Tf 201.55 0 TD[(expect)]TJ/F1 10.91 Tf -397.64 -13.15 TD[(serv)27(es)-276(as)-277(a)-277(v)27(ery)-276(programmable)-278(shell;)-295(y)26(ou)-276(can)-277(run)-277(an)27(y)-276(program,)-289(as)-277(with)-277(the)-277(usual)-277(Unix)-277(com-)]TJ 0 -13.15 TD[(mand)-338(shells|but)-339(once)-338(the)-339(program)-338(is)-339(started,)-340(y)27(our)]TJ/F4 10.91 Tf 250.53 0 TD[(expect)]TJ/F1 10.91 Tf 38.06 0 TD[(script)-338(has)-339(fully)-338(programmable)]TJ -288.59 -13.15 TD[(con)27(trol)-254(of)-254(its)-255(input)-255(and)-255(output.)-418(This)-255(do)-28(es)-254(not)-255(just)-255(apply)-255(to)-255(the)-255(programs)-254(under)-255(test;)]TJ/F4 10.91 Tf 397.64 0 TD[(expect)]TJ/F1 10.91 Tf -397.64 -13.15 TD[(can)-307(also)-308(run)-308(an)27(y)-307(auxiliary)-307(program,)-313(suc)27(h)-307(as)]TJ/F4 10.91 Tf 210.55 0 TD[(diff)]TJ/F1 10.91 Tf 26.27 0 TD[(or)]TJ/F4 10.91 Tf 13.08 0 TD[(sh)]TJ/F1 10.91 Tf 11.45 0 TD[(,)-312(with)-308(full)-308(con)27(trol)-307(o)27(v)28(er)-307(its)-308(input)-307(and)]TJ -261.35 -13.15 TD[(output.)]TJ 14.94 -16.14 TD[(DejaGn)27(u)-435(itself)-437(is)-437(merely)-436(a)-437(framew)27(ork)-436(for)-436(the)-437(set)-436(of)-437(test)-437(suites)-436(distributed)-437(separately)]TJ -14.94 -13.15 TD[(for)-427(eac)27(h)]TJ/F7 10.91 Tf 43.3 0 TD[(gnu)]TJ/F1 10.91 Tf 25.04 0 TD[(to)-27(ol.)-728(F)82(uture)-426(releases)-428(of)]TJ/F7 10.91 Tf 119.85 0 TD[(gnu)]TJ/F1 10.91 Tf 25.04 0 TD[(to)-27(ols)-428(will)-428(include)-427(ev)26(en)-426(more)-428(tests,)-451(dev)26(elop)-26(ed)]TJ -213.23 -13.15 TD[(throughout)-333(the)-333(free)-333(soft)26(w)28(are)-332(comm)27(unit)27(y)84(.)]TJ/F4 10.91 Tf 14.94 -16.14 TD[(runtest)]TJ/F1 10.91 Tf 43.85 0 TD[(is)-344(the)-345(glue)-344(to)-345(tie)-344(together)-345(and)-345(manage)-344(the)-345(test)-344(scripts.)-479(The)]TJ/F4 10.91 Tf 289.3 0 TD[(runtest)]TJ/F1 10.91 Tf 43.85 0 TD[(program)]TJ -391.94 -13.15 TD[(is)-403(actually)-403(a)-403(simple)-404(Bourne)-403(shell)-403(script)-404(that)-403(lo)-28(cates)-403(a)-403(cop)27(y)-403(of)-403(the)]TJ/F4 10.91 Tf 324.38 0 TD[(expect)]TJ/F1 10.91 Tf 38.76 0 TD[(shell)-403(and)-403(then)]TJ -363.14 -13.15 TD[(starts)-333(the)-333(main)-333(Tcl)-334(co)-28(de,)]TJ/F4 10.91 Tf 124.09 0 TD[(runtest.exp)]TJ/F1 10.91 Tf 63 0 TD[(.)]TJ/F4 10.91 Tf 7.88 0 TD[(runtest.exp)]TJ/F1 10.91 Tf 66.64 0 TD[(itself)-333(has)-333(these)-333(essen)26(tial)-332(functions:)]TJ -255.7 -16.14 TD[(1.)-660(P)27(arse)-221(the)-223(command)-223(line)-223(options,)-244(load)-223(the)-223(library)-223(\014les,)-244(and)-223(load)-223(the)-222(default)-223(con\014guration)]TJ 15.69 -13.16 TD[(\014les.)]TJ -15.69 -16.13 TD[(2.)-660(Lo)-27(cating)-450(the)-450(individual)-450(test)-450(scripts.)]TJ/F4 10.91 Tf 200.12 0 TD[(runtest.exp)]TJ/F1 10.91 Tf 67.91 0 TD[(lo)-27(cates)-450(the)-450(tests)-450(b)26(y)-449(exploiting)-450(a)]TJ -252.34 -13.16 TD[(straigh)27(tforw)28(ard)-367(naming)-368(con)27(v)28(en)27(tion)-367(based)-368(on)-367(the)-368(string)-368(y)26(ou)-367(sp)-27(ecify)-368(with)-368(the)-368(`)]TJ/F4 10.91 Tf 373.01 0 TD[(--tool)]TJ/F1 10.91 Tf 34.36 0 TD[(')]TJ -407.37 -13.15 TD[(option.)]TJ -15.69 -16.14 TD[(3.)-660(Pro)27(viding)-290(an)-290(extended)-291(test)-291(en)27(vironmen)27(t,)-298(b)27(y)-290(de\014ning)-291(additional)-291(Tcl)-291(pro)-27(cedures)-291(b)-28(ey)27(ond)]TJ 15.69 -13.15 TD[(those)-333(already)-333(in)]TJ/F4 10.91 Tf 79.79 0 TD[(expect)]TJ/F1 10.91 Tf 34.36 0 TD[(.)]TJ -129.84 -16.14 TD[(4.)-660(Lo)-27(cating)-264(target-dep)-28(enden)27(t)-263(functions,)-277(to)-264(standardize)-264(the)-263(test)-264(en)27(vironmen)28(t)-263(across)-264(a)-263(wide)]TJ 15.69 -13.15 TD[(v)55(ariet)28(y)-332(of)-334(test)-333(platforms.)]TJ/F2 14.35 Tf -21.6 -30.88 TD[(5.1)-562(Con)30(v)32(en)31(tions)-374(for)-375(using)-375(to)-31(ol)-375(names)]TJ/F1 10.91 Tf 14.94 -23.11 TD[(DejaGn)27(u)-281(uses)-282(`)]TJ/F4 10.91 Tf 71.05 0 TD[($tool)]TJ/F1 10.91 Tf 28.64 0 TD[(',)-292(the)-282(name)-282(of)-282(the)-282(to)-28(ol)-282(under)-282(test,)-292(to)-282(tie)-282(together)-282(the)-282(testing)-282(con\014g-)]TJ -114.63 -13.15 TD[(uration)-346(in)-346(a)-347(straigh)27(tforw)28(ard)-346(but)-346(\015exible)-346(w)26(a)28(y)84(.)-483(If)-347(there)-346(is)-346(only)-347(one)-346(testsuite)-347(for)-346(a)-346(particular)]TJ 0 -13.16 TD[(application,)-333(then)-333(`)]TJ/F4 10.91 Tf 87.27 0 TD[($tool)]TJ/F1 10.91 Tf 28.64 0 TD[(')-333(is)-333(optional.)]TJ -100.97 -16.13 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[($tool)]TJ/F1 10.91 Tf 28.64 0 TD[(')-431(is)]TJ/F8 10.91 Tf 19.78 0 TD[(not)]TJ/F1 10.91 Tf 21.07 0 TD[(used)-431(to)-432(in)27(v)28(ok)28(e)-431(the)-431(to)-28(ol,)-456(since)-432(sites)-431(that)-432(run)-431(m)27(ultiple)-431(con\014gurations)-431(of)]TJ -87.46 -13.16 TD[(a)-513(particular)-514(to)-28(ol)-514(often)-514(call)-514(eac)27(h)-513(con\014guration)-514(b)27(y)-513(a)-514(di\013eren)27(t)-513(name.)]TJ/F4 10.91 Tf 346.03 0 TD[(runtest)]TJ/F1 10.91 Tf 45.7 0 TD[(uses)-513(the)]TJ -391.73 -13.15 TD[(con\014guration-dep)-27(enden)27(t)-452(v)55(ariables)-451(captured)-453(in)-452(`)]TJ/F4 10.91 Tf 230.49 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(')-452(to)-452(determine)-452(ho)27(w)-452(to)-452(call)-452(eac)27(h)]TJ -276.31 -13.15 TD[(to)-27(ol.)]TJ/F4 10.91 Tf 14.94 -16.14 TD[(runtest)]TJ/F1 10.91 Tf 43.94 0 TD[(uses)-352(to)-28(ol)-352(names)-352(to)-353(\014nd)-352(directories)-352(con)26(taining)-351(tests.)]TJ/F4 10.91 Tf 251.59 0 TD[(runtest)]TJ/F1 10.91 Tf 43.93 0 TD[(scans)-352(the)-352(source)]TJ -354.4 -13.15 TD[(directory)-249(\(sp)-28(eci\014ed)-249(with)]TJ/F4 10.91 Tf 116.77 0 TD[(--srcdir)]TJ/F1 10.91 Tf 45.82 0 TD[(\))-249(for)-250(all)-249(directories)-250(whose)-249(names)-250(start)-250(with)-249(the)-250(to)-27(ol)-250(name.)]TJ -162.59 -13.15 TD[(It)-441(is)-442(a)-442(common)-442(practice)-442(to)-441(put)-442(a)-442(p)-28(erio)-28(d)-441(after)-442(the)-442(to)-28(ol)-442(part)-441(of)-442(the)-442(name.)-770(F)82(or)-440(instance,)]TJ 0 -13.15 TD[(directories)-363(that)-363(start)-363(with)-363(`)]TJ/F4 10.91 Tf 131.81 0 TD[(g++.)]TJ/F1 10.91 Tf 22.91 0 TD[(')-363(con)27(tain)]TJ/F7 10.91 Tf 45.8 0 TD[(g)]TJ/F4 10.91 Tf 7 0 TD[(++)]TJ/F1 10.91 Tf 15.41 0 TD[(tests.)-533(T)82(o)-362(add)-363(a)-363(new)-363(test,)-371(just)-363(put)-363(it)-363(in)-363(an)27(y)]TJ -222.93 -13.15 TD[(directory)-273(\(create)-273(an)-273(en)27(tirely)-272(new)-273(directory)83(,)-284(if)-273(y)26(ou)-272(wish\))-273(whose)-273(name)-273(follo)27(ws)-272(this)-273(con)27(v)28(en)27(tion.)]TJ 14.94 -16.14 TD[(A)-272(test)-273(is)-273(an)27(y)-272(\014le)-272(in)-273(an)-273(appropriately)-273(named)-272(sub)-28(directory)-273(whose)-273(name)-272(ends)-273(in)-273(`)]TJ/F4 10.91 Tf 368.75 0 TD[(.exp)]TJ/F1 10.91 Tf 22.91 0 TD[(')-272(\(the)]TJ -406.6 -13.15 TD[(con)27(v)28(en)28(tional)-346(w)27(a)27(y)-346(of)-347(naming)]TJ/F4 10.91 Tf 136.96 0 TD[(expect)]TJ/F1 10.91 Tf 38.15 0 TD[(scripts\).)-485(These)-347(simple)-347(naming)-347(con)27(v)27(en)28(tions)-346(mak)27(e)-346(it)-347(as)]TJ -175.11 -13.15 TD[(simple)-298(as)-299(p)-28(ossible)-299(to)-299(install)-299(new)-299(tests:)-427(all)-299(y)27(ou)-298(m)27(ust)-298(do)-299(is)-299(put)-299(the)-298(test)-299(in)-299(the)-299(righ)27(t)-298(directory)82(.)]TJ/F4 10.91 Tf 14.94 -16.14 TD[(runtest)]TJ/F1 10.91 Tf 44.08 0 TD[(sorts)-365(the)-365(tests)-366(in)-365(eac)27(h)-365(sub)-27(directory)-366(b)27(y)-364(name)-366(\(using)-365(the)-365(Tcl)]TJ/F4 10.91 Tf 290.06 0 TD[(lsort)]TJ/F1 10.91 Tf 32.62 0 TD[(command\))]TJ -381.7 -13.15 TD[(and)-333(runs)-333(them)-333(in)-334(the)-333(resulting)-333(order.)]TJ ET 0 g 0 G +endstream +endobj +134 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +/F7 49 0 R +/F8 52 0 R +>> +endobj +132 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 134 0 R +>> +endobj +137 0 obj +<< +/Length 7809 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(22)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F2 14.35 Tf 0 -23.91 TD[(5.2)-562(Initialization)-375(mo)-31(dule)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(The)-389(initialization)-389(mo)-28(dule)-390(\(or)-389(\\init)-390(\014le"\))-389(has)-389(t)26(w)28(o)-388(purp)-28(oses:)-557(to)-389(pro)27(vide)-389(to)-28(ol)-389(and)-390(target)]TJ -14.94 -13.15 TD[(dep)-27(enden)27(t)-334(pro)-27(cedures,)-334(and)-334(to)-335(start)-334(up)-334(an)-334(in)27(teractiv)28(e)-333(to)-28(ol)-334(to)-334(the)-334(p)-28(oin)27(t)-333(where)-334(it)-334(is)-334(ready)-334(to)]TJ 0 -13.15 TD[(op)-27(erate.)-443(The)-328(latter)-328(includes)-328(establishing)-328(comm)26(unications)-327(with)-328(the)-328(target.)-443(All)-328(the)-328(tests)-328(for)]TJ 0 -13.15 TD[(in)27(teractiv)28(e)-250(programs)-251(assume)-250(that)-251(the)-251(to)-28(ol)-251(is)-250(already)-251(running)-251(and)-251(comm)27(unicating.)-416(Initializa-)]TJ 0 -13.15 TD[(tion)-333(mo)-28(dules)-333(for)-333(non-in)27(teractiv)27(e)-332(programs)-333(ma)26(y)-332(only)-333(need)-334(to)-333(supply)-333(the)-334(supp)-27(ort)-334(functions.)]TJ 14.94 -16.14 TD[(Eac)27(h)-357(test)-358(suite)-358(directory)-358(m)27(ust)-357(con)27(tain)-358(\(in)-358(its)-358(`)]TJ/F4 10.91 Tf 223.83 0 TD[(config)]TJ/F1 10.91 Tf 34.36 0 TD[(')-358(sub)-27(directory\))-358(a)-358(separate)-359(initial-)]TJ -273.13 -13.15 TD[(ization)-299(mo)-28(dule)-300(for)-300(eac)27(h)-299(target.)-433(The)-300(appropriate)-300(init)-299(\014le)-300(is)-300(can)-300(b)-27(e)-300(named)-300(sev)27(eral)-299(w)27(a)27(ys.)-432(The)]TJ 0 -13.15 TD[(prefered)-373(name)-374(is)-374(the)]TJ/F8 10.91 Tf 102.8 0 TD[(os)]TJ/F1 10.91 Tf 15.01 0 TD[(part)-373(of)-374(the)-374(canonical)-374(con\014guration)-374(name)-374(with)]TJ/F4 10.91 Tf 225.89 0 TD[(.exp)]TJ/F1 10.91 Tf 26.99 0 TD[(as)-373(the)-374(su\016x.)]TJ -370.69 -13.15 TD[(An)-362(example)-363(w)26(ould)-362(b)-27(e)-363(that)-363(for)-363(an)]TJ/F4 10.91 Tf 165.02 0 TD[(m68k-coff)]TJ/F1 10.91 Tf 55.51 0 TD[(system,)-370(the)]TJ/F4 10.91 Tf 58.72 0 TD[(target_os)]TJ/F1 10.91 Tf 55.51 0 TD[(part)-362(w)26(ould)-362(b)-27(e)]TJ/F4 10.91 Tf 71.3 0 TD[(coff)]TJ/F1 10.91 Tf 22.91 0 TD[(.)]TJ -428.97 -13.15 TD[(The)-303(next)-304(w)27(a)28(y)-303(is)-303(for)-304(system)-303(where)-304(there)-303(are)-304(short)-304(\014lenames,)-309(or)-304(a)-303(shortcut)-304(is)-303(desired)-304(to)-304(refer)]TJ 0 -13.15 TD[(to)-334(the)-335(OS)-334(name)-335(for)-334(that)-335(target.)-448(This)-335(is)-334(uses)-335(the)-334(v)54(alue)-333(of)]TJ/F4 10.91 Tf 274.75 0 TD[($target_abbrev)]TJ/F1 10.91 Tf 83.83 0 TD[(rather)-334(than)-335(the)]TJ/F4 10.91 Tf -358.58 -13.15 TD[(target_os)]TJ/F1 10.91 Tf 51.55 0 TD[(.)]TJ -36.61 -16.14 TD[(The)-356(\014nal)-356(\014le)-356(lo)-27(ok)26(ed)-355(for)-356(is)-356(simply)-356(`)]TJ/F4 10.91 Tf 165.83 0 TD[(default.exp)]TJ/F1 10.91 Tf 63 0 TD[('.)-512(If)-356(there)-356(is)-356(only)-356(one)-356(op)-28(erating)-356(system)]TJ -243.77 -13.15 TD[(to)-275(supp)-28(ort,)-287(then)-276(this)-276(\014le)-276(can)-275(b)-28(e)-276(used.)-425(It's)-276(main)-276(purp)-28(ose)-275(is)-276(to)-276(o\013er)-276(some)-275(supp)-28(ort)-276(for)-276(new)-276(op-)]TJ 0 -13.15 TD[(erating)-301(systems,)-308(or)-302(for)-302(unsupp)-28(orted)-301(cross)-302(targets.)-434(The)-302(last)-301(\014le)-302(lo)-28(ok)27(ed)-301(for)-302(is)-301(`)]TJ/F4 10.91 Tf 362.94 0 TD[(unknown.exp)]TJ/F1 10.91 Tf 63 0 TD[('.)]TJ -425.94 -13.15 TD[(This)-428(is)-429(usually)-428(limited)-429(to)-428(error)-429(handling)-428(for)-429(unsupp)-27(orted)-429(targets.)-730(It's)-428(whole)-429(con)27(ten)28(ts)-428(is)]TJ 0 -13.15 TD[(t)27(ypically)84(.)]TJ/F9 9.96 Tf 0 -9.45 TD[(\013)]TJ ET 23.98 -258.91 m 450.40 -258.91 l 450.40 -258.51 l 23.98 -258.51 l b BT 456.38 -258.91 TD[(\010)]TJ ET 18.00 -292.72 m 18.40 -292.72 l 18.40 -264.64 l 18.00 -264.64 l b BT/F4 10.91 Tf 21.39 -277.28 TD[(perror)-524("Sorry,)-525(there)-525(is)-525(no)-525(support)-525(for)-525(this)-525(target")]TJ 0 -12.45 TD[(exit)-524(1)]TJ ET 456.38 -292.72 m 456.77 -292.72 l 456.77 -264.64 l 456.38 -264.64 l b BT/F9 9.96 Tf 18 -298.95 TD[(\012)]TJ ET 23.98 -298.95 m 450.40 -298.95 l 450.40 -298.55 l 23.98 -298.55 l b BT 456.38 -298.95 TD[(\011)]TJ/F1 10.91 Tf -423.44 -17.39 TD[(A)27(t)-376(the)-377(b)-28(eginning)-377(of)-377(the)-377(init)-377(\014le,)-389(y)27(ou)-376(m)27(ust)-376(\014rst)-378(determine)-377(the)-377(prop)-28(er)-377(executable)-377(name)]TJ -14.94 -13.15 TD[(of)-340(the)-340(to)-28(ol)-340(to)-341(execute,)-342(since)-340(the)-340(actual)-341(name)-340(of)-340(the)-341(to)-27(ol)-341(to)-340(b)-28(e)-340(tested)-341(m)27(y)-339(v)54(ary)-339(from)-340(system)]TJ 0 -13.15 TD[(to)-333(system.)-444(Here's)-334(an)-333(example)-333(for)-334(the)]TJ/F7 10.91 Tf 180.24 0 TD[(GNU)]TJ/F1 10.91 Tf 30.68 0 TD[(C)-333(compiler.)]TJ/F9 9.96 Tf -210.92 -9.44 TD[(\013)]TJ ET 23.98 -352.08 m 450.40 -352.08 l 450.40 -351.69 l 23.98 -351.69 l b BT 456.38 -352.08 TD[(\010)]TJ ET 18.00 -523.79 m 18.40 -523.79 l 18.40 -357.81 l 18.00 -357.81 l b BT/F4 10.91 Tf 21.39 -370.46 TD[(global)-524(AR)]TJ 0 -12.45 TD[(#)-524(look)-525(for)-525(the)-525(archiver)-525(ar)]TJ 0 -12.45 TD[(if)-524(![info)-525(exists)-525(AR])-525({)]TJ 22.91 -12.46 TD[(set)-524(AR)-525([findfile)-525($base_dir/../../binutils/ar)-525($base_dir/../../binutils/ar)-525([tr)]TJ -22.91 -12.45 TD[(ansform)-524(ar]])]TJ 22.91 -12.45 TD[(verbose)-524("AR)-525(defaulting)-525(to)-525($AR")-525(2)]TJ -22.91 -12.46 TD[(})]TJ 0 -12.45 TD[(})]TJ 0 -24.91 TD[(global)-524(CFLAGS)]TJ 0 -12.45 TD[(if)-524(![info)-525(exists)-525(CFLAGS])-525(then)-525({)]TJ 22.91 -12.45 TD[(set)-524(CFLAGS)-525("")]TJ -22.91 -12.46 TD[(})]TJ ET 456.38 -523.79 m 456.77 -523.79 l 456.77 -357.81 l 456.38 -357.81 l b BT/F9 9.96 Tf 18 -530.02 TD[(\012)]TJ ET 23.98 -530.02 m 450.40 -530.02 l 450.40 -529.62 l 23.98 -529.62 l b BT 456.38 -530.02 TD[(\011)]TJ/F1 10.91 Tf -423.44 -17.39 TD[(It)-330(is)-331(alw)27(a)28(ys)-330(a)-331(go)-27(o)-28(d)-331(idea)-330(to)-331(\014rst)-331(c)27(hec)28(k)-330(the)-330(v)54(ariable,)-330(and)-331(only)-330(set)-331(it)-331(if)-330(it)-331(has)-331(not)-330(y)27(et)-330(b)-28(een)]TJ -14.94 -13.15 TD[(de\014ned.)-444(Often)-333(the)-334(prop)-27(er)-334(v)55(alue)-333(of)]TJ/F4 10.91 Tf 166.73 0 TD[(AR)]TJ/F1 10.91 Tf 15.09 0 TD[(is)-333(set)-333(on)-333(the)-334(command)-333(line)-333(that)-334(in)27(v)28(ok)28(es)-333(`)]TJ/F4 10.91 Tf 196.85 0 TD[(runtest)]TJ/F1 10.91 Tf 40.09 0 TD[('.)]TJ -403.82 -16.14 TD[(The)]TJ/F4 10.91 Tf 22.14 0 TD[(findfile)]TJ/F1 10.91 Tf 49.18 0 TD[(pro)-27(cedure)-308(tak)27(es)-306(as)-308(it's)-307(\014rst)-307(argumen)27(t)-307(a)-307(\014le)-307(name)-308(to)-307(lo)-28(ok)-307(for.)-436(The)-307(second)]TJ -86.26 -13.15 TD[(argumen)27(t)-293(is)-295(returned)-294(if)-295(the)-294(\014le)-295(is)-294(found,)-302(and)-295(the)-294(third)-295(argumen)27(t)-293(is)-295(returned)-294(if)-295(the)-294(\014le)-295(is)-294(not)]TJ 0 -13.15 TD[(found.)]TJ/F4 10.91 Tf 34.85 0 TD[(base_dir)]TJ/F1 10.91 Tf 49.45 0 TD[(is)-333(set)-333(in)27(ternally)-333(b)27(y)-332(DejaGn)27(u)-333(to)-333(the)-333(top)-334(lev)27(el)-332(directory)-334(of)-333(the)-333(ob)-56(ject)-333(tree.)]TJ -69.36 -16.14 TD[(The)]TJ/F4 10.91 Tf 23.9 0 TD[(transform)]TJ/F1 10.91 Tf 56.65 0 TD[(pro)-27(cedure)-468(tak)26(es)-467(as)-468(its)-468(argumen)27(t)-467(the)-468(nativ)27(e)-467(name)-468(of)-468(a)-468(to)-28(ol)-468(\(suc)27(h)-467(as)]TJ -95.49 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(gcc)]TJ/F1 10.91 Tf 17.18 0 TD[(')-434(for)-435(the)-435(compiler\),)-460(and)-435(returns)-435(the)-434(name)-435(as)-435(con\014gured)-435(for)-435(that)-434(to)-28(ol)-435(in)-435(the)-434(curren)26(t)]TJ ET 0 g 0 G +endstream +endobj +138 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +/F8 52 0 R +/F9 59 0 R +/F7 49 0 R +>> +endobj +136 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 138 0 R +>> +endobj +141 0 obj +<< +/Length 8761 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(5:)-444(The)-334(DejaGn)27(u)-332(Implemen)27(tation)-20326(23)]TJ 0 -23.91 TD[(installation.)-440(\(F)83(or)-320(example,)-323(a)-321(cross-compiling)-321(v)27(ersion)-320(of)]TJ/F7 10.91 Tf 265.1 0 TD[(gnu)]TJ/F1 10.91 Tf 23.87 0 TD[(CC)-320(that)-321(generates)-321(MIPS)-321(co)-27(de)]TJ -288.97 -13.15 TD[(ma)27(y)-332(b)-28(e)-333(installed)-333(with)-334(a)-333(name)-333(lik)26(e)]TJ/F4 10.91 Tf 165.21 0 TD[(mips-idt-ecoff-gcc)]TJ/F1 10.91 Tf 103.09 0 TD[(.\))]TJ -253.36 -16.14 TD[(In)-372(a)-373(test)-373(running)-372(nativ)27(e,)-382(writing)-373(the)-372(Tcl)-373(co)-28(de)-372(for)-373(initialization)-373(is)-372(usually)-373(quite)-373(simple.)]TJ -14.94 -13.15 TD[(F)83(or)-238(cross)-238(con\014gurations,)-258(ho)27(w)28(ev)28(er,)-257(more)-238(elab)-28(orate)-238(instructions)-239(are)-238(usually)-239(needed)-238(to)-239(describ)-27(e)]TJ 0 -13.15 TD[(ho)27(w)-332(to)-333(talk)-334(to)-333(a)-333(remote)-334(target.)]TJ 14.94 -16.14 TD[(Eac)27(h)-333(initialization)-335(mo)-27(dule)-335(de\014nes)-334(up)-335(to)-334(four)-335(pro)-27(cedures)-335(with)-334(standard)-335(names)-334(and)-335(pur-)]TJ -14.94 -13.15 TD[(p)-27(oses.)-641(The)-399(names)-399(of)-399(these)-399(pro)-28(cedures)-399(b)-28(egin)-398(with)-399(`)]TJ/F4 10.91 Tf 248.73 0 TD[($tool)]TJ/F1 10.91 Tf 28.64 0 TD[(',)-415(the)-399(string)-399(that)-399(iden)27(ti\014es)-398(tests)]TJ -277.37 -13.15 TD[(for)-422(a)-423(particular)-423(to)-28(ol:)]TJ/F4 10.91 Tf 107.4 0 TD[($tool_start)]TJ/F1 10.91 Tf 63 0 TD[(,)]TJ/F4 10.91 Tf 7.89 0 TD[($tool_load)]TJ/F1 10.91 Tf 57.27 0 TD[(,)]TJ/F4 10.91 Tf 7.89 0 TD[($tool_exit)]TJ/F1 10.91 Tf 57.27 0 TD[(,)-445(and)]TJ/F4 10.91 Tf 30.08 0 TD[($tool_version)]TJ/F1 10.91 Tf 74.45 0 TD[(.)-713(F)83(or)]TJ -405.25 -13.16 TD[(example,)-306(the)-299(start)-300(pro)-28(cedure)-299(for)]TJ/F7 10.91 Tf 156.29 0 TD[(gdb)]TJ/F1 10.91 Tf 23.41 0 TD[(is)-299(called)]TJ/F4 10.91 Tf 41.14 0 TD[(gdb_start)]TJ/F1 10.91 Tf 51.54 0 TD[(.)-433(\(Since)-299(start)-300(pro)-28(cedures)-299(are)-300(used)]TJ -272.38 -13.15 TD[(di\013eren)27(tly)-305(for)-307(batc)27(h)-305(and)-307(in)27(teractiv)28(e)-306(to)-27(ols,)-312(ho)27(w)27(ev)28(er,)]TJ/F4 10.91 Tf 245.82 0 TD[(runtest)]TJ/F1 10.91 Tf 43.44 0 TD[(itself)-306(nev)27(er)-306(calls)-306(the)-306(start)-307(pro-)]TJ -289.26 -13.15 TD[(cedure.)-444(Init)-333(\014les)-334(for)-333(in)27(teractiv)28(e)-333(to)-27(ols)-334(are)-333(exp)-28(ected)-333(to)-334(end)-333(b)27(y)-332(running)-334(the)-333(start)-333(pro)-28(cedure.\))]TJ 14.94 -16.14 TD[(The)-411(initialization)-412(mo)-28(dule)-411(is)-412(also)-412(a)-411(go)-28(o)-28(d)-412(place)-411(to)-412(call)]TJ/F4 10.91 Tf 262.91 0 TD[(load_lib)]TJ/F1 10.91 Tf 50.31 0 TD[(to)-411(get)-412(an)27(y)-411(collections)]TJ -328.16 -13.15 TD[(of)-362(utilit)27(y)-361(pro)-28(cedures)-362(mean)26(t)-361(for)-362(a)-363(family)-362(of)-362(test)-363(cases,)-369(and)-362(to)-363(set)-362(up)-362(default)-363(v)55(alues)-361(for)-363(an)27(y)]TJ 0 -13.15 TD[(additional)-333(Tcl)-333(v)54(ariables)-332(needed)-333(for)-334(a)-333(sp)-28(eci\014c)-333(set)-333(of)-334(tests.)]TJ 14.94 -16.14 TD[(See)-439(Section)-440(5.4)-440([T)82(arget)-439(dep)-28(enden)27(t)-439(pro)-28(cedures],)-466(page)-440(31,)-467(for)-440(full)-440(descriptions)-440(of)-440(these)]TJ -14.94 -13.15 TD[(pro)-27(cedures.)]TJ/F2 14.35 Tf 0 -30.88 TD[(5.3)-562(DejaGn)30(u)-374(pro)-31(cedures)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(DejaGn)27(u)-430(pro)27(vides)-430(these)-431(Tcl)-431(pro)-28(cedures)-431(for)-430(use)-431(in)-431(test)-431(scripts.)-738(Y)83(ou)-430(can)-431(also)-431(use)-431(an)27(y)]TJ -14.94 -13.15 TD[(standard)]TJ/F4 10.91 Tf 45.54 0 TD[(expect)]TJ/F1 10.91 Tf 37.99 0 TD[(or)-332(Tcl)-332(function.)-445(These)-332(pro)-28(cedures)-332(are)-333(stored)-332(in)-333(libraries,)-332(whic)26(h)-331(DejaGn)27(u)]TJ -83.53 -13.15 TD[(loads)-343(at)-343(run)27(time.)-473(Here's)-343(explanation)-343(of)-343(the)-343(library)-344(pro)-27(cedures)-344(that)-343(get)-343(loaded)-343(at)-343(run)27(time.)]TJ 0 -13.15 TD[(All)-333(other)-333(librarys)-333(are)-334(optional,)-333(and)-333(need)-334(to)-333(b)-28(e)-333(loaded)-334(b)27(y)-332(the)-333(testsuite.)]TJ/F2 13.09 Tf 0 -26.9 TD[(5.3.1)-562(Core)-375(In)30(ternal)-374(Pro)-31(cedures)]TJ/F1 10.91 Tf 14.94 -23.11 TD[(See)-333(Section)-334(2.4)-333([A)-334(POSIX)-333(conforming)-334(test)-333(framew)27(ork],)-333(page)-333(6,)-334(for)-333(more)-334(detailed)-333(expla-)]TJ -14.94 -13.15 TD[(nations)-333(of)-333(the)-333(test)-334(outcomes)-333(\(`)]TJ/F4 10.91 Tf 145.94 0 TD[(FAIL)]TJ/F1 10.91 Tf 22.91 0 TD[(',)-333(`)]TJ/F4 10.91 Tf 12.73 0 TD[(PASS)]TJ/F1 10.91 Tf 22.9 0 TD[(',)-333(`)]TJ/F4 10.91 Tf 12.73 0 TD[(UNTESTED)]TJ/F1 10.91 Tf 45.82 0 TD[(',)-333(`)]TJ/F4 10.91 Tf 12.73 0 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 57.27 0 TD[(',)-333(`)]TJ/F4 10.91 Tf 12.73 0 TD[(UNSUPPORTED)]TJ/F1 10.91 Tf 63 0 TD[('\).)]TJ/F4 10.91 Tf -408.76 -22.12 TD[(perror)-333(")]TJ/F5 10.91 Tf 43.73 0 TD[(string)-418(n)26(um)28(b)-27(er)]TJ/F4 10.91 Tf 68.81 0 TD[(")]TJ/F1 10.91 Tf -54.94 -13.15 TD[(Declares)-299(a)-299(sev)27(ere)-298(error)-299(in)-299(the)-300(testing)-299(framew)27(ork)-298(itself.)]TJ/F4 10.91 Tf 260.23 0 TD[(perror)]TJ/F1 10.91 Tf 37.62 0 TD[(writes)-299(in)-299(the)-299(log)]TJ -297.85 -13.15 TD[(\014les)-356(a)-356(message)-357(b)-28(eginning)-356(with)-356(`)]TJ/F4 10.91 Tf 152.05 0 TD[(ERROR)]TJ/F1 10.91 Tf 28.63 0 TD[(',)-362(app)-27(ending)-357(the)-356(argumen)26(t)]TJ/F5 10.91 Tf 131.41 0 TD[(string)]TJ/F1 10.91 Tf 27.36 0 TD[(.)-513(If)-357(the)]TJ -339.45 -13.15 TD[(optional)]TJ/F5 10.91 Tf 41.92 0 TD[(n)27(um)28(b)-27(er)]TJ/F1 10.91 Tf 40.01 0 TD[(is)-287(supplied,)-296(then)-287(this)-287(is)-287(used)-287(to)-287(set)-288(the)-287(in)27(ternal)-286(coun)27(t)-286(of)-287(errors)]TJ -81.93 -13.15 TD[(to)-333(that)-333(v)54(alue.)]TJ 0 -16.14 TD[(As)-347(a)-348(side)-348(e\013ect,)]TJ/F4 10.91 Tf 79.59 0 TD[(perror)]TJ/F1 10.91 Tf 38.16 0 TD[(also)-347(c)26(hanges)-347(the)-348(e\013ect)-347(of)-348(the)-348(next)]TJ/F4 10.91 Tf 166.69 0 TD[(pass)]TJ/F1 10.91 Tf 26.7 0 TD[(or)]TJ/F4 10.91 Tf 13.53 0 TD[(fail)]TJ/F1 10.91 Tf 26.7 0 TD[(com-)]TJ -351.37 -13.15 TD[(mand:)-559(the)-390(test)-391(outcome)-391(b)-27(ecomes)-391(`)]TJ/F4 10.91 Tf 168.42 0 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 57.27 0 TD[(',)-405(since)-390(an)-391(automatic)-391(`)]TJ/F4 10.91 Tf 108.78 0 TD[(PASS)]TJ/F1 10.91 Tf 22.91 0 TD[(')-390(or)]TJ -357.38 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(FAIL)]TJ/F1 10.91 Tf 22.91 0 TD[(')-356(cannot)-357(b)-28(e)-357(trusted)-356(after)-357(a)-357(sev)27(ere)-356(error)-357(in)-357(the)-357(test)-356(framew)26(ork.)-513(If)-357(the)-357(op-)]TJ -25.94 -13.15 TD[(tional)-339(n)26(umeric)-338(v)54(alue)-339(is)-339(`)]TJ/F4 10.91 Tf 114.92 0 TD[(0)]TJ/F1 10.91 Tf 5.73 0 TD[(',)-341(then)-340(there)-340(are)-339(no)-340(further)-340(side)-340(e\013ects)-340(to)-339(calling)-340(this)]TJ -120.65 -13.15 TD[(function,)-416(and)-400(the)-400(follo)27(wing)-399(test)-399(outcome)-400(do)-28(esn't)-400(b)-28(ecome)-399(`)]TJ/F4 10.91 Tf 282.77 0 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 57.27 0 TD[('.)-643(This)]TJ -340.04 -13.15 TD[(can)-333(b)-28(e)-333(used)-333(for)-334(errors)-333(with)-333(no)-334(kno)27(wn)-332(side)-333(e\013ects.)]TJ/F4 10.91 Tf -57.6 -22.12 TD[(warning)-333(")]TJ/F5 10.91 Tf 49.45 0 TD[(string)-418(n)26(um)28(b)-27(er)]TJ/F4 10.91 Tf 68.81 0 TD[(")]TJ/F1 10.91 Tf -60.66 -13.15 TD[(Declares)-287(detection)-288(of)-288(a)-287(minor)-288(error)-288(in)-288(the)-287(test)-288(case)-288(itself.)]TJ/F4 10.91 Tf 272.07 0 TD[(warning)]TJ/F1 10.91 Tf 43.23 0 TD[(writes)-287(in)-288(the)]TJ -315.3 -13.15 TD[(log)-379(\014les)-380(a)-380(message)-380(b)-28(eginning)-380(with)-380(`)]TJ/F4 10.91 Tf 171.42 0 TD[(WARNING)]TJ/F1 10.91 Tf 40.09 0 TD[(',)-391(app)-28(ending)-380(the)-380(argumen)27(t)]TJ/F5 10.91 Tf 132.5 0 TD[(string)]TJ/F1 10.91 Tf 27.36 0 TD[(.)]TJ -371.37 -13.15 TD[(Use)]TJ/F4 10.91 Tf 22.19 0 TD[(warning)]TJ/F1 10.91 Tf 44.95 0 TD[(rather)-445(than)]TJ/F4 10.91 Tf 60.68 0 TD[(error)]TJ/F1 10.91 Tf 33.5 0 TD[(for)-445(cases)-445(\(suc)27(h)-444(as)-446(comm)27(unication)-444(failure)-445(to)]TJ -161.32 -13.15 TD[(b)-27(e)-489(follo)27(w)28(ed)-487(b)27(y)-488(a)-488(retry\))-488(where)-488(the)-489(test)-488(case)-488(can)-488(reco)27(v)27(er)-487(from)-488(the)-488(error.)-909(If)]TJ 0 -13.15 TD[(the)-367(optional)]TJ/F5 10.91 Tf 61.96 0 TD[(n)27(um)28(b)-27(er)]TJ/F1 10.91 Tf 40.88 0 TD[(is)-367(supplied,)-376(then)-368(this)-367(is)-368(used)-367(to)-368(set)-367(the)-368(in)27(ternal)-366(coun)26(t)-366(of)]TJ -102.84 -13.15 TD[(w)27(arnings)-332(to)-333(that)-334(v)55(alue.)]TJ ET 0 g 0 G +endstream +endobj +142 0 obj +<< +/F1 9 0 R +/F7 49 0 R +/F4 28 0 R +/F2 12 0 R +/F5 31 0 R +>> +endobj +140 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 142 0 R +>> +endobj +145 0 obj +<< +/Length 8738 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(24)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ 57.6 -23.91 TD[(As)-351(a)-352(side)-351(e\013ect,)]TJ/F4 10.91 Tf 79.76 0 TD[(warning_threshold)]TJ/F1 10.91 Tf 101.2 0 TD[(or)-351(more)-352(calls)-351(to)]TJ/F4 10.91 Tf 79.1 0 TD[(warning)]TJ/F1 10.91 Tf 43.92 0 TD[(in)-351(a)-352(single)-351(test)]TJ -303.98 -13.15 TD[(case)-369(also)-369(c)27(hanges)-369(the)-369(e\013ect)-369(of)-370(the)-369(next)]TJ/F4 10.91 Tf 191.81 0 TD[(pass)]TJ/F1 10.91 Tf 26.93 0 TD[(or)]TJ/F4 10.91 Tf 13.76 0 TD[(fail)]TJ/F1 10.91 Tf 26.94 0 TD[(command:)-516(the)-369(test)-369(out-)]TJ -259.44 -13.15 TD[(come)-416(b)-27(ecomes)-417(`)]TJ/F4 10.91 Tf 76.11 0 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 57.27 0 TD[(')-416(since)-416(an)-416(automatic)-416(`)]TJ/F4 10.91 Tf 106.71 0 TD[(PASS)]TJ/F1 10.91 Tf 22.91 0 TD[(')-416(or)-416(`)]TJ/F4 10.91 Tf 24.87 0 TD[(FAIL)]TJ/F1 10.91 Tf 22.91 0 TD[(')-416(ma)27(y)-415(not)-416(b)-28(e)]TJ -310.78 -13.15 TD[(trust)27(w)28(orth)28(y)-449(after)-450(man)27(y)-449(w)27(arnings.)-792(If)-450(the)-450(optional)-450(n)27(umeric)-449(v)55(alue)-449(is)-449(`)]TJ/F4 10.91 Tf 336.18 0 TD[(0)]TJ/F1 10.91 Tf 5.72 0 TD[(',)-478(then)]TJ -341.9 -13.16 TD[(there)-352(are)-353(no)-353(further)-353(side)-353(e\013ects)-353(to)-353(calling)-352(this)-353(function,)-358(and)-353(the)-353(follo)27(wing)-352(test)]TJ 0 -13.15 TD[(outcome)-430(do)-27(esn't)-431(b)-27(ecome)-431(`)]TJ/F4 10.91 Tf 126.87 0 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 57.27 0 TD[('.)-734(This)-431(can)-430(b)-28(e)-430(used)-430(for)-430(errors)-430(with)-430(no)]TJ -184.14 -13.15 TD[(kno)27(wn)-332(side)-333(e\013ects.)]TJ/F4 10.91 Tf -57.6 -21.87 TD[(note)-333(")]TJ/F5 10.91 Tf 32.27 0 TD[(string)]TJ/F4 10.91 Tf 28.3 0 TD[(")]TJ/F1 10.91 Tf -2.97 -13.15 TD[(App)-27(ends)-374(an)-373(informational)-374(message)-373(to)-374(the)-374(log)-373(\014le.)]TJ/F4 10.91 Tf 246.12 0 TD[(note)]TJ/F1 10.91 Tf 26.98 0 TD[(writes)-373(in)-374(the)-373(log)-374(\014les)]TJ -273.1 -13.15 TD[(a)-431(message)-432(b)-27(eginning)-432(with)-432(`)]TJ/F4 10.91 Tf 133.2 0 TD[(NOTE)]TJ/F1 10.91 Tf 22.9 0 TD[(',)-456(app)-27(ending)-432(the)-432(argumen)27(t)]TJ/F5 10.91 Tf 134.89 0 TD[(string)]TJ/F1 10.91 Tf 27.37 0 TD[(.)-739(Use)]TJ/F4 10.91 Tf 33.13 0 TD[(note)]TJ/F1 10.91 Tf -351.49 -13.15 TD[(sparingly)83(.)]TJ/F4 10.91 Tf 50.52 0 TD[(verbose)]TJ/F1 10.91 Tf 43.76 0 TD[(should)-337(b)-27(e)-337(used)-338(for)-337(most)-337(suc)27(h)-336(messages,)-338(but)-337(in)-337(cases)-337(where)]TJ -94.28 -13.15 TD[(a)-333(message)-333(is)-333(needed)-334(in)-333(the)-333(log)-334(\014le)-333(regardless)-333(of)-334(the)-333(v)27(erb)-27(osit)27(y)-333(lev)27(el)-332(use)]TJ/F4 10.91 Tf 337.49 0 TD[(note)]TJ/F1 10.91 Tf 22.9 0 TD[(.)]TJ/F4 10.91 Tf -417.99 -21.88 TD[(pass)-333(")]TJ/F5 10.91 Tf 32.27 0 TD[(string)]TJ/F4 10.91 Tf 28.3 0 TD[(")]TJ/F1 10.91 Tf -2.97 -13.15 TD[(Declares)-305(a)-305(test)-306(to)-305(ha)26(v)28(e)-304(passed.)]TJ/F4 10.91 Tf 149.71 0 TD[(pass)]TJ/F1 10.91 Tf 26.24 0 TD[(writes)-305(in)-305(the)-306(log)-305(\014les)-306(a)-305(message)-306(b)-27(eginning)]TJ -175.95 -13.15 TD[(with)-295(`)]TJ/F4 10.91 Tf 27.47 0 TD[(PASS)]TJ/F1 10.91 Tf 22.91 0 TD[(')-295(\(or)]TJ/F4 10.91 Tf 23.45 0 TD[(XPASS)]TJ/F1 10.91 Tf 28.63 0 TD[(,)-303(if)-295(failure)-296(w)27(as)-295(exp)-28(ected\),)-303(app)-28(ending)-295(the)-296(argumen)27(t)]TJ/F5 10.91 Tf 241.55 0 TD[(string)]TJ/F1 10.91 Tf 27.36 0 TD[(.)]TJ/F4 10.91 Tf -428.97 -21.87 TD[(fail)-333(")]TJ/F5 10.91 Tf 32.27 0 TD[(string)]TJ/F4 10.91 Tf 28.3 0 TD[(")]TJ/F1 10.91 Tf -2.97 -13.15 TD[(Declares)-340(a)-340(test)-340(to)-341(ha)27(v)28(e)-339(failed.)]TJ/F4 10.91 Tf 146.67 0 TD[(fail)]TJ/F1 10.91 Tf 26.62 0 TD[(writes)-340(in)-340(the)-340(log)-341(\014les)-340(a)-340(message)-341(b)-27(eginning)]TJ -173.29 -13.15 TD[(with)-295(`)]TJ/F4 10.91 Tf 27.47 0 TD[(FAIL)]TJ/F1 10.91 Tf 22.91 0 TD[(')-295(\(or)]TJ/F4 10.91 Tf 23.45 0 TD[(XFAIL)]TJ/F1 10.91 Tf 28.63 0 TD[(,)-303(if)-295(failure)-296(w)27(as)-295(exp)-28(ected\),)-303(app)-28(ending)-295(the)-296(argumen)27(t)]TJ/F5 10.91 Tf 241.55 0 TD[(string)]TJ/F1 10.91 Tf 27.36 0 TD[(.)]TJ/F4 10.91 Tf -428.97 -21.88 TD[(unresolved)-333(")]TJ/F5 10.91 Tf 66.64 0 TD[(string)]TJ/F4 10.91 Tf 28.29 0 TD[(")]TJ/F1 10.91 Tf -37.33 -13.15 TD[(Declares)-374(a)-375(test)-375(to)-375(ha)27(v)28(e)-374(an)-375(unresolv)27(ed)-374(outcome.)]TJ/F4 10.91 Tf 234.01 0 TD[(unresolved)]TJ/F1 10.91 Tf 61.37 0 TD[(writes)-374(in)-375(the)-375(log)]TJ -295.38 -13.15 TD[(\014le)-431(a)-432(message)-431(b)-28(eginning)-432(with)-431(`)]TJ/F4 10.91 Tf 151.84 0 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 57.28 0 TD[(',)-456(app)-27(ending)-432(the)-432(argumen)27(t)]TJ/F5 10.91 Tf 134.89 0 TD[(string)]TJ/F1 10.91 Tf 27.36 0 TD[(.)]TJ -371.37 -13.15 TD[(This)-384(usually)-385(means)-385(the)-384(test)-385(did)-385(not)-385(execute)-384(as)-385(exp)-28(ected,)-397(and)-385(a)-385(h)27(uman)-384(b)-28(eing)]TJ 0 -13.15 TD[(m)27(ust)-304(go)-305(o)27(v)27(er)-304(results)-305(to)-305(determine)-305(if)-306(it)-305(passed)-305(or)-305(failed)-306(\(and)-305(to)-305(impro)27(v)28(e)-305(the)-305(test)]TJ 0 -13.15 TD[(case\).)]TJ/F4 10.91 Tf -57.6 -21.87 TD[(untested)-333(")]TJ/F5 10.91 Tf 55.18 0 TD[(string)]TJ/F4 10.91 Tf 28.3 0 TD[(")]TJ/F1 10.91 Tf -25.88 -13.15 TD[(Declares)-265(a)-265(test)-265(w)27(as)-265(not)-265(run.)]TJ/F4 10.91 Tf 134.62 0 TD[(untested)]TJ/F1 10.91 Tf 48.71 0 TD[(writes)-265(in)-265(the)-265(log)-265(\014le)-266(a)-265(message)-265(b)-28(eginning)]TJ -183.33 -13.15 TD[(with)-353(`)]TJ/F4 10.91 Tf 28.1 0 TD[(UNTESTED)]TJ/F1 10.91 Tf 45.82 0 TD[(',)-358(app)-28(ending)-354(the)-353(argumen)27(t)]TJ/F5 10.91 Tf 131.27 0 TD[(string)]TJ/F1 10.91 Tf 27.36 0 TD[(.)-505(F)83(or)-353(example,)-359(y)27(ou)-352(migh)26(t)-352(use)]TJ -232.55 -13.16 TD[(this)-318(in)-318(a)-318(dumm)26(y)-317(test)-318(whose)-319(only)-318(role)-318(is)-319(to)-318(record)-318(that)-319(a)-318(test)-318(do)-28(es)-318(not)-319(y)27(et)-317(exist)]TJ 0 -13.15 TD[(for)-333(some)-333(feature.)]TJ/F4 10.91 Tf -57.6 -21.87 TD[(unsupported)-333(")]TJ/F5 10.91 Tf 72.36 0 TD[(string)]TJ/F4 10.91 Tf 28.3 0 TD[(")]TJ/F1 10.91 Tf -43.06 -13.15 TD[(Declares)-409(that)-410(a)-410(test)-410(case)-409(dep)-28(ends)-410(on)-410(some)-409(facilit)26(y)-408(that)-410(do)-28(es)-410(not)-409(exist)-410(in)-410(the)]TJ 0 -13.15 TD[(testing)-399(en)27(vironmen)27(t.)]TJ/F4 10.91 Tf 105.71 0 TD[(unsupported)]TJ/F1 10.91 Tf 67.36 0 TD[(writes)-399(in)-400(the)-399(log)-400(\014le)-399(a)-400(message)-400(b)-27(eginning)]TJ -173.07 -13.15 TD[(with)-333(`)]TJ/F4 10.91 Tf 27.88 0 TD[(UNSUPPORTED)]TJ/F1 10.91 Tf 63 0 TD[(',)-333(app)-28(ending)-333(the)-333(argumen)27(t)]TJ/F5 10.91 Tf 130.33 0 TD[(string)]TJ/F1 10.91 Tf 27.37 0 TD[(.)]TJ/F4 10.91 Tf -306.18 -21.88 TD[(get_warning_threshold)]TJ/F1 10.91 Tf 57.6 -13.15 TD[(Returns)-333(the)-333(curren)27(t)-333(v)55(alue)-332(of)]TJ/F4 10.91 Tf 138.79 0 TD[(warning_threshold)]TJ/F1 10.91 Tf 97.36 0 TD[(.)-444(The)-333(default)-334(v)55(alue)-332(is)-334(3.)]TJ/F4 10.91 Tf -293.75 -21.87 TD[(set_warning_threshold)]TJ/F5 10.91 Tf 123.91 0 TD[(threshold)]TJ/F1 10.91 Tf -66.31 -13.15 TD[(Sets)-265(the)-266(v)54(alue)-264(of)]TJ/F4 10.91 Tf 79.54 0 TD[(warning_threshold)]TJ/F1 10.91 Tf 97.36 0 TD[(.)-421(A)-266(v)54(alue)-264(of)]TJ/F4 10.91 Tf 57.85 0 TD[(0)]TJ/F1 10.91 Tf 8.62 0 TD[(disables)-265(it:)-411(calls)-266(to)]TJ/F4 10.91 Tf 90.94 0 TD[(warning)]TJ/F1 10.91 Tf -334.31 -13.15 TD[(will)-333(not)-333(turn)-333(a)-334(`)]TJ/F4 10.91 Tf 76.39 0 TD[(PASS)]TJ/F1 10.91 Tf 22.91 0 TD[(')-333(or)-333(`)]TJ/F4 10.91 Tf 23.06 0 TD[(FAIL)]TJ/F1 10.91 Tf 22.91 0 TD[(')-333(in)27(to)-332(an)-334(`)]TJ/F4 10.91 Tf 46.97 0 TD[(UNRESOLVED)]TJ/F1 10.91 Tf 57.27 0 TD[('.)]TJ/F4 10.91 Tf -307.11 -21.87 TD[(transform)-333(")]TJ/F5 10.91 Tf 60.91 0 TD[(to)-27(olname)]TJ/F4 10.91 Tf 44.55 0 TD[(")]TJ/F1 10.91 Tf -47.86 -13.15 TD[(Generates)-416(a)-416(string)-417(for)-416(the)-417(name)-416(of)-416(a)-417(to)-28(ol)-416(as)-416(it)-417(w)27(as)-415(con\014gured)-417(and)-416(installed,)]TJ 0 -13.16 TD[(giv)27(en)-300(its)-302(nativ)27(e)-301(name)-301(\(as)-302(the)-302(argumen)27(t)]TJ/F5 10.91 Tf 188.34 0 TD[(to)-27(olname)]TJ/F1 10.91 Tf 44.55 0 TD[(\).)-433(This)-302(mak)27(es)-301(the)-301(assumption)]TJ -232.89 -13.15 TD[(that)-528(all)-529(to)-27(ols)-529(are)-528(installed)-529(using)-528(the)-529(same)-528(naming)-529(con)27(v)28(en)27(tions:)-833(it)-529(extrap-)]TJ 0 -13.15 TD[(olates)-568(from)-569(the)-568(in)26(v)28(o)-27(cation)-568(name)-569(for)-568(`)]TJ/F4 10.91 Tf 192.49 0 TD[(runtest)]TJ/F1 10.91 Tf 40.09 0 TD[('.)-1150(F)83(or)-568(example,)-627(if)-569(y)27(ou)-568(call)]TJ ET 0 g 0 G +endstream +endobj +146 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F5 31 0 R +>> +endobj +144 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 146 0 R +>> +endobj +149 0 obj +<< +/Length 8937 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(5:)-444(The)-334(DejaGn)27(u)-332(Implemen)27(tation)-20326(25)]TJ/F4 10.91 Tf 57.6 -23.91 TD[(runtest)]TJ/F1 10.91 Tf 46.52 0 TD[(as)-589(`)]TJ/F4 10.91 Tf 19.23 0 TD[(m68k-vxworks-runtest)]TJ/F1 10.91 Tf 114.54 0 TD[(',)-653(the)-590(result)-590(of)-590(`)]TJ/F4 10.91 Tf 89.86 0 TD[(transform)-333("gcc")]TJ/F1 10.91 Tf 87.45 0 TD[(')-589(is)]TJ -357.6 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(m68k-vxworks-gcc)]TJ/F1 10.91 Tf 91.64 0 TD[('.)]TJ/F4 10.91 Tf -152.27 -22.12 TD[(ishost)-333(")]TJ/F5 10.91 Tf 43.73 0 TD[(host)]TJ/F4 10.91 Tf 20.29 0 TD[(")]TJ/F1 10.91 Tf -6.42 -13.15 TD[(T)83(ests)-223(for)-223(a)-224(particular)]TJ/F8 10.91 Tf 99.66 0 TD[(host)]TJ/F1 10.91 Tf 22.71 0 TD[(en)27(vironmen)28(t.)-407(If)-223(the)-224(curren)27(tly)-222(con\014gured)-224(host)-223(matc)27(hes)]TJ -122.37 -13.15 TD[(the)-367(argumen)27(t)-367(string,)-376(the)-367(result)-368(is)]TJ/F4 10.91 Tf 164.12 0 TD[(1)]TJ/F1 10.91 Tf 5.73 0 TD[(;)-384(otherwise)-368(the)-367(result)-368(is)]TJ/F4 10.91 Tf 117.44 0 TD[(0)]TJ/F1 10.91 Tf 5.73 0 TD[(.)]TJ/F5 10.91 Tf 8.99 0 TD[(host)]TJ/F1 10.91 Tf 24.31 0 TD[(m)27(ust)-366(b)-28(e)-368(a)]TJ -326.32 -13.15 TD[(full)-268(three-part)]TJ/F4 10.91 Tf 69.25 0 TD[(configure)]TJ/F1 10.91 Tf 54.48 0 TD[(host)-268(name;)-290(in)-269(particular,)-281(y)27(ou)-268(ma)27(y)-267(not)-269(use)-268(the)-269(shorter)]TJ -123.73 -13.15 TD[(nic)27(knames)-258(supp)-28(orted)-260(b)27(y)]TJ/F4 10.91 Tf 116.83 0 TD[(configure)]TJ/F1 10.91 Tf 54.38 0 TD[(\(but)-259(y)27(ou)-259(can)-260(use)-259(wildcard)-260(c)27(haracters,)-274(using)]TJ -171.21 -13.15 TD[(shell)-333(syn)27(tax,)-332(to)-334(sp)-27(ecify)-334(sets)-333(of)-334(names\).)]TJ/F4 10.91 Tf -57.6 -22.12 TD[(istarget)-333(")]TJ/F5 10.91 Tf 55.18 0 TD[(target)]TJ/F4 10.91 Tf 28.75 0 TD[(")]TJ/F1 10.91 Tf -26.33 -13.15 TD[(T)83(ests)-437(for)-438(a)-438(particular)]TJ/F8 10.91 Tf 109.01 0 TD[(tar)51(get)]TJ/F1 10.91 Tf 32.72 0 TD[(en)27(vironmen)28(t.)-757(If)-438(the)-437(curren)26(tly)-436(con\014gured)-438(target)]TJ -141.73 -13.15 TD[(matc)27(hes)-374(the)-375(argumen)27(t)-374(string,)-386(the)-375(result)-375(is)]TJ/F4 10.91 Tf 207.28 0 TD[(1)]TJ/F1 10.91 Tf 5.73 0 TD[(;)-396(otherwise)-375(the)-375(result)-375(is)]TJ/F4 10.91 Tf 117.9 0 TD[(0)]TJ/F1 10.91 Tf 5.73 0 TD[(.)]TJ/F5 10.91 Tf 9.25 0 TD[(target)]TJ/F1 10.91 Tf -345.89 -13.15 TD[(m)27(ust)-384(b)-28(e)-385(a)-385(full)-385(three-part)]TJ/F4 10.91 Tf 124.46 0 TD[(configure)]TJ/F1 10.91 Tf 55.74 0 TD[(target)-385(name;)-410(in)-385(particular,)-398(y)26(ou)-384(ma)27(y)-384(not)]TJ -180.2 -13.15 TD[(use)-340(the)-341(shorter)-341(nic)26(knames)-340(supp)-27(orted)-341(b)26(y)]TJ/F4 10.91 Tf 194.47 0 TD[(configure)]TJ/F1 10.91 Tf 55.26 0 TD[(\(but)-340(y)26(ou)-340(can)-341(use)-341(wildcard)]TJ -249.73 -13.15 TD[(c)27(haracters,)-356(using)-353(shell)-353(syn)27(tax,)-357(to)-352(sp)-28(ecify)-353(sets)-352(of)-353(names\).)-503(If)-353(it)-352(is)-353(passed)-353(a)]TJ/F4 10.91 Tf 351.49 0 TD[(NULL)]TJ/F1 10.91 Tf -351.49 -13.15 TD[(string,)-333(then)-333(it)-333(returns)-334(the)-333(name)-333(of)-334(the)-333(build)-333(canonical)-334(con\014guration.)]TJ/F4 10.91 Tf -57.6 -22.12 TD[(isbuild)-333(")]TJ/F5 10.91 Tf 49.45 0 TD[(host)]TJ/F4 10.91 Tf 20.3 0 TD[(")]TJ/F1 10.91 Tf -12.15 -13.15 TD[(T)83(ests)-356(for)-357(a)-357(particular)]TJ/F8 10.91 Tf 105.48 0 TD[(build)-379(host)]TJ/F1 10.91 Tf 50.88 0 TD[(en)27(vironmen)28(t.)-514(If)-357(the)-356(curren)26(tly)-356(con\014gured)-356(host)]TJ -156.36 -13.15 TD[(matc)27(hes)-423(the)-424(argumen)26(t)-423(string,)-447(the)-425(result)-424(is)]TJ/F4 10.91 Tf 211.17 0 TD[(1)]TJ/F1 10.91 Tf 5.73 0 TD[(;)-469(otherwise)-425(the)-424(result)-425(is)]TJ/F4 10.91 Tf 120.85 0 TD[(0)]TJ/F1 10.91 Tf 5.73 0 TD[(.)]TJ/F5 10.91 Tf 10.86 0 TD[(host)]TJ/F1 10.91 Tf -354.34 -13.15 TD[(m)27(ust)-445(b)-27(e)-446(a)-446(full)-446(three-part)]TJ/F4 10.91 Tf 127.77 0 TD[(configure)]TJ/F1 10.91 Tf 56.41 0 TD[(host)-445(name;)-502(in)-446(particular,)-474(y)27(ou)-445(ma)27(y)-445(not)]TJ -184.18 -13.15 TD[(use)-340(the)-341(shorter)-341(nic)26(knames)-340(supp)-27(orted)-341(b)26(y)]TJ/F4 10.91 Tf 194.47 0 TD[(configure)]TJ/F1 10.91 Tf 55.26 0 TD[(\(but)-340(y)26(ou)-340(can)-341(use)-341(wildcard)]TJ -249.73 -13.16 TD[(c)27(haracters,)-356(using)-353(shell)-353(syn)27(tax,)-357(to)-352(sp)-28(ecify)-353(sets)-352(of)-353(names\).)-503(If)-353(it)-352(is)-353(passed)-353(a)]TJ/F4 10.91 Tf 351.49 0 TD[(NULL)]TJ/F1 10.91 Tf -351.49 -13.15 TD[(string,)-333(then)-333(it)-333(returns)-334(the)-333(name)-333(of)-334(the)-333(build)-333(canonical)-334(con\014guration.)]TJ 0 -16.14 TD[(item)-376(is3w)27(a)28(y)]TJ/F4 10.91 Tf 60.69 0 TD[(")]TJ/F5 10.91 Tf 5.73 0 TD[(host)]TJ/F4 10.91 Tf 20.3 0 TD[(")]TJ/F1 10.91 Tf 9.83 0 TD[(T)83(ests)-375(for)-377(a)-376(canadian)-376(cross.)-574(This)-376(is)-376(when)-376(the)-377(tests)-376(will)-376(b)-28(e)]TJ -96.55 -13.15 TD[(run)-279(on)-279(a)-279(remotly)-280(hosted)-279(cross)-279(compiler.)-427(If)-279(it)-280(is)-279(a)-279(canadian)-279(cross,)-291(then)-279(the)-279(result)]TJ 0 -13.15 TD[(is)]TJ/F4 10.91 Tf 10.97 0 TD[(1)]TJ/F1 10.91 Tf 5.73 0 TD[(;)-333(otherwise)-333(the)-333(result)-334(is)]TJ/F4 10.91 Tf 115.39 0 TD[(0)]TJ/F1 10.91 Tf 5.73 0 TD[(.)]TJ/F4 10.91 Tf -195.42 -22.11 TD[(isnative)]TJ/F1 10.91 Tf 57.6 0 TD[(T)83(ests)-296(whether)-296(the)-297(curren)27(t)-296(con\014guration)-296(has)-297(the)-297(same)-296(host)-297(and)-297(target.)-432(When)-296(it)]TJ 0 -13.15 TD[(runs)-365(in)-365(a)]TJ/F8 10.91 Tf 47.19 0 TD[(native)]TJ/F1 10.91 Tf 33.52 0 TD[(con\014guration)-365(this)-365(pro)-27(cedure)-365(returns)-365(a)]TJ/F4 10.91 Tf 186.54 0 TD[(1)]TJ/F1 10.91 Tf 5.73 0 TD[(;)-380(otherwise)-365(it)-365(returns)]TJ -272.98 -13.16 TD[(a)]TJ/F4 10.91 Tf 9.09 0 TD[(0)]TJ/F1 10.91 Tf 5.73 0 TD[(.)]TJ/F4 10.91 Tf -72.42 -22.11 TD[(load_lib)-333(")]TJ/F5 10.91 Tf 55.18 0 TD[(library-\014le)]TJ/F4 10.91 Tf 50.07 0 TD[(")]TJ/F1 10.91 Tf -47.65 -13.15 TD[(Loads)-500(the)-500(\014le)]TJ/F5 10.91 Tf 73.55 0 TD[(library-\014le)]TJ/F1 10.91 Tf 55.52 0 TD[(b)27(y)-499(searc)27(hing)-499(a)-500(\014xed)-500(path)-500(built)-500(in)27(to)]TJ/F4 10.91 Tf 184.63 0 TD[(runtest)]TJ/F1 10.91 Tf 40.09 0 TD[(.)-944(If)]TJ -353.79 -13.15 TD[(DejaGn)27(u)-264(has)-265(b)-27(een)-265(installed,)-279(it)-265(lo)-27(oks)-265(in)-265(a)-265(path)-265(starting)-265(with)-265(the)-265(installed)-265(library)]TJ 0 -13.15 TD[(directory)83(.)-428(If)-286(y)27(ou)-285(are)-285(running)-286(DejaGn)26(u)-284(directly)-286(from)-286(a)-286(source)-286(directory)83(,)-295(without)]TJ 0 -13.16 TD[(\014rst)-440(running)-441(`)]TJ/F4 10.91 Tf 68.53 0 TD[(make)-333(install)]TJ/F1 10.91 Tf 66.63 0 TD[(',)-467(this)-441(path)-441(defaults)-441(to)-441(the)-441(curren)27(t)-440(directory)83(.)-766(In)]TJ -135.16 -13.15 TD[(either)-346(case,)-349(it)-347(then)-346(lo)-28(oks)-346(in)-347(the)-346(curren)27(t)-346(directory)-346(for)-346(a)-347(directory)-346(called)]TJ/F4 10.91 Tf 341.64 0 TD[(lib)]TJ/F1 10.91 Tf 17.18 0 TD[(.)-483(If)]TJ -358.82 -13.15 TD[(there)-411(are)-411(duplicate)-411(de\014nitions,)-431(the)-411(last)-411(one)-411(loaded)-411(tak)27(es)-411(precedence)-411(o)27(v)28(er)-410(the)]TJ 0 -13.15 TD[(earlier)-333(ones.)]TJ/F4 10.91 Tf -57.6 -22.11 TD[(setup_xfail)-333(")]TJ/F5 10.91 Tf 72.36 0 TD[(con\014g)]TJ/F1 10.91 Tf 32.45 0 TD[([)]TJ/F5 10.91 Tf 3.03 0 TD[(bugid)]TJ/F1 10.91 Tf 27.1 0 TD[(])]TJ/F4 10.91 Tf 3.03 0 TD[(")]TJ/F1 10.91 Tf -80.37 -13.15 TD[(Declares)-368(that)-369(the)-369(test)-369(is)-369(exp)-27(ected)-369(to)-369(fail)-369(on)-369(a)-369(particular)-369(set)-368(of)-369(con\014gurations.)]TJ 0 -13.16 TD[(The)]TJ/F5 10.91 Tf 22.64 0 TD[(con\014g)]TJ/F1 10.91 Tf 32.67 0 TD[(argumen)27(t)-352(m)27(ust)-352(b)-28(e)-353(a)-353(list)-353(of)-353(full)-353(three-part)]TJ/F4 10.91 Tf 202.84 0 TD[(configure)]TJ/F1 10.91 Tf 55.4 0 TD[(target)-353(name;)]TJ -313.55 -13.15 TD[(in)-325(particular,)-328(y)27(ou)-325(ma)27(y)-325(not)-326(use)-326(the)-326(shorter)-326(nic)27(knames)-325(supp)-28(orted)-326(b)27(y)]TJ/F4 10.91 Tf 322.86 0 TD[(configure)]TJ/F1 10.91 Tf -322.86 -13.15 TD[(\(but)-241(y)27(ou)-240(can)-241(use)-241(the)-241(common)-241(shell)-241(wildcard)-241(c)27(haracters)-241(to)-241(sp)-27(ecify)-241(sets)-241(of)-242(names\).)]TJ 0 -13.15 TD[(The)]TJ/F5 10.91 Tf 22.81 0 TD[(bugid)]TJ/F1 10.91 Tf 31.11 0 TD[(argumen)27(t)-367(is)-369(optional,)-377(and)-368(used)-369(only)-368(in)-369(the)-368(logging)-369(\014le)-368(output;)-386(use)]TJ -53.92 -13.15 TD[(it)-320(as)-320(a)-320(link)-320(to)-320(a)-320(bug-trac)27(king)-319(system)-320(suc)26(h)-319(as)]TJ/F7 10.91 Tf 213.74 0 TD[(gna)66(ts)]TJ/F1 10.91 Tf 34.58 0 TD[(\(see)-320(section)-320(\\Ov)27(erview")-319(in)]TJ/F5 10.91 Tf -248.32 -13.15 TD[(T)83(rac)28(king)-333(Bugs)-333(With)-333(GNA)82(TS)]TJ/F1 10.91 Tf 139.14 0 TD[(\).)]TJ ET 0 g 0 G +endstream +endobj +150 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F5 31 0 R +/F8 52 0 R +/F7 49 0 R +>> +endobj +148 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 150 0 R +>> +endobj +153 0 obj +<< +/Length 9059 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(26)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ 57.6 -23.91 TD[(Once)-391(y)27(ou)-391(use)]TJ/F4 10.91 Tf 69.23 0 TD[(setup_xfail)]TJ/F1 10.91 Tf 63 0 TD[(,)-405(the)]TJ/F4 10.91 Tf 26.88 0 TD[(fail)]TJ/F1 10.91 Tf 27.18 0 TD[(and)]TJ/F4 10.91 Tf 21.85 0 TD[(pass)]TJ/F1 10.91 Tf 27.18 0 TD[(pro)-27(cedures)-392(pro)-27(duce)-392(the)-391(mes-)]TJ -235.32 -13.15 TD[(sages)-463(`)]TJ/F4 10.91 Tf 32.45 0 TD[(XFAIL)]TJ/F1 10.91 Tf 28.64 0 TD[(')-463(and)-464(`)]TJ/F4 10.91 Tf 33.75 0 TD[(XPASS)]TJ/F1 10.91 Tf 28.64 0 TD[(')-463(resp)-28(ectiv)27(ely)83(,)-495(allo)27(wing)-463(y)27(ou)-463(to)-464(distinguish)-464(exp)-27(ected)]TJ -123.48 -13.15 TD[(failures)-333(\(and)-333(unexp)-28(ected)-333(success!\))-445(from)-333(other)-333(test)-334(outcomes.)]TJ/F8 10.91 Tf 0 -16.14 TD[(Warning:)]TJ/F1 10.91 Tf 50.18 0 TD[(y)27(ou)-267(m)27(ust)-267(clear)-268(the)-268(exp)-28(ected)-268(failure)-268(after)-268(using)]TJ/F4 10.91 Tf 220.27 0 TD[(setup_xfail)]TJ/F1 10.91 Tf 65.92 0 TD[(in)-268(a)-268(test)]TJ -336.37 -13.15 TD[(case.)-438(An)27(y)-314(call)-315(to)]TJ/F4 10.91 Tf 83.33 0 TD[(pass)]TJ/F1 10.91 Tf 26.35 0 TD[(or)]TJ/F4 10.91 Tf 13.16 0 TD[(fail)]TJ/F1 10.91 Tf 26.35 0 TD[(clears)-314(the)-315(exp)-28(ected)-315(failure)-315(implicitly;)-321(if)-315(the)-315(test)]TJ -149.19 -13.15 TD[(has)-359(some)-360(other)-360(outcome,)-366(e.g.)-524(an)-359(error,)-367(y)27(ou)-359(can)-359(call)]TJ/F4 10.91 Tf 252.33 0 TD[(clear_xfail)]TJ/F1 10.91 Tf 66.92 0 TD[(to)-359(clear)-360(the)]TJ -319.25 -13.16 TD[(exp)-27(ected)-363(failure)-362(explicitly)82(.)-531(Otherwise,)-370(the)-362(exp)-28(ected-failure)-363(declaration)-362(applies)]TJ 0 -13.15 TD[(to)-333(whatev)27(er)-332(test)-334(runs)-333(next,)-333(leading)-334(to)-333(surprising)-333(results.)]TJ/F4 10.91 Tf -57.6 -22.11 TD[(clear_xfail)]TJ/F5 10.91 Tf 66.64 0 TD[(con\014g)]TJ/F1 10.91 Tf -9.04 -13.15 TD[(Cancel)-258(an)-258(exp)-28(ected)-258(failure)-258(\(previously)-258(declared)-258(with)]TJ/F4 10.91 Tf 248.65 0 TD[(setup_xfail)]TJ/F1 10.91 Tf 63 0 TD[(\))-258(for)-258(a)-258(partic-)]TJ -311.65 -13.15 TD[(ular)-323(set)-324(of)-324(con\014gurations.)-441(The)]TJ/F5 10.91 Tf 148.52 0 TD[(con\014g)]TJ/F1 10.91 Tf 32.35 0 TD[(argumen)27(t)-323(is)-323(a)-324(list)-324(of)-324(con\014guration)-324(target)]TJ -180.87 -13.16 TD[(names.)-745(It)-433(is)-434(only)-433(necessary)-434(to)-433(call)]TJ/F4 10.91 Tf 175.87 0 TD[(clear_xfail)]TJ/F1 10.91 Tf 67.73 0 TD[(if)-433(a)-434(test)-433(case)-434(ends)-433(without)]TJ -243.6 -13.15 TD[(calling)-333(either)]TJ/F4 10.91 Tf 65.49 0 TD[(pass)]TJ/F1 10.91 Tf 26.54 0 TD[(or)]TJ/F4 10.91 Tf 13.36 0 TD[(fail)]TJ/F1 10.91 Tf 22.91 0 TD[(,)-333(after)-333(calling)]TJ/F4 10.91 Tf 67 0 TD[(setup_xfail)]TJ/F1 10.91 Tf 63 0 TD[(.)]TJ/F4 10.91 Tf -315.9 -22.11 TD[(verbose)]TJ/F1 10.91 Tf 43.73 0 TD[([)]TJ/F4 10.91 Tf 3.03 0 TD[(-log)]TJ/F1 10.91 Tf 22.91 0 TD[(])-333([)]TJ/F4 10.91 Tf 9.69 0 TD[(-n)]TJ/F1 10.91 Tf 11.46 0 TD[(])-333([)]TJ/F4 10.91 Tf 9.69 0 TD[(--)]TJ/F1 10.91 Tf 11.46 0 TD[(])]TJ/F4 10.91 Tf 6.67 0 TD[(")]TJ/F5 10.91 Tf 5.72 0 TD[(string)]TJ/F4 10.91 Tf 28.3 0 TD[(")]TJ/F5 10.91 Tf 9.36 0 TD[(n)27(um)28(b)-27(er)]TJ/F1 10.91 Tf -104.42 -13.15 TD[(T)83(est)-452(cases)-452(can)-453(use)-453(this)-452(function)-453(to)-452(issue)-453(helpful)-452(messages)-453(dep)-28(ending)-452(on)-453(the)]TJ 0 -13.15 TD[(n)27(um)28(b)-27(er)-334(of)-333(`)]TJ/F4 10.91 Tf 55.19 0 TD[(--verbose)]TJ/F1 10.91 Tf 51.55 0 TD[(')-333(options)-334(on)-334(the)]TJ/F4 10.91 Tf 78.87 0 TD[(runtest)]TJ/F1 10.91 Tf 43.73 0 TD[(command)-333(line.)-446(It)-334(prin)27(ts)]TJ/F5 10.91 Tf 117.7 0 TD[(string)]TJ/F1 10.91 Tf -347.04 -13.16 TD[(if)-455(the)-456(v)54(alue)-454(of)-456(the)-456(v)55(ariable)]TJ/F4 10.91 Tf 137.14 0 TD[(verbose)]TJ/F1 10.91 Tf 45.06 0 TD[(is)-455(higher)-456(than)-456(or)-456(equal)-455(to)-456(the)-456(optional)]TJ/F5 10.91 Tf -182.2 -13.15 TD[(n)27(um)28(b)-27(er)]TJ/F1 10.91 Tf 36.09 0 TD[(.)-473(The)-343(default)-343(v)55(alue)-342(for)]TJ/F5 10.91 Tf 112.58 0 TD[(n)27(um)28(b)-27(er)]TJ/F1 10.91 Tf 40.62 0 TD[(is)-342(1.)-474(Use)-343(the)-343(optional)-343(`)]TJ/F4 10.91 Tf 110.25 0 TD[(-log)]TJ/F1 10.91 Tf 22.91 0 TD[(')-342(argumen)26(t)]TJ -322.45 -13.15 TD[(to)-370(cause)]TJ/F5 10.91 Tf 43.29 0 TD[(string)]TJ/F1 10.91 Tf 32.34 0 TD[(to)-370(alw)27(a)28(ys)-370(b)-27(e)-371(added)-370(to)-370(the)-371(log)-370(\014le,)-379(ev)26(en)-369(if)-370(it)-371(w)27(on't)-369(b)-28(e)-370(prin)26(ted.)]TJ -75.63 -13.15 TD[(Use)-340(the)-341(optional)-340(`)]TJ/F4 10.91 Tf 85.45 0 TD[(-n)]TJ/F1 10.91 Tf 11.45 0 TD[(')-340(argumen)27(t)-340(to)-340(prin)26(t)]TJ/F5 10.91 Tf 96.14 0 TD[(string)]TJ/F1 10.91 Tf 32.01 0 TD[(without)-340(a)-341(trailing)-340(newline.)-466(Use)]TJ -225.05 -13.15 TD[(the)-333(optional)-333(`)]TJ/F4 10.91 Tf 64.24 0 TD[(--)]TJ/F1 10.91 Tf 11.46 0 TD[(')-333(argumen)27(t)-332(if)]TJ/F5 10.91 Tf 65.48 0 TD[(string)]TJ/F1 10.91 Tf 31.94 0 TD[(b)-27(egins)-334(with)]TJ/F4 10.91 Tf 58.54 0 TD[(")]TJ/F1 10.91 Tf 5.73 0 TD[(-)]TJ/F4 10.91 Tf 3.64 0 TD[(")]TJ/F1 10.91 Tf 5.72 0 TD[(.)]TJ/F2 13.09 Tf -304.35 -29.89 TD[(5.3.2)-562(Remote)-375(Comm)30(unication)-374(Pro)-31(cedures)]TJ/F1 10.91 Tf 14.94 -23.11 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(lib/remote.exp)]TJ/F1 10.91 Tf 80.19 0 TD[(')-432(de\014nes)-433(these)-433(functions,)-458(for)-433(establishing)-433(and)-433(managing)-433(comm)27(unica-)]TJ -98.16 -13.15 TD[(tions:)]TJ/F8 10.91 Tf 14.94 -16.14 TD[(Pr)51(o)51(c)51(e)51(dur)51(es)-469(to)-471(establish)-470(a)-471(c)50(onne)52(ction:)]TJ/F1 10.91 Tf 187.47 0 TD[(Eac)27(h)-454(of)-456(these)-456(pro)-28(cedures)-456(tries)-455(to)-456(establish)-456(the)]TJ -202.41 -13.15 TD[(connection)-338(up)-338(to)-338(three)-339(times)-338(b)-28(efore)-338(returning.)-460(W)83(arnings)-338(\(if)-338(retries)-338(will)-339(con)27(tin)28(ue\))-337(or)-339(errors)]TJ 0 -13.15 TD[(\(if)-463(the)-464(attempt)-464(is)-464(abandoned\))-464(rep)-28(ort)-464(on)-463(comm)26(unication)-463(failures.)-836(The)-464(result)-463(for)-464(an)26(y)-462(of)]TJ 0 -13.15 TD[(these)-334(pro)-28(cedures)-335(is)-334(either)]TJ/F4 10.91 Tf 124.88 0 TD[(-1)]TJ/F1 10.91 Tf 11.45 0 TD[(,)-335(when)-334(the)-335(connection)-335(cannot)-334(b)-28(e)-335(established,)-335(or)-334(the)-335(spa)27(wn)-334(ID)]TJ -136.33 -13.15 TD[(returned)-333(b)27(y)-332(the)]TJ/F4 10.91 Tf 78.24 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(command)]TJ/F4 10.91 Tf 49.7 0 TD[(spawn)]TJ/F1 10.91 Tf 28.64 0 TD[(.)]TJ -179.64 -16.14 TD[(It)-295(use)-295(the)-295(v)55(alue)-295(of)-295(the)]TJ/F4 10.91 Tf 106.35 0 TD[(connect)]TJ/F1 10.91 Tf 43.32 0 TD[(\014eld)-295(in)-295(the)]TJ/F4 10.91 Tf 53.9 0 TD[(target_info)]TJ/F1 10.91 Tf 66.22 0 TD[(arra)27(y)-294(\(w)27(as)]TJ/F4 10.91 Tf 52.92 0 TD[(connectmode)]TJ/F1 10.91 Tf 66.22 0 TD[(as)-295(the)]TJ -403.87 -13.15 TD[(t)27(yp)-26(e)-414(of)-413(connection)-413(to)-413(mak)26(e.)-683(Curren)27(t)-412(supp)-28(orted)-413(connection)-413(t)26(yp)-26(es)-414(are)-413(tip,)-433(k)27(ermit,)-432(telnet,)]TJ 0 -13.15 TD[(rsh,)-411(rlogin,)-412(and)-396(netdata.)-633(If)-396(the)]TJ/F4 10.91 Tf 156.25 0 TD[(--reboot)]TJ/F1 10.91 Tf 50.14 0 TD[(option)-396(w)27(as)-395(used)-396(on)-396(the)-396(run)26(test)-395(command)-396(line,)]TJ -206.39 -13.15 TD[(then)-333(the)-333(target)-333(is)-334(reb)-28(o)-27(oted)-334(b)-28(efore)-333(the)-333(connection)-334(is)-333(made.)]TJ/F4 10.91 Tf 0 -22.12 TD[(remote_open)]TJ/F5 10.91 Tf 66.64 0 TD[(t)27(yp)-26(e)]TJ/F8 10.91 Tf -9.04 -13.15 TD[(R)51(emote)-430(Conne)50(ction)-430(Pr)50(o)51(c)51(e)51(dur)51(e.)]TJ/F1 10.91 Tf 155.43 0 TD[(This)-412(is)-413(passed)]TJ/F8 10.91 Tf 73.15 0 TD[(host)]TJ/F1 10.91 Tf 24.77 0 TD[(or)]TJ/F8 10.91 Tf 14.24 0 TD[(tar)51(get)]TJ/F1 10.91 Tf 26.9 0 TD[(.)-682(Host)-413(or)-413(target)]TJ -294.49 -13.15 TD[(refers)-344(to)-345(whether)-344(it)-345(is)-345(a)-344(connection)-345(to)-345(a)-344(remote)-345(target,)-347(or)-345(a)-345(remote)-344(host.)-479(This)]TJ 0 -13.15 TD[(op)-27(ens)-379(the)-379(connection)-378(to)-379(the)-379(desired)-378(target)-379(or)-379(host)-378(using)-379(the)-379(default)-378(v)54(alues)-377(in)]TJ 0 -13.15 TD[(the)-270(con\014guration)-271(system.)-424(It)-270(returns)-271(that)]TJ/F4 10.91 Tf 194.81 0 TD[(spawn_id)]TJ/F1 10.91 Tf 48.78 0 TD[(of)-270(the)-271(pro)-28(cess)-271(that)-270(manages)]TJ -243.59 -13.15 TD[(the)-350(connection.)-497(This)-351(v)55(alue)-350(can)-350(b)-28(e)-351(used)-351(in)]TJ/F4 10.91 Tf 205.05 0 TD[(expect)]TJ/F1 10.91 Tf 38.19 0 TD[(or)]TJ/F4 10.91 Tf 13.55 0 TD[(exp_send)]TJ/F1 10.91 Tf 49.65 0 TD[(statemen)27(ts,)-354(or)]TJ -306.44 -13.15 TD[(passed)-282(to)-282(other)-282(pro)-28(cedures)-282(that)-282(need)-282(the)-282(connection)-283(pro)-27(cess's)-282(id.)-428(This)-282(also)-282(sets)]TJ 0 -13.16 TD[(the)]TJ/F4 10.91 Tf 18.79 0 TD[(fileid)]TJ/F1 10.91 Tf 38 0 TD[(\014eld)-333(in)-333(the)]TJ/F4 10.91 Tf 55.15 0 TD[(target_info)]TJ/F1 10.91 Tf 66.64 0 TD[(arra)27(y)84(.)]TJ ET 0 g 0 G +endstream +endobj +154 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F8 52 0 R +/F5 31 0 R +/F2 12 0 R +>> +endobj +152 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 154 0 R +>> +endobj +157 0 obj +<< +/Length 8999 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(5:)-444(The)-334(DejaGn)27(u)-332(Implemen)27(tation)-20326(27)]TJ/F4 10.91 Tf 0 -23.91 TD[(remote_close)]TJ/F5 10.91 Tf 72.36 0 TD[(shellid)]TJ/F8 10.91 Tf -14.76 -13.15 TD[(shel)-51(lid)]TJ/F1 10.91 Tf 35.06 0 TD[(is)-350(v)55(alue)-350(returned)-350(b)27(y)-349(a)-351(call)-350(to)]TJ/F4 10.91 Tf 142.32 0 TD[(remote_open)]TJ/F1 10.91 Tf 63 0 TD[(.)-495(This)-350(closes)-350(the)-351(connection)]TJ -240.38 -13.15 TD[(to)-301(the)-302(target)-302(so)-302(resources)-301(can)-302(b)-28(e)-302(used)-302(b)27(y)-301(others.)-433(This)-302(parameter)-302(can)-302(b)-28(e)-301(left)-302(o\013)]TJ 0 -13.15 TD[(if)-333(the)]TJ/F4 10.91 Tf 28.79 0 TD[(fileid)]TJ/F1 10.91 Tf 38 0 TD[(\014eld)-333(in)-333(the)]TJ/F4 10.91 Tf 55.15 0 TD[(target_info)]TJ/F1 10.91 Tf 66.64 0 TD[(arra)27(y)-332(is)-333(set.)]TJ/F4 10.91 Tf -246.18 -22.12 TD[(telnet)]TJ/F5 10.91 Tf 38 0 TD[(hostname)-389(p)-28(ort)]TJ/F4 10.91 Tf -38 -13.15 TD[(rlogin)]TJ/F5 10.91 Tf 38 0 TD[(hostname)]TJ/F4 10.91 Tf -38 -13.15 TD[(rsh)]TJ/F5 10.91 Tf 20.82 0 TD[(hostname)]TJ/F8 10.91 Tf 36.78 -13.15 TD[(IP)-283(network)-284(pr)50(o)51(c)51(e)51(dur)51(es.)]TJ/F5 10.91 Tf 111.43 0 TD[(hostname)]TJ/F1 10.91 Tf 48.89 0 TD[(refers)-253(to)-253(the)-253(IP)-253(address)-253(or)-253(name)-253(\(for)-253(example,)]TJ -160.32 -13.15 TD[(an)-263(en)27(try)-263(in)-263(`)]TJ/F4 10.91 Tf 57.14 0 TD[(/etc/hosts)]TJ/F1 10.91 Tf 57.27 0 TD[('\))-263(for)-264(this)-263(target.)-421(The)-264(pro)-28(cedure)-263(names)-264(re\015ect)-263(the)-264(Unix)]TJ -114.41 -13.16 TD[(utilit)27(y)-338(used)-340(to)-340(establish)-339(a)-340(connection.)-464(The)-339(optional)]TJ/F5 10.91 Tf 249.36 0 TD[(p)-27(ort)]TJ/F1 10.91 Tf 24.28 0 TD[(is)-339(used)-340(to)-340(sp)-27(ecify)-340(the)]TJ -273.64 -13.15 TD[(IP)-383(p)-28(ort)-384(n)27(um)28(b)-27(er.)-596(The)-383(v)54(alue)-383(of)-383(the)]TJ/F4 10.91 Tf 169.71 0 TD[(netport)]TJ/F1 10.91 Tf 44.27 0 TD[(\014eld)-383(in)-384(the)]TJ/F4 10.91 Tf 56.81 0 TD[(target_info)]TJ/F1 10.91 Tf 67.18 0 TD[(arra)27(y)-382(is)]TJ -337.97 -13.15 TD[(used.)-712(\(w)26(as)]TJ/F4 10.91 Tf 58.27 0 TD[($netport)]TJ/F1 10.91 Tf 45.82 0 TD[(\))-422(This)-423(v)54(alue)-421(has)-423(t)26(w)28(o)-422(parts,)-445(the)-423(hostname)-423(and)-422(the)-423(p)-28(ort)]TJ -104.09 -13.15 TD[(n)27(um)28(b)-27(er,)-297(sep)-28(erated)-288(b)27(y)-287(a)]TJ/F8 10.91 Tf 114.01 0 TD[(:)]TJ/F1 10.91 Tf 3.35 0 TD[(.)-429(If)]TJ/F4 10.91 Tf 18.13 0 TD[(host)]TJ/F1 10.91 Tf 26.05 0 TD[(or)]TJ/F4 10.91 Tf 12.87 0 TD[(target)]TJ/F1 10.91 Tf 37.51 0 TD[(is)-288(used)-288(in)-288(the)]TJ/F4 10.91 Tf 65.43 0 TD[(hostname)]TJ/F1 10.91 Tf 48.96 0 TD[(\014eld,)-297(than)]TJ -326.31 -13.15 TD[(the)-333(con\014g)-333(arra)27(y)-333(is)-333(used)-333(for)-334(all)-333(information.)]TJ/F4 10.91 Tf -57.6 -22.11 TD[(tip)]TJ/F5 10.91 Tf 20.82 0 TD[(p)-27(ort)]TJ/F8 10.91 Tf 36.78 0 TD[(Serial)-314(line)-315(pr)50(o)51(c)51(e)51(dur)51(e.)]TJ/F1 10.91 Tf 103.69 0 TD[(Connect)-286(using)-287(the)-287(Unix)-287(utilit)27(y)]TJ/F4 10.91 Tf 147.22 0 TD[(tip)]TJ/F1 10.91 Tf 17.18 0 TD[(.)]TJ/F5 10.91 Tf 7.71 0 TD[(p)-27(ort)]TJ/F1 10.91 Tf 23.7 0 TD[(m)27(ust)-286(b)-27(e)-287(a)-287(name)]TJ -299.5 -13.16 TD[(from)-300(the)]TJ/F4 10.91 Tf 43.85 0 TD[(tip)]TJ/F1 10.91 Tf 20.46 0 TD[(con\014guration)-300(\014le)-300(`)]TJ/F4 10.91 Tf 85.98 0 TD[(/etc/remote)]TJ/F1 10.91 Tf 63 0 TD[('.)-433(Often,)-307(this)-300(is)-300(called)-301(`)]TJ/F4 10.91 Tf 109.23 0 TD[(hardwire)]TJ/F1 10.91 Tf 45.82 0 TD[(',)]TJ -368.34 -13.15 TD[(or)-301(something)-301(lik)27(e)-300(`)]TJ/F4 10.91 Tf 87.52 0 TD[(ttya)]TJ/F1 10.91 Tf 22.91 0 TD[('.)-433(This)-301(\014le)-302(holds)-301(all)-301(the)-301(con\014guration)-301(data)-301(for)-302(the)-301(serial)]TJ -110.43 -13.15 TD[(p)-27(ort.)-677(The)-410(v)54(alue)-409(of)-411(the)]TJ/F4 10.91 Tf 115.94 0 TD[(serial)]TJ/F1 10.91 Tf 38.84 0 TD[(\014eld)-410(in)-411(the)]TJ/F4 10.91 Tf 57.68 0 TD[(target_info)]TJ/F1 10.91 Tf 67.48 0 TD[(arra)27(y)-409(is)-411(used.)-676(\(w)26(as)]TJ/F4 10.91 Tf -279.94 -13.15 TD[($serialport)]TJ/F1 10.91 Tf 63 0 TD[(\))-289(If)]TJ/F4 10.91 Tf 17.84 0 TD[(host)]TJ/F1 10.91 Tf 26.06 0 TD[(or)]TJ/F4 10.91 Tf 12.89 0 TD[(target)]TJ/F1 10.91 Tf 37.53 0 TD[(is)-289(used)-290(in)-290(the)]TJ/F4 10.91 Tf 65.49 0 TD[(port)]TJ/F1 10.91 Tf 26.07 0 TD[(\014eld,)-298(than)-290(the)-289(con\014g)-290(arra)27(y)]TJ -248.88 -13.15 TD[(is)-333(used)-333(for)-333(all)-334(information.)]TJ/F4 10.91 Tf -57.6 -22.12 TD[(kermit)]TJ/F5 10.91 Tf 38 0 TD[(p)-27(ort)-355(bps)]TJ/F8 10.91 Tf 19.6 -13.15 TD[(Serial)-414(line)-414(pr)50(o)51(c)51(e)51(dur)51(e.)]TJ/F1 10.91 Tf 108.04 0 TD[(Connect)-394(using)-395(the)-395(program)]TJ/F4 10.91 Tf 136.74 0 TD[(kermit)]TJ/F1 10.91 Tf 34.36 0 TD[(.)]TJ/F5 10.91 Tf 9.89 0 TD[(p)-27(ort)]TJ/F1 10.91 Tf 24.88 0 TD[(is)-394(the)-395(device)]TJ -313.91 -13.15 TD[(name,)-299(e.g.)-430(`)]TJ/F4 10.91 Tf 55.84 0 TD[(/dev/ttyb)]TJ/F1 10.91 Tf 51.55 0 TD[('.)]TJ/F5 10.91 Tf 10.75 0 TD[(bps)]TJ/F1 10.91 Tf 20.05 0 TD[(is)-291(the)-291(line)-291(sp)-28(eed)-291(to)-291(use)-291(\(in)-291(bits)-291(p)-28(er)-291(second\))-291(for)-291(the)]TJ -138.19 -13.15 TD[(connection.)-644(The)-400(v)54(alue)-399(of)-400(the)]TJ/F4 10.91 Tf 145.7 0 TD[(serial)]TJ/F1 10.91 Tf 38.73 0 TD[(\014eld)-400(in)-400(the)]TJ/F4 10.91 Tf 57.33 0 TD[(target_info)]TJ/F1 10.91 Tf 67.37 0 TD[(arra)27(y)-399(is)-400(used.)]TJ -309.13 -13.15 TD[(\(w)27(as)]TJ/F4 10.91 Tf 24.98 0 TD[($serialport)]TJ/F1 10.91 Tf 63 0 TD[(\))-311(If)]TJ/F4 10.91 Tf 18.32 0 TD[(host)]TJ/F1 10.91 Tf 26.31 0 TD[(or)]TJ/F4 10.91 Tf 13.13 0 TD[(target)]TJ/F1 10.91 Tf 37.76 0 TD[(is)-311(used)-312(in)-312(the)]TJ/F4 10.91 Tf 66.46 0 TD[(port)]TJ/F1 10.91 Tf 26.31 0 TD[(\014eld,)-316(than)-311(the)-312(con\014g)]TJ -276.27 -13.15 TD[(arra)27(y)-332(is)-333(used)-334(for)-333(all)-333(information.)]TJ/F8 10.91 Tf -57.6 -19.13 TD[(Pr)51(o)51(c)51(e)51(dur)51(es)-357(to)-357(manage)-358(a)-358(c)50(onne)51(ction:)]TJ/F4 10.91 Tf 0 -22.11 TD[(tip_download)]TJ/F5 10.91 Tf 72.36 0 TD[(spa)27(wnid)-371(\014le)]TJ/F1 10.91 Tf -14.76 -13.15 TD[(Do)27(wnload)-271(`)]TJ/F5 10.91 Tf 53.42 0 TD[(\014le)]TJ/F1 10.91 Tf 14.55 0 TD[(')-271(to)-272(the)-272(pro)-28(cess)]TJ/F5 10.91 Tf 74.14 0 TD[(spa)27(wnid)]TJ/F1 10.91 Tf 41.94 0 TD[(\(the)-271(v)54(alue)-271(returned)-272(when)-272(the)-272(connection)]TJ -184.05 -13.16 TD[(w)27(as)-453(established\),)-485(using)-455(the)]TJ/F4 10.91 Tf 137.08 0 TD[(~put)]TJ/F1 10.91 Tf 27.86 0 TD[(command)-454(under)]TJ/F4 10.91 Tf 83.28 0 TD[(tip)]TJ/F1 10.91 Tf 17.19 0 TD[(.)-808(Most)-454(often)-455(used)-454(for)]TJ -265.41 -13.15 TD[(single)-334(b)-28(oard)-335(computers)-335(that)-335(require)-335(do)27(wnloading)-334(programs)-335(in)]TJ/F7 10.91 Tf 298.99 0 TD[(asci)-22(i)]TJ/F1 10.91 Tf 28.62 0 TD[(S-records.)]TJ -327.61 -13.15 TD[(Returns)]TJ/F4 10.91 Tf 41.45 0 TD[(1)]TJ/F1 10.91 Tf 9.37 0 TD[(if)-333(an)-333(error)-333(o)-28(ccurs,)]TJ/F4 10.91 Tf 88.67 0 TD[(0)]TJ/F1 10.91 Tf 9.36 0 TD[(otherwise.)]TJ/F4 10.91 Tf -206.45 -22.11 TD[(exit_remote_shell)]TJ/F5 10.91 Tf 101 0 TD[(spa)27(wnid)]TJ/F1 10.91 Tf -43.4 -13.15 TD[(Exits)-376(a)-377(remote)-377(pro)-28(cess)-376(started)-377(b)27(y)-376(an)27(y)-376(of)-377(the)-376(connection)-377(pro)-28(cedures.)]TJ/F5 10.91 Tf 335.85 0 TD[(spa)27(wnid)]TJ/F1 10.91 Tf -335.85 -13.16 TD[(is)-333(the)-333(result)-333(of)-334(the)-333(connection)-333(pro)-28(cedure)-334(that)-333(started)-333(the)-334(remote)-333(pro)-28(cess.)]TJ/F4 10.91 Tf -57.6 -22.11 TD[(download)]TJ/F5 10.91 Tf 49.45 0 TD[(\014le)]TJ/F1 10.91 Tf 18.19 0 TD[([)]TJ/F5 10.91 Tf 6.67 0 TD[(spa)27(wnid)]TJ/F1 10.91 Tf 42.61 0 TD[(])]TJ -59.32 -13.15 TD[(After)-308(y)27(ou)-307(establish)-308(a)-308(connection)-309(to)-308(a)-308(target,)-313(y)27(ou)-308(can)-308(do)27(wnload)-307(programs)-308(using)]TJ 0 -13.15 TD[(this)-436(command.)]TJ/F4 10.91 Tf 79.73 0 TD[(download)]TJ/F1 10.91 Tf 50.59 0 TD[(reads)-436(in)]TJ/F5 10.91 Tf 43.56 0 TD[(\014le)]TJ/F1 10.91 Tf 19.32 0 TD[(\(ob)-55(ject)-437(co)-28(de)-437(in)-437(S-record)-437(format\))-437(and)]TJ -193.2 -13.15 TD[(writes)-325(it)-325(to)-325(the)-325(device)-326(con)27(trolling)-324(this)]TJ/F5 10.91 Tf 183.2 0 TD[(spa)27(wnid)]TJ/F1 10.91 Tf 38.55 0 TD[(.)-441(\(F)82(rom)-324(the)-325(p)-28(oin)27(t)-325(of)-325(view)-325(of)-325(the)]TJ -221.75 -13.16 TD[(target,)-333(the)-333(S-record)-333(\014le)-334(comes)-333(in)-333(via)-334(standard)-333(input.\))]TJ 0 -16.13 TD[(If)-419(y)27(ou)-418(ha)26(v)28(e)-418(more)-419(than)-420(one)-419(target)-419(activ)26(e,)-439(y)26(ou)-418(can)-419(use)-420(the)-419(optional)-419(argumen)26(t)]TJ/F5 10.91 Tf 0 -13.16 TD[(spa)27(wnid)]TJ/F1 10.91 Tf 42.15 0 TD[(to)-291(sp)-27(ecify)-292(an)-291(alternativ)27(e)-290(target)-292(\(the)-291(default)-291(is)-291(the)-291(most)-292(recen)27(tly)-290(estab-)]TJ -42.15 -13.15 TD[(lished)]TJ/F5 10.91 Tf 30.97 0 TD[(spa)27(wnid)]TJ/F1 10.91 Tf 38.55 0 TD[(.\))]TJ ET 0 g 0 G +endstream +endobj +158 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F5 31 0 R +/F8 52 0 R +/F7 49 0 R +>> +endobj +156 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 158 0 R +>> +endobj +161 0 obj +<< +/Length 7101 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(28)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F2 13.09 Tf 0 -23.91 TD[(5.3.3)-562(Utilit)30(y)-374(Pro)-31(cedures)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(lib/utils.exp)]TJ/F1 10.91 Tf 74.46 0 TD[(')-333(de\014nes)-333(these)-333(utilit)26(y)-332(pro)-28(cedures:)]TJ/F4 10.91 Tf -92.43 -22.11 TD[(getdirs)]TJ/F5 10.91 Tf 43.73 0 TD[(dir)]TJ/F4 10.91 Tf -43.73 -13.15 TD[(getdirs)]TJ/F5 10.91 Tf 43.73 0 TD[(dir)-405(pattern)]TJ/F1 10.91 Tf 13.87 -13.15 TD[(Returns)-237(a)-238(list)-238(of)-238(all)-238(the)-238(directories)-238(in)-238(the)-238(single)-238(directory)]TJ/F5 10.91 Tf 264.86 0 TD[(dir)]TJ/F1 10.91 Tf 16.74 0 TD[(that)-237(matc)26(h)]TJ/F5 10.91 Tf 54.59 0 TD[(pattern)]TJ/F1 10.91 Tf 35.18 0 TD[(.)]TJ -371.37 -13.16 TD[(If)-341(y)27(ou)-340(do)-341(not)-341(sp)-28(ecify)]TJ/F5 10.91 Tf 102.6 0 TD[(pattern)]TJ/F1 10.91 Tf 35.18 0 TD[(,)]TJ/F4 10.91 Tf 6.77 0 TD[(getdirs)]TJ/F1 10.91 Tf 43.82 0 TD[(assumes)-341(`)]TJ/F4 10.91 Tf 45.11 0 TD[(*)]TJ/F1 10.91 Tf 5.73 0 TD[('.)-467(Y)82(ou)-340(ma)27(y)-340(use)-341(the)-341(common)]TJ -239.21 -13.15 TD[(shell)-358(wildcard)-359(c)26(haracters)-358(in)]TJ/F5 10.91 Tf 134.97 0 TD[(pattern)]TJ/F1 10.91 Tf 35.18 0 TD[(.)-521(If)-359(no)-359(directories)-359(matc)27(h)-358(the)-359(pattern,)-365(then)]TJ -170.15 -13.15 TD[(a)]TJ/F4 10.91 Tf 9.09 0 TD[(NULL)]TJ/F1 10.91 Tf 26.55 0 TD[(string)-333(is)-333(returned.)]TJ/F4 10.91 Tf -93.24 -22.11 TD[(find)]TJ/F5 10.91 Tf 26.55 0 TD[(dir)-405(pattern)]TJ/F1 10.91 Tf 31.05 -13.15 TD[(Searc)27(h)-453(for)-455(\014les)-455(whose)-455(names)-455(matc)27(h)]TJ/F5 10.91 Tf 180.01 0 TD[(pattern)]TJ/F1 10.91 Tf 40.14 0 TD[(\(using)-454(shell)-455(wildcard)-455(c)27(haracters)]TJ -220.15 -13.15 TD[(for)-336(\014lename)-337(expansion\).)-456(Searc)27(h)-336(sub)-28(directories)-336(recursiv)26(ely)84(,)-337(starting)-337(at)]TJ/F5 10.91 Tf 334.25 0 TD[(dir)]TJ/F1 10.91 Tf 13.37 0 TD[(.)-455(The)]TJ -347.62 -13.16 TD[(result)-452(is)-452(the)-453(list)-452(of)-453(\014les)-452(whose)-452(names)-453(matc)27(h;)-511(if)-452(no)-453(\014les)-452(matc)27(h,)-482(the)-452(result)-452(is)]TJ 0 -13.15 TD[(empt)27(y)84(.)-580(Filenames)-378(in)-379(the)-378(result)-379(include)-379(all)-378(in)26(terv)28(ening)-377(sub)-28(directory)-379(names.)-580(If)]TJ 0 -13.15 TD[(no)-333(\014les)-333(matc)27(h)-333(the)-333(pattern,)-333(then)-334(a)]TJ/F4 10.91 Tf 164.64 0 TD[(NULL)]TJ/F1 10.91 Tf 26.54 0 TD[(string)-333(is)-333(returned.)]TJ/F4 10.91 Tf -248.78 -22.11 TD[(which)]TJ/F5 10.91 Tf 32.27 0 TD[(binary)]TJ/F1 10.91 Tf 25.33 -13.15 TD[(Searc)27(hes)-461(the)-463(execution)-463(path)-462(for)-463(an)-462(executable)-463(\014le)]TJ/F5 10.91 Tf 251.41 0 TD[(binary)]TJ/F1 10.91 Tf 30.63 0 TD[(,)-494(lik)26(e)-461(the)-463(the)-463(BSD)]TJ/F4 10.91 Tf -282.04 -13.16 TD[(which)]TJ/F1 10.91 Tf 33.34 0 TD[(utilit)27(y)84(.)-737(This)-431(pro)-28(cedure)-431(uses)-431(the)-431(shell)-431(en)27(vironmen)28(t)-430(v)55(ariable)-430(`)]TJ/F4 10.91 Tf 295.86 0 TD[(PATH)]TJ/F1 10.91 Tf 22.91 0 TD[('.)-737(It)]TJ -352.11 -13.15 TD[(returns)]TJ/F4 10.91 Tf 37.99 0 TD[(0)]TJ/F1 10.91 Tf 9.66 0 TD[(if)-360(the)-360(binary)-361(is)-360(not)-360(in)-361(the)-360(path,)-367(or)-361(if)-360(there)-360(is)-361(no)-360(`)]TJ/F4 10.91 Tf 237.76 0 TD[(PATH)]TJ/F1 10.91 Tf 22.91 0 TD[(')-360(en)27(vironmen)28(t)]TJ -308.32 -13.15 TD[(v)55(ariable.)-443(If)]TJ/F5 10.91 Tf 56.09 0 TD[(binary)]TJ/F1 10.91 Tf 35.21 0 TD[(is)-333(in)-333(the)-333(path,)-334(it)-333(returns)-333(the)-334(full)-333(path)-333(to)]TJ/F5 10.91 Tf 196.24 0 TD[(binary)]TJ/F1 10.91 Tf 30.64 0 TD[(.)]TJ/F4 10.91 Tf -375.78 -22.11 TD[(grep)]TJ/F5 10.91 Tf 26.55 0 TD[(\014lename)-389(regexp)]TJ/F4 10.91 Tf -26.55 -19.13 TD[(grep)]TJ/F5 10.91 Tf 26.55 0 TD[(\014lename)-389(regexp)]TJ/F4 10.91 Tf 78.85 0 TD[(line)]TJ/F1 10.91 Tf -47.8 -13.15 TD[(Searc)27(h)-385(the)-387(\014le)-386(called)]TJ/F5 10.91 Tf 104.47 0 TD[(\014lename)]TJ/F1 10.91 Tf 44.23 0 TD[(\(a)-386(fully)-387(sp)-27(eci\014ed)-387(path\))-386(for)-387(lines)-387(that)-386(con)27(tain)-386(a)]TJ -148.7 -13.15 TD[(matc)27(h)-410(for)-411(regular)-411(expression)]TJ/F5 10.91 Tf 142.72 0 TD[(regexp)]TJ/F1 10.91 Tf 31.24 0 TD[(.)-677(The)-411(result)-411(is)-411(a)-411(list)-411(of)-411(all)-411(the)-411(lines)-411(that)]TJ -173.96 -13.15 TD[(matc)27(h.)-574(If)-377(no)-377(lines)-377(matc)27(h,)-387(the)-377(result)-377(is)-377(an)-377(empt)26(y)-376(string.)-575(Sp)-28(ecify)]TJ/F5 10.91 Tf 313.81 0 TD[(regexp)]TJ/F1 10.91 Tf 35.68 0 TD[(using)]TJ -349.49 -13.15 TD[(the)-333(standard)-333(regular)-333(expression)-334(st)27(yle)-332(used)-334(b)27(y)-332(the)-334(Unix)-333(utilit)27(y)-332(program)]TJ/F4 10.91 Tf 341.39 0 TD[(grep)]TJ/F1 10.91 Tf 22.91 0 TD[(.)]TJ -364.3 -16.14 TD[(Use)-310(the)-311(optional)-311(third)-311(argumen)26(t)-309(`)]TJ/F4 10.91 Tf 160.11 0 TD[(line)]TJ/F1 10.91 Tf 22.91 0 TD[(')-310(to)-311(start)-311(lines)-311(in)-311(the)-311(result)-311(with)-311(the)-311(line)]TJ -183.02 -13.15 TD[(n)27(um)28(b)-27(er)-400(in)]TJ/F5 10.91 Tf 53.91 0 TD[(\014lename)]TJ/F1 10.91 Tf 39.4 0 TD[(.)-645(\(This)-400(argumen)27(t)-399(is)-400(simply)-401(an)-400(option)-400(\015ag;)-434(t)27(yp)-27(e)-400(it)-400(just)-400(as)]TJ -93.31 -13.16 TD[(sho)27(wn|`)]TJ/F4 10.91 Tf 43.39 0 TD[(line)]TJ/F1 10.91 Tf 22.91 0 TD[('.\))]TJ/F4 10.91 Tf -123.9 -22.11 TD[(diff)]TJ/F5 10.91 Tf 26.55 0 TD[(\014lename)-389(\014lename)]TJ/F1 10.91 Tf 31.05 -13.15 TD[(Compares)-373(the)-373(t)27(w)28(o)-372(\014les)-373(and)-373(returns)-373(a)-373(1)-373(if)-373(they)-373(matc)26(h,)-382(or)-373(a)-373(0)-373(if)-373(they)-373(don't.)-563(If)]TJ/F4 10.91 Tf 0 -13.15 TD[(verbose)]TJ/F1 10.91 Tf 43.73 0 TD[(is)-333(set,)-333(then)-333(it'll)-334(prin)27(t)-332(the)-334(di\013erences)-333(to)-333(the)-334(screen.)]TJ/F4 10.91 Tf -101.33 -22.12 TD[(slay)]TJ/F5 10.91 Tf 26.55 0 TD[(name)]TJ/F1 10.91 Tf 31.05 -13.15 TD[(This)-348(lo)-27(ok)-348(in)-349(the)-348(pro)-27(cess)-349(tab)-27(el)-348(for)]TJ/F5 10.91 Tf 163.49 0 TD[(name)]TJ/F1 10.91 Tf 29.86 0 TD[(and)-348(send)-348(it)-348(a)-348(unix)]TJ/F4 10.91 Tf 91.48 0 TD[(SIGINT)]TJ/F1 10.91 Tf 34.36 0 TD[(,)-351(killing)-348(the)]TJ -319.19 -13.15 TD[(pro)-27(cess.)]TJ/F4 10.91 Tf -57.6 -22.12 TD[(absolute)]TJ/F5 10.91 Tf 49.45 0 TD[(path)]TJ/F1 10.91 Tf 8.15 -13.15 TD[(This)-333(pro)-28(cedure)-333(tak)27(es)-332(the)-334(relativ)27(e)]TJ/F5 10.91 Tf 161.12 0 TD[(path)]TJ/F1 10.91 Tf 21.82 0 TD[(,)-333(and)-333(con)27(v)27(erts)-332(it)-333(to)-334(an)-333(absolute)-333(path.)]TJ/F4 10.91 Tf -240.54 -22.12 TD[(psource)]TJ/F5 10.91 Tf 43.73 0 TD[(\014lename)]TJ/F1 10.91 Tf 13.87 -13.15 TD[(This)-276(sources)-277(the)-276(\014le)]TJ/F5 10.91 Tf 96.52 0 TD[(\014lename)]TJ/F1 10.91 Tf 39.4 0 TD[(,)-287(and)-277(traps)-277(all)-276(errors.)-426(It)-276(also)-277(ignores)-277(all)-276(extraneous)]TJ -135.92 -13.15 TD[(output.)-444(If)-333(there)-334(w)27(as)-332(an)-333(error)-334(it)-333(returns)-333(a)-334(1,)-333(otherwise)-333(it)-334(returns)-333(a)-333(0.)]TJ ET 0 g 0 G +endstream +endobj +162 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +/F5 31 0 R +>> +endobj +160 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 162 0 R +>> +endobj +165 0 obj +<< +/Length 6747 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(5:)-444(The)-334(DejaGn)27(u)-332(Implemen)27(tation)-20326(29)]TJ/F4 10.91 Tf 0 -23.91 TD[(prune)]TJ/F5 10.91 Tf 32.27 0 TD[(list)-355(pattern)]TJ/F1 10.91 Tf 25.33 -13.15 TD[(Remo)27(v)28(e)-386(elemen)27(ts)-386(of)-387(the)-387(Tcl)-387(list)]TJ/F5 10.91 Tf 158.02 0 TD[(list)]TJ/F1 10.91 Tf 14.61 0 TD[(.)-605(Elemen)27(ts)-386(are)-387(\014elds)-387(delimited)-387(b)27(y)-386(spaces.)]TJ -172.63 -13.15 TD[(The)-319(result)-320(is)-319(a)-320(cop)27(y)-319(of)]TJ/F5 10.91 Tf 109.86 0 TD[(list)]TJ/F1 10.91 Tf 14.61 0 TD[(,)-322(without)-319(an)26(y)-318(elemen)26(ts)-318(that)-320(matc)27(h)]TJ/F5 10.91 Tf 168.28 0 TD[(pattern)]TJ/F1 10.91 Tf 35.18 0 TD[(.)-439(Y)82(ou)-319(can)]TJ -327.93 -13.15 TD[(use)-333(the)-333(common)-333(shell)-334(wildcard)-333(c)27(haracters)-333(to)-333(sp)-28(ecify)]TJ/F5 10.91 Tf 251.85 0 TD[(pattern)]TJ/F1 10.91 Tf 35.18 0 TD[(.)]TJ/F4 10.91 Tf -344.63 -22.01 TD[(setenv)]TJ/F5 10.91 Tf 38 0 TD[(v)55(ar)-404(v)55(al)]TJ/F1 10.91 Tf 19.6 -13.15 TD[(Sets)-333(the)-333(v)54(ariable)]TJ/F5 10.91 Tf 82.82 0 TD[(v)55(ar)]TJ/F1 10.91 Tf 19.3 0 TD[(to)-333(the)-333(v)54(alue)]TJ/F5 10.91 Tf 60.3 0 TD[(v)55(al)]TJ/F1 10.91 Tf 13.64 0 TD[(.)]TJ/F4 10.91 Tf -233.66 -22 TD[(unsetenv)]TJ/F5 10.91 Tf 49.45 0 TD[(v)55(ar)]TJ/F1 10.91 Tf 8.15 -13.15 TD[(Unsets)-333(the)-333(en)27(vironmen)27(t)-332(v)55(ariable)]TJ/F5 10.91 Tf 158.06 0 TD[(v)55(ar)]TJ/F4 10.91 Tf -215.66 -22 TD[(getenv)]TJ/F5 10.91 Tf 38 0 TD[(v)55(ar)]TJ/F1 10.91 Tf 19.6 -13.15 TD[(returns)-444(the)-445(v)54(alue)-444(of)]TJ/F5 10.91 Tf 101.96 0 TD[(v)55(ar)]TJ/F1 10.91 Tf 20.52 0 TD[(in)-444(the)-445(en)26(vironmen)28(t)-444(if)-445(it)-445(exists,)-472(otherwise)-445(it)-445(returns)]TJ/F4 10.91 Tf -122.48 -13.15 TD[(NULL)]TJ/F1 10.91 Tf 22.91 0 TD[(.)]TJ/F4 10.91 Tf -80.51 -22 TD[(runtest_file_p)]TJ/F5 10.91 Tf 83.82 0 TD[(run)27(tests)-373(testcase)]TJ/F1 10.91 Tf -26.22 -13.15 TD[(Searc)27(h)]TJ/F5 10.91 Tf 34.88 0 TD[(run)27(tests)]TJ/F1 10.91 Tf 42.13 0 TD[(for)]TJ/F5 10.91 Tf 16.7 0 TD[(testcase)]TJ/F1 10.91 Tf 41.34 0 TD[(and)-333(return)-334(1)-334(if)-334(found,)-334(0)-334(if)-334(not.)]TJ/F5 10.91 Tf 150.12 0 TD[(run)27(tests)]TJ/F1 10.91 Tf 42.12 0 TD[(is)-333(a)-334(list)-334(of)]TJ -327.29 -13.15 TD[(t)27(w)28(o)-327(elemen)26(ts.)-441(The)-329(\014rst)-328(is)-329(the)-328(pathname)-329(of)-328(the)-329(testsuite)-328(exp)-28(ect)-329(script)-328(running.)]TJ 0 -13.15 TD[(The)-317(second)-318(is)-318(a)-317(cop)26(y)-316(of)-318(what)-318(w)27(as)-317(on)-318(the)-317(righ)26(t)-316(side)-318(of)-318(the)]TJ/F4 10.91 Tf 274.86 0 TD[(=)]TJ/F1 10.91 Tf 9.2 0 TD[(if)-317(`)]TJ/F4 10.91 Tf 12.86 0 TD[(foo.exp="...")]TJ/F1 10.91 Tf 74.45 0 TD[(')]TJ -371.37 -13.15 TD[(w)27(as)-358(sp)-28(eci\014ed,)-366(or)-360(an)-359(empt)27(y)-359(string)-359(if)-360(no)-359(suc)26(h)-358(argumen)27(t)-359(is)-359(presen)26(t.)-522(This)-359(is)-360(used)]TJ 0 -13.15 TD[(b)27(y)-332(to)-28(ols)-333(lik)27(e)-333(compilers)-333(where)-333(eac)26(h)-332(testcase)-333(is)-334(a)-333(\014le.)]TJ/F4 10.91 Tf -57.6 -22 TD[(prune_system_crud)]TJ/F5 10.91 Tf 101 0 TD[(system)-333(text)]TJ/F1 10.91 Tf -43.4 -13.16 TD[(F)83(or)-320(system)]TJ/F5 10.91 Tf 55.49 0 TD[(system)]TJ/F1 10.91 Tf 32.55 0 TD[(,)-323(delete)-321(text)-321(the)-321(host)-322(or)-321(target)-321(op)-28(erating)-321(system)-321(migh)27(t)-320(issue)]TJ -88.04 -13.15 TD[(that)-230(will)-230(in)26(terfere)-229(with)-230(pattern)-231(matc)27(hing)-230(of)-230(program)-230(output)-231(in)]TJ/F5 10.91 Tf 291.96 0 TD[(text)]TJ/F1 10.91 Tf 19.09 0 TD[(.)-410(An)-230(example)]TJ -311.05 -13.15 TD[(is)-333(the)-333(message)-333(that)-334(is)-333(prin)27(ted)-333(if)-333(a)-333(shared)-334(library)-333(is)-333(out)-334(of)-333(date.)]TJ/F2 13.09 Tf -57.6 -29.73 TD[(5.3.4)-562(Cross)-375(target)-375(pro)-31(cedure)]TJ/F1 10.91 Tf 14.94 -23.07 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(lib/target.exp)]TJ/F1 10.91 Tf 80.19 0 TD[(')-333(de\014nes)-333(these)-333(utilit)26(y)-332(pro)-28(cedures:)]TJ/F4 10.91 Tf -98.16 -22.01 TD[(push_target)]TJ/F8 10.91 Tf 66.64 0 TD[(name)]TJ/F1 10.91 Tf -9.04 -13.15 TD[(This)-260(mak)27(es)-260(the)-261(target)-261(named)]TJ/F8 10.91 Tf 139.83 0 TD[(name)]TJ/F1 10.91 Tf 29.31 0 TD[(b)-27(e)-261(the)-261(curren)27(t)-260(target)-260(connection.)-421(The)-260(v)54(alue)]TJ -169.14 -13.15 TD[(of)]TJ/F8 10.91 Tf 12.39 0 TD[(name)]TJ/F1 10.91 Tf 30.08 0 TD[(is)-330(an)-331(index)-330(in)27(to)-330(the)]TJ/F4 10.91 Tf 96.27 0 TD[(target_info)]TJ/F1 10.91 Tf 66.6 0 TD[(arra)27(y)-329(and)-331(is)-330(set)-331(in)-330(the)-331(global)-330(con\014g)]TJ -205.34 -13.15 TD[(\014le.)]TJ/F4 10.91 Tf -57.6 -22 TD[(pop_target)]TJ/F1 10.91 Tf 57.6 -13.15 TD[(This)-333(unsets)-333(the)-333(curren)26(t)-332(target)-333(connection.)]TJ/F4 10.91 Tf -57.6 -22 TD[(list_targets)]TJ/F1 10.91 Tf 57.6 -13.15 TD[(This)-333(lists)-333(all)-333(the)-334(supp)-28(orted)-333(targets)-333(for)-334(this)-333(arc)27(hitecture.)]TJ/F4 10.91 Tf -57.6 -22 TD[(push_host)]TJ/F8 10.91 Tf 55.18 0 TD[(name)]TJ/F1 10.91 Tf 2.42 -13.15 TD[(This)-331(mak)27(es)-330(the)-331(host)-331(named)]TJ/F8 10.91 Tf 135.21 0 TD[(name)]TJ/F1 10.91 Tf 30.08 0 TD[(b)-27(e)-331(the)-331(curren)26(t)-330(remote)-331(host)-331(connection.)-444(The)]TJ -165.29 -13.15 TD[(v)55(alue)-350(of)]TJ/F8 10.91 Tf 40.99 0 TD[(name)]TJ/F1 10.91 Tf 30.3 0 TD[(is)-350(an)-351(index)-351(in)27(to)-350(the)]TJ/F4 10.91 Tf 97.38 0 TD[(target_info)]TJ/F1 10.91 Tf 66.82 0 TD[(arra)27(y)-350(and)-350(is)-351(set)-351(in)-351(the)-351(global)]TJ -235.49 -13.15 TD[(con\014g)-333(\014le.)]TJ/F4 10.91 Tf -57.6 -22 TD[(pop_host)]TJ/F1 10.91 Tf 57.6 0 TD[(This)-333(unsets)-333(the)-333(curren)26(t)-332(host)-333(connection.)]TJ 0 -16.1 TD[(This)-344(in)27(v)28(ok)27(es)-343(the)-345(compiler)-344(as)-345(set)-344(b)27(y)]TJ/F4 10.91 Tf 172.34 0 TD[(CC)]TJ/F1 10.91 Tf 15.21 0 TD[(to)-344(compile)-344(the)-345(\014le)]TJ/F8 10.91 Tf 90.18 0 TD[(\014le)]TJ/F1 10.91 Tf 13.94 0 TD[(.)-477(The)-345(default)-344(op-)]TJ -291.67 -13.16 TD[(tions)-273(for)-274(man)27(y)-273(cross)-273(compilation)-274(targets)-274(are)]TJ/F8 10.91 Tf 209.44 0 TD[(guesse)51(d)]TJ/F1 10.91 Tf 38.96 0 TD[(b)27(y)-272(DejaGn)26(u,)-284(and)-274(these)-274(op-)]TJ -248.4 -13.15 TD[(tions)-294(can)-294(b)-27(e)-294(added)-295(to)-294(b)27(y)-293(passing)-294(in)-294(more)-294(parameters)-294(as)-294(argumen)27(ts)-293(to)]TJ/F4 10.91 Tf 331.28 0 TD[(compile)]TJ/F1 10.91 Tf 40.09 0 TD[(.)]TJ -371.37 -13.15 TD[(Optionally)83(,)-365(this)-360(will)-359(also)-360(use)-359(the)-360(v)55(alue)-359(of)-359(the)]TJ/F4 10.91 Tf 219.79 0 TD[(cflags)]TJ/F1 10.91 Tf 38.29 0 TD[(\014eld)-359(in)-359(the)-360(target)-359(con\014g)]TJ ET 0 g 0 G +endstream +endobj +166 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F5 31 0 R +/F2 12 0 R +/F8 52 0 R +>> +endobj +164 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 166 0 R +>> +endobj +169 0 obj +<< +/Length 6552 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(30)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ 57.6 -23.91 TD[(arra)27(y)84(.)-463(If)-340(the)-340(host)-340(is)-339(not)-340(the)-340(same)-340(as)-340(the)-339(build)-340(mac)27(hines,)-341(then)-340(then)-340(compiler)-339(is)]TJ 0 -13.15 TD[(run)-333(on)-333(the)-333(remote)-334(host)-333(using)]TJ/F4 10.91 Tf 142.61 0 TD[(execute_anywhere)]TJ/F1 10.91 Tf 91.63 0 TD[(.)]TJ -234.24 -15.82 TD[(This)-370(pro)-27(duces)-370(an)-371(arc)27(hiv)28(e)-369(\014le.)-555(An)27(y)-369(parameters)-370(passed)-370(to)]TJ/F4 10.91 Tf 277.26 0 TD[(archive)]TJ/F1 10.91 Tf 44.13 0 TD[(are)-370(used)-370(in)]TJ -321.39 -13.15 TD[(addition)-453(to)-453(the)-453(default)-453(\015ags.)-803(Optionally)82(,)-482(this)-453(will)-453(also)-453(use)-453(the)-453(v)55(alue)-453(of)-453(the)]TJ/F4 10.91 Tf 0 -13.15 TD[(arflags)]TJ/F1 10.91 Tf 44.99 0 TD[(\014eld)-449(in)-450(the)-449(target)-450(con\014g)-449(arra)27(y)83(.)-792(If)-450(the)-449(host)-450(is)-449(not)-450(the)-449(same)-450(as)-450(the)]TJ -44.99 -13.15 TD[(build)-376(mac)27(hines,)-387(then)-377(then)-376(arc)26(hiv)28(er)-375(is)-377(run)-377(on)-377(the)-376(remote)-377(host)-377(using)]TJ/F4 10.91 Tf 328.58 0 TD[(execute_)]TJ -328.58 -13.15 TD[(anywhere)]TJ/F1 10.91 Tf 45.82 0 TD[(.)]TJ -45.82 -15.81 TD[(This)-325(generates)-326(an)-326(index)-326(for)-326(the)-326(arc)27(hiv)28(e)-325(\014le)-326(for)-326(systems)-326(that)-326(aren't)-326(POSIX)-326(y)27(et.)]TJ 0 -13.15 TD[(An)27(y)-332(parameters)-333(passed)-334(to)]TJ/F4 10.91 Tf 127.82 0 TD[(ranlib)]TJ/F1 10.91 Tf 38 0 TD[(are)-333(used)-333(in)-333(for)-334(the)-333(\015ags.)]TJ/F4 10.91 Tf -223.42 -21.15 TD[(execute_anywhere)]TJ/F8 10.91 Tf 95.27 0 TD[(cmd)-51(line)]TJ/F1 10.91 Tf -37.67 -13.15 TD[(This)-414(executes)-415(the)]TJ/F8 10.91 Tf 89.75 0 TD[(cmd)-51(line)]TJ/F1 10.91 Tf 42.7 0 TD[(on)-414(the)-415(prop)-28(er)-414(host.)-689(This)-414(should)-415(b)-28(e)-414(used)-415(as)-415(a)-414(re-)]TJ -132.45 -13.15 TD[(placemen)27(t)-362(for)-363(the)-363(Tcl)-363(command)]TJ/F4 10.91 Tf 158.01 0 TD[(exec)]TJ/F1 10.91 Tf 26.87 0 TD[(as)-363(this)-363(v)27(ersion)-362(utilizes)-363(the)-363(target)-363(con\014g)]TJ -184.88 -13.15 TD[(info)-281(to)-281(execute)-281(this)-281(command)-281(on)-281(the)-281(build)-281(mac)27(hine)-280(or)-282(a)-281(remote)-281(host.)-427(All)-281(con\014g)]TJ 0 -13.15 TD[(information)-339(for)-339(the)-340(remote)-339(host)-340(m)27(ust)-339(b)-27(e)-340(setup)-339(to)-340(ha)27(v)28(e)-339(this)-339(command)-340(w)27(ork.)-462(If)]TJ 0 -13.15 TD[(this)-285(is)-285(a)-285(canadian)-285(cross,)-295(\(where)-285(w)27(e)-284(test)-285(a)-286(cross)-285(compiler)-285(that)-285(runs)-285(on)-285(a)-285(di\013eren)26(t)]TJ 0 -13.15 TD[(host)-326(then)-327(where)-326(DejaGn)26(u)-325(is)-327(running\))-327(then)-326(a)-327(connection)-326(is)-327(made)-327(to)-326(the)-327(remote)]TJ 0 -13.15 TD[(host)-422(and)-422(the)-422(command)-422(is)-422(executed)-422(there.)-710(It)-422(returns)-422(either)]TJ/F8 10.91 Tf 293.73 0 TD[(REMOTERR)25(OR)]TJ/F1 10.91 Tf -293.73 -13.15 TD[(\(for)-354(an)-354(error\))-354(or)-354(the)-355(output)-354(pro)-27(duced)-355(when)-354(the)-354(command)-354(w)26(as)-353(executed.)-507(This)]TJ 0 -13.15 TD[(is)-333(used)-333(for)-333(running)-334(the)-333(to)-28(ol)-333(to)-334(b)-27(e)-334(tested,)-333(not)-333(a)-334(test)-333(case.)]TJ/F2 13.09 Tf -57.6 -25.92 TD[(5.3.5)-562(Debugging)-375(Pro)-31(cedures)]TJ/F1 10.91 Tf 14.94 -22.79 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(lib/debugger.exp)]TJ/F1 10.91 Tf 91.64 0 TD[(')-333(de\014nes)-333(these)-333(utilit)26(y)-332(pro)-28(cedures:)]TJ/F4 10.91 Tf -109.61 -21.14 TD[(dumpvars)]TJ/F8 10.91 Tf 49.45 0 TD[(expr)]TJ/F1 10.91 Tf 8.15 -13.15 TD[(This)-387(tak)27(es)-386(a)-387(csh)-388(st)27(yle)-386(regular)-387(expression)-387(\(glob)-388(rules\))-387(and)-387(prin)27(ts)-387(the)-387(v)55(alues)-386(of)]TJ 0 -13.15 TD[(the)-333(global)-333(v)54(ariable)-332(names)-333(that)-334(matc)27(h.)-443(It)-334(is)-333(abbreviated)-333(as)]TJ/F4 10.91 Tf 282.06 0 TD[(dv)]TJ -339.66 -21.15 TD[(dumplocals)]TJ/F8 10.91 Tf 60.91 0 TD[(expr)]TJ/F1 10.91 Tf -3.31 -13.15 TD[(This)-387(tak)27(es)-386(a)-387(csh)-388(st)27(yle)-386(regular)-387(expression)-387(\(glob)-388(rules\))-387(and)-387(prin)27(ts)-387(the)-387(v)55(alues)-386(of)]TJ 0 -13.15 TD[(the)-333(lo)-28(cal)-333(v)55(ariable)-333(names)-333(that)-333(matc)26(h.)-443(It)-333(is)-334(abbreviated)-333(as)]TJ/F4 10.91 Tf 275.7 0 TD[(dl)]TJ/F1 10.91 Tf 11.45 0 TD[(.)]TJ/F4 10.91 Tf -344.75 -21.14 TD[(dumprocs)]TJ/F8 10.91 Tf 49.45 0 TD[(expr)]TJ/F1 10.91 Tf 8.15 -13.15 TD[(This)-316(tak)27(es)-315(a)-317(csh)-316(st)27(yle)-315(regular)-317(expression)-316(\(glob)-316(rules\))-317(and)-316(prin)27(ts)-316(the)-316(b)-28(o)-27(dy)-317(of)-316(all)]TJ 0 -13.15 TD[(pro)-27(cs)-334(that)-333(matc)27(h.)-444(It)-333(is)-333(abbreviated)-334(as)]TJ/F4 10.91 Tf 185.7 0 TD[(dp)]TJ -243.3 -21.14 TD[(dumpwatch)]TJ/F8 10.91 Tf 55.18 0 TD[(expr)]TJ/F1 10.91 Tf 2.42 -13.15 TD[(This)-349(tak)27(es)-348(a)-349(csh)-349(st)26(yle)-348(regular)-349(expression)-349(\(glob)-349(rules\))-350(and)-349(prin)27(ts)-348(all)-349(the)-350(w)27(atc)28(h-)]TJ 0 -13.15 TD[(p)-27(oin)27(ts.)-444(It)-333(is)-334(abbreviated)-333(as)]TJ/F4 10.91 Tf 132.94 0 TD[(dw)]TJ/F1 10.91 Tf 11.45 0 TD[(.)]TJ/F4 10.91 Tf -201.99 -21.14 TD[(watchunset)]TJ/F8 10.91 Tf 60.91 0 TD[(var)]TJ/F1 10.91 Tf -3.31 -13.15 TD[(This)-262(breaks)-262(program)-262(execution)-263(when)-262(the)-262(v)54(ariable)]TJ/F8 10.91 Tf 234.51 0 TD[(var)]TJ/F1 10.91 Tf 19.23 0 TD[(is)-262(unset.)-421(It)-262(is)-262(abbreviated)]TJ -253.74 -13.15 TD[(as)]TJ/F4 10.91 Tf 13.39 0 TD[(wu)]TJ/F1 10.91 Tf 11.46 0 TD[(.)]TJ/F4 10.91 Tf -82.45 -21.14 TD[(watchwrite)]TJ/F8 10.91 Tf 60.91 0 TD[(var)]TJ/F1 10.91 Tf -3.31 -13.15 TD[(This)-326(breaks)-326(program)-326(execution)-326(when)-327(the)-326(v)55(ariable)]TJ/F8 10.91 Tf 239.4 0 TD[(var)]TJ/F1 10.91 Tf 19.93 0 TD[(is)-326(written.)-442(It)-326(is)-326(abbrevi-)]TJ -259.33 -13.15 TD[(ated)-333(as)]TJ/F4 10.91 Tf 37.64 0 TD[(ww)]TJ/F1 10.91 Tf 11.45 0 TD[(.)]TJ/F4 10.91 Tf -106.69 -21.15 TD[(watchread)]TJ/F8 10.91 Tf 55.18 0 TD[(var)]TJ/F1 10.91 Tf 2.42 -13.15 TD[(This)-301(breaks)-302(program)-302(execution)-301(when)-302(the)-302(v)55(ariable)]TJ/F8 10.91 Tf 237.53 0 TD[(var)]TJ/F1 10.91 Tf 19.66 0 TD[(is)-301(read.)-434(It)-302(is)-302(abbreviated)]TJ -257.19 -13.15 TD[(as)]TJ/F4 10.91 Tf 13.39 0 TD[(wr)]TJ/F1 10.91 Tf 11.46 0 TD[(.)]TJ ET 0 g 0 G +endstream +endobj +170 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F8 52 0 R +/F2 12 0 R +>> +endobj +168 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 170 0 R +>> +endobj +173 0 obj +<< +/Length 9272 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(5:)-333(The)-333(DejaGn)26(u)-332(Implemen)27(tation)-20437(31)]TJ/F4 10.91 Tf 0 -23.91 TD[(watchdel)]TJ/F8 10.91 Tf 49.45 0 TD[(watch)]TJ/F1 10.91 Tf 8.15 -13.15 TD[(This)-333(deletes)-333(a)-333(the)-334(w)27(atc)28(hp)-27(oin)27(t)-333(for)]TJ/F8 10.91 Tf 161.67 0 TD[(watch)]TJ/F1 10.91 Tf 27.04 0 TD[(.)-444(It)-333(is)-334(abbreviated)-333(as)]TJ/F4 10.91 Tf 103.79 0 TD[(wd)]TJ/F1 10.91 Tf 11.45 0 TD[(.)]TJ/F4 10.91 Tf -361.55 -21.59 TD[(print)]TJ/F8 10.91 Tf 32.27 0 TD[(var)]TJ/F1 10.91 Tf 25.33 0 TD[(This)-333(prin)27(ts)-332(the)-334(v)55(alue)-332(of)-334(the)-333(v)54(ariable)]TJ/F8 10.91 Tf 175.33 0 TD[(var)]TJ/F1 10.91 Tf 15.2 0 TD[(.)-444(It)-333(is)-334(abbreviated)-333(as)]TJ/F4 10.91 Tf 103.79 0 TD[(p)]TJ/F1 10.91 Tf 5.72 0 TD[(.)]TJ/F4 10.91 Tf -357.64 -21.58 TD[(quit)]TJ/F1 10.91 Tf 57.6 0 TD[(This)-333(mak)27(es)-332(run)26(test)-332(exit.)-444(It)-334(is)-333(abbreviated)-333(as)]TJ/F4 10.91 Tf 216.73 0 TD[(q)]TJ/F1 10.91 Tf 5.73 0 TD[(.)]TJ/F4 10.91 Tf -280.06 -21.59 TD[(bt)]TJ/F1 10.91 Tf 57.6 0 TD[(This)-333(prin)27(ts)-332(a)-334(bac)27(ktrace)-332(of)-334(the)-333(executed)-333(Tcl)-334(commands.)]TJ/F2 14.35 Tf -57.6 -30.35 TD[(5.4)-562(T)93(arget)-374(dep)-31(enden)30(t)-374(pro)-31(cedures)]TJ/F1 10.91 Tf 14.94 -22.94 TD[(Eac)27(h)-398(com)27(bination)-399(of)-399(target)-400(and)-399(to)-28(ol)-400(requires)-399(some)-400(target-dep)-27(enden)26(t)-398(pro)-28(cedures.)-643(The)]TJ -14.94 -13.15 TD[(names)-258(of)-259(these)-259(pro)-27(cedures)-259(ha)27(v)27(e)-257(a)-259(common)-259(form:)-407(the)-259(to)-28(ol)-258(name,)-274(follo)27(w)28(ed)-258(b)27(y)-258(an)-259(underbar)-259(`)]TJ/F4 10.91 Tf 420.21 0 TD[(_)]TJ/F1 10.91 Tf 5.73 0 TD[(',)]TJ -425.94 -13.15 TD[(and)-288(\014nally)-289(a)-289(su\016x)-288(describing)-289(the)-289(pro)-27(cedure's)-289(purp)-28(ose.)-429(F)82(or)-288(example,)-297(a)-289(pro)-28(cedure)-289(to)-288(extract)]TJ 0 -13.15 TD[(the)-497(v)27(ersion)-496(from)]TJ/F7 10.91 Tf 87 0 TD[(gdb)]TJ/F1 10.91 Tf 25.55 0 TD[(is)-497(called)-497(`)]TJ/F4 10.91 Tf 48.49 0 TD[(gdb_version)]TJ/F1 10.91 Tf 63 0 TD[('.)-935(See)-498(Section)-497(5.2)-497([Initialization)-497(Mo)-28(dule],)]TJ -224.04 -13.15 TD[(page)-419(22,)-440(for)-420(a)-419(discussion)-419(of)-419(ho)27(w)-419(DejaGn)27(u)-418(arranges)-419(to)-420(\014nd)-419(the)-419(righ)27(t)-418(pro)-28(cedures)-419(for)-420(eac)27(h)]TJ 0 -13.15 TD[(target.)]TJ/F4 10.91 Tf 14.94 -15.97 TD[(runtest)]TJ/F1 10.91 Tf 44.72 0 TD[(itself)-423(calls)-424(only)-424(t)27(w)28(o)-423(of)-424(these)-424(pro)-27(cedures,)]TJ/F5 10.91 Tf 200.79 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_exit)]TJ/F1 10.91 Tf 33.26 0 TD[(and)]TJ/F5 10.91 Tf 22.2 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_version)]TJ/F1 10.91 Tf 45.82 0 TD[(;)-468(these)]TJ -399.55 -13.15 TD[(pro)-27(cedures)-334(use)-333(no)-333(argumen)27(ts.)]TJ 14.94 -15.96 TD[(The)-334(other)-334(t)27(w)28(o)-333(pro)-28(cedures,)]TJ/F5 10.91 Tf 129.58 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.92 0 TD[(_start)]TJ/F1 10.91 Tf 38.01 0 TD[(and)]TJ/F5 10.91 Tf 21.22 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_load)]TJ/F1 10.91 Tf 28.64 0 TD[(,)-334(are)-334(only)-334(called)-334(b)27(y)-333(the)-334(test)-334(suites)]TJ -270.22 -13.15 TD[(themselv)27(es)-410(\(or)-410(b)26(y)-410(testsuite-sp)-27(eci\014c)-411(initialization)-411(co)-28(de\);)-449(they)-411(ma)26(y)-409(tak)26(e)-410(argumen)27(ts)-410(or)-410(not,)]TJ 0 -13.15 TD[(dep)-27(ending)-334(on)-333(the)-333(con)27(v)27(en)28(tions)-332(used)-334(within)-333(eac)27(h)-332(test)-334(suite.)]TJ/F5 10.91 Tf 0 -21.59 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_start)]TJ/F1 10.91 Tf 38.69 -13.15 TD[(Starts)-236(a)-237(particular)-237(to)-28(ol.)-412(F)82(or)-236(an)-236(in)26(teractiv)28(e)-236(to)-28(ol,)]TJ/F5 10.91 Tf 224.07 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_start)]TJ/F1 10.91 Tf 36.95 0 TD[(starts)-236(and)-237(initializes)]TJ -279.93 -13.15 TD[(the)-308(to)-27(ol,)-314(lea)27(ving)-307(the)-308(to)-28(ol)-308(up)-309(and)-308(running)-308(for)-308(the)-308(test)-309(cases;)-316(an)-308(example)-309(is)]TJ/F4 10.91 Tf 351.49 0 TD[(gdb_)]TJ -351.49 -13.15 TD[(start)]TJ/F1 10.91 Tf 28.64 0 TD[(,)-463(the)-438(start)-438(function)-437(for)]TJ/F7 10.91 Tf 117 0 TD[(gdb)]TJ/F1 10.91 Tf 20.14 0 TD[(.)-757(F)82(or)-436(a)-438(batc)27(h)-437(orien)27(ted)-437(to)-28(ol,)]TJ/F5 10.91 Tf 143.24 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_start)]TJ/F1 10.91 Tf 39.14 0 TD[(is)]TJ -367.07 -13.15 TD[(optional;)-287(the)-266(recommended)-265(con)27(v)28(en)28(tion)-264(is)-266(to)-265(let)]TJ/F5 10.91 Tf 223.01 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_start)]TJ/F1 10.91 Tf 37.26 0 TD[(run)-265(the)-265(to)-28(ol,)-278(lea)26(ving)]TJ -279.18 -13.15 TD[(the)-448(output)-448(in)-449(a)-448(v)55(ariable)-448(called)]TJ/F4 10.91 Tf 155.74 0 TD[(comp_output)]TJ/F1 10.91 Tf 63 0 TD[(.)-789(T)82(est)-447(scripts)-448(can)-449(then)-448(analyze)]TJ -218.74 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[($comp_output)]TJ/F1 10.91 Tf 68.73 0 TD[(')-349(to)-349(determine)-350(the)-349(test)-350(results.)-492(An)-350(example)-349(of)-349(this)-350(second)-349(kind)]TJ -71.76 -13.15 TD[(of)-333(start)-333(function)-333(is)]TJ/F4 10.91 Tf 92.27 0 TD[(gcc_start)]TJ/F1 10.91 Tf 51.55 0 TD[(,)-333(the)-333(start)-333(function)-334(for)]TJ/F7 10.91 Tf 111.03 0 TD[(gcc)]TJ/F1 10.91 Tf 19.89 0 TD[(.)]TJ/F4 10.91 Tf -274.74 -15.96 TD[(runtest)]TJ/F1 10.91 Tf 42.52 0 TD[(itself)]TJ/F8 10.91 Tf 25.21 0 TD[(do)51(es)-255(not)-255(c)50(al)-50(l)]TJ/F5 10.91 Tf 60.7 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_start)]TJ/F1 10.91 Tf 34.37 0 TD[(.)-407(The)-222(initialization)-222(mo)-28(dule)-222(`)]TJ/F5 10.91 Tf 131.41 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.92 0 TD[(_init.exp)]TJ/F1 10.91 Tf 51.54 0 TD[(')]TJ -383.58 -13.15 TD[(m)27(ust)-383(call)]TJ/F5 10.91 Tf 48.14 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.92 0 TD[(_start)]TJ/F1 10.91 Tf 38.55 0 TD[(for)-384(in)27(teractiv)28(e)-383(to)-28(ols;)-410(for)-384(batc)27(h-orien)27(ted)-383(to)-28(ols,)-397(eac)27(h)-383(indi-)]TJ -105.61 -13.15 TD[(vidual)-444(test)-445(script)-445(calls)]TJ/F5 10.91 Tf 113.86 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_start)]TJ/F1 10.91 Tf 39.22 0 TD[(\(or)-444(mak)27(es)-444(other)-445(arrangemen)27(ts)-444(to)-444(run)-445(the)]TJ -171.99 -13.15 TD[(to)-27(ol\).)]TJ/F5 10.91 Tf -57.6 -21.59 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_load)]TJ/F1 10.91 Tf 38.69 0 TD[(Loads)-272(something)-272(in)26(to)-271(a)-273(to)-27(ol.)-425(F)83(or)-272(an)-272(in)27(teractiv)27(e)-271(to)-28(ol,)-285(this)-272(conditions)-272(the)-273(to)-28(ol)-272(for)]TJ 0 -13.15 TD[(a)-379(particular)-381(test)-380(case;)-403(for)-380(example,)]TJ/F4 10.91 Tf 172.74 0 TD[(gdb_load)]TJ/F1 10.91 Tf 49.96 0 TD[(loads)-379(a)-381(new)-380(executable)-380(\014le)-380(in)27(to)]TJ -222.7 -13.15 TD[(the)-263(debugger.)-421(F)82(or)-262(batc)27(h)-263(orien)27(ted)-262(to)-28(ols,)]TJ/F5 10.91 Tf 186.99 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.92 0 TD[(_load)]TJ/F1 10.91 Tf 31.51 0 TD[(ma)27(y)-262(do)-263(nothing|though,)-278(for)]TJ -237.42 -13.15 TD[(example,)-276(the)]TJ/F7 10.91 Tf 63.15 0 TD[(gcc)]TJ/F1 10.91 Tf 22.75 0 TD[(supp)-27(ort)-263(uses)]TJ/F4 10.91 Tf 62 0 TD[(gcc_load)]TJ/F1 10.91 Tf 48.67 0 TD[(to)-262(load)-262(and)-262(run)-262(a)-263(binary)-262(on)-262(the)-262(target)]TJ -196.57 -13.15 TD[(en)27(vironmen)28(t.)-674(Con)27(v)28(en)28(tionally)83(,)]TJ/F5 10.91 Tf 147.53 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_load)]TJ/F1 10.91 Tf 33.12 0 TD[(lea)27(v)28(es)-409(the)-410(output)-410(of)-410(an)26(y)-409(program)-410(it)]TJ -199.56 -13.15 TD[(runs)-414(in)-415(a)-414(v)54(ariable)-413(called)-415(`)]TJ/F4 10.91 Tf 125.46 0 TD[(exec_output)]TJ/F1 10.91 Tf 63 0 TD[('.)-688(W)83(riting)]TJ/F5 10.91 Tf 54.48 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.92 0 TD[(_load)]TJ/F1 10.91 Tf 33.16 0 TD[(can)-414(b)-28(e)-414(the)-415(most)]TJ -295.02 -13.15 TD[(complex)-297(part)-298(of)-298(extending)-298(DejaGn)27(u)-297(to)-298(a)-297(new)-298(to)-28(ol)-298(or)-298(a)-297(new)-298(target,)-305(if)-298(it)-298(requires)]TJ 0 -13.16 TD[(m)27(uc)28(h)-332(comm)27(unication)-333(co)-28(ding)-333(or)-333(\014le)-334(do)27(wnloading.)]TJ 0 -15.96 TD[(T)83(est)-332(scripts)-334(call)]TJ/F5 10.91 Tf 78.7 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_load)]TJ/F1 10.91 Tf 28.64 0 TD[(.)]TJ/F5 10.91 Tf -183.85 -21.58 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_exit)]TJ/F1 10.91 Tf 38.69 0 TD[(Cleans)-375(up)-375(\(if)-375(necessary\))-375(b)-28(efore)]TJ/F4 10.91 Tf 152.82 0 TD[(runtest)]TJ/F1 10.91 Tf 44.19 0 TD[(exits.)-569(F)82(or)-374(in)27(teractiv)28(e)-375(to)-27(ols,)-386(this)-375(usu-)]TJ -197.01 -13.15 TD[(ally)-425(ends)-425(the)-425(in)27(teractiv)28(e)-424(session.)-719(Y)82(ou)-424(can)-425(also)-425(use)]TJ/F5 10.91 Tf 252.61 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_exit)]TJ/F1 10.91 Tf 33.27 0 TD[(to)-425(remo)27(v)28(e)-424(an)27(y)]TJ -304.79 -13.15 TD[(temp)-27(orary)-334(\014les)-333(left)-333(o)27(v)27(er)-332(from)-333(the)-334(tests.)]TJ/F4 10.91 Tf 0 -15.97 TD[(runtest)]TJ/F1 10.91 Tf 43.73 0 TD[(calls)]TJ/F5 10.91 Tf 24.3 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_exit)]TJ/F1 10.91 Tf 28.64 0 TD[(.)]TJ ET 0 g 0 G +endstream +endobj +174 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F8 52 0 R +/F2 12 0 R +/F7 49 0 R +/F5 31 0 R +>> +endobj +172 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 174 0 R +>> +endobj +178 0 obj +<< +/Type /FontDescriptor +/CapHeight 686.11 +/Ascent 694.44 +/Descent -194.44 +/Flags 4 +/FontBBox [-270 -250 1011 948] +/FontName /CMB10 +/ItalicAngle 0 +/XHeight 444 +/StemV 80 +/FontFile 177 0 R +>> +endobj +179 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F13 +/FontDescriptor 178 0 R +/BaseFont /EUXRYM+CMB10 +/FirstChar 0 +/LastChar 127 +/Widths [600 833.34 777.78 700 666.67 783.34 722.22 777.78 722.22 777.78 722.22 583.34 +555.56 555.56 833.34 833.34 277.78 305.56 500 500 500 500 500 755.56 444.45 559.72 +722.22 777.78 500 905.56 1016.67 777.78 277.78 305.56 544.45 833.34 500 833.34 777.78 +277.78 388.89 388.89 500 777.78 277.78 333.33 277.78 500 500 500 500 500 500 500 +500 500 500 500 277.78 277.78 305.56 777.78 472.22 472.22 777.78 755.56 711.11 722.22 +766.67 655.56 627.78 786.11 783.34 397.22 516.67 783.34 600 950 783.34 750 683.34 +750 759.72 555.56 694.45 769.45 755.56 1033.34 755.56 755.56 611.11 280 544.45 280 +500 277.78 277.78 486.11 555.56 444.45 555.56 466.67 305.56 500 555.56 277.78 305.56 +527.78 277.78 833.34 555.56 500 555.56 527.78 427.78 394.45 390.28 555.56 527.78 +722.22 527.78 527.78 444.45 500 1000 500 500 500] +>> +endobj +180 0 obj +<< +/Length 8736 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(32)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F5 10.91 Tf 0 -23.91 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_version)]TJ/F1 10.91 Tf 38.69 -13.15 TD[(Prin)27(ts)-408(the)-409(v)26(ersion)-408(lab)-28(el)-409(and)-410(n)27(um)28(b)-27(er)-409(for)]TJ/F5 10.91 Tf 198.32 0 TD[(to)-27(ol)]TJ/F1 10.91 Tf 18.49 0 TD[(.)-672(This)-409(is)-410(called)-409(b)27(y)-409(the)-409(DejaGn)27(u)]TJ -216.81 -13.15 TD[(pro)-27(cedure)-357(that)-357(prin)27(ts)-355(the)-357(\014nal)-357(summary)-356(rep)-28(ort.)-515(The)-356(output)-357(should)-357(consist)-356(of)]TJ 0 -13.15 TD[(the)-333(full)-333(path)-333(name)-334(used)-333(for)-333(the)-334(tested)-333(to)-28(ol,)-333(and)-334(its)-333(v)27(ersion)-332(n)26(um)28(b)-27(er.)]TJ/F4 10.91 Tf 0 -16.14 TD[(runtest)]TJ/F1 10.91 Tf 43.73 0 TD[(calls)]TJ/F5 10.91 Tf 24.3 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_version)]TJ/F1 10.91 Tf 45.82 0 TD[(.)]TJ -175.42 -19.13 TD[(The)-352(usual)-353(con)27(v)28(en)28(tion)-352(for)-352(return)-353(co)-28(des)-352(from)-353(an)27(y)-352(of)-352(these)-353(pro)-27(cedures)-353(\(although)-353(it)-352(is)-353(not)]TJ -14.94 -13.15 TD[(required)-296(b)27(y)]TJ/F4 10.91 Tf 57.13 0 TD[(runtest)]TJ/F1 10.91 Tf 40.09 0 TD[(\))-296(is)-296(to)-297(return)]TJ/F4 10.91 Tf 63.97 0 TD[(0)]TJ/F1 10.91 Tf 8.96 0 TD[(if)-296(the)-296(pro)-28(cedure)-296(succeeded,)]TJ/F4 10.91 Tf 131.32 0 TD[(1)]TJ/F1 10.91 Tf 8.96 0 TD[(if)-296(it)-296(failed,)-304(and)]TJ/F4 10.91 Tf 73.01 0 TD[(-1)]TJ/F1 10.91 Tf 14.69 0 TD[(if)-296(there)]TJ -398.13 -13.15 TD[(w)27(as)-332(a)-333(comm)26(unication)-332(error.)]TJ/F2 14.35 Tf 0 -30.89 TD[(5.5)-562(Remote)-375(targets)-375(supp)-31(orted)]TJ/F1 10.91 Tf 14.94 -23.11 TD[(The)-400(DejaGn)27(u)-399(distribution)-400(includes)-400(supp)-28(ort)-400(for)-400(the)-400(follo)27(wing)-399(remote)-400(targets.)-645(Y)82(ou)-399(can)]TJ -14.94 -13.15 TD[(set)-384(the)-384(target)-385(name)-384(and)-385(the)-384(connect)-385(mo)-27(de)-385(in)-384(the)-385(`)]TJ/F4 10.91 Tf 246.58 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.81 0 TD[(')-384(\014le)-384(\(using)-385(the)-384(Tcl)-385(v)55(ariables)]TJ -292.39 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(targetname)]TJ/F1 10.91 Tf 57.27 0 TD[(')-428(and)-428(`)]TJ/F4 10.91 Tf 32.98 0 TD[(connectmode)]TJ/F1 10.91 Tf 63 0 TD[(',)-451(resp)-28(ectiv)27(ely\),)-451(or)-428(on)-428(the)]TJ/F4 10.91 Tf 129.44 0 TD[(runtest)]TJ/F1 10.91 Tf 44.76 0 TD[(command)-428(line)-428(\(using)]TJ -330.48 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(--name)]TJ/F1 10.91 Tf 34.36 0 TD[(')-333(and)-333(`)]TJ/F4 10.91 Tf 30.91 0 TD[(--connect)]TJ/F1 10.91 Tf 51.55 0 TD[('\).)]TJ/F7 10.91 Tf -119.85 -19.13 TD[(amd)]TJ/F13 10.91 Tf 25.28 0 TD[(29000,)-333(with)-333(UDI)-333(proto)-28(col)]TJ/F1 10.91 Tf 32.32 -13.15 TD[(Con\014gure)-314(DejaGn)27(u)-314(for)-315(target)-314(`)]TJ/F4 10.91 Tf 146.78 0 TD[(a29k-amd-udi)]TJ/F1 10.91 Tf 68.72 0 TD[('.)-438(\(Cygn)27(us)]TJ/F4 10.91 Tf 53.73 0 TD[(configure)]TJ/F1 10.91 Tf 54.98 0 TD[(also)-314(recog-)]TJ -324.21 -13.15 TD[(nizes)-398(the)-399(abbreviation)-398(`)]TJ/F4 10.91 Tf 114.05 0 TD[(udi29k)]TJ/F1 10.91 Tf 34.36 0 TD[('.\))-640(Then,)-415(to)-398(run)-399(tests,)-415(use)-398(the)]TJ/F4 10.91 Tf 153.04 0 TD[(runtest)]TJ/F1 10.91 Tf 44.44 0 TD[(target)]TJ -345.89 -13.15 TD[(name)-314(to)-314(sp)-28(ecify)-314(whether)-314(y)26(ou)-313(w)27(an)28(t)-314(to)-314(use)-314(a)-314(sim)26(ulator,)-317(or)-314(a)-314(particular)-315(hardw)27(are)]TJ 0 -13.15 TD[(b)-27(oard.)-741(The)-432(particular)-432(string)-432(to)-432(use)-432(with)-432(`)]TJ/F4 10.91 Tf 209.02 0 TD[(--name)]TJ/F1 10.91 Tf 34.36 0 TD[(')-431(will)-432(dep)-28(end)-432(on)-432(y)27(our)-431(UDI)]TJ -243.38 -13.16 TD[(setup)-415(\014le,)-437(`)]TJ/F4 10.91 Tf 54.81 0 TD[(udi_soc)]TJ/F1 10.91 Tf 40.09 0 TD[(')-415(\(if)-416(`)]TJ/F4 10.91 Tf 25.74 0 TD[(udi_soc)]TJ/F1 10.91 Tf 40.09 0 TD[(')-415(is)-416(not)-416(in)-416(y)27(our)-415(w)27(orking)-415(directory)82(,)-435(the)-416(en)27(vi-)]TJ -160.73 -13.15 TD[(ronmen)27(t)-334(v)55(ariable)-335(`)]TJ/F4 10.91 Tf 87.38 0 TD[(UDICONF)]TJ/F1 10.91 Tf 40.09 0 TD[(')-335(should)-335(con)27(tain)-335(a)-335(path)-335(to)-336(this)-335(\014le\).)-450(F)82(or)-334(example,)-336(if)]TJ -127.47 -13.15 TD[(y)27(our)-332(UDI)-333(setup)-334(\014le)-333(includes)-333(these)-334(lines:)]TJ/F9 9.96 Tf -57.6 -12.43 TD[(\013)]TJ ET 23.98 -328.05 m 450.40 -328.05 l 450.40 -327.65 l 23.98 -327.65 l b BT 456.38 -328.05 TD[(\010)]TJ ET 18.00 -365.20 m 18.40 -365.20 l 18.40 -333.78 l 18.00 -333.78 l b BT/F4 10.91 Tf 21.39 -347.33 TD[(iss)-1574(AF_UNIX)-1050(*)-1575(isstip)-525(-r)-525(/home/gnu/29k/src/osboot/sim/osboot)]TJ 0 -12.45 TD[(mon)-1574(AF_UNIX)-1050(*)-1575(montip)-525(-t)-525(serial)-525(-baud)-525(9600)-525(-com)-525(/dev/ttyb)]TJ ET 456.38 -365.20 m 456.77 -365.20 l 456.77 -333.78 l 456.38 -333.78 l b BT/F9 9.96 Tf 18 -371.42 TD[(\012)]TJ ET 23.98 -371.42 m 450.40 -371.42 l 450.40 -371.03 l 23.98 -371.03 l b BT 456.38 -371.42 TD[(\011)]TJ/F1 10.91 Tf -380.78 -20.38 TD[(Y)83(ou)-394(can)-396(use)-395(`)]TJ/F4 10.91 Tf 66.33 0 TD[(--name)-333(iss)]TJ/F1 10.91 Tf 55.18 0 TD[(')-395(to)-395(run)-395(tests)-396(on)-395(the)-395(sim)27(ulator,)-410(and)-396(`)]TJ/F4 10.91 Tf 180.67 0 TD[(--name)-333(mon)]TJ/F1 10.91 Tf 55.18 0 TD[(')-395(to)]TJ -357.36 -13.15 TD[(run)-382(tests)-383(on)-383(the)-383(29K)-383(hardw)26(are.)-592(See)-383(the)-383(man)27(ufacturer's)-382(man)27(uals)-382(for)-383(more)-383(in-)]TJ 0 -13.15 TD[(formation)-333(on)-333(UDI)-333(and)-334(`)]TJ/F4 10.91 Tf 113.52 0 TD[(udi_soc)]TJ/F1 10.91 Tf 40.09 0 TD[('.)]TJ -153.61 -16.14 TD[(The)-381(default)-381(connect)-381(proto)-28(col)-381(is)-381(`)]TJ/F4 10.91 Tf 158.46 0 TD[(mondfe)]TJ/F1 10.91 Tf 34.36 0 TD[(')-381(with)-381(either)-381(bac)27(k)-380(end.)]TJ/F4 10.91 Tf 116.42 0 TD[(mondfe)]TJ/F1 10.91 Tf 38.52 0 TD[(is)-381(the)]TJ -347.76 -13.15 TD[(only)-239(shell)-240(DejaGn)27(u)-239(supp)-28(orts)-240(for)-239(UDI)-240(targets.)]TJ/F4 10.91 Tf 214.55 0 TD[(mondfe)]TJ/F1 10.91 Tf 36.98 0 TD[(is)-239(an)]TJ/F7 10.91 Tf 24.08 0 TD[(amd)]TJ/F1 10.91 Tf 24.27 0 TD[(sp)-27(eci\014c)-240(monitor)]TJ -299.88 -13.15 TD[(program)-333(freely)-333(a)27(v)55(ailable)-332(from)]TJ/F7 10.91 Tf 144.06 0 TD[(amd)]TJ/F1 10.91 Tf 21.65 0 TD[(.)]TJ/F8 10.91 Tf -165.71 -16.14 TD[(Warning:)]TJ/F1 10.91 Tf 50.85 0 TD[(This)-347(target)-348(requires)]TJ/F7 10.91 Tf 98.57 0 TD[(gdb)]TJ/F1 10.91 Tf 23.93 0 TD[(v)27(ersion)-347(4.7.2)-348(\(or)-347(greater\).)-489(Earlier)-348(v)27(ersions)]TJ -173.35 -13.15 TD[(of)]TJ/F7 10.91 Tf 12.18 0 TD[(gdb)]TJ/F1 10.91 Tf 23.52 0 TD[(do)-310(not)-311(fully)-310(supp)-28(ort)-311(the)]TJ/F4 10.91 Tf 117.34 0 TD[(load)]TJ/F1 10.91 Tf 26.3 0 TD[(command)-310(on)-311(this)-310(target,)-316(so)-310(DejaGn)27(u)-310(has)]TJ -179.34 -13.15 TD[(no)-333(w)27(a)28(y)-333(to)-333(load)-333(executable)-334(\014les)-333(from)-333(the)-334(debugger.)]TJ/F13 10.91 Tf -57.6 -19.13 TD[(Motorola)-333(680x0)-333(b)-28(oards,)-333(a.out)-334(or)]TJ/F7 10.91 Tf 159.15 0 TD[(coff)]TJ/F13 10.91 Tf 28.7 0 TD[(ob)-55(ject)-333(format)]TJ/F1 10.91 Tf -130.25 -13.15 TD[(Con\014gure)-333(DejaGn)27(u)-332(for)-334(an)27(y)-332(remote)-334(target)-333(matc)27(hing)-332(`)]TJ/F4 10.91 Tf 252.17 0 TD[(m68k-*)]TJ/F1 10.91 Tf 34.36 0 TD[('.)]TJ/F8 10.91 Tf -286.53 -16.14 TD[(Warning:)]TJ/F1 10.91 Tf 53.35 0 TD[(Most)-462(`)]TJ/F4 10.91 Tf 32.07 0 TD[(m68k-*)]TJ/F1 10.91 Tf 34.36 0 TD[(')-462(con\014gurations)-462(run)-462(all)-463(tests)-462(only)-462(for)-463(nativ)27(e)-461(testing)]TJ -119.78 -13.15 TD[(\(when)-432(the)-432(target)-432(is)-433(the)-432(same)-432(as)-433(the)-432(host\).)-741(When)-433(y)27(ou)-431(sp)-28(ecify)-432(most)-433(of)-432(these)]TJ 0 -13.15 TD[(targets)-432(for)-432(a)-433(cross)-432(con\014guration,)-457(y)27(ou)-432(will)-432(only)-433(b)-27(e)-433(able)-432(to)-433(use)-432(tests)-432(that)-433(run)]TJ 0 -13.15 TD[(completely)-281(within)-282(the)-281(host)-282(\(for)-281(example,)-292(tests)-281(of)-282(the)-281(binary)-282(utilities)-281(suc)26(h)-280(as)-282(the)]TJ 0 -13.16 TD[(arc)27(hiv)28(er;)-332(or)-334(compiler)-333(tests)-333(that)-334(only)-333(generate)-333(co)-28(de)-333(rather)-334(than)-333(running)-333(it\).)]TJ 0 -16.14 TD[(T)83(o)-292(run)-293(a.out)-293(or)]TJ/F7 10.91 Tf 75.58 0 TD[(coff)]TJ/F1 10.91 Tf 28.26 0 TD[(binaries)-293(on)-293(a)-293(remote)-293(M68K,)-293(y)27(ou)-292(m)27(ust)-292(con\014gure)-293(DejaGn)26(u)]TJ -103.84 -13.15 TD[(for)-405(a)-405(particular)-406(target)-405(b)-28(oard.)-661(`)]TJ/F4 10.91 Tf 152.32 0 TD[(m68k-abug)]TJ/F1 10.91 Tf 51.55 0 TD[(')-405(is)-405(an)-406(example.)-660(\(In)-406(general)-405(for)-406(an)]TJ ET 0 g 0 G +endstream +endobj +181 0 obj +<< +/F1 9 0 R +/F5 31 0 R +/F4 28 0 R +/F2 12 0 R +/F7 49 0 R +/F13 179 0 R +/F9 59 0 R +/F8 52 0 R +>> +endobj +176 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 181 0 R +>> +endobj +184 0 obj +<< +/Length 7898 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(5:)-444(The)-334(DejaGn)27(u)-332(Implemen)27(tation)-20326(33)]TJ 57.6 -23.91 TD[(em)27(b)-26(edded)-397(en)27(vironmen)27(t,)-411(b)-28(ecause)-396(it)-397(do)-28(es)-396(not)-397(ha)27(v)28(e)-396(absolute)-397(addresses,)-412(a.out)-397(is)]TJ 0 -13.15 TD[(not)-273(a)-273(go)-28(o)-27(d)-274(c)27(hoice)-272(for)-273(output)-274(format)-273(in)-273(an)27(y)-272(case;)-294(most)-273(often)-273(S-records)-273(or)-273(Hex-32)]TJ 0 -13.15 TD[(are)-333(used)-333(instead.\))]TJ/F13 10.91 Tf -57.6 -19.13 TD[(Motorola)-333(68K)-333(MVME)-333(135)-334(b)-28(oard)-333(running)-333(ABug)-334(b)-27(o)-28(ot)-334(monitor)]TJ/F1 10.91 Tf 57.6 -13.15 TD[(Con\014gure)-339(for)-340(`)]TJ/F4 10.91 Tf 69.59 0 TD[(m68k-abug-aout)]TJ/F1 10.91 Tf 80.19 0 TD[(')-339(or)-340(`)]TJ/F4 10.91 Tf 23.19 0 TD[(m68k-abug-coff)]TJ/F1 10.91 Tf 80.19 0 TD[(')-339(\(as)-340(a)-340(target\).)-463(This)-340(b)-28(o)-27(ot)]TJ -253.16 -13.15 TD[(monitor)-473(can)-474(only)-474(do)27(wnload)-473(S-records;)-544(therefore,)-509(the)-474(DejaGn)27(u)-473(tests)-474(for)-474(this)]TJ 0 -13.15 TD[(en)27(vironmen)28(t)-378(require)-379(a)-380(link)27(er)-378(command)-379(script)-379(to)-380(con)27(v)28(ert)-378(either)-380(output)-379(format)]TJ 0 -13.15 TD[(to)-333(S-records,)-333(setting)-333(the)-334(default)-333(addresses)-333(for)]TJ/F4 10.91 Tf 219.82 0 TD[(.text)]TJ/F1 10.91 Tf 28.64 0 TD[(,)]TJ/F4 10.91 Tf 6.66 0 TD[(.bss)]TJ/F1 10.91 Tf 22.91 0 TD[(,)-333(and)]TJ/F4 10.91 Tf 27.88 0 TD[(.data)]TJ/F1 10.91 Tf 28.64 0 TD[(.)]TJ -334.55 -16.14 TD[(With)-355(this)-355(con\014guration,)-361(the)-355(default)-355(for)-355(`)]TJ/F4 10.91 Tf 195.25 0 TD[(--connect)]TJ/F1 10.91 Tf 51.54 0 TD[(')-355(is)-355(`)]TJ/F4 10.91 Tf 21.15 0 TD[(tip)]TJ/F1 10.91 Tf 17.18 0 TD[('.)-510(`)]TJ/F4 10.91 Tf 14.66 0 TD[(tip)]TJ/F1 10.91 Tf 17.18 0 TD[(')-355(is)-355(the)-355(only)]TJ -316.96 -13.16 TD[(comm)27(unications)-422(proto)-28(col)-423(supp)-27(orted)-424(for)-423(connecting)-423(to)-423(`)]TJ/F4 10.91 Tf 267.91 0 TD[(m68k-abug-*)]TJ/F1 10.91 Tf 63 0 TD[(')-423(targets.)]TJ -330.91 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(tip)]TJ/F1 10.91 Tf 17.18 0 TD[(')-314(uses)-315(an)]TJ/F7 10.91 Tf 44.36 0 TD[(asci)-22(i)]TJ/F1 10.91 Tf 28.4 0 TD[(do)27(wnloader)-313(\(the)]TJ/F4 10.91 Tf 80.53 0 TD[(~put)]TJ/F1 10.91 Tf 26.34 0 TD[(command\))-314(to)-315(load)-314(S-records)-315(in)27(to)-314(the)]TJ -199.84 -13.15 TD[(target)-405(b)-28(oard.)-663(The)-406(`)]TJ/F4 10.91 Tf 97.05 0 TD[(--name)]TJ/F1 10.91 Tf 34.37 0 TD[(')-405(string)-406(m)26(ust)-405(b)-27(e)-406(a)-406(mac)26(hine)-405(name)-406(that)]TJ/F4 10.91 Tf 190.43 0 TD[(tip)]TJ/F1 10.91 Tf 21.61 0 TD[(under-)]TJ -343.46 -13.15 TD[(stands)-404(\(for)-405(example,)-423(on)-405(some)]TJ/F4 10.91 Tf 147.34 0 TD[(tip)]TJ/F1 10.91 Tf 21.59 0 TD[(implemen)27(tations)-404(it)-404(m)26(ust)-403(b)-28(e)-405(an)-405(en)27(try)-404(from)]TJ -168.93 -13.15 TD[(the)-333(initialization)-333(\014le)-333(for)]TJ/F4 10.91 Tf 116.7 0 TD[(tip)]TJ/F1 10.91 Tf 17.18 0 TD[(;)-333(this)-333(\014le)-333(is)-334(sometimes)-333(called)-333(`)]TJ/F4 10.91 Tf 143.27 0 TD[(/etc/remote)]TJ/F1 10.91 Tf 63 0 TD[('\).)]TJ -340.15 -16.14 TD[(See)-285(y)27(our)-285(system)-286(do)-28(cumen)27(tation)-284(for)-286(information)-286(on)-286(ho)27(w)-284(to)-286(create)-286(new)-286(en)27(tries)-284(in)]TJ 0 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(/etc/remote)]TJ/F1 10.91 Tf 63 0 TD[('.)-578(\(Some)]TJ/F7 10.91 Tf 46.19 0 TD[(unix)]TJ/F1 10.91 Tf 27.5 0 TD[(systems)-378(are)-378(distributed)-378(with)-378(at)-378(least)-378(one)-378(default)]TJ -139.72 -13.15 TD[(en)27(try)-315(with)-316(a)-316(name)-316(resem)27(bling)-315(`)]TJ/F4 10.91 Tf 147.96 0 TD[(hardwire)]TJ/F1 10.91 Tf 45.82 0 TD[(';)-321(if)-316(y)27(our)-315(system)-316(has)-316(one,)-320(y)27(ou)-315(can)-316(edit)]TJ -193.78 -13.15 TD[(it,)-483(or)-454(mak)27(e)-452(a)-454(mo)-28(di\014ed)-453(cop)27(y)-453(with)-454(a)-453(new)-454(name.\))-805(When)-453(y)27(ou)-453(ha)27(v)28(e)-453(a)-453(w)26(orking)]TJ 0 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(/etc/remote)]TJ/F1 10.91 Tf 63 0 TD[(')-356(en)27(try)]TJ/F5 10.91 Tf 35.68 0 TD[(abugtarget)]TJ/F1 10.91 Tf 51.55 0 TD[(,)-362(y)27(ou)-355(should)-356(b)-28(e)-356(able)-357(to)-356(t)27(yp)-27(e)-356(`)]TJ/F4 10.91 Tf 142.48 0 TD[(tip)]TJ/F5 10.91 Tf 20.82 0 TD[(abugtarget)]TJ/F1 10.91 Tf 51.78 0 TD[(',)]TJ -368.34 -13.15 TD[(and)-268(get)-268(the)-268(prompt)-268(`)]TJ/F4 10.91 Tf 97.19 0 TD[(135ABUG>)]TJ/F1 10.91 Tf 45.82 0 TD[(')-268(from)-268(the)-268(b)-28(oard.)-423(Use)-268(the)-268(same)]TJ/F5 10.91 Tf 149.32 0 TD[(abugtarget)]TJ/F1 10.91 Tf 54.71 0 TD[(string)]TJ -347.04 -13.15 TD[(with)-333(`)]TJ/F4 10.91 Tf 27.88 0 TD[(runtest)-333(--name)]TJ/F1 10.91 Tf 78.09 0 TD[('.)]TJ/F13 10.91 Tf -163.57 -19.13 TD[(Motorola)-333(IDP)-333(b)-28(oard)-333(running)-334(the)-333(rom68k)-333(b)-28(o)-28(ot)-333(monitor)]TJ/F1 10.91 Tf 57.6 -13.15 TD[(This)-410(is)-411(the)-411(same)-411(in)-411(functionalit)27(y)-410(as)-411(the)-411(MVME)-411(b)-28(oard)-411(running)-411(the)]TJ/F4 10.91 Tf 330.92 0 TD[(BUG)]TJ/F1 10.91 Tf 21.66 0 TD[(b)-27(o)-28(ot)]TJ -352.58 -13.15 TD[(monitor.)-444(Only)-333(the)-334(monitor)-333(commands)-333(and)-334(the)-333(addresses)-333(are)-334(di\013eren)27(t.)]TJ/F13 10.91 Tf -57.6 -19.13 TD[(VxW)83(orks)-332(\(Motorola)-334(68K)-333(or)-333(In)26(tel)-332(960\))]TJ/F1 10.91 Tf 57.6 -13.15 TD[(Con\014gure)-392(DejaGn)26(u)-392(for)-393(either)-392(`)]TJ/F4 10.91 Tf 148.98 0 TD[(m68k-wrs-vxworks)]TJ/F1 10.91 Tf 91.64 0 TD[(')-392(\(abbreviated)-393(`)]TJ/F4 10.91 Tf 74.96 0 TD[(vxworks68)]TJ/F1 10.91 Tf 51.55 0 TD[('\))]TJ -367.13 -13.15 TD[(or)-229(`)]TJ/F4 10.91 Tf 15.26 0 TD[(i960-wrs-vxworks)]TJ/F1 10.91 Tf 91.64 0 TD[(')-229(\(abbreviated)-229(`)]TJ/F4 10.91 Tf 71.4 0 TD[(vxworks960)]TJ/F1 10.91 Tf 57.27 0 TD[('\).)-409(Since)-230(b)-28(oth)-229(targets)-230(supp)-27(ort)]TJ -235.57 -13.15 TD[(IP)-466(addressing,)-501(sp)-27(ecify)-467(the)-467(net)26(w)28(ork)-466(address)-467(\(for)-467(example,)-500(a)-467(host)-467(name)-467(from)]TJ 0 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(/etc/hosts)]TJ/F1 10.91 Tf 57.27 0 TD[('\))-333(with)-333(`)]TJ/F4 10.91 Tf 38.79 0 TD[(--name)]TJ/F1 10.91 Tf 34.36 0 TD[('.)]TJ -133.45 -16.14 TD[(The)-388(default)-389(connect)-389(proto)-28(col)-389(is)-389(`)]TJ/F4 10.91 Tf 158.88 0 TD[(rlogin)]TJ/F1 10.91 Tf 34.37 0 TD[(',)-402(but)-389(y)27(ou)-388(can)-389(use)-389(an)26(y)-387(of)-389(`)]TJ/F4 10.91 Tf 129.61 0 TD[(--connect)]TJ -322.86 -13.15 TD[(rlogin)]TJ/F1 10.91 Tf 34.36 0 TD[(',)-333(`)]TJ/F4 10.91 Tf 12.73 0 TD[(--connect)-333(telnet)]TJ/F1 10.91 Tf 89.55 0 TD[(',)-333(or)-333(`)]TJ/F4 10.91 Tf 26.09 0 TD[(--connect)-333(rsh)]TJ/F1 10.91 Tf 72.36 0 TD[('.)]TJ -235.09 -16.14 TD[(T)83(est)-456(scripts)-457(need)-456(no)-457(sp)-28(ecial)-456(co)-28(de)-457(to)-457(load)-456(programs)-457(in)27(to)-456(these)-457(targets;)-518(since)]TJ 0 -13.15 TD[(VxW)83(orks)-452(supp)-28(orts)-452(NFS,)-453(all)-452(y)26(ou)-451(m)27(ust)-452(do)-453(is)-452(ensure)-453(test)-452(programs)-453(are)-453(on)-452(an)]TJ 0 -13.15 TD[(exp)-27(orted)-334(\014lesystem.)]TJ 0 -16.14 TD[(When)-362(y)27(ou)-362(compile)-362(for)-363(VxW)83(orks,)-369(use)-363(the)-362(link)27(er)-362(`)]TJ/F4 10.91 Tf 233.45 0 TD[(-r)]TJ/F1 10.91 Tf 11.45 0 TD[(')-362(option)-363(to)-362(mak)27(e)-362(the)-362(link)26(er)]TJ -244.9 -13.15 TD[(output)-274(relo)-28(catable|at)-275(least)-275(if)-274(y)26(ou)-273(w)26(an)28(t)-274(to)-274(use)-275(library)-275(routines.)-425(Man)27(y)-274(standard)]TJ 0 -13.15 TD[(C)-377(routines)-378(are)-377(included)-378(in)-377(VxW)82(orks;)-399(often)-377(no)-378(additional)-378(libraries)-377(are)-378(needed.)]TJ 0 -13.15 TD[(See)-333(y)27(our)-332(VxW)82(orks)-332(system)-334(do)-27(cumen)26(tation)-332(for)-333(additional)-334(details.)]TJ ET 0 g 0 G +endstream +endobj +185 0 obj +<< +/F1 9 0 R +/F13 179 0 R +/F4 28 0 R +/F7 49 0 R +/F5 31 0 R +>> +endobj +183 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 185 0 R +>> +endobj +188 0 obj +<< +/Length 3782 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(34)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F2 14.35 Tf 0 -23.91 TD[(5.6)-562(The)-375(\014les)-375(DejaGn)30(u)-374(reads)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(The)]TJ/F4 10.91 Tf 22.3 0 TD[(runtest)]TJ/F1 10.91 Tf 43.6 0 TD[(program)-321(used)-322(to)-322(in)27(v)28(ok)28(e)-321(DejaGn)27(u)-321(is)-322(a)-321(short)-322(shell)-322(script)-321(generated)-322(b)27(y)]TJ/F4 10.91 Tf 328.25 0 TD[(make)]TJ/F1 10.91 Tf -409.09 -13.15 TD[(during)-349(the)-350(con\014guration)-350(pro)-28(cess.)-495(Its)-350(main)-350(task)-350(is)-350(to)-350(read)-350(the)-350(main)-350(test)-350(framew)27(ork)-349(driv)27(er,)]TJ 0 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(runtest.exp)]TJ/F1 10.91 Tf 63 0 TD[('.)]TJ -51.09 -16.14 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(runtest.exp)]TJ/F1 10.91 Tf 63 0 TD[(',)-333(in)-333(turn,)-333(reads)]TJ/F4 10.91 Tf 78.31 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(co)-27(de)-334(from)-333(certain)-333(other)-334(\014les,)-333(in)-333(this)-334(order:)]TJ -191.37 -16.14 TD[(1.)-660(Eac)27(h)-330(of)-331(the)-331(`)]TJ/F4 10.91 Tf 76.98 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.81 0 TD[(')-330(lo)-28(cal)-331(de\014nition)-331(\014les)-331(a)27(v)55(ailable.)-442(See)-331(Chapter)-331(4)-331([Setting)]TJ/F4 10.91 Tf 263.21 0 TD[(runtest)]TJ/F1 10.91 Tf -370.31 -13.15 TD[(defaults],)-333(page)-333(15,)-333(for)-334(details.)]TJ -15.69 -16.14 TD[(2.)-660(`)]TJ/F4 10.91 Tf 18.72 0 TD[(lib/utils.exp)]TJ/F1 10.91 Tf 74.45 0 TD[(',)-281(a)-269(collection)-269(of)-268(utilit)26(y)-267(pro)-28(cedures.)-423(See)-269(Section)-269(5.3)-268([DejaGn)26(u)-267(Builtins],)]TJ -77.48 -13.15 TD[(page)-333(23,)-333(for)-333(descriptions)-334(of)-333(these)-333(pro)-28(cedures.)]TJ -15.69 -16.14 TD[(3.)-660(`)]TJ/F4 10.91 Tf 18.72 0 TD[(lib/framework.exp)]TJ/F1 10.91 Tf 97.36 0 TD[(',)-452(a)-429(\014le)-428(of)-429(subroutines)-429(mean)27(t)-428(for)]TJ/F4 10.91 Tf 164.39 0 TD[(runtest)]TJ/F1 10.91 Tf 44.77 0 TD[(itself)-428(rather)-429(than)-429(for)]TJ -309.55 -13.15 TD[(general-purp)-27(ose)-334(use)-333(in)-333(b)-28(oth)]TJ/F4 10.91 Tf 135.94 0 TD[(runtest)]TJ/F1 10.91 Tf 43.73 0 TD[(and)-333(test)-333(suites.)]TJ -195.36 -16.14 TD[(4.)-660(`)]TJ/F4 10.91 Tf 18.72 0 TD[(debugger.exp)]TJ/F1 10.91 Tf 68.73 0 TD[(',)-525(Don)-487(Lib)-28(es')-487(Tcl)-487(Debugger.)-906(\(See)]TJ/F5 10.91 Tf 175.29 0 TD[(A)-486(Debugger)-488(for)-487(Tcl)-487(Applications)]TJ/F1 10.91 Tf -247.05 -13.15 TD[(b)27(y)-420(Don)-422(Lib)-28(es.)-709(This)-421(pap)-28(er)-422(is)-421(distributed)-422(with)]TJ/F4 10.91 Tf 228.72 0 TD[(expect)]TJ/F1 10.91 Tf 38.96 0 TD[(in)-421(P)27(ostScript)-421(form)-421(as)-422(the)-422(\014le)]TJ -267.68 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(expect/tcl-debug.ps)]TJ/F1 10.91 Tf 108.82 0 TD[('.\))]TJ -127.54 -16.14 TD[(5.)-660(`)]TJ/F4 10.91 Tf 18.72 0 TD[(lib/remote.exp)]TJ/F1 10.91 Tf 80.18 0 TD[(',)-249(a)-227(collection)-228(of)-228(subroutines)-228(mean)26(t)-227(for)-227(connecting)-228(to)-228(remote)-228(mac)26(hines.)]TJ -98.9 -16.14 TD[(6.)-660(`)]TJ/F4 10.91 Tf 18.72 0 TD[(lib/target.exp)]TJ/F1 10.91 Tf 80.18 0 TD[(',)-479(a)-451(collection)-450(of)-451(subroutines)-450(used)-451(for)-450(the)-450(con\014guration)-451(systems)-450(in)]TJ -83.21 -13.15 TD[(DejaGn)27(u.)-443(These)-333(pro)-28(cedures)-334(t)27(ypically)-332(manipulate)-333(or)-334(utilize)-333(the)-333(con\014guration)-334(system.)]TJ -15.69 -16.14 TD[(7.)-660(An)-380(initialization)-381(\014le)]TJ/F5 10.91 Tf 116.33 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.91 0 TD[(_init.exp)]TJ/F1 10.91 Tf 51.54 0 TD[(.)-585(See)-381(Section)-380(5.2)-381([Initialization)-380(mo)-28(dule],)-393(page)-380(22,)]TJ -171.09 -13.15 TD[(for)-333(more)-333(discussion)-333(of)-334(init)-333(\014les.)]TJ ET 0 g 0 G +endstream +endobj +189 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +/F5 31 0 R +>> +endobj +187 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 189 0 R +>> +endobj +192 0 obj +<< +/Length 5629 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(5:)-444(The)-334(DejaGn)27(u)-332(Implemen)27(tation)-20326(35)]TJ/F2 14.35 Tf 0 -23.91 TD[(5.7)-562(The)-375(\014les)-375(DejaGn)30(u)-374(writes)]TJ/F4 10.91 Tf 14.94 -23.12 TD[(runtest)]TJ/F1 10.91 Tf 44.08 0 TD[(alw)27(a)28(ys)-364(writes)-365(t)26(w)28(o)-364(kinds)-365(of)-366(output)-365(\014les:)-508(summary)-365(logs)-366(and)-365(detailed)-365(logs.)-540(The)]TJ -59.02 -13.15 TD[(con)27(ten)28(ts)-332(of)-334(b)-27(oth)-334(of)-333(these)-333(are)-334(determined)-333(b)27(y)-333(y)27(our)-332(tests.)]TJ 14.94 -16.14 TD[(F)83(or)-404(troublesho)-27(oting,)-423(a)-404(third)-405(kind)-404(of)-405(output)-404(\014le)-405(is)-404(useful:)-587(use)-405(`)]TJ/F4 10.91 Tf 305.16 0 TD[(--debug)]TJ/F1 10.91 Tf 40.09 0 TD[(')-404(to)-405(request)-404(an)]TJ -360.19 -13.15 TD[(output)-333(\014le)-333(sho)27(wing)-333(details)-333(of)-333(what)]TJ/F4 10.91 Tf 169.21 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(is)-333(doing)-333(in)27(ternally)83(.)]TJ/F2 13.09 Tf -207.21 -26.9 TD[(5.7.1)-562(Summary)-375(log)]TJ/F4 10.91 Tf 14.94 -23.11 TD[(runtest)]TJ/F1 10.91 Tf 44.35 0 TD[(alw)27(a)28(ys)-389(pro)-28(duces)-390(a)-391(summary)-390(output)-390(\014le)-391(`)]TJ/F5 10.91 Tf 197.61 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.49 0 TD[(.sum)]TJ/F1 10.91 Tf 22.91 0 TD[('.)-615(This)-390(summary)-391(sho)27(ws)-389(the)]TJ -298.3 -13.15 TD[(names)-384(of)-385(all)-385(test)-385(\014les)-385(run;)-410(for)-385(eac)27(h)-384(test)-385(\014le,)-398(one)-384(line)-385(of)-385(output)-385(from)-385(eac)27(h)]TJ/F4 10.91 Tf 358.83 0 TD[(pass)]TJ/F1 10.91 Tf 27.11 0 TD[(command)]TJ -385.94 -13.15 TD[(\(sho)27(wing)-429(status)-429(`)]TJ/F4 10.91 Tf 83.2 0 TD[(PASS)]TJ/F1 10.91 Tf 22.9 0 TD[(')-429(or)-430(`)]TJ/F4 10.91 Tf 25.17 0 TD[(XPASS)]TJ/F1 10.91 Tf 28.64 0 TD[('\))-429(or)]TJ/F4 10.91 Tf 26.37 0 TD[(fail)]TJ/F1 10.91 Tf 27.6 0 TD[(command)-429(\(status)-430(`)]TJ/F4 10.91 Tf 91.32 0 TD[(FAIL)]TJ/F1 10.91 Tf 22.91 0 TD[(')-429(or)-430(`)]TJ/F4 10.91 Tf 25.16 0 TD[(XFAIL)]TJ/F1 10.91 Tf 28.64 0 TD[('\);)-478(trailing)]TJ -381.91 -13.15 TD[(summary)-292(statistics)-293(that)-292(coun)26(t)-291(passing)-293(and)-292(failing)-293(tests)-293(\(exp)-27(ected)-293(and)-293(unexp)-27(ected\);)-307(and)-292(the)]TJ 0 -13.15 TD[(full)-286(pathname)-287(and)-286(v)27(ersion)-286(n)27(um)27(b)-26(er)-287(of)-286(the)-287(to)-28(ol)-286(tested.)-429(\(All)-287(p)-28(ossible)-286(outcomes,)-296(and)-287(all)-286(errors,)]TJ 0 -13.15 TD[(are)-391(alw)27(a)27(ys)-390(re\015ected)-392(in)-391(the)-392(summary)-392(output)-391(\014le,)-406(regardless)-392(of)-392(whether)-391(or)-392(not)-392(y)27(ou)-390(sp)-28(ecify)]TJ 0 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(--all)]TJ/F1 10.91 Tf 28.64 0 TD[('.\))]TJ -16.73 -16.14 TD[(If)-444(an)27(y)-444(of)-444(y)27(our)-444(tests)-444(use)-444(the)-445(pro)-28(cedures)]TJ/F4 10.91 Tf 196.7 0 TD[(unresolved)]TJ/F1 10.91 Tf 57.27 0 TD[(,)]TJ/F4 10.91 Tf 8.18 0 TD[(unsupported)]TJ/F1 10.91 Tf 63 0 TD[(,)-472(or)]TJ/F4 10.91 Tf 22.76 0 TD[(untested)]TJ/F1 10.91 Tf 45.82 0 TD[(,)-472(the)]TJ -408.67 -13.15 TD[(summary)-333(output)-333(also)-333(tabulates)-334(the)-333(corresp)-28(onding)-333(outcomes.)]TJ 14.94 -16.14 TD[(F)83(or)-221(example,)-245(after)-222(`)]TJ/F4 10.91 Tf 90.76 0 TD[(runtest)-333(--tool)-333(binutils)]TJ/F1 10.91 Tf 127.55 0 TD[(',)-244(lo)-28(ok)-222(for)-222(a)-222(summary)-223(log)-222(in)-222(`)]TJ/F4 10.91 Tf 131.88 0 TD[(binutils.sum)]TJ/F1 10.91 Tf 68.72 0 TD[('.)]TJ -433.85 -13.15 TD[(Normally)83(,)]TJ/F4 10.91 Tf 51.15 0 TD[(runtest)]TJ/F1 10.91 Tf 44.62 0 TD[(writes)-415(this)-415(\014le)-416(in)-415(y)26(our)-414(curren)27(t)-415(w)27(orking)-414(directory;)-457(use)-415(the)-416(`)]TJ/F4 10.91 Tf 287.38 0 TD[(--outdir)]TJ/F1 10.91 Tf 45.82 0 TD[(')]TJ -428.97 -13.15 TD[(option)-333(to)-333(select)-333(a)-334(di\013eren)27(t)-332(directory)82(.)]TJ 0 -13.79 TD[(Here)-333(is)-333(a)-333(short)-334(sample)-333(summary)-333(log:)]TJ/F9 9.96 Tf 0 -9.44 TD[(\013)]TJ ET 23.98 -299.39 m 450.40 -299.39 l 450.40 -298.99 l 23.98 -298.99 l b BT 456.38 -299.39 TD[(\010)]TJ ET 18.00 -534.88 m 18.40 -534.88 l 18.40 -305.12 l 18.00 -305.12 l b BT/F4 10.91 Tf 21.39 -317.76 TD[(Test)-524(Run)-525(By)-525(rob)-525(on)-525(Mon)-525(May)-525(25)-525(21:40:57)-525(PDT)-525(1992)]TJ 91.63 -12.46 TD[(===)-524(gdb)-525(tests)-525(===)]TJ -91.63 -12.45 TD[(Running)-524(./gdb.t00/echo.exp)-525(...)]TJ 0 -12.45 TD[(PASS:)-1574(Echo)-525(test)]TJ 0 -12.46 TD[(Running)-524(./gdb.all/help.exp)-525(...)]TJ 0 -12.45 TD[(PASS:)-1574(help)-525(add-symbol-file)]TJ 0 -12.45 TD[(PASS:)-1574(help)-525(aliases)]TJ 0 -12.46 TD[(PASS:)-1574(help)-525(breakpoint)-525("bre")-525(abbreviation)]TJ 0 -12.45 TD[(FAIL:)-1574(help)-525(run)-525("r")-525(abbreviation)]TJ 0 -12.45 TD[(Running)-524(./gdb.t10/crossload.exp)-525(...)]TJ 0 -12.46 TD[(PASS:)-1574(m68k-elf)-525(\(elf-big\))-525(explicit)-525(format;)-525(loaded)]TJ 0 -12.45 TD[(XFAIL:)-1049(mips-ecoff)-525(\(ecoff-bigmips\))-525("ptype)-525(v_signed_char")-525(signed)]TJ 0 -12.45 TD[(C)-524(types)]TJ 91.63 -12.46 TD[(===)-524(gdb)-525(Summary)-525(===)]TJ -91.63 -12.45 TD[(#)-524(of)-525(expected)-525(passes)-525(5)]TJ 0 -12.45 TD[(#)-524(of)-525(expected)-525(failures)-525(1)]TJ 0 -12.46 TD[(#)-524(of)-525(unexpected)-525(failures)-525(1)]TJ 0 -12.45 TD[(/usr/latest/bin/gdb)-524(version)-525(4.6.5)-525(-q)]TJ ET 456.38 -534.88 m 456.77 -534.88 l 456.77 -305.12 l 456.38 -305.12 l b BT/F9 9.96 Tf 18 -541.11 TD[(\012)]TJ ET 23.98 -541.11 m 450.40 -541.11 l 450.40 -540.71 l 23.98 -540.71 l b BT 456.38 -541.11 TD[(\011)]TJ ET 0 g 0 G +endstream +endobj +193 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +/F5 31 0 R +/F9 59 0 R +>> +endobj +191 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 193 0 R +>> +endobj +196 0 obj +<< +/Length 5683 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(36)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F2 13.09 Tf 0 -23.91 TD[(5.7.2)-562(Detailed)-375(log)]TJ/F4 10.91 Tf 14.94 -22.46 TD[(runtest)]TJ/F1 10.91 Tf 43.69 0 TD[(also)-329(sa)27(v)28(es)-328(a)-329(detailed)-330(log)-329(\014le)-329(`)]TJ/F5 10.91 Tf 137.78 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.49 0 TD[(.log)]TJ/F1 10.91 Tf 22.91 0 TD[(',)-330(sho)27(wing)-328(an)27(y)-328(output)-329(generated)-330(b)27(y)-328(tests)]TJ -237.81 -13.15 TD[(as)-328(w)27(ell)-328(as)-329(the)-329(summary)-329(output.)-442(F)82(or)-328(example,)-330(after)-328(`)]TJ/F4 10.91 Tf 249.11 0 TD[(runtest)-333(--tool)-333(binutils)]TJ/F1 10.91 Tf 127.55 0 TD[(',)-329(lo)-28(ok)-329(for)-328(a)]TJ -376.66 -13.16 TD[(detailed)-332(log)-332(in)-332(`)]TJ/F4 10.91 Tf 74.51 0 TD[(binutils.log)]TJ/F1 10.91 Tf 68.72 0 TD[('.)-444(Normally)83(,)]TJ/F4 10.91 Tf 60.93 0 TD[(runtest)]TJ/F1 10.91 Tf 43.71 0 TD[(writes)-332(this)-332(\014le)-332(in)-332(y)27(our)-331(curren)27(t)-332(w)27(orking)]TJ -247.87 -13.15 TD[(directory;)-333(use)-333(the)-333(`)]TJ/F4 10.91 Tf 90.12 0 TD[(--outdir)]TJ/F1 10.91 Tf 45.82 0 TD[(')-333(option)-333(to)-333(select)-334(a)-333(di\013eren)27(t)-333(directory)83(.)]TJ -135.94 -13.13 TD[(Here)-333(is)-333(a)-333(brief)-334(example)-333(sho)27(wing)-333(a)-333(detailed)-333(log)-334(for)]TJ/F7 10.91 Tf 239.91 0 TD[(g)]TJ/F4 10.91 Tf 6.99 0 TD[(++)]TJ/F1 10.91 Tf 15.09 0 TD[(tests:)]TJ/F9 9.96 Tf -261.99 -9.44 TD[(\013)]TJ ET 23.98 -94.45 m 450.40 -94.45 l 450.40 -94.05 l 23.98 -94.05 l b BT 456.38 -94.45 TD[(\010)]TJ ET 18.00 -516.74 m 18.40 -516.74 l 18.40 -100.18 l 18.00 -100.18 l b BT/F4 10.91 Tf 21.39 -112.82 TD[(Test)-524(Run)-525(By)-525(rob)-525(on)-525(Mon)-525(May)-525(25)-525(21:40:43)-525(PDT)-525(1992)]TJ 91.63 -24.91 TD[(===)-524(g++)-525(tests)-525(===)]TJ -91.63 -24.9 TD[(---)-524(Running)-525(./g++.other/t01-1.exp)-525(---)]TJ 45.81 -12.46 TD[(PASS:)-1574(operate)-525(delete)]TJ -45.81 -24.9 TD[(---)-524(Running)-525(./g++.other/t01-2.exp)-525(---)]TJ 45.81 -12.46 TD[(FAIL:)-1574(i960)-525(bug)-525(EOF)]TJ -45.81 -12.45 TD[(p0000646.C:)-524(In)-525(function)-525(`int)-1050(warn_return_1)-525(\(\)':)]TJ 0 -12.45 TD[(p0000646.C:109:)-524(warning:)-525(control)-525(reaches)-525(end)-525(of)-525(non-void)-525(function)]TJ 0 -12.46 TD[(p0000646.C:)-524(In)-525(function)-525(`int)-1050(warn_return_arg)-525(\(int\)':)]TJ 0 -12.45 TD[(p0000646.C:117:)-524(warning:)-525(control)-525(reaches)-525(end)-525(of)-525(non-void)-525(function)]TJ 0 -12.45 TD[(p0000646.C:)-524(In)-525(function)-525(`int)-1050(warn_return_sum)-525(\(int,)-525(int\)':)]TJ 0 -12.46 TD[(p0000646.C:125:)-524(warning:)-525(control)-525(reaches)-525(end)-525(of)-525(non-void)-525(function)]TJ 0 -12.45 TD[(p0000646.C:)-524(In)-525(function)-525(`struct)-525(foo)-525(warn_return_foo)-525(\(\)':)]TJ 0 -12.45 TD[(p0000646.C:132:)-524(warning:)-525(control)-525(reaches)-525(end)-525(of)-525(non-void)-525(function)]TJ 0 -24.91 TD[(---)-524(Running)-525(./g++.other/t01-4.exp)-525(---)]TJ 45.81 -12.45 TD[(FAIL:)-1574(abort)]TJ -45.81 -12.46 TD[(900403_04.C:8:)-524(zero)-525(width)-525(for)-525(bit-field)-525(`foo')]TJ 0 -12.45 TD[(---)-524(Running)-525(./g++.other/t01-3.exp)-525(---)]TJ 45.81 -12.45 TD[(FAIL:)-1574(segment)-525(violation)]TJ -45.81 -12.46 TD[(900519_12.C:9:)-524(parse)-525(error)-525(before)-525(`;')]TJ 0 -12.45 TD[(900519_12.C:12:)-524(Segmentation)-525(violation)]TJ 0 -12.45 TD[(/usr/latest/bin/gcc:)-524(Internal)-525(compiler)-525(error:)-525(program)-525(cc1plus)-525(got)]TJ 0 -12.46 TD[(fatal)-524(signal)]TJ 91.63 -24.9 TD[(===)-524(g++)-525(Summary)-525(===)]TJ -91.63 -24.91 TD[(#)-524(of)-525(expected)-525(passes)-525(1)]TJ 0 -12.45 TD[(#)-524(of)-525(expected)-525(failures)-525(3)]TJ 0 -12.46 TD[(/usr/ps/bin/g++)-524(version)-525(cygnus-2.0.1)]TJ ET 456.38 -516.74 m 456.77 -516.74 l 456.77 -100.18 l 456.38 -100.18 l b BT/F9 9.96 Tf 18 -522.97 TD[(\012)]TJ ET 23.98 -522.97 m 450.40 -522.97 l 450.40 -522.57 l 23.98 -522.57 l b BT 456.38 -522.97 TD[(\011)]TJ/F2 13.09 Tf -438.38 -24.94 TD[(5.7.3)-562(Logging)]TJ/F10 13.09 Tf 93.12 0 TD[(expect)]TJ/F2 13.09 Tf 45.33 0 TD[(in)31(ternal)-374(actions)]TJ/F1 10.91 Tf -123.51 -22.46 TD[(With)-360(the)-361(`)]TJ/F4 10.91 Tf 50.6 0 TD[(--debug)]TJ/F1 10.91 Tf 40.09 0 TD[(')-360(option,)-368(y)27(ou)-359(can)-361(request)-361(a)-360(log)-361(\014le)-360(sho)26(wing)-359(the)-361(output)-360(from)]TJ/F4 10.91 Tf 292.01 0 TD[(expect)]TJ/F1 10.91 Tf -397.64 -13.15 TD[(itself,)-416(running)-400(in)-400(debugging)-400(mo)-28(de.)-644(This)-400(\014le)-400(\(`)]TJ/F4 10.91 Tf 225.06 0 TD[(dbg.log)]TJ/F1 10.91 Tf 40.09 0 TD[(',)-416(in)-400(the)-400(directory)-400(where)-400(y)27(ou)-399(start)]TJ/F4 10.91 Tf -265.15 -13.15 TD[(runtest)]TJ/F1 10.91 Tf 40.09 0 TD[(\))-333(sho)27(ws)-332(eac)26(h)-332(pattern)]TJ/F4 10.91 Tf 102.58 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(considers)-333(in)-333(analyzing)-333(test)-334(output.)]TJ -165.73 -15.49 TD[(This)-305(\014le)-306(re\015ects)-305(eac)27(h)]TJ/F4 10.91 Tf 102.88 0 TD[(send)]TJ/F1 10.91 Tf 26.24 0 TD[(command,)-311(sho)27(wing)-304(the)-306(string)-305(sen)26(t)-304(as)-306(input)-305(to)-306(the)-305(to)-28(ol)-306(under)]TJ -144.06 -13.15 TD[(test;)-333(and)-333(eac)27(h)]TJ/F4 10.91 Tf 70.06 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(command,)-333(sho)27(wing)-332(eac)26(h)-332(pattern)-333(it)-334(compares)-333(with)-333(the)-334(to)-27(ol)-334(output.)]TJ -93.12 -15.49 TD[(The)-333(log)-333(messages)-333(for)]TJ/F4 10.91 Tf 102.94 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(b)-27(egin)-334(with)-333(a)-333(message)-334(of)-333(the)-333(form)]TJ ET 0 g 0 G +endstream +endobj +197 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +/F5 31 0 R +/F7 49 0 R +/F9 59 0 R +/F10 78 0 R +>> +endobj +195 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 197 0 R +>> +endobj +200 0 obj +<< +/Length 6757 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(5:)-444(The)-334(DejaGn)27(u)-332(Implemen)27(tation)-20326(37)]TJ/F4 10.91 Tf 28.8 -23.91 TD[(expect:)-524(does)-525({)]TJ/F5 10.91 Tf 80.18 0 TD[(to)-27(ol)-334(output)]TJ/F4 10.91 Tf 54.48 0 TD[(})-524(\(spawn_id)]TJ/F5 10.91 Tf 68.73 0 TD[(n)]TJ/F4 10.91 Tf 6.06 0 TD[(\))-524(match)-525(pattern)]TJ -209.45 -12.46 TD[({)]TJ/F5 10.91 Tf 5.73 0 TD[(exp)-27(ected)-334(pattern)]TJ/F4 10.91 Tf 80.63 0 TD[(}?)]TJ/F1 10.91 Tf -115.16 -16.14 TD[(F)83(or)-325(ev)27(ery)-325(unsuccessful)-325(matc)26(h,)]TJ/F4 10.91 Tf 145.84 0 TD[(expect)]TJ/F1 10.91 Tf 37.91 0 TD[(issues)-325(a)-326(`)]TJ/F4 10.91 Tf 42.44 0 TD[(no)]TJ/F1 10.91 Tf 11.46 0 TD[(')-325(after)-326(this)-326(message;)-328(if)-326(other)-325(patterns)-326(are)]TJ -237.65 -13.15 TD[(sp)-27(eci\014ed)-341(for)-341(the)-341(same)]TJ/F4 10.91 Tf 107.14 0 TD[(expect)]TJ/F1 10.91 Tf 38.09 0 TD[(command,)-342(they)-341(are)-341(re\015ected)-341(also,)-342(but)-341(without)-341(the)-341(\014rst)-340(part)]TJ -145.23 -13.15 TD[(of)-333(the)-333(message)-333(\(`)]TJ/F4 10.91 Tf 80.42 0 TD[(expect...match)-333(pattern)]TJ/F1 10.91 Tf 123.91 0 TD[('\).)]TJ -189.39 -16.14 TD[(When)]TJ/F4 10.91 Tf 32.05 0 TD[(expect)]TJ/F1 10.91 Tf 38.24 0 TD[(\014nds)-354(a)-355(matc)27(h,)-359(the)-354(log)-355(for)-354(the)-355(successful)-355(matc)27(h)-353(ends)-355(with)-355(`)]TJ/F4 10.91 Tf 281.12 0 TD[(yes)]TJ/F1 10.91 Tf 17.18 0 TD[(',)-359(follo)26(w)28(ed)]TJ -383.53 -13.15 TD[(b)27(y)-356(a)-356(record)-357(of)-357(the)]TJ/F4 10.91 Tf 90.13 0 TD[(expect)]TJ/F1 10.91 Tf 38.25 0 TD[(v)55(ariables)-356(set)-357(to)-356(describ)-28(e)-357(a)-357(successful)-356(matc)26(h.)-514(Here)-356(is)-357(an)-357(excerpt)]TJ -128.38 -13.15 TD[(from)-333(the)-333(debugging)-333(log)-334(for)-333(a)]TJ/F7 10.91 Tf 140.06 0 TD[(gdb)]TJ/F1 10.91 Tf 23.77 0 TD[(test:)]TJ/F9 9.96 Tf -163.83 -9.44 TD[(\013)]TJ ET 23.98 -116.74 m 450.40 -116.74 l 450.40 -116.34 l 23.98 -116.34 l b BT 456.38 -116.74 TD[(\010)]TJ ET 18.00 -440.32 m 18.40 -440.32 l 18.40 -122.47 l 18.00 -122.47 l b BT/F4 10.91 Tf 21.39 -136.02 TD[(send:)-524(sent)-525({break)-525(gdbme.c:34\\n})-525(to)-525(spawn)-525(id)-525(6)]TJ 0 -12.46 TD[(expect:)-524(does)-525({})-525(\(spawn_id)-525(6\))-525(match)-525(pattern)-525({Breakpoint.*at.*)-525(file)]TJ 5.72 -12.45 TD[(gdbme.c,)-524(line)-525(34.*\\\(gdb\\\))-525($}?)-525(no)]TJ -5.72 -12.45 TD[({.*\\\(gdb\\\))-524($}?)-525(no)]TJ 0 -12.46 TD[(expect:)-524(does)-525({})-525(\(spawn_id)-525(0\))-525(match)-525(pattern)-525({}?)-525(no)]TJ 0 -12.45 TD[({\\\(y)-524(or)-525(n\\\))-525(}?)-525(no)]TJ 0 -12.45 TD[({buffer_full}?)-524(no)]TJ 0 -12.46 TD[({virtual}?)-524(no)]TJ 0 -12.45 TD[({memory}?)-524(no)]TJ 0 -12.45 TD[({exhausted}?)-524(no)]TJ 0 -12.46 TD[({Undefined}?)-524(no)]TJ 0 -12.45 TD[({command}?)-524(no)]TJ 0 -12.45 TD[(break)-524(gdbme.c:34)]TJ 0 -12.46 TD[(Breakpoint)-524(8)-525(at)-525(0x23d8:)-525(file)-525(gdbme.c,)-525(line)-525(34.)]TJ 0 -12.45 TD[(\(gdb\))-524(expect:)-525(does)-525({break)-525(gdbme.c:34\\r\\nBreakpoint)-525(8)-525(at)-525(0x23d8:)]TJ 0 -12.45 TD[(file)-524(gdbme.c,)-525(line)-525(34.\\r\\n\(gdb\))-525(})-525(\(spawn_id)-525(6\))-525(match)-525(pattern)]TJ 0 -12.46 TD[({Breakpoint.*at.*)-524(file)-525(gdbme.c,)-525(line)-525(34.*\\\(gdb\\\))-525($}?)-525(yes)]TJ 0 -12.45 TD[(expect:)-524(set)-525(expect_out\(0,start\))-525({18})]TJ 0 -12.45 TD[(expect:)-524(set)-525(expect_out\(0,end\))-525({71})]TJ 0 -12.46 TD[(expect:)-524(set)-525(expect_out\(0,string\))-525({Breakpoint)-525(8)-525(at)-525(0x23d8:)-525(file)]TJ 0 -12.45 TD[(gdbme.c,)-524(line)-525(34.\\r\\n\(gdb\))-525(})]TJ 0 -12.45 TD[(expect:)-524(set)-525(expect_out\(spawn_id\))-525({6})]TJ 0 -12.46 TD[(expect:)-524(set)-525(expect_out\(buffer\))-525({break)-525(gdbme.c:34\\r\\nBreakpoint)-525(8)]TJ 0 -12.45 TD[(at)-524(0x23d8:)-525(file)-525(gdbme.c,)-525(line)-525(34.\\r\\n\(gdb\))-525(})]TJ 45.81 -12.45 TD[(PASS:)-1574(70)-3150(0)-3675(breakpoint)-525(line)-525(number)-525(in)-525(file)]TJ ET 456.38 -440.32 m 456.77 -440.32 l 456.77 -122.47 l 456.38 -122.47 l b BT/F9 9.96 Tf 18 -446.54 TD[(\012)]TJ ET 23.98 -446.54 m 450.40 -446.54 l 450.40 -446.14 l 23.98 -446.14 l b BT 456.38 -446.54 TD[(\011)]TJ/F1 10.91 Tf -438.38 -17.39 TD[(This)-309(example)-310(exhibits)-310(three)-309(prop)-28(erties)-310(of)]TJ/F4 10.91 Tf 198.73 0 TD[(expect)]TJ/F1 10.91 Tf 37.74 0 TD[(and)-309(DejaGn)27(u)-309(that)-310(migh)27(t)-309(b)-28(e)-309(surprising)-310(at)]TJ -236.47 -13.15 TD[(\014rst)-333(glance:)]TJ/F3 10.91 Tf 8.95 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(Empt)27(y)-272(output)-274(for)-274(the)-273(\014rst)-274(attempted)-274(matc)27(h.)-424(The)-273(\014rst)-274(set)-274(of)-273(attempted)-274(matc)27(hes)-273(sho)27(wn)]TJ 0 -13.15 TD[(ran)-377(against)-377(the)-377(output)-377(`)]TJ/F4 10.91 Tf 116.54 0 TD[({})]TJ/F1 10.91 Tf 11.46 0 TD[('|that)-377(is,)-387(no)-378(output.)]TJ/F4 10.91 Tf 109.71 0 TD[(expect)]TJ/F1 10.91 Tf 38.47 0 TD[(b)-27(egins)-377(attempting)-377(to)-377(matc)26(h)]TJ -276.18 -13.15 TD[(the)-401(patterns)-401(supplied)-401(immediately;)-435(often,)-419(the)-401(\014rst)-401(pass)-401(is)-401(against)-402(incomplete)-401(output)]TJ 0 -13.15 TD[(\(or)-333(completely)-333(b)-28(efore)-333(all)-334(output,)-333(as)-333(in)-334(this)-333(case\).)]TJ/F3 10.91 Tf -12.65 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(In)27(tersp)-26(ersed)-446(to)-27(ol)-445(output.)-780(The)-445(b)-28(eginning)-445(of)-445(the)-445(log)-445(en)27(try)-445(for)-445(the)-445(second)-445(attempted)]TJ 0 -13.15 TD[(matc)27(h)-341(ma)26(y)-341(b)-28(e)-342(hard)-343(to)-343(sp)-27(ot:)-463(this)-343(is)-342(b)-28(ecause)-343(the)-342(prompt)-343(`)]TJ/F4 10.91 Tf 273.03 0 TD[(\(gdb\))]TJ/F1 10.91 Tf 32.27 0 TD[(')-342(app)-28(ears)-342(on)-343(the)-343(same)]TJ -305.3 -13.15 TD[(line,)-333(just)-333(b)-28(efore)-333(the)-334(`)]TJ/F4 10.91 Tf 99.79 0 TD[(expect:)]TJ/F1 10.91 Tf 40.09 0 TD[(')-333(that)-333(marks)-333(the)-334(b)-28(eginning)-333(of)-333(the)-334(log)-333(en)27(try)83(.)]TJ/F3 10.91 Tf -152.53 -16.14 TD[(\017)]TJ/F1 10.91 Tf 12.65 0 TD[(F)83(ail-safe)-342(patterns.)-472(Man)27(y)-342(of)-343(the)-342(patterns)-343(tested)-342(are)-343(fail-safe)-343(patterns)-342(pro)27(vided)-342(b)27(y)]TJ/F7 10.91 Tf 390.27 0 TD[(gdb)]TJ/F1 10.91 Tf -390.27 -13.15 TD[(testing)-471(utilities,)-506(to)-472(reduce)-471(p)-28(ossible)-471(indeterminacy)82(.)-858(It)-472(is)-471(useful)-472(to)-471(an)27(ticipate)-471(p)-28(oten-)]TJ 0 -13.15 TD[(tial)-484(v)55(ariations)-484(caused)-485(b)27(y)-483(extreme)-485(system)-484(conditions)-485(\()]TJ/F7 10.91 Tf 265.55 0 TD[(gdb)]TJ/F1 10.91 Tf 25.42 0 TD[(migh)27(t)-483(issue)-485(the)-484(message)]TJ ET 0 g 0 G +endstream +endobj +201 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F5 31 0 R +/F7 49 0 R +/F9 59 0 R +/F3 21 0 R +>> +endobj +199 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 201 0 R +>> +endobj +204 0 obj +<< +/Length 2123 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(38)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ 21.6 -23.91 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(virtual)-333(memory)-333(exhausted)]TJ/F1 10.91 Tf 133.27 0 TD[(')-361(in)-361(rare)-361(circumstances\),)-368(or)-361(b)27(y)-360(c)27(hanges)-360(in)-361(the)-361(tested)-361(pro-)]TJ -136.3 -13.15 TD[(gram)-354(\(`)]TJ/F4 10.91 Tf 35.41 0 TD[(Undefined)-333(command)]TJ/F1 10.91 Tf 95.28 0 TD[(')-354(is)-355(the)-355(lik)27(eliest)-353(outcome)-355(if)-355(the)-354(name)-355(of)-355(a)-355(tested)-354(command)]TJ -130.69 -13.15 TD[(c)27(hanges\).)]TJ 0 -16.14 TD[(The)-355(pattern)-356(`)]TJ/F4 10.91 Tf 64.76 0 TD[({})]TJ/F1 10.91 Tf 57.27 0 TD[(')-355(is)-356(a)-355(particularly)-356(in)27(teresting)-355(fail-safe)-355(to)-356(notice;)-367(it)-355(c)27(hec)27(ks)-354(for)]TJ -122.03 -13.15 TD[(an)-421(unexp)-28(ected)]TJ/F11 8.97 Tf 74.65 0.39 TD[(h)]TJ ET 117.16 -58.83 m 135.26 -58.83 l 135.26 -58.43 l 117.16 -58.43 l b BT/F12 7.97 Tf 117.16 -65.55 TD[(RET)]TJ ET 117.16 -67.40 m 135.26 -67.40 l 135.26 -67.00 l 117.16 -67.00 l b BT/F11 8.97 Tf 134.76 -65.16 TD[(i)]TJ/F1 10.91 Tf 8.18 -0.39 TD[(prompt.)-709(This)-421(ma)27(y)-421(happ)-28(en,)-443(for)-422(example,)-444(if)-421(the)-422(tested)-421(to)-28(ol)-422(can)]TJ -103.34 -13.15 TD[(\014lter)-333(output)-333(through)-333(a)-334(pager.)]TJ 0 -16.14 TD[(These)-317(fail-safe)-317(patterns)-318(\(lik)27(e)-316(the)-318(debugging)-317(log)-318(itself)-77(\))-318(are)-317(primarily)-318(useful)-317(while)-317(dev)26(el-)]TJ 0 -13.15 TD[(oping)-357(test)-357(scripts.)-516(Use)-357(the)]TJ/F4 10.91 Tf 131.49 0 TD[(error)]TJ/F1 10.91 Tf 32.54 0 TD[(pro)-27(cedure)-358(to)-357(mak)27(e)-356(the)-358(actions)-357(for)-357(fail-safe)-357(patterns)]TJ -164.03 -13.16 TD[(pro)-27(duce)-391(messages)-390(starting)-391(with)-390(`)]TJ/F4 10.91 Tf 158.86 0 TD[(ERROR)]TJ/F1 10.91 Tf 28.64 0 TD[(')-390(on)-391(the)]TJ/F4 10.91 Tf 42.47 0 TD[(runtest)]TJ/F1 10.91 Tf 44.35 0 TD[(standard)-390(output,)-405(and)-390(in)-391(the)]TJ -274.32 -13.15 TD[(detailed)-333(log)-333(\014le.)]TJ ET 0 g 0 G +endstream +endobj +205 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F11 97 0 R +/F12 100 0 R +>> +endobj +203 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 205 0 R +>> +endobj +208 0 obj +<< +/Length 6090 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(6:)-444(Ho)27(w)-333(T)83(o)-333(W)83(rite)-333(a)-333(T)82(est)-332(Case)-21861(39)]TJ/F2 17.22 Tf 0 -25.91 TD[(6)-562(Ho)30(w)-374(T)93(o)-374(W)93(rite)-374(a)-375(T)93(est)-374(Case)]TJ/F2 14.35 Tf 0 -42.83 TD[(6.1)-562(W)93(riting)-374(a)-375(test)-375(case)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(The)-338(easiest)-338(w)27(a)28(y)-337(to)-338(prepare)-339(a)-338(new)-338(test)-338(case)-338(is)-338(to)-338(base)-339(it)-338(on)-338(an)-338(existing)-338(one)-338(for)-338(a)-338(similar)]TJ -14.94 -13.15 TD[(situation.)-702(There)-419(are)-419(t)26(w)28(o)-418(ma)-56(jor)-419(categories)-419(of)-419(tests:)-617(batc)27(h)-418(or)-420(in)27(teractiv)28(e.)-701(Batc)26(h)-418(orien)27(ted)]TJ 0 -13.15 TD[(tests)-333(are)-333(usually)-333(easier)-334(to)-333(write.)]TJ 14.94 -16.14 TD[(The)]TJ/F7 10.91 Tf 21.56 0 TD[(gcc)]TJ/F1 10.91 Tf 22.66 0 TD[(tests)-253(are)-254(a)-254(go)-28(o)-28(d)-254(example)-253(of)-254(batc)26(h)-252(orien)26(ted)-253(tests.)-418(All)]TJ/F7 10.91 Tf 246.46 0 TD[(gcc)]TJ/F1 10.91 Tf 22.66 0 TD[(tests)-253(consist)-254(primarily)]TJ -328.28 -13.15 TD[(of)-387(a)-388(call)-388(to)-388(a)-388(single)-388(common)-388(pro)-28(cedure,)-401(since)-388(all)-388(the)-388(tests)-388(either)-388(ha)27(v)27(e)-386(no)-388(output,)-402(or)-388(only)]TJ 0 -13.15 TD[(ha)27(v)28(e)-429(a)-431(few)-431(w)27(arning)-429(messages)-431(when)-430(successfully)-431(compiled.)-736(An)27(y)-430(non-w)27(arning)-430(output)-430(is)-431(a)]TJ 0 -13.15 TD[(test)-331(failure.)-444(All)-332(the)-332(C)-332(co)-28(de)-332(needed)-332(is)-332(k)27(ept)-331(in)-332(the)-331(test)-332(directory)82(.)-443(The)-332(test)-332(driv)27(er,)-331(written)-332(in)]TJ/F4 10.91 Tf 0 -13.15 TD[(expect)]TJ/F1 10.91 Tf 34.36 0 TD[(,)-302(need)-294(only)-295(get)-294(a)-295(listing)-294(of)-295(all)-294(the)-295(C)-294(\014les)-295(in)-294(the)-295(directory)82(,)-301(and)-294(compile)-295(them)-294(all)-295(using)]TJ -34.36 -13.15 TD[(a)-307(generic)-307(pro)-28(cedure.)-435(This)-308(pro)-27(cedure)-307(and)-308(a)-307(few)-307(others)-307(supp)-28(orting)-307(for)-307(these)-307(tests)-308(are)-307(k)27(ept)-306(in)]TJ 0 -13.15 TD[(the)-325(library)-325(mo)-28(dule)-325(`)]TJ/F4 10.91 Tf 95.55 0 TD[(lib/c-torture.exp)]TJ/F1 10.91 Tf 97.36 0 TD[(')-325(in)-325(the)]TJ/F7 10.91 Tf 37.92 0 TD[(gcc)]TJ/F1 10.91 Tf 23.43 0 TD[(test)-325(suite.)-441(Most)-325(tests)-326(of)-325(this)-325(kind)-325(use)]TJ -254.26 -13.15 TD[(v)27(ery)-332(few)]TJ/F4 10.91 Tf 43.67 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(features,)-333(and)-333(are)-333(co)-28(ded)-334(almost)-333(purely)-333(in)-334(Tcl.)]TJ -81.67 -16.14 TD[(W)83(riting)-332(the)-334(complete)-333(suite)-333(of)-334(C)-333(tests,)-333(then,)-334(consisted)-333(of)-333(these)-334(steps:)]TJ 5.91 -16.14 TD[(1.)-660(Cop)27(ying)-289(all)-290(the)-291(C)-290(co)-28(de)-290(in)27(to)-290(the)-290(test)-291(directory)83(.)-429(These)-291(tests)-290(w)27(ere)-290(based)-290(on)-290(the)-291(C-torture)]TJ 15.69 -13.15 TD[(test)-263(created)-264(b)26(y)-263(T)83(orb)-55(jorn)-264(Granlund)-264(\(on)-264(b)-27(ehalf)-264(of)-264(the)-264(F)82(ree)-263(Soft)27(w)28(are)-263(F)82(oundation\))-263(for)]TJ/F7 10.91 Tf 390.51 0 TD[(gcc)]TJ/F1 10.91 Tf -390.51 -13.15 TD[(dev)27(elopmen)28(t.)]TJ -15.69 -16.14 TD[(2.)-660(W)83(riting)-333(\(and)-333(debugging\))-333(the)-334(generic)]TJ/F4 10.91 Tf 193.33 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(pro)-27(cedures)-334(for)-333(compilation.)]TJ -231.33 -16.14 TD[(3.)-660(W)83(riting)-359(the)-360(simple)-360(test)-360(driv)27(er:)-497(its)-360(main)-360(task)-360(is)-359(to)-360(searc)26(h)-359(the)-359(directory)-360(\(using)-360(the)-360(Tcl)]TJ 15.69 -13.15 TD[(pro)-27(cedure)]TJ/F4 10.91 Tf 50.96 0 TD[(glob)]TJ/F1 10.91 Tf 26.84 0 TD[(for)-360(\014lename)-360(expansion)-361(with)-360(wildcards\))-361(and)-360(call)-361(a)-360(Tcl)-361(pro)-27(cedure)-361(with)]TJ -77.8 -13.15 TD[(eac)27(h)-332(\014lename.)-444(It)-334(also)-333(c)27(hec)27(ks)-332(for)-333(a)-334(few)-333(errors)-333(from)-334(the)-333(testing)-333(pro)-28(cedure.)]TJ -6.66 -19.13 TD[(T)83(esting)-412(in)27(teractiv)28(e)-412(programs)-412(is)-412(in)26(trinsically)-411(more)-413(complex.)-681(T)82(ests)-412(for)-412(most)-412(in)26(teractiv)28(e)]TJ -14.94 -13.15 TD[(programs)-333(require)-333(some)-333(trial)-334(and)-333(error)-333(b)-28(efore)-334(they)-333(are)-333(complete.)]TJ 14.94 -16.14 TD[(Ho)27(w)28(ev)28(er,)-465(some)-439(in)27(teractiv)28(e)-438(programs)-439(can)-439(b)-28(e)-439(tested)-439(in)-439(a)-438(simple)-439(fashion)-439(reminiscen)26(t)-438(of)]TJ -14.94 -13.15 TD[(batc)27(h)-378(tests.)-583(F)83(or)-379(example,)-391(prior)-379(to)-380(the)-379(creation)-379(of)-380(DejaGn)27(u,)-390(the)]TJ/F7 10.91 Tf 312.86 0 TD[(gdb)]TJ/F1 10.91 Tf 24.27 0 TD[(distribution)-379(already)]TJ -337.13 -13.15 TD[(included)-407(a)-408(wide-ranging)-407(testing)-408(pro)-28(cedure.)-667(This)-408(pro)-27(cedure)-408(w)27(as)-407(v)27(ery)-407(robust,)-426(and)-407(had)-408(al-)]TJ 0 -13.15 TD[(ready)-314(undergone)-315(m)27(uc)28(h)-314(more)-315(debugging)-314(and)-315(error)-315(c)27(hec)28(king)-314(than)-315(man)27(y)-314(recen)27(t)-313(DejaGn)26(u)-313(test)]TJ 0 -13.16 TD[(cases.)-685(Accordingly)83(,)-433(the)-413(b)-28(est)-414(approac)27(h)-413(w)27(as)-412(simply)-414(to)-414(encapsulate)-413(the)-414(existing)]TJ/F7 10.91 Tf 382.39 0 TD[(gdb)]TJ/F1 10.91 Tf 24.64 0 TD[(tests,)]TJ -407.03 -13.15 TD[(for)-355(rep)-27(orting)-356(purp)-27(oses.)-510(Thereafter,)-361(new)]TJ/F7 10.91 Tf 194.75 0 TD[(gdb)]TJ/F1 10.91 Tf 24.01 0 TD[(tests)-355(built)-355(up)-355(a)-355(family)-355(of)]TJ/F4 10.91 Tf 123.67 0 TD[(expect)]TJ/F1 10.91 Tf 38.24 0 TD[(pro)-27(cedures)]TJ -380.67 -13.15 TD[(sp)-27(ecialized)-334(for)]TJ/F7 10.91 Tf 71 0 TD[(gdb)]TJ/F1 10.91 Tf 23.77 0 TD[(testing.)]TJ -79.83 -16.14 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(gdb.t10/crossload.exp)]TJ/F1 10.91 Tf 120.28 0 TD[(')-333(is)-333(a)-333(go)-28(o)-28(d)-333(example)-334(of)-333(an)-333(in)26(teractiv)28(e)-332(test.)]TJ ET 0 g 0 G +endstream +endobj +209 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F7 49 0 R +/F4 28 0 R +>> +endobj +207 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 209 0 R +>> +endobj +212 0 obj +<< +/Length 10014 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(40)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F2 14.35 Tf 0 -23.91 TD[(6.2)-562(Debugging)-375(a)-375(test)-375(case)]TJ/F1 10.91 Tf 0 -23.12 TD[(These)-333(are)-333(the)-333(kinds)-334(of)-333(debugging)-333(information)-334(a)27(v)56(ailable)-333(from)-333(DejaGn)27(u:)]TJ 5.91 -16.14 TD[(1.)-660(Output)-330(con)27(trolled)-329(b)26(y)-329(test)-330(scripts)-331(themselv)27(es,)-330(explicitly)-330(allo)27(w)28(ed)-330(for)-330(b)27(y)-330(the)-330(test)-330(author.)]TJ 15.69 -13.15 TD[(This)-252(kind)-252(of)-252(debugging)-252(output)-252(app)-28(ears)-252(in)-253(the)-252(detailed)-252(output)-252(recorded)-252(in)-252(the)-253(`)]TJ/F5 10.91 Tf 365.98 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.48 0 TD[(.log)]TJ/F1 10.91 Tf 22.91 0 TD[(')]TJ -407.37 -13.15 TD[(\014le.)-455(T)82(o)-336(do)-337(the)-337(same)-337(for)-337(new)-337(tests,)-338(use)-337(the)]TJ/F4 10.91 Tf 205.01 0 TD[(verbose)]TJ/F1 10.91 Tf 43.77 0 TD[(pro)-27(cedure)-337(\(whic)26(h)-336(in)-337(turn)-337(uses)-337(the)]TJ -248.78 -13.15 TD[(v)55(ariable)-328(also)-330(called)]TJ/F4 10.91 Tf 93.6 0 TD[(verbose)]TJ/F1 10.91 Tf 40.09 0 TD[(\))-329(to)-330(con)27(trol)-328(ho)26(w)-328(m)27(uc)27(h)-328(output)-330(to)-329(generate.)-443(This)-330(will)-330(mak)27(e)]TJ -133.69 -13.15 TD[(it)-328(easier)-328(for)-328(other)-328(p)-28(eople)-328(running)-328(the)-328(test)-329(to)-328(debug)-328(it)-328(if)-328(necessary)82(.)-442(Whenev)27(er)-327(p)-28(ossible,)]TJ 0 -13.15 TD[(if)-353(`)]TJ/F4 10.91 Tf 13.25 0 TD[($verbose)]TJ/F1 10.91 Tf 45.82 0 TD[(')-353(is)]TJ/F4 10.91 Tf 18.08 0 TD[(0)]TJ/F1 10.91 Tf 5.73 0 TD[(,)-358(there)-354(should)-353(b)-28(e)-354(no)-353(output)-354(other)-354(than)-353(the)-354(output)-354(from)]TJ/F4 10.91 Tf 271.73 0 TD[(pass)]TJ/F1 10.91 Tf 22.91 0 TD[(,)]TJ/F4 10.91 Tf 6.94 0 TD[(fail)]TJ/F1 10.91 Tf 22.91 0 TD[(,)]TJ/F4 10.91 Tf -407.37 -13.15 TD[(error)]TJ/F1 10.91 Tf 28.64 0 TD[(,)-370(and)]TJ/F4 10.91 Tf 28.6 0 TD[(warning)]TJ/F1 10.91 Tf 40.1 0 TD[(.)-533(Then,)-371(to)-363(whatev)27(er)-362(exten)27(t)-362(is)-363(appropriate)-363(for)-363(the)-364(particular)-363(test,)]TJ -97.34 -13.15 TD[(allo)27(w)-363(successiv)27(ely)-363(higher)-364(v)54(alues)-363(of)-364(`)]TJ/F4 10.91 Tf 170.44 0 TD[($verbose)]TJ/F1 10.91 Tf 45.82 0 TD[(')-364(to)-364(generate)-364(more)-364(information.)-537(Be)-364(kind)]TJ -216.26 -13.15 TD[(to)-333(other)-333(programmers)-333(who)-334(use)-333(y)27(our)-333(tests:)-444(pro)27(vide)-333(for)-333(a)-333(lot)-334(of)-333(debugging)-333(information.)]TJ -15.69 -16.14 TD[(2.)-660(Output)-293(from)-293(the)-293(in)26(ternal)-292(debugging)-293(functions)-293(of)-294(Tcl)-293(and)]TJ/F4 10.91 Tf 287.64 0 TD[(expect)]TJ/F1 10.91 Tf 34.36 0 TD[(.)-431(There)-293(is)-293(a)-293(command)]TJ -306.31 -13.15 TD[(line)-329(options)-330(for)-329(eac)27(h;)-330(b)-28(oth)-329(forms)-330(of)-329(debugging)-330(output)-329(are)-330(recorded)-329(in)-330(the)-329(\014le)]TJ/F4 10.91 Tf 370.31 0 TD[(dbg.log)]TJ/F1 10.91 Tf -370.31 -13.15 TD[(in)-333(the)-333(curren)27(t)-333(directory)83(.)]TJ 0 -16.14 TD[(Use)-243(`)]TJ/F4 10.91 Tf 23.02 0 TD[(--debug)]TJ/F1 10.91 Tf 40.09 0 TD[(')-243(for)-243(information)-244(from)-243(the)]TJ/F4 10.91 Tf 122.16 0 TD[(expect)]TJ/F1 10.91 Tf 37.02 0 TD[(lev)27(el;)-272(it)-244(generates)-243(displa)27(ys)-243(of)-243(the)]TJ/F4 10.91 Tf 153.75 0 TD[(expect)]TJ/F1 10.91 Tf -376.04 -13.15 TD[(attempts)-266(to)-267(matc)26(h)-265(the)-267(to)-28(ol)-267(output)-267(with)-267(the)-267(patterns)-267(sp)-28(eci\014ed)-266(\(see)-267(Section)-267(5.7.3)-267([Debug)]TJ 0 -13.15 TD[(Log],)-357(page)-353(36\).)-503(This)-353(output)-353(can)-353(b)-28(e)-353(v)27(ery)-352(helpful)-353(while)-353(dev)27(eloping)-352(test)-353(scripts,)-357(since)-353(it)]TJ 0 -13.15 TD[(sho)27(ws)-322(precisely)-323(the)-323(c)27(haracters)-322(receiv)26(ed.)-440(Iterating)-323(b)-27(et)26(w)28(een)-322(the)-323(latest)-323(attempt)-323(at)-323(a)-323(new)]TJ 0 -13.15 TD[(test)-347(script)-348(and)-348(the)-347(corresp)-28(onding)-348(`)]TJ/F4 10.91 Tf 165.6 0 TD[(dbg.log)]TJ/F1 10.91 Tf 40.09 0 TD[(')-347(can)-348(allo)27(w)-347(y)27(ou)-347(to)-347(create)-348(the)-348(\014nal)-347(patterns)]TJ -205.69 -13.15 TD[(b)27(y)-332(\\cut)-333(and)-334(paste".)-444(This)-333(is)-334(sometimes)-333(the)-333(b)-28(est)-334(w)27(a)28(y)-332(to)-334(write)-333(a)-333(test)-334(case.)]TJ 0 -16.14 TD[(Use)-486(`)]TJ/F4 10.91 Tf 25.67 0 TD[(--strace)]TJ/F1 10.91 Tf 45.82 0 TD[(')-486(to)-486(see)-486(more)-486(detail)-487(at)-486(the)-486(Tcl)-486(lev)26(el;)-561(this)-487(sho)27(ws)-485(ho)27(w)-486(Tcl)-486(pro)-28(cedure)]TJ -71.49 -13.15 TD[(de\014nitions)-484(expand,)-522(as)-485(they)-484(execute.)-898(The)-485(asso)-28(ciated)-484(n)27(um)27(b)-26(er)-485(con)27(trols)-484(the)-484(depth)-485(of)]TJ 0 -13.16 TD[(de\014nitions)-247(expanded;)-277(see)-248(the)-248(discussion)-247(of)-248(`)]TJ/F4 10.91 Tf 202.3 0 TD[(--strace)]TJ/F1 10.91 Tf 45.81 0 TD[(')-247(in)-248(Chapter)-248(3)-248([Running)-248(the)-248(T)82(ests],)]TJ -248.11 -13.15 TD[(page)-333(9.)]TJ -15.69 -16.14 TD[(3.)-660(Finally)83(,)-273(if)-259(the)-260(v)55(alue)-258(of)-259(`)]TJ/F4 10.91 Tf 123.47 0 TD[(verbose)]TJ/F1 10.91 Tf 40.09 0 TD[(')-259(is)-259(3)-259(or)-259(greater,)]TJ/F4 10.91 Tf 76.27 0 TD[(runtest)]TJ/F1 10.91 Tf 42.92 0 TD[(turns)-259(on)-259(the)]TJ/F4 10.91 Tf 60.09 0 TD[(expect)]TJ/F1 10.91 Tf 37.19 0 TD[(command)]TJ/F4 10.91 Tf -364.34 -13.15 TD[(log_user)]TJ/F1 10.91 Tf 45.82 0 TD[(.)-434(This)-304(command)-305(prin)27(ts)-303(all)]TJ/F4 10.91 Tf 127.56 0 TD[(expect)]TJ/F1 10.91 Tf 37.68 0 TD[(actions)-304(to)-304(the)]TJ/F4 10.91 Tf 68.2 0 TD[(expect)]TJ/F1 10.91 Tf 37.68 0 TD[(standard)-304(output,)-310(to)]TJ -316.94 -13.15 TD[(the)-333(detailed)-333(log)-333(\014le,)-334(and)-333(\(if)-333(`)]TJ/F4 10.91 Tf 136.67 0 TD[(--debug)]TJ/F1 10.91 Tf 40.09 0 TD[(')-333(is)-333(on\))-333(to)-334(`)]TJ/F4 10.91 Tf 53.39 0 TD[(dbg.log)]TJ/F1 10.91 Tf 40.09 0 TD[('.)]TJ/F2 14.35 Tf -291.84 -30.88 TD[(6.3)-562(Adding)-375(a)-375(test)-375(case)-375(to)-375(a)-375(test)-375(suite)]TJ/F1 10.91 Tf 14.94 -23.11 TD[(There)-357(are)-358(t)27(w)28(o)-357(sligh)27(tly)-357(di\013eren)27(t)-357(w)27(a)27(ys)-356(to)-358(add)-358(a)-358(test)-357(case.)-518(One)-358(is)-358(to)-357(add)-358(the)-358(test)-358(case)-357(to)]TJ -14.94 -13.16 TD[(an)-297(existing)-298(directory)83(.)-432(The)-297(other)-298(is)-297(to)-298(create)-297(a)-298(new)-297(directory)-298(to)-298(hold)-297(y)27(our)-297(test.)-432(The)-298(existing)]TJ 0 -13.15 TD[(test)-284(directories)-285(represen)26(t)-284(sev)27(eral)-284(st)27(yles)-284(of)-285(testing,)-295(all)-285(of)-285(whic)27(h)-284(are)-285(sligh)27(tly)-284(di\013eren)27(t;)-300(examine)]TJ 0 -13.15 TD[(the)-333(directories)-333(for)-333(the)-334(to)-28(ol)-333(of)-333(in)27(terest)-333(to)-333(see)-333(whic)26(h)-332(\(if)-333(an)26(y\))-332(is)-333(most)-334(suitable.)]TJ 14.94 -16.14 TD[(Adding)-347(a)]TJ/F7 10.91 Tf 47.89 0 TD[(gcc)]TJ/F1 10.91 Tf 23.68 0 TD[(test)-347(can)-348(b)-28(e)-347(v)27(ery)-347(simple:)-473(just)-348(add)-347(the)-348(C)-347(co)-28(de)-348(to)-348(an)27(y)-346(directory)-348(b)-28(eginning)]TJ -86.51 -13.15 TD[(with)-333(`)]TJ/F4 10.91 Tf 27.88 0 TD[(gcc.)]TJ/F1 10.91 Tf 22.91 0 TD[(')-333(and)-333(it)-333(runs)-334(on)-333(the)-333(next)-334(`)]TJ/F4 10.91 Tf 124.63 0 TD[(runtest)-333(--tool)-333(gcc)]TJ/F1 10.91 Tf 98.91 0 TD[('.)]TJ -259.39 -16.14 TD[(T)83(o)-288(add)-289(a)-289(test)-289(to)]TJ/F7 10.91 Tf 78.55 0 TD[(gdb)]TJ/F1 10.91 Tf 20.14 0 TD[(,)-297(\014rst)-289(add)-289(an)26(y)-288(source)-289(co)-27(de)-289(y)27(ou)-288(will)-289(need)-289(to)-289(the)-289(test)-289(directory)82(.)-429(Then)]TJ -113.63 -13.15 TD[(y)27(ou)-312(can)-313(either)-313(create)-314(a)-313(new)]TJ/F4 10.91 Tf 133.9 0 TD[(expect)]TJ/F1 10.91 Tf 37.78 0 TD[(\014le,)-317(or)-313(add)-313(y)27(our)-313(test)-313(to)-313(an)-313(existing)-314(one)-313(\(an)27(y)-312(\014le)-314(with)-313(a)]TJ -171.68 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(.exp)]TJ/F1 10.91 Tf 22.91 0 TD[(')-309(su\016x\).)-437(Creating)-310(a)-310(new)-310(`)]TJ/F4 10.91 Tf 122.32 0 TD[(.exp)]TJ/F1 10.91 Tf 22.91 0 TD[(')-309(\014le)-310(is)-310(probably)-310(a)-310(b)-28(etter)-310(idea)-310(if)-310(the)-310(test)-310(is)-310(signi\014can)27(tly)]TJ -171.17 -13.15 TD[(di\013eren)27(t)-395(from)-395(existing)-396(tests.)-632(Adding)-396(it)-396(as)-396(a)-395(separate)-396(\014le)-396(also)-396(mak)27(es)-395(upgrading)-396(easier.)-632(If)]TJ 0 -13.15 TD[(the)-365(C)-365(co)-28(de)-365(has)-365(to)-365(b)-28(e)-365(already)-365(compiled)-365(b)-28(efore)-365(the)-365(test)-365(will)-366(run,)-373(then)-365(y)27(ou'll)-364(ha)27(v)27(e)-364(to)-365(add)-365(it)]TJ 0 -13.15 TD[(to)-333(the)-333(`)]TJ/F4 10.91 Tf 35.15 0 TD[(Makefile.in)]TJ/F1 10.91 Tf 63 0 TD[(')-333(\014le)-333(for)-333(that)-334(test)-333(directory)82(,)-332(then)-333(run)]TJ/F4 10.91 Tf 179.27 0 TD[(configure)]TJ/F1 10.91 Tf 55.19 0 TD[(and)]TJ/F4 10.91 Tf 21.21 0 TD[(make)]TJ/F1 10.91 Tf 22.91 0 TD[(.)]TJ -361.79 -16.14 TD[(Adding)-333(a)-333(test)-333(b)26(y)-332(creating)-333(a)-334(new)-333(directory)-333(is)-334(v)27(ery)-332(similar:)]TJ -9.03 -16.14 TD[(1.)-660(Create)-360(the)-360(new)-360(directory)82(.)-523(All)-360(sub)-28(directory)-360(names)-360(b)-28(egin)-360(with)-360(the)-360(name)-361(of)-360(the)-360(to)-28(ol)-360(to)]TJ 15.69 -13.15 TD[(test;)-341(e.g.)]TJ/F7 10.91 Tf 45.77 0 TD[(g)]TJ/F4 10.91 Tf 6.99 0 TD[(++)]TJ/F1 10.91 Tf 15.15 0 TD[(tests)-338(migh)27(t)-338(b)-27(e)-339(in)-338(a)-339(directory)-338(called)-339(`)]TJ/F4 10.91 Tf 174.21 0 TD[(g++.other)]TJ/F1 10.91 Tf 51.55 0 TD[('.)-459(There)-339(can)-338(b)-28(e)-339(m)27(ultiple)]TJ -293.67 -13.15 TD[(test)-333(directories)-333(that)-333(start)-334(with)-333(the)-333(same)-334(to)-28(ol)-333(name)-333(\(suc)27(h)-333(as)-333(`)]TJ/F4 10.91 Tf 291.36 0 TD[(g++)]TJ/F1 10.91 Tf 17.19 0 TD[('\).)]TJ ET 0 g 0 G +endstream +endobj +213 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F5 31 0 R +/F4 28 0 R +/F7 49 0 R +>> +endobj +211 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 213 0 R +>> +endobj +216 0 obj +<< +/Length 9135 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(6:)-444(Ho)27(w)-333(T)83(o)-333(W)83(rite)-333(a)-333(T)82(est)-332(Case)-21861(41)]TJ 5.91 -23.91 TD[(2.)-660(Add)-320(the)-320(new)-320(directory)-320(name)-320(to)-321(the)-320(`)]TJ/F4 10.91 Tf 190.51 0 TD[(configdirs)]TJ/F1 10.91 Tf 57.27 0 TD[(')-320(de\014nition)-320(in)-320(the)-320(`)]TJ/F4 10.91 Tf 89.12 0 TD[(configure.in)]TJ/F1 10.91 Tf 68.73 0 TD[(')-320(\014le)]TJ -389.94 -13.15 TD[(for)-285(the)-287(test)-286(suite)-286(directory)83(.)-428(This)-286(w)27(a)28(y)-285(when)]TJ/F4 10.91 Tf 204.37 0 TD[(make)]TJ/F1 10.91 Tf 26.02 0 TD[(and)]TJ/F4 10.91 Tf 20.7 0 TD[(configure)]TJ/F1 10.91 Tf 54.67 0 TD[(next)-285(run,)-296(they)-286(include)]TJ -305.76 -13.15 TD[(the)-333(new)-333(directory)82(.)]TJ -15.69 -16.14 TD[(3.)-660(Add)-333(the)-333(new)-334(test)-333(case)-333(to)-334(the)-333(directory)82(,)-332(as)-333(ab)-28(o)27(v)28(e.)]TJ 0 -16.14 TD[(4.)-660(T)83(o)-387(add)-389(supp)-27(ort)-389(in)-388(the)-388(new)-388(directory)-388(for)-389(con\014gure)-388(and)-388(mak)27(e,)-401(y)27(ou)-387(m)26(ust)-387(also)-388(create)-388(a)]TJ/F4 10.91 Tf 15.69 -13.15 TD[(Makefile.in)]TJ/F1 10.91 Tf 67.88 0 TD[(and)-447(a)]TJ/F4 10.91 Tf 32.8 0 TD[(configure.in)]TJ/F1 10.91 Tf 68.73 0 TD[(.)-787(See)-448(section)-448(\\What)-447(Con\014gure)-448(Do)-28(es")-448(in)]TJ/F5 10.91 Tf 205.78 0 TD[(Cygn)27(us)]TJ -375.19 -13.15 TD[(Con\014gure)]TJ/F1 10.91 Tf 46.7 0 TD[(.)]TJ/F2 14.35 Tf -68.3 -30.89 TD[(6.4)-562(Hin)30(ts)-374(on)-375(writing)-375(a)-375(test)-375(case)]TJ/F1 10.91 Tf 14.94 -23.11 TD[(There)-305(ma)27(y)-305(b)-28(e)-305(useful)-306(existing)-305(pro)-28(cedures)-305(already)-306(written)-305(for)-306(y)27(our)-305(test)-305(in)-306(the)-305(`)]TJ/F4 10.91 Tf 366.82 0 TD[(lib)]TJ/F1 10.91 Tf 17.18 0 TD[(')-305(direc-)]TJ -398.94 -13.15 TD[(tory)-333(of)-333(the)-333(DejaGn)26(u)-332(distribution.)-444(See)-334(Section)-333(5.3)-333([DejaGn)26(u)-332(Builtins],)-333(page)-334(23.)]TJ 14.94 -16.14 TD[(It)-291(is)-292(safest)-291(to)-292(write)-291(patterns)-292(that)-291(matc)27(h)]TJ/F8 10.91 Tf 190.3 0 TD[(al)-51(l)]TJ/F1 10.91 Tf 16.01 0 TD[(the)-291(output)-292(generated)-291(b)27(y)-291(the)-291(tested)-292(program;)]TJ -221.25 -13.15 TD[(this)-254(is)-255(called)]TJ/F5 10.91 Tf 60.58 0 TD[(closure)]TJ/F1 10.91 Tf 32.82 0 TD[(.)-418(If)-255(a)-254(pattern)-255(do)-28(es)-255(not)-254(matc)26(h)-253(the)-255(en)27(tire)-254(output,)-271(an)27(y)-254(output)-254(that)-255(remains)]TJ -93.4 -13.15 TD[(will)-416(b)-28(e)-416(examined)-416(b)27(y)-416(the)]TJ/F8 10.91 Tf 122.71 0 TD[(next)]TJ/F4 10.91 Tf 25.41 0 TD[(expect)]TJ/F1 10.91 Tf 38.9 0 TD[(command.)-693(In)-416(this)-416(situation,)-437(the)-416(precise)-417(b)-28(oundary)]TJ -187.02 -13.15 TD[(that)-341(determines)-341(whic)26(h)]TJ/F4 10.91 Tf 110.36 0 TD[(expect)]TJ/F1 10.91 Tf 38.09 0 TD[(command)-341(sees)-341(what)-342(is)-341(v)26(ery)-340(sensitiv)27(e)-341(to)-341(timing)-342(b)-27(et)26(w)28(een)-340(the)]TJ/F4 10.91 Tf -148.45 -13.15 TD[(expect)]TJ/F1 10.91 Tf 39.03 0 TD[(task)-427(and)-427(the)-428(task)-427(running)-427(the)-428(tested)-427(to)-28(ol.)-726(As)-428(a)-427(result,)-451(the)-427(test)-428(ma)27(y)-426(sometimes)]TJ -39.03 -13.16 TD[(app)-27(ear)-388(to)-388(w)27(ork,)-400(but)-388(is)-388(lik)27(ely)-387(to)-388(ha)27(v)28(e)-387(unpredictable)-388(results.)-608(\(This)-388(problem)-387(is)-388(particularly)]TJ 0 -13.15 TD[(lik)27(ely)-360(for)-360(in)26(teractiv)28(e)-360(to)-27(ols,)-368(but)-361(can)-361(also)-361(a\013ect)-360(batc)26(h)-359(to)-28(ols|esp)-28(ecially)-361(for)-361(tests)-360(that)-361(tak)27(e)-360(a)]TJ 0 -13.15 TD[(long)-270(time)-271(to)-271(\014nish.\))-424(The)-270(b)-28(est)-271(w)27(a)27(y)-269(to)-271(ensure)-271(closure)-271(is)-271(to)-271(use)-270(the)-271(`)]TJ/F4 10.91 Tf 307.09 0 TD[(-re)]TJ/F1 10.91 Tf 17.18 0 TD[(')-270(option)-271(for)-271(the)]TJ/F4 10.91 Tf 73.37 0 TD[(expect)]TJ/F1 10.91 Tf -397.64 -13.15 TD[(command)-323(to)-323(write)-323(the)-323(pattern)-324(as)-323(a)-323(full)-323(regular)-324(expressions;)-326(then)-323(y)26(ou)-322(can)-323(matc)27(h)-322(the)-324(end)-323(of)]TJ 0 -13.15 TD[(output)-344(using)-345(a)-344(`)]TJ/F4 10.91 Tf 76.79 0 TD[($)]TJ/F1 10.91 Tf 5.73 0 TD[('.)-478(It)-344(is)-345(also)-344(a)-345(go)-28(o)-28(d)-344(idea)-345(to)-344(write)-345(patterns)-345(that)-344(matc)27(h)-344(all)-345(a)27(v)56(ailable)-344(output)]TJ -82.52 -13.15 TD[(b)27(y)-398(using)-399(`)]TJ/F4 10.91 Tf 48.16 0 TD[(.*\\)]TJ/F1 10.91 Tf 17.18 0 TD[(')-398(after)-399(the)-399(text)-399(of)-399(in)27(terest;)-431(this)-399(will)-399(also)-399(matc)27(h)-398(an)27(y)-398(in)27(terv)27(ening)-397(blank)-399(lines.)]TJ -65.34 -13.15 TD[(Sometimes)-356(an)-357(alternativ)27(e)-356(is)-357(to)-357(matc)27(h)-356(end)-357(of)-357(line)-357(using)-356(`)]TJ/F4 10.91 Tf 269.44 0 TD[(\\r)]TJ/F1 10.91 Tf 11.46 0 TD[(')-356(or)-357(`)]TJ/F4 10.91 Tf 23.57 0 TD[(\\n)]TJ/F1 10.91 Tf 11.46 0 TD[(',)-362(but)-357(this)-357(is)-357(usually)-357(to)-27(o)]TJ -315.93 -13.15 TD[(dep)-27(enden)27(t)-333(on)-333(terminal)-333(settings.)]TJ 14.94 -16.14 TD[(Alw)27(a)28(ys)-494(escap)-28(e)-495(punctuation,)-535(suc)26(h)-494(as)-495(`)]TJ/F4 10.91 Tf 186.48 0 TD[(\()]TJ/F1 10.91 Tf 5.73 0 TD[(')-495(or)-495(`)]TJ/F4 10.91 Tf 26.59 0 TD[(")]TJ/F1 10.91 Tf 5.73 0 TD[(',)-535(in)-495(y)27(our)-494(patterns;)-576(for)-496(example,)-535(write)]TJ -239.47 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(\\\()]TJ/F1 10.91 Tf 11.45 0 TD[('.)-448(If)-335(y)27(ou)-334(forget)-335(to)-335(escap)-27(e)-335(punctuation,)-335(y)26(ou)-333(will)-335(usually)-335(see)-335(an)-334(error)-335(message)-335(lik)27(e)-334(`)]TJ/F4 10.91 Tf 388.88 0 TD[(extra)]TJ -403.36 -13.15 TD[(characters)-333(after)-333(close-quote)]TJ/F1 10.91 Tf 156.18 0 TD[('.)]TJ -141.24 -16.14 TD[(If)-372(y)27(ou)-372(ha)27(v)28(e)-372(trouble)-373(understanding)-372(wh)27(y)-372(a)-373(pattern)-372(do)-28(es)-373(not)-372(matc)26(h)-371(the)-373(program)-372(output,)]TJ -14.94 -13.15 TD[(try)-496(using)-497(the)-496(`)]TJ/F4 10.91 Tf 73.61 0 TD[(--debug)]TJ/F1 10.91 Tf 40.09 0 TD[(')-496(option)-497(to)]TJ/F4 10.91 Tf 59.29 0 TD[(runtest)]TJ/F1 10.91 Tf 40.09 0 TD[(,)-537(and)-496(examine)-497(the)-496(debug)-497(log)-497(carefully)83(.)-933(See)]TJ -213.08 -13.15 TD[(Section)-333(5.7.3)-333([Debug)-333(Log],)-334(page)-333(36.)]TJ 14.94 -16.14 TD[(Be)-304(careful)-305(not)-305(to)-304(neglect)-305(output)-305(generated)-305(b)27(y)-304(setup)-304(rather)-305(than)-305(b)27(y)-304(the)-304(in)26(teresting)-303(parts)]TJ -14.94 -13.15 TD[(of)-349(a)-349(test)-350(case.)-493(F)83(or)-349(example,)-353(while)-350(testing)]TJ/F7 10.91 Tf 201.56 0 TD[(gdb)]TJ/F1 10.91 Tf 20.13 0 TD[(,)-353(I)-349(issue)-350(a)-349(send)-350(`)]TJ/F4 10.91 Tf 78.38 0 TD[(set)-333(height)-333(0\\n)]TJ/F1 10.91 Tf 76 0 TD[(')-349(command.)]TJ -376.07 -13.15 TD[(The)-360(purp)-28(ose)-360(is)-360(simply)-361(to)-360(mak)27(e)-360(sure)]TJ/F7 10.91 Tf 176.31 0 TD[(gdb)]TJ/F1 10.91 Tf 24.06 0 TD[(nev)27(er)-359(calls)-360(a)-361(paging)-360(program.)-526(The)-360(`)]TJ/F4 10.91 Tf 173.42 0 TD[(set)-333(height)]TJ/F1 10.91 Tf 55.18 0 TD[(')]TJ -428.97 -13.15 TD[(command)-427(in)]TJ/F7 10.91 Tf 64.48 0 TD[(gdb)]TJ/F1 10.91 Tf 24.8 0 TD[(do)-27(es)-428(not)-427(generate)-428(an)27(y)-427(output;)-475(but)-427(running)]TJ/F8 10.91 Tf 215.41 0 TD[(any)]TJ/F1 10.91 Tf 22.64 0 TD[(command)-427(mak)27(es)]TJ/F7 10.91 Tf 84.54 0 TD[(gdb)]TJ/F1 10.91 Tf -411.87 -13.15 TD[(issue)-318(a)-319(new)-319(`)]TJ/F4 10.91 Tf 60.26 0 TD[(\(gdb\))]TJ/F1 10.91 Tf 32.27 0 TD[(')-318(prompt.)-440(If)-319(there)-319(w)27(ere)-318(no)]TJ/F4 10.91 Tf 128.04 0 TD[(expect)]TJ/F1 10.91 Tf 37.85 0 TD[(command)-318(to)-319(matc)26(h)-318(this)-319(prompt,)-322(the)]TJ -258.42 -13.15 TD[(output)-281(`)]TJ/F4 10.91 Tf 38.22 0 TD[(\(gdb\))]TJ/F1 10.91 Tf 32.27 0 TD[(')-281(b)-27(egins)-282(the)-281(text)-281(seen)-281(b)27(y)-280(the)-282(next)]TJ/F4 10.91 Tf 159.51 0 TD[(expect)]TJ/F1 10.91 Tf 37.43 0 TD[(command|whic)27(h)-280(migh)27(t)-280(mak)27(e)]TJ/F8 10.91 Tf 146.17 0 TD[(that)]TJ/F1 10.91 Tf -413.6 -13.16 TD[(pattern)-333(fail)-333(to)-333(matc)26(h.)]TJ 14.94 -16.13 TD[(T)83(o)-426(preserv)27(e)-426(basic)-426(sanit)27(y)83(,)-449(I)-426(also)-427(recommended)-426(that)-427(no)-427(test)-426(ev)27(er)-426(pass)-427(if)-426(there)-427(w)27(as)-425(an)26(y)]TJ -14.94 -13.16 TD[(kind)-373(of)-374(problem)-374(in)-373(the)-374(test)-374(case.)-566(T)83(o)-373(tak)27(e)-373(an)-374(extreme)-373(case,)-384(tests)-374(that)-374(pass)-373(ev)26(en)-372(when)-374(the)]TJ 0 -13.15 TD[(to)-27(ol)-381(will)-380(not)-381(spa)27(wn)-380(are)-380(misleading.)-586(Ideally)82(,)-391(a)-381(test)-380(in)-381(this)-380(sort)-381(of)-380(situation)-381(should)-380(not)-381(fail)]TJ 0 -13.15 TD[(either.)-453(Instead,)-337(prin)27(t)-336(an)-336(error)-336(message)-337(b)27(y)-335(calling)-336(one)-337(of)-336(the)-336(DejaGn)26(u)-335(pro)-28(cedures)]TJ/F4 10.91 Tf 389.97 0 TD[(error)]TJ/F1 10.91 Tf 32.3 0 TD[(or)]TJ/F4 10.91 Tf -422.27 -13.15 TD[(warning)]TJ/F1 10.91 Tf 40.09 0 TD[(.)]TJ ET 0 g 0 G +endstream +endobj +217 0 obj +<< +/F1 9 0 R +/F4 28 0 R +/F5 31 0 R +/F2 12 0 R +/F8 52 0 R +/F7 49 0 R +>> +endobj +215 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 217 0 R +>> +endobj +220 0 obj +<< +/Length 3621 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(42)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F2 14.35 Tf 0 -23.91 TD[(6.5)-562(Sp)-31(ecial)-375(v)61(ariables)-374(used)-375(b)31(y)-374(test)-375(cases)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(Y)83(our)-488(test)-489(cases)-489(can)-489(use)-489(these)-490(v)55(ariables,)-527(with)-489(con)27(v)27(en)28(tional)-488(meanings)-489(\(as)-489(w)27(ell)-488(as)-489(the)]TJ -14.94 -13.15 TD[(v)55(ariables)-332(sa)27(v)27(ed)-332(in)-333(`)]TJ/F4 10.91 Tf 90.45 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(')-333(see)-333(Chapter)-333(4)-334([Setting)]TJ/F4 10.91 Tf 116.46 0 TD[(runtest)]TJ/F1 10.91 Tf 43.72 0 TD[(defaults],)-333(page)-333(15\):)]TJ/F8 10.91 Tf -267.65 -15.44 TD[(These)-357(variables)-358(ar)50(e)-357(available)-357(to)-358(al)-51(l)-358(test)-358(c)50(ases.)]TJ/F4 10.91 Tf -28.8 -22.12 TD[(prms_id)]TJ/F1 10.91 Tf 57.6 0 TD[(The)-378(trac)27(king)-377(system)-379(\(e.g.)]TJ/F7 10.91 Tf 129.46 0 TD[(gna)66(ts)]TJ/F1 10.91 Tf 31.09 0 TD[(\))-378(n)27(um)28(b)-27(er)-378(iden)26(tifying)-377(a)-378(corresp)-28(onding)-378(bugre-)]TJ -160.55 -13.15 TD[(p)-27(ort.)-445(\(`)]TJ/F4 10.91 Tf 35.49 0 TD[(0)]TJ/F1 10.91 Tf 5.72 0 TD[(')-333(if)-333(y)27(ou)-333(do)-333(not)-333(sp)-28(ecify)-333(it)-334(in)-333(the)-333(test)-334(script.\))]TJ/F4 10.91 Tf -98.81 -22.11 TD[(bug_id)]TJ/F1 10.91 Tf 57.6 0 TD[(An)-307(optional)-308(bug)-307(id;)-316(ma)26(y)-306(re\015ect)-308(a)-307(bug)-308(iden)27(ti\014cation)-307(from)-308(another)-307(organization.)]TJ 0 -13.15 TD[(\(`)]TJ/F4 10.91 Tf 7.27 0 TD[(0)]TJ/F1 10.91 Tf 5.73 0 TD[(')-333(if)-333(y)27(ou)-333(do)-333(not)-333(sp)-28(ecify)-333(it.\))]TJ/F4 10.91 Tf -70.6 -22.12 TD[(subdir)]TJ/F1 10.91 Tf 57.6 0 TD[(The)-333(sub)-28(directory)-333(for)-333(the)-334(curren)27(t)-332(test)-333(case.)]TJ/F8 10.91 Tf -28.8 -18.43 TD[(These)-357(variables)-358(should)-358(never)-358(b)51(e)-357(change)50(d.)-459(They)-358(app)50(e)51(ar)-356(in)-358(most)-358(tests.)]TJ/F4 10.91 Tf -28.8 -22.12 TD[(expect_out\(buffer\))]TJ/F1 10.91 Tf 57.6 -13.15 TD[(The)-297(output)-297(from)-298(the)-297(last)-297(command.)-433(This)-297(is)-297(an)-298(in)27(ternal)-296(v)54(ariable)-296(set)-297(b)26(y)]TJ/F4 10.91 Tf 337.01 0 TD[(expect)]TJ/F1 10.91 Tf 34.36 0 TD[(.)]TJ/F4 10.91 Tf -428.97 -22.12 TD[(exec_output)]TJ/F1 10.91 Tf 57.6 -13.15 TD[(This)-349(is)-349(the)-349(output)-349(from)-349(a)]TJ/F5 10.91 Tf 126.33 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.92 0 TD[(_load)]TJ/F1 10.91 Tf 32.44 0 TD[(command.)-491(This)-349(only)-349(applies)-349(to)-349(to)-28(ols)-349(lik)26(e)]TJ/F7 10.91 Tf -177.69 -13.15 TD[(gcc)]TJ/F1 10.91 Tf 24.35 0 TD[(and)]TJ/F7 10.91 Tf 22.03 0 TD[(gas)]TJ/F1 10.91 Tf 23.13 0 TD[(whic)27(h)-407(pro)-28(duce)-408(an)-409(ob)-55(ject)-409(\014le)-408(that)-409(m)27(ust)-407(in)-409(turn)-408(b)-28(e)-408(executed)-409(to)]TJ -69.51 -13.15 TD[(complete)-333(a)-333(test.)]TJ/F4 10.91 Tf -57.6 -22.12 TD[(comp_output)]TJ/F1 10.91 Tf 57.6 -13.15 TD[(This)-398(is)-399(the)-399(output)-398(from)-399(a)]TJ/F5 10.91 Tf 129.58 0 TD[(to)-27(ol)]TJ/F4 10.91 Tf 18.92 0 TD[(_start)]TJ/F1 10.91 Tf 38.71 0 TD[(command.)-640(This)-399(is)-399(con)27(v)28(en)28(tionally)-398(used)]TJ -187.21 -13.15 TD[(for)-377(batc)27(h)-376(orien)26(ted)-376(programs,)-389(lik)27(e)]TJ/F7 10.91 Tf 162.4 0 TD[(gcc)]TJ/F1 10.91 Tf 24.01 0 TD[(and)]TJ/F7 10.91 Tf 21.69 0 TD[(gas)]TJ/F1 10.91 Tf 18.68 0 TD[(,)-388(that)-377(ma)26(y)-376(pro)-28(duce)-377(in)27(teresting)]TJ -226.78 -13.15 TD[(output)-333(\(w)27(arnings,)-332(errors\))-334(without)-333(further)-333(in)26(teraction.)]TJ ET 0 g 0 G +endstream +endobj +221 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +/F8 52 0 R +/F7 49 0 R +/F5 31 0 R +>> +endobj +219 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 221 0 R +>> +endobj +224 0 obj +<< +/Length 6574 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(7:)-444(New)-334(T)83(o)-27(ols,)-333(T)82(argets,)-332(or)-334(Hosts)-20764(43)]TJ/F2 17.22 Tf 0 -25.91 TD[(7)-562(New)-375(T)93(o)-30(ols,)-375(T)92(argets,)-374(or)-375(Hosts)]TJ/F1 10.91 Tf 14.94 -28.09 TD[(The)-350(most)-350(common)-351(w)27(a)28(ys)-350(to)-350(extend)-351(the)-350(DejaGn)27(u)-350(framew)27(ork)-349(are:)-479(adding)-350(a)-351(suite)-350(of)-351(tests)]TJ -14.94 -13.15 TD[(for)-265(a)-266(new)-265(to)-28(ol)-266(to)-266(b)-27(e)-266(tested;)-288(adding)-266(supp)-28(ort)-265(for)-266(testing)-266(on)-265(a)-266(new)-265(target;)-289(and)-265(p)-28(orting)]TJ/F4 10.91 Tf 391.91 0 TD[(runtest)]TJ/F1 10.91 Tf -391.91 -13.15 TD[(to)-333(a)-333(new)-333(host.)]TJ/F2 14.35 Tf 0 -30.89 TD[(7.1)-562(W)93(riting)-374(tests)-375(for)-375(a)-375(new)-375(to)-31(ol)]TJ/F1 10.91 Tf 14.94 -23.11 TD[(In)-426(general,)-450(the)-426(b)-28(est)-427(w)27(a)28(y)-426(to)-426(learn)-427(ho)27(w)-426(to)-426(write)-427(\(co)-27(de)-427(or)-427(ev)27(en)-425(prose\))-427(is)-426(to)-427(read)-427(some-)]TJ -14.94 -13.15 TD[(thing)-385(similar.)-602(This)-385(principle)-386(applies)-386(to)-385(test)-386(cases)-386(and)-385(to)-386(test)-386(suites.)-601(Unfortunately)82(,)-397(w)26(ell-)]TJ 0 -13.15 TD[(established)-479(test)-479(suites)-479(ha)27(v)28(e)-479(a)-479(w)27(a)28(y)-478(of)-480(dev)27(eloping)-478(their)-479(o)27(wn)-478(con)26(v)28(en)28(tions:)-735(as)-479(test)-480(writers)]TJ 0 -13.15 TD[(b)-27(ecome)-315(more)-315(exp)-28(erienced)-315(with)-315(DejaGn)27(u)-314(and)-315(with)-315(Tcl,)-319(they)-315(accum)27(ulate)-314(more)-315(utilities,)-319(and)]TJ 0 -13.15 TD[(tak)27(e)-332(adv)55(an)27(tage)-332(of)-333(more)-334(and)-333(more)-333(features)-334(of)]TJ/F4 10.91 Tf 216.82 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(and)-333(Tcl)-333(in)-333(general.)]TJ -239.88 -16.14 TD[(Insp)-27(ecting)-425(suc)27(h)-423(established)-425(test)-424(suites)-425(ma)27(y)-424(mak)27(e)-423(the)-425(prosp)-28(ect)-424(of)-425(creating)-424(an)-425(en)27(tirely)]TJ -14.94 -13.15 TD[(new)-342(test)-342(suite)-342(app)-28(ear)-342(o)27(v)28(erwhelming.)-470(Nev)27(ertheless,)-343(it)-342(is)-342(quite)-342(straigh)26(tforw)28(ard)-341(to)-342(get)-342(a)-342(new)]TJ 0 -13.15 TD[(test)-333(suite)-333(going.)]TJ 14.94 -16.14 TD[(There)-315(is)-315(one)-315(test)-315(suite)-316(that)-315(is)-315(guaran)27(teed)-314(not)-316(to)-315(gro)27(w)-314(more)-315(elab)-28(orate)-315(o)26(v)28(er)-314(time:)-435(b)-28(oth)-315(it)]TJ -14.94 -13.15 TD[(and)-377(the)-378(to)-28(ol)-378(it)-378(tests)-378(w)27(ere)-377(created)-378(expressly)-378(to)-378(illustrate)-378(what)-378(it)-378(tak)27(es)-377(to)-378(get)-378(started)-378(with)]TJ 0 -13.15 TD[(DejaGn)27(u.)-681(The)-413(`)]TJ/F4 10.91 Tf 79.14 0 TD[(example/)]TJ/F1 10.91 Tf 45.82 0 TD[(')-412(directory)-413(of)-412(the)-413(DejaGn)27(u)-412(distribution)-412(con)26(tains)-411(b)-28(oth)-413(an)-412(in)27(ter-)]TJ -124.96 -13.15 TD[(activ)27(e)-360(to)-27(ol)-361(called)]TJ/F4 10.91 Tf 85.44 0 TD[(calc)]TJ/F1 10.91 Tf 22.91 0 TD[(,)-367(and)-361(a)-361(test)-361(suite)-360(for)-361(it.)-527(Reading)-361(this)-361(test)-360(suite,)-368(and)-361(exp)-28(erimen)27(ting)]TJ -108.35 -13.15 TD[(with)-389(it,)-404(is)-389(a)-390(go)-27(o)-28(d)-390(w)27(a)28(y)-389(to)-389(supplemen)27(t)-389(the)-390(information)-389(in)-390(this)-389(section.)-613(\(Thanks)-390(to)-389(Rob)-28(ert)]TJ 0 -13.16 TD[(Lupton)-323(for)-324(creating)]TJ/F4 10.91 Tf 96.57 0 TD[(calc)]TJ/F1 10.91 Tf 26.44 0 TD[(and)-323(its)-324(test)-324(suite|and)-324(also)-323(the)-324(\014rst)-324(v)27(ersion)-323(of)-324(this)-324(section)-323(of)-324(the)]TJ -123.01 -13.15 TD[(man)27(ual!\))]TJ 14.94 -16.14 TD[(T)83(o)-344(help)-344(orien)27(t)-344(y)27(ou)-343(further)-345(in)-344(this)-345(task,)-347(here)-344(is)-345(an)-344(outline)-344(of)-345(the)-344(steps)-345(to)-344(b)-28(egin)-344(building)]TJ -14.94 -13.15 TD[(a)-333(test)-333(suite)-333(for)-334(a)-333(program)]TJ/F5 10.91 Tf 125.97 0 TD[(example)]TJ/F1 10.91 Tf 39.09 0 TD[(.)]TJ -159.15 -16.14 TD[(1.)-660(Create)-413(or)-414(select)-413(a)-414(directory)-413(to)-414(con)27(tain)-413(y)27(our)-413(new)-413(collection)-414(of)-413(tests.)-685(Change)-414(to)-414(that)]TJ 15.69 -13.15 TD[(directory)-333(\(sho)27(wn)-332(here)-334(as)]TJ/F4 10.91 Tf 120.82 0 TD[(testsuite)]TJ/F1 10.91 Tf 51.54 0 TD[(\):)]TJ/F4 10.91 Tf -143.56 -15.44 TD[(eg$)-524(cd)-525(testsuite/)]TJ/F1 10.91 Tf -44.49 -16.14 TD[(2.)-660(Create)-555(a)-555(`)]TJ/F4 10.91 Tf 67.83 0 TD[(configure.in)]TJ/F1 10.91 Tf 68.73 0 TD[(')-555(\014le)-555(in)-555(this)-555(directory)83(,)-610(to)-555(con)27(trol)-554(con\014guration-dep)-28(enden)27(t)]TJ -120.87 -13.15 TD[(c)27(hoices)-383(for)-384(y)26(our)-383(tests.)-597(So)-385(far)-384(as)-384(DejaGn)26(u)-383(is)-384(concerned,)-397(the)-385(imp)-27(ortan)26(t)-383(thing)-384(is)-385(to)-384(set)]TJ 0 -13.15 TD[(a)-375(v)55(alue)-375(for)-375(the)-376(v)55(ariable)]TJ/F4 10.91 Tf 116 0 TD[(target_abbrev)]TJ/F1 10.91 Tf 74.45 0 TD[(;)-396(this)-375(v)54(alue)-374(is)-376(the)-375(link)-376(to)-375(the)-376(init)-375(\014le)-376(y)27(ou)-374(will)]TJ -190.45 -13.15 TD[(write)-334(so)-27(on.)-448(\(F)83(or)-333(simplicit)26(y)84(,)-334(w)27(e)-333(assume)-334(the)-335(en)27(vironmen)28(t)-333(is)-334(Unix,)-335(and)-334(use)-334(`)]TJ/F4 10.91 Tf 352.26 0 TD[(unix)]TJ/F1 10.91 Tf 22.91 0 TD[(')-334(as)-334(the)]TJ -375.17 -13.15 TD[(v)55(alue.\))]TJ 0 -16.14 TD[(What)-303(else)-304(is)-303(needed)-304(in)-304(`)]TJ/F4 10.91 Tf 112.74 0 TD[(configure.in)]TJ/F1 10.91 Tf 68.73 0 TD[(')-303(dep)-28(ends)-304(on)-303(the)-304(requiremen)27(ts)-303(of)-303(y)26(our)-302(to)-28(ol,)-310(y)27(our)]TJ -181.47 -13.15 TD[(in)27(tended)-351(test)-352(en)26(vironmen)28(ts,)-356(and)-352(whic)27(h)]TJ/F4 10.91 Tf 189.42 0 TD[(configure)]TJ/F1 10.91 Tf 55.39 0 TD[(system)-352(y)27(ou)-351(use.)-502(This)-352(example)-352(is)-352(a)]TJ -244.81 -13.15 TD[(minimal)]TJ/F4 10.91 Tf 42.96 0 TD[(configure.in)]TJ/F1 10.91 Tf 72.9 0 TD[(for)-382(use)-383(with)-382(Cygn)27(us)-382(Con\014gure.)-592(\(F)83(or)-382(an)-383(alternativ)27(e)-381(based)-383(on)]TJ -115.86 -13.15 TD[(the)-340(FSF)]TJ/F4 10.91 Tf 42.88 0 TD[(autoconf)]TJ/F1 10.91 Tf 49.53 0 TD[(system,)-342(see)-340(the)]TJ/F4 10.91 Tf 75.89 0 TD[(calc)]TJ/F1 10.91 Tf 26.62 0 TD[(example)-340(distributed)-340(with)-341(DejaGn)27(u.\))-465(Replace)]TJ/F5 10.91 Tf -194.92 -13.15 TD[(example)]TJ/F1 10.91 Tf 43.34 0 TD[(with)-333(the)-333(name)-333(of)-334(y)27(our)-332(program:)]TJ ET 0 g 0 G +endstream +endobj +225 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +/F5 31 0 R +>> +endobj +223 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 225 0 R +>> +endobj +228 0 obj +<< +/Length 3165 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(44)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F9 9.96 Tf 21.6 -20.18 TD[(\013)]TJ ET 45.58 -6.23 m 450.40 -6.23 l 450.40 -5.83 l 45.58 -5.83 l b BT 456.38 -6.23 TD[(\010)]TJ ET 39.60 -201.93 m 40.00 -201.93 l 40.00 -11.96 l 39.60 -11.96 l b BT/F4 10.91 Tf 42.99 -24.6 TD[(#)-524(This)-525(file)-525(is)-525(a)-525(shell)-525(script)-525(fragment)]TJ 0 -12.45 TD[(#)-524(for)-525(use)-525(with)-525(Cygnus)-525(configure.)]TJ 0 -24.91 TD[(srctrigger=")]TJ/F5 10.91 Tf 68.72 0 TD[(example)]TJ/F4 10.91 Tf 39.1 0 TD[(.0")]TJ -107.82 -12.45 TD[(srcname="The)-524(DejaGnu)]TJ/F5 10.91 Tf 120.27 0 TD[(example)]TJ/F4 10.91 Tf 45.43 0 TD[(tests")]TJ -165.7 -24.91 TD[(#)-524(per-host:)]TJ 0 -24.91 TD[(#)-524(per-target:)]TJ 0 -24.9 TD[(#)-524(everything)-525(defaults)-525(to)-525(unix)-525(for)-525(a)-525(target)]TJ 0 -12.46 TD[(target_abbrev=unix)]TJ 0 -24.9 TD[(#)-524(post-target:)]TJ ET 456.38 -201.93 m 456.77 -201.93 l 456.77 -11.96 l 456.38 -11.96 l b BT/F9 9.96 Tf 39.6 -208.16 TD[(\012)]TJ ET 45.58 -208.16 m 450.40 -208.16 l 450.40 -207.76 l 45.58 -207.76 l b BT 456.38 -208.16 TD[(\011)]TJ/F1 10.91 Tf -432.47 -17.39 TD[(3.)-660(Create)-301(`)]TJ/F4 10.91 Tf 53.55 0 TD[(Makefile.in)]TJ/F1 10.91 Tf 63 0 TD[(',)-307(the)-302(source)-301(\014le)-302(used)-301(b)27(y)]TJ/F4 10.91 Tf 117.53 0 TD[(configure)]TJ/F1 10.91 Tf 54.84 0 TD[(to)-301(build)-301(y)26(our)-300(`)]TJ/F4 10.91 Tf 68.07 0 TD[(Makefile)]TJ/F1 10.91 Tf 45.82 0 TD[('.)-433(Its)]TJ -387.12 -13.15 TD[(leading)-333(section)-333(should)-333(as)-334(usual)-333(con)27(tain)-333(the)-333(v)55(alues)-333(that)]TJ/F4 10.91 Tf 263.94 0 TD[(configure)]TJ/F1 10.91 Tf 55.18 0 TD[(ma)27(y)-332(o)27(v)28(erride:)]TJ/F9 9.96 Tf -319.12 -9.75 TD[(\013)]TJ ET 45.58 -248.45 m 450.40 -248.45 l 450.40 -248.05 l 45.58 -248.05 l b BT 456.38 -248.45 TD[(\010)]TJ ET 39.60 -446.58 m 40.00 -446.58 l 40.00 -254.18 l 39.60 -254.18 l b BT/F4 10.91 Tf 42.99 -266.82 TD[(srcdir)-524(=)-525(.)]TJ 0 -12.45 TD[(prefix)-524(=)-525(/usr/local)]TJ 0 -24.91 TD[(exec_prefix)-524(=)-525($\(prefix\))]TJ 0 -12.45 TD[(bindir)-524(=)-525($\(exec_prefix\)/bin)]TJ 0 -12.46 TD[(libdir)-524(=)-525($\(exec_prefix\)/lib)]TJ 0 -12.45 TD[(tooldir)-524(=)-525($\(libdir\)/$\(target_alias\))]TJ 0 -24.91 TD[(datadir)-524(=)-525($\(exec_prefix\)/lib/dejagnu)]TJ 0 -24.9 TD[(RUNTEST)-524(=)-525(runtest)]TJ 0 -12.46 TD[(RUNTESTFLAGS)-524(=)]TJ 0 -12.45 TD[(FLAGS_TO_PASS)-524(=)]TJ 0 -24.91 TD[(####)-524(host,)-525(target,)-525(site)-525(specific)-525(Makefile)-525(frags)-525(come)-525(in)-525(here.)]TJ ET 456.38 -446.58 m 456.77 -446.58 l 456.77 -254.18 l 456.38 -254.18 l b BT/F9 9.96 Tf 39.6 -452.81 TD[(\012)]TJ ET 45.58 -452.81 m 450.40 -452.81 l 450.40 -452.41 l 45.58 -452.41 l b BT 456.38 -452.81 TD[(\011)]TJ/F1 10.91 Tf -416.78 -17.38 TD[(This)-305(should)-306(b)-28(e)-306(follo)27(w)28(ed)-305(b)27(y)-305(the)-306(standard)-306(targets)-306(at)-306(y)27(our)-305(site.)-435(T)82(o)-305(b)-27(egin)-306(with,)-311(they)-306(need)]TJ 0 -13.16 TD[(not)-333(do)-333(an)27(ything|for)-333(example,)-333(these)-333(de\014nitions)-334(will)-333(do:)]TJ ET 0 g 0 G +endstream +endobj +229 0 obj +<< +/F1 9 0 R +/F9 59 0 R +/F4 28 0 R +/F5 31 0 R +>> +endobj +227 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 229 0 R +>> +endobj +232 0 obj +<< +/Length 3671 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(7:)-444(New)-334(T)83(o)-27(ols,)-333(T)82(argets,)-332(or)-334(Hosts)-20764(45)]TJ/F9 9.96 Tf 21.6 -20.18 TD[(\013)]TJ ET 45.58 -6.23 m 450.40 -6.23 l 450.40 -5.83 l 45.58 -5.83 l b BT 456.38 -6.23 TD[(\010)]TJ ET 39.60 -170.36 m 40.00 -170.36 l 40.00 -11.96 l 39.60 -11.96 l b BT/F4 10.91 Tf 42.99 -30.39 TD[(all:)]TJ 0 -24.9 TD[(info:)]TJ 0 -24.91 TD[(install-info:)]TJ 0 -24.91 TD[(install:)]TJ 0 -12.45 TD[(uninstall:)]TJ 0 -24.91 TD[(clean:)]TJ 45.82 -12.45 TD[(-rm)-524(-f)-525(*~)-525(core)-525(*.info*)]TJ ET 456.38 -170.36 m 456.77 -170.36 l 456.77 -11.96 l 456.38 -11.96 l b BT/F9 9.96 Tf 39.6 -176.59 TD[(\012)]TJ ET 45.58 -176.59 m 450.40 -176.59 l 450.40 -176.19 l 45.58 -176.19 l b BT 456.38 -176.59 TD[(\011)]TJ/F1 10.91 Tf -416.78 -17.39 TD[(It)-328(is)-328(also)-328(a)-328(go)-27(o)-28(d)-328(idea)-328(to)-328(mak)27(e)-327(sure)-328(y)26(our)-327(`)]TJ/F4 10.91 Tf 195.72 0 TD[(Makefile)]TJ/F1 10.91 Tf 45.82 0 TD[(')-328(can)-328(rebuild)-328(itself)-328(if)-328(`)]TJ/F4 10.91 Tf 102.83 0 TD[(Makefile.in)]TJ/F1 10.91 Tf 63 0 TD[(')]TJ -407.37 -13.15 TD[(c)27(hanges,)-332(with)-333(a)-334(target)-333(lik)27(e)-333(this)-333(\(whic)27(h)-332(w)26(orks)-332(for)-333(either)-334(Cygn)27(us)-332(or)-334(FSF)-333(Con\014gure\):)]TJ/F9 9.96 Tf 0 -10.05 TD[(\013)]TJ ET 45.58 -217.18 m 450.40 -217.18 l 450.40 -216.78 l 45.58 -216.78 l b BT 456.38 -217.18 TD[(\010)]TJ ET 39.60 -266.78 m 40.00 -266.78 l 40.00 -222.91 l 39.60 -222.91 l b BT/F4 10.91 Tf 42.99 -236.46 TD[(Makefile)-524(:)-525($\(srcdir\)/Makefile.in)-525($\(host_makefile_frag\))-525(\\)]TJ 74.45 -12.45 TD[($\(target_makefile_frag\))]TJ -28.63 -12.46 TD[($\(SHELL\))-524(./config.status)]TJ ET 456.38 -266.78 m 456.77 -266.78 l 456.77 -222.91 l 456.38 -222.91 l b BT/F9 9.96 Tf 39.6 -273.01 TD[(\012)]TJ ET 45.58 -273.01 m 450.40 -273.01 l 450.40 -272.61 l 45.58 -272.61 l b BT 456.38 -273.01 TD[(\011)]TJ/F1 10.91 Tf -416.78 -17.38 TD[(Y)83(ou)-363(also)-365(need)-364(to)-364(include)-364(t)26(w)28(o)-363(targets)-364(imp)-28(ortan)27(t)-364(to)-364(DejaGn)27(u:)]TJ/F4 10.91 Tf 296.54 0 TD[(check)]TJ/F1 10.91 Tf 28.64 0 TD[(,)-371(to)-365(run)-364(the)-364(tests,)]TJ -325.18 -13.15 TD[(and)]TJ/F4 10.91 Tf 21.3 0 TD[(site.exp)]TJ/F1 10.91 Tf 45.81 0 TD[(,)-342(to)-341(set)-341(up)-341(the)-341(Tcl)-341(copies)-341(of)-341(con\014guration-dep)-28(enden)27(t)-340(v)54(alues.)-466(The)]TJ/F4 10.91 Tf 314.65 0 TD[(check)]TJ/F1 10.91 Tf -381.76 -13.16 TD[(target)-333(m)27(ust)-332(run)-334(`)]TJ/F4 10.91 Tf 82.24 0 TD[(runtest)-333(--tool)]TJ/F5 10.91 Tf 81.73 0 TD[(example)]TJ/F1 10.91 Tf 39.7 0 TD[(':)]TJ/F9 9.96 Tf -203.67 -9.44 TD[(\013)]TJ ET 45.58 -326.14 m 450.40 -326.14 l 450.40 -325.74 l 45.58 -325.74 l b BT 456.38 -326.14 TD[(\010)]TJ ET 39.60 -374.53 m 40.00 -374.53 l 40.00 -331.87 l 39.60 -331.87 l b BT/F4 10.91 Tf 42.99 -344.51 TD[(check:)-524(site.exp)-525(all)]TJ 45.82 -12.46 TD[($\(RUNTEST\))-524($\(RUNTESTFLAGS\))-525($\(FLAGS_TO_PASS\))-525(\\)]TJ 22.9 -12.45 TD[(--tool)]TJ/F5 10.91 Tf 40.09 0 TD[(example)]TJ/F4 10.91 Tf 45.43 0 TD[(--srcdir)-524($\(srcdir\))]TJ ET 456.38 -374.53 m 456.77 -374.53 l 456.77 -331.87 l 456.38 -331.87 l b BT/F9 9.96 Tf 39.6 -380.76 TD[(\012)]TJ ET 45.58 -380.76 m 450.40 -380.76 l 450.40 -380.36 l 45.58 -380.36 l b BT 456.38 -380.76 TD[(\011)]TJ/F1 10.91 Tf -416.78 -17.99 TD[(The)]TJ/F4 10.91 Tf 23.09 0 TD[(site.exp)]TJ/F1 10.91 Tf 50.12 0 TD[(target)-394(should)-394(usually)-394(set)-395(up)-394(\(among)-394(other)-395(things!\))-627(a)-394(Tcl)-394(v)54(ariable)-393(for)]TJ -73.21 -13.15 TD[(the)-333(name)-333(of)-333(y)26(our)-332(program:)]TJ ET 0 g 0 G +endstream +endobj +233 0 obj +<< +/F1 9 0 R +/F9 59 0 R +/F4 28 0 R +/F5 31 0 R +>> +endobj +231 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 233 0 R +>> +endobj +236 0 obj +<< +/Length 5426 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(46)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F9 9.96 Tf 21.6 -20.18 TD[(\013)]TJ ET 45.58 -6.23 m 450.40 -6.23 l 450.40 -5.83 l 45.58 -5.83 l b BT 456.38 -6.23 TD[(\010)]TJ ET 39.60 -416.97 m 40.00 -416.97 l 40.00 -11.96 l 39.60 -11.96 l b BT/F4 10.91 Tf 42.99 -25.51 TD[(site.exp:)-524(./config.status)-525(Makefile)]TJ 45.82 -12.45 TD[(@echo)-524("Making)-525(a)-525(new)-525(config)-525(file...")]TJ 0 -12.46 TD[(-@rm)-524(-f)-525(./tmp?)]TJ 0 -12.45 TD[(@touch)-524(site.exp)]TJ 0 -24.91 TD[(-@mv)-524(site.exp)-525(site.bak)]TJ 0 -12.45 TD[(@echo)-524("##)-525(these)-525(variables)-525(are)-525(automatically\\)]TJ -40.1 -12.45 TD[(generated)-524(by)-525(make)-525(##")-525(>)-525(./tmp0)]TJ 40.1 -12.45 TD[(@echo)-524("#)-525(Do)-525(not)-525(edit)-525(here.)-525(If)-525(you)-525(wish)-525(to\\)]TJ -40.1 -12.46 TD[(override)-524(these)-525(values")-525(>>)-525(./tmp0)]TJ 40.1 -12.45 TD[(@echo)-524("#)-525(add)-525(them)-525(to)-525(the)-525(last)-525(section")-525(>>)-525(./tmp0)]TJ 0 -12.45 TD[(@echo)-524("set)-525(host_os)-525(${host_os}")-525(>>)-525(./tmp0)]TJ 0 -12.46 TD[(@echo)-524("set)-525(host_alias)-525(${host_alias}")-525(>>)-525(./tmp0)]TJ 0 -12.45 TD[(@echo)-524("set)-525(host_cpu)-525(${host_cpu}")-525(>>)-525(./tmp0)]TJ 0 -12.45 TD[(@echo)-524("set)-525(host_vendor)-525(${host_vendor}")-525(>>)-525(./tmp0)]TJ 0 -12.46 TD[(@echo)-524("set)-525(target_os)-525(${target_os}")-525(>>)-525(./tmp0)]TJ 0 -12.45 TD[(@echo)-524("set)-525(target_alias)-525(${target_alias}")-525(>>)-525(./tmp0)]TJ 0 -12.45 TD[(@echo)-524("set)-525(target_cpu)-525(${target_cpu}")-525(>>)-525(./tmp0)]TJ 0 -12.46 TD[(@echo)-524("set)-525(target_vendor)-525(${target_vendor}")-525(>>)-525(./tmp0)]TJ 0 -12.45 TD[(@echo)-524("set)-525(host_triplet)-525(${host_canonical}")-525(>>)-525(./tmp0)]TJ 0 -12.45 TD[(@echo)-524("set)-525(target_triplet)-525(${target_canonical}">>./tmp0)]TJ 0 -12.46 TD[(@echo)-524("set)-525(tool)-525(binutils")-525(>>)-525(./tmp0)]TJ 0 -12.45 TD[(@echo)-524("set)-525(srcdir)-525(${srcdir}")-525(>>)-525(./tmp0)]TJ 0 -12.45 TD[(@echo)-524("set)-525(objdir)-525(`pwd`")-525(>>)-525(./tmp0)]TJ 0 -12.46 TD[(@echo)-524("set)]TJ/F5 10.91 Tf 62.99 0 TD[(examplename)-581(example)]TJ/F4 10.91 Tf 110.59 0 TD[(")-524(>>)-525(./tmp0)]TJ -173.58 -12.45 TD[(@echo)-524("##)-525(All)-525(variables)-525(above)-525(are)-525(generated)-525(by\\)]TJ -40.1 -12.45 TD[(configure.)-524(Do)-525(Not)-525(Edit)-525(##")-525(>>)-525(./tmp0)]TJ 85.91 -12.46 TD[(@cat)-524(./tmp0)-525(>)-525(site.exp)]TJ -45.81 -12.45 TD[(@sed)-524(<)-525(site.bak)-525(\\)]TJ 40.09 -12.45 TD[(-e)-524('1,/^##)-525(All)-525(variables)-525(above)-525(are.*##/)-525(d')-525(\\)]TJ 0 -12.46 TD[(>>)-524(site.exp)]TJ -40.09 -12.45 TD[(-@rm)-524(-f)-525(./tmp?)]TJ ET 456.38 -416.97 m 456.77 -416.97 l 456.77 -11.96 l 456.38 -11.96 l b BT/F9 9.96 Tf 39.6 -423.2 TD[(\012)]TJ ET 45.58 -423.20 m 450.40 -423.20 l 450.40 -422.80 l 45.58 -422.80 l b BT 456.38 -423.2 TD[(\011)]TJ/F1 10.91 Tf -432.47 -18 TD[(4.)-660(Create)-333(a)-333(directory)-334(\(in)-333(`)]TJ/F4 10.91 Tf 126.39 0 TD[(testsuite/)]TJ/F1 10.91 Tf 57.27 0 TD[('\))-333(called)-333(`)]TJ/F4 10.91 Tf 44.85 0 TD[(config/)]TJ/F1 10.91 Tf 40.09 0 TD[(':)]TJ/F4 10.91 Tf -224.11 -15.44 TD[(eg$)-524(mkdir)-525(config)]TJ/F1 10.91 Tf -44.49 -16.14 TD[(5.)-660(Mak)27(e)-319(an)-320(init)-320(\014le)-320(in)-321(this)-320(directory;)-324(its)-320(name)-321(m)27(ust)-319(start)-320(with)-320(the)]TJ/F4 10.91 Tf 320.57 0 TD[(target_abbrev)]TJ/F1 10.91 Tf 77.94 0 TD[(v)55(alue,)]TJ -382.82 -13.15 TD[(so)-362(call)-363(it)-363(`)]TJ/F4 10.91 Tf 48.3 0 TD[(config/unix.exp)]TJ/F1 10.91 Tf 85.9 0 TD[('.)-532(This)-363(is)-363(the)-362(\014le)-363(that)-363(con)27(tains)-362(the)-363(target-dep)-27(enden)26(t)-361(pro-)]TJ -134.2 -13.15 TD[(cedures;)-365(fortunately)83(,)-359(most)-355(of)-354(them)-355(do)-354(not)-355(ha)27(v)28(e)-354(to)-354(do)-355(v)27(ery)-354(m)27(uc)28(h)-354(in)-354(order)-355(for)]TJ/F4 10.91 Tf 370.31 0 TD[(runtest)]TJ/F1 10.91 Tf -370.31 -13.15 TD[(to)-333(run.)]TJ 0 -16.14 TD[(If)]TJ/F5 10.91 Tf 10.9 0 TD[(example)]TJ/F1 10.91 Tf 43.33 0 TD[(is)-332(not)-333(in)27(teractiv)28(e,)-332(y)27(ou)-331(can)-333(get)-333(a)27(w)28(a)28(y)-332(with)-332(this)-333(minimal)-332(`)]TJ/F4 10.91 Tf 264.61 0 TD[(unix.exp)]TJ/F1 10.91 Tf 45.82 0 TD[(')-332(to)-333(b)-27(egin)]TJ -364.66 -13.15 TD[(with:)]TJ/F9 9.96 Tf 0 -7.32 TD[(\013)]TJ ET 45.58 -548.84 m 450.40 -548.84 l 450.40 -548.44 l 45.58 -548.44 l b BT 456.38 -548.84 TD[(\010)]TJ ET 39.60 -585.99 m 40.00 -585.99 l 40.00 -554.57 l 39.60 -554.57 l b BT/F4 10.91 Tf 42.99 -568.12 TD[(proc)-524(foo_exit)-525({})-525({})]TJ 0 -12.46 TD[(proc)-524(foo_version)-525({})-525({})]TJ ET 456.38 -585.99 m 456.77 -585.99 l 456.77 -554.57 l 456.38 -554.57 l b BT/F9 9.96 Tf 39.6 -592.22 TD[(\012)]TJ ET 45.58 -592.22 m 450.40 -592.22 l 450.40 -591.82 l 45.58 -591.82 l b BT 456.38 -592.22 TD[(\011)]TJ/F1 10.91 Tf -416.78 -17.39 TD[(If)]TJ/F5 10.91 Tf 10.95 0 TD[(example)]TJ/F1 10.91 Tf 43.38 0 TD[(is)-337(in)27(teractiv)28(e,)-337(ho)26(w)28(ev)28(er,)-337(y)27(ou)-337(migh)27(t)-336(as)-337(w)26(ell)-336(de\014ne)-337(a)-337(start)-338(routine)]TJ/F8 10.91 Tf 304.73 0 TD[(and)-361(invoke)]TJ -359.06 -13.15 TD[(it)]TJ/F1 10.91 Tf 11.64 0 TD[(b)27(y)-332(using)-333(an)-334(init)-333(\014le)-333(lik)26(e)-332(this:)]TJ ET 0 g 0 G +endstream +endobj +237 0 obj +<< +/F1 9 0 R +/F9 59 0 R +/F4 28 0 R +/F5 31 0 R +/F8 52 0 R +>> +endobj +235 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 237 0 R +>> +endobj +240 0 obj +<< +/Length 5208 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Chapter)-333(7:)-444(New)-334(T)83(o)-27(ols,)-333(T)82(argets,)-332(or)-334(Hosts)-20764(47)]TJ/F9 9.96 Tf 21.6 -20.18 TD[(\013)]TJ ET 45.58 -6.23 m 450.40 -6.23 l 450.40 -5.83 l 45.58 -5.83 l b BT 456.38 -6.23 TD[(\010)]TJ ET 39.60 -154.07 m 40.00 -154.07 l 40.00 -11.96 l 39.60 -11.96 l b BT/F4 10.91 Tf 42.99 -25.51 TD[(proc)-524(foo_exit)-525({})-525({})]TJ 0 -12.45 TD[(proc)-524(foo_version)-525({})-525({})]TJ 0 -24.91 TD[(proc)-524(foo_start)-525({})-525({)]TJ 11.45 -12.45 TD[(global)]TJ/F5 10.91 Tf 40.09 0 TD[(examplename)]TJ/F4 10.91 Tf -40.09 -12.46 TD[(spawn)-524($)]TJ/F5 10.91 Tf 40.09 0 TD[(examplename)]TJ/F4 10.91 Tf -40.09 -12.45 TD[(expect)-524({)]TJ 11.46 -12.45 TD[(-re)-524("")-525({})]TJ -11.46 -12.45 TD[(})]TJ -11.45 -12.46 TD[(})]TJ 0 -12.45 TD[(foo_start)]TJ ET 456.38 -154.07 m 456.77 -154.07 l 456.77 -11.96 l 456.38 -11.96 l b BT/F9 9.96 Tf 39.6 -160.29 TD[(\012)]TJ ET 45.58 -160.29 m 450.40 -160.29 l 450.40 -159.90 l 45.58 -159.90 l b BT 456.38 -160.29 TD[(\011)]TJ/F1 10.91 Tf -432.47 -17.39 TD[(6.)-660(Create)-333(a)-333(directory)-334(whose)-333(name)-333(b)-28(egins)-333(with)-334(y)27(our)-332(to)-28(ol's)-333(name,)-334(to)-333(con)27(tain)-333(tests:)]TJ/F4 10.91 Tf 44.49 -15.45 TD[(eg$)-524(mkdir)]TJ/F5 10.91 Tf 57.27 0 TD[(example)]TJ/F4 10.91 Tf 39.09 0 TD[(.0)]TJ/F1 10.91 Tf -140.85 -16.14 TD[(7.)-660(Create)-356(a)-357(sample)-357(test)-357(\014le)-357(in)-357(`)]TJ/F5 10.91 Tf 152.53 0 TD[(example)]TJ/F4 10.91 Tf 39.09 0 TD[(.0)]TJ/F1 10.91 Tf 11.46 0 TD[('.)-515(Its)-356(name)-357(m)27(ust)-356(end)-357(with)-357(`)]TJ/F4 10.91 Tf 133.69 0 TD[(.exp)]TJ/F1 10.91 Tf 22.91 0 TD[(';)-368(y)27(ou)-356(can)-357(use)]TJ -343.99 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(first-try.exp)]TJ/F1 10.91 Tf 74.45 0 TD[(')-326(T)82(o)-325(b)-28(egin)-327(with,)-328(just)-326(write)-327(there)-327(a)-326(line)-327(of)-326(Tcl)-327(co)-28(de)-326(to)-327(issue)-327(a)-326(message:)]TJ/F9 9.96 Tf -77.48 -9.74 TD[(\013)]TJ ET 45.58 -232.16 m 450.40 -232.16 l 450.40 -231.76 l 45.58 -231.76 l b BT 456.38 -232.16 TD[(\010)]TJ ET 39.60 -256.86 m 40.00 -256.86 l 40.00 -237.89 l 39.60 -237.89 l b BT/F4 10.91 Tf 42.99 -251.44 TD[(send_user)-524("Testing:)-525(one,)-525(two...\\n")]TJ ET 456.38 -256.86 m 456.77 -256.86 l 456.77 -237.89 l 456.38 -237.89 l b BT/F9 9.96 Tf 39.6 -263.08 TD[(\012)]TJ ET 45.58 -263.08 m 450.40 -263.08 l 450.40 -262.69 l 45.58 -262.69 l b BT 456.38 -263.08 TD[(\011)]TJ/F1 10.91 Tf -432.47 -18 TD[(8.)-660(Bac)27(k)-332(in)-333(the)-334(`)]TJ/F4 10.91 Tf 77.36 0 TD[(testsuite/)]TJ/F1 10.91 Tf 57.27 0 TD[(')-333(\(top)-333(lev)27(el\))-333(directory)83(,)-333(run)]TJ/F4 10.91 Tf -90.14 -15.44 TD[(eg$)-524(configure)]TJ/F1 10.91 Tf -28.8 -16.14 TD[(\(Y)83(ou)-383(ma)27(y)-383(ha)27(v)28(e)-383(to)-384(sp)-28(ecify)-384(more)-383(of)-384(a)-384(path,)-396(if)-384(a)-384(suitable)]TJ/F4 10.91 Tf 268.71 0 TD[(configure)]TJ/F1 10.91 Tf 55.74 0 TD[(is)-383(not)-384(a)27(v)55(ailable)-383(in)]TJ -324.45 -13.15 TD[(y)27(our)-332(execution)-333(path.\))]TJ -15.69 -16.14 TD[(9.)-660(Y)83(ou)-370(are)-371(no)27(w)-370(ready)-370(to)-371(triumphan)27(tly)-370(t)27(yp)-27(e)-371(`)]TJ/F4 10.91 Tf 219.54 0 TD[(make)-333(check)]TJ/F1 10.91 Tf 55.19 0 TD[(')-370(or)-371(`)]TJ/F4 10.91 Tf 23.87 0 TD[(runtest)-333(--tool)]TJ/F5 10.91 Tf 81.73 0 TD[(example)]TJ/F1 10.91 Tf 39.7 0 TD[('.)]TJ -404.34 -13.15 TD[(Y)83(ou)-332(should)-334(see)-333(something)-333(lik)26(e)-332(this:)]TJ/F9 9.96 Tf 0 -9.45 TD[(\013)]TJ ET 45.58 -364.55 m 450.40 -364.55 l 450.40 -364.15 l 45.58 -364.15 l b BT 456.38 -364.55 TD[(\010)]TJ ET 39.60 -485.53 m 40.00 -485.53 l 40.00 -370.27 l 39.60 -370.27 l b BT/F4 10.91 Tf 42.99 -382.92 TD[(Test)-524(Run)-525(By)-525(rhl)-525(on)-525(Fri)-525(Jan)-525(29)-525(16:25:44)-525(EST)-525(1993)]TJ 91.63 -24.9 TD[(===)]TJ/F5 10.91 Tf 22.91 0 TD[(example)]TJ/F4 10.91 Tf 45.43 0 TD[(tests)-524(===)]TJ -159.97 -24.91 TD[(Running)-524(./)]TJ/F5 10.91 Tf 57.27 0 TD[(example)]TJ/F4 10.91 Tf 39.09 0 TD[(.0/first-try.exp)-524(...)]TJ -96.36 -12.45 TD[(Testing:)-524(one,)-525(two...)]TJ 91.63 -24.91 TD[(===)]TJ/F5 10.91 Tf 22.91 0 TD[(example)]TJ/F4 10.91 Tf 45.43 0 TD[(Summary)-524(===)]TJ ET 456.38 -485.53 m 456.77 -485.53 l 456.77 -370.27 l 456.38 -370.27 l b BT/F9 9.96 Tf 39.6 -491.76 TD[(\012)]TJ ET 45.58 -491.76 m 450.40 -491.76 l 450.40 -491.36 l 45.58 -491.36 l b BT 456.38 -491.76 TD[(\011)]TJ/F1 10.91 Tf -416.78 -17.39 TD[(There)-391(is)-391(no)-392(output)-391(in)-392(the)-391(summary)82(,)-405(b)-28(ecause)-391(so)-392(far)-391(the)-392(example)-391(do)-28(es)-392(not)-391(call)-392(an)27(y)-390(of)]TJ 0 -13.15 TD[(the)-333(pro)-28(cedures)-333(that)-333(establish)-334(a)-333(test)-333(outcome.)]TJ -21.14 -16.14 TD[(10.)-660(Begin)-427(writing)-428(some)-428(real)-428(tests.)-728(F)82(or)-427(an)-428(in)27(teractiv)28(e)-427(to)-28(ol,)-451(y)26(ou)-427(should)-427(probably)-428(write)-428(a)]TJ 21.14 -13.15 TD[(real)-339(exit)-339(routine)-339(in)-339(fairly)-339(short)-339(order;)-341(in)-339(an)26(y)-338(case,)-340(y)27(ou)-338(should)-339(also)-339(write)-339(a)-339(real)-339(v)27(ersion)]TJ 0 -13.15 TD[(routine)-333(so)-28(on.)]TJ ET 0 g 0 G +endstream +endobj +241 0 obj +<< +/F1 9 0 R +/F9 59 0 R +/F4 28 0 R +/F5 31 0 R +>> +endobj +239 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 241 0 R +>> +endobj +244 0 obj +<< +/Length 6498 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(48)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F2 14.35 Tf 0 -23.91 TD[(7.2)-562(Adding)-375(a)-375(target)]TJ/F1 10.91 Tf 14.94 -23.12 TD[(DejaGn)27(u)-522(has)-524(some)-523(additional)-523(requiremen)26(ts)-522(for)-523(target)-524(supp)-28(ort,)-570(b)-28(ey)27(ond)-523(the)-523(general-)]TJ -14.94 -13.15 TD[(purp)-27(ose)-424(pro)27(visions)-423(of)-423(Cygn)26(us)]TJ/F4 10.91 Tf 147.27 0 TD[(configure)]TJ/F1 10.91 Tf 51.55 0 TD[(.)]TJ/F4 10.91 Tf 10.83 0 TD[(runtest)]TJ/F1 10.91 Tf 44.71 0 TD[(m)27(ust)-422(activ)26(ely)-422(comm)27(unicate)-423(with)-424(the)]TJ -254.36 -13.15 TD[(target,)-322(rather)-319(than)-319(simply)-320(generating)-319(or)-319(managing)-320(co)-28(de)-319(for)-319(the)-320(target)-319(arc)27(hitecture.)-439(There-)]TJ 0 -13.15 TD[(fore,)-329(eac)27(h)-328(to)-28(ol)-328(requires)-329(an)-328(initialization)-329(mo)-28(dule)-328(for)-329(eac)27(h)-328(target.)-443(F)83(or)-328(new)-329(targets,)-329(y)27(ou)-328(m)27(ust)]TJ 0 -13.15 TD[(supply)-259(a)-259(few)-259(Tcl)-259(pro)-28(cedures)-259(to)-259(adapt)-259(DejaGn)27(u)-258(to)-259(the)-260(target.)-419(This)-259(p)-28(ermits)-259(DejaGn)27(u)-259(itself)-259(to)]TJ 0 -13.15 TD[(remain)-281(target)-282(indep)-28(enden)27(t.)-426(See)-282(Section)-282(5.2)-282([Initialization)-281(mo)-28(dule],)-292(page)-282(22,)-292(for)-282(a)-281(discussion)]TJ 0 -13.15 TD[(of)-333(the)-333(naming)-333(con)26(v)28(en)28(tions)-332(that)-334(enable)-333(DejaGn)27(u)-333(to)-333(lo)-28(cate)-333(and)-333(use)-334(init)-333(\014les.)]TJ 14.94 -16.14 TD[(Usually)-284(the)-284(b)-27(est)-284(w)26(a)28(y)-283(to)-284(write)-284(a)-284(new)-284(initialization)-284(mo)-28(dule)-284(is)-284(to)-284(edit)-284(an)-284(existing)-284(initializa-)]TJ -14.94 -13.15 TD[(tion)-337(mo)-28(dule;)-340(some)-338(trial)-337(and)-338(error)-338(will)-337(b)-28(e)-338(required.)-458(If)-337(necessary)82(,)-338(y)27(ou)-337(can)-337(use)-338(the)-338(`)]TJ/F4 10.91 Tf 388.88 0 TD[(--debug)]TJ/F1 10.91 Tf 40.09 0 TD[(')]TJ -428.97 -13.15 TD[(option)-333(to)-333(see)-333(what)-334(is)-333(really)-333(going)-334(on.)]TJ 14.94 -16.14 TD[(When)-324(y)26(ou)-323(co)-28(de)-325(an)-325(initialization)-325(mo)-27(dule,)-327(b)-28(e)-324(generous)-325(in)-325(prin)27(ting)-324(information)-325(con)27(trolled)]TJ -14.94 -13.15 TD[(b)27(y)-332(the)]TJ/F4 10.91 Tf 33.94 0 TD[(verbose)]TJ/F1 10.91 Tf 43.73 0 TD[(pro)-27(cedure)-334(\(see)-333(Section)-333(5.3)-334([DejaGn)27(u)-332(Builtins],)-334(page)-333(23\).)]TJ -62.73 -16.14 TD[(Most)-432(of)-433(the)-433(w)27(ork)-432(is)-433(in)-433(getting)-433(the)-433(comm)27(unications)-432(righ)27(t.)-742(Comm)26(unications)-432(co)-27(de)-433(\(for)]TJ -14.94 -13.15 TD[(sev)27(eral)-277(situations)-279(in)27(v)28(olving)-278(IP)-278(net)27(w)28(orks)-278(or)-278(serial)-279(lines\))-278(is)-279(a)27(v)56(ailable)-278(in)-278(a)-279(DejaGn)27(u)-278(library)-278(\014le,)]TJ 0 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(lib/remote.exp)]TJ/F1 10.91 Tf 80.18 0 TD[('.)-444(See)-333(Section)-334(5.3)-333([DejaGn)27(u)-332(Builtins],)-334(page)-333(23.)]TJ -68.27 -16.14 TD[(If)-331(y)27(ou)-331(susp)-28(ect)-332(a)-331(comm)26(unication)-330(problem,)-333(try)-331(running)-332(the)-332(connection)-332(in)27(teractiv)28(ely)-331(from)]TJ/F4 10.91 Tf -14.94 -13.15 TD[(expect)]TJ/F1 10.91 Tf 34.36 0 TD[(.)-422(\(There)-266(are)-267(three)-266(w)27(a)28(ys)-266(of)-266(running)]TJ/F4 10.91 Tf 164.66 0 TD[(expect)]TJ/F1 10.91 Tf 37.27 0 TD[(as)-266(an)-266(in)26(teractiv)28(e)-265(in)26(terpreter.)-421(Y)83(ou)-266(can)-266(run)]TJ/F4 10.91 Tf -236.29 -13.15 TD[(expect)]TJ/F1 10.91 Tf 37.88 0 TD[(with)-322(no)-322(argumen)27(ts,)-324(and)-322(con)27(trol)-321(it)-322(completely)-323(in)27(teractiv)28(ely;)-325(or)-322(y)27(ou)-321(can)-323(use)-322(`)]TJ/F4 10.91 Tf 359.76 0 TD[(expect)]TJ -397.64 -13.15 TD[(-i)]TJ/F1 10.91 Tf 11.45 0 TD[(')-280(together)-280(with)-281(other)-280(command-line)-281(options)-280(and)-281(argumen)27(ts;)-297(or)-281(y)27(ou)-279(can)-281(run)-280(the)-281(command)]TJ/F4 10.91 Tf -11.45 -13.15 TD[(interpreter)]TJ/F1 10.91 Tf 66.35 0 TD[(from)-306(an)27(y)]TJ/F4 10.91 Tf 45.81 0 TD[(expect)]TJ/F1 10.91 Tf 37.71 0 TD[(pro)-27(cedure.)-436(Use)]TJ/F4 10.91 Tf 75.49 0 TD[(return)]TJ/F1 10.91 Tf 37.71 0 TD[(to)-306(get)-307(bac)27(k)-306(to)-307(the)-307(calling)-306(pro)-28(cedure)]TJ -263.07 -13.15 TD[(\(if)-355(an)26(y\),)-360(or)]TJ/F4 10.91 Tf 56.29 0 TD[(return)-333(-tcl)]TJ/F1 10.91 Tf 64.79 0 TD[(to)-355(mak)26(e)-355(the)-355(calling)-356(pro)-28(cedure)-356(itself)-356(return)-356(to)-356(its)-356(caller;)-367(use)]TJ/F4 10.91 Tf 288.01 0 TD[(exit)]TJ/F1 10.91 Tf -409.09 -13.16 TD[(or)-442(end-of-\014le)-442(to)-442(lea)27(v)28(e)]TJ/F4 10.91 Tf 109.02 0 TD[(expect)]TJ/F1 10.91 Tf 39.18 0 TD[(altogether.\))-770(Run)-442(the)-442(program)-442(whose)-442(name)-442(is)-442(recorded)-442(in)]TJ -148.2 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[($connectmode)]TJ/F1 10.91 Tf 68.73 0 TD[(',)-520(with)-482(the)-483(argumen)27(ts)-482(in)-482(`)]TJ/F4 10.91 Tf 130.76 0 TD[($targetname)]TJ/F1 10.91 Tf 63 0 TD[(',)-520(to)-482(establish)-483(a)-483(connection.)-892(Y)82(ou)]TJ -265.52 -13.15 TD[(should)-333(at)-333(least)-333(b)-28(e)-334(able)-333(to)-333(get)-334(a)-333(prompt)-333(from)-334(an)27(y)-332(target)-333(that)-334(is)-333(ph)27(ysically)-333(connected.)]TJ/F2 14.35 Tf 0 -30.88 TD[(7.3)-562(P)30(orting)-374(to)-375(a)-375(new)-375(host)]TJ/F1 10.91 Tf 14.94 -23.11 TD[(The)-472(task)-473(of)-473(p)-28(orting)-472(DejaGn)26(u)-472(is)-472(basically)-473(that)-473(of)-473(p)-28(orting)-472(Tcl)-473(and)]TJ/F4 10.91 Tf 331.76 0 TD[(expect)]TJ/F1 10.91 Tf 34.37 0 TD[(.)-862(Tcl)-473(and)]TJ/F4 10.91 Tf -381.07 -13.16 TD[(expect)]TJ/F1 10.91 Tf 34.36 0 TD[(,)-357(as)-352(distributed)-353(with)-352(DejaGn)27(u,)-356(b)-28(oth)-353(use)]TJ/F4 10.91 Tf 195.95 0 TD[(autoconf)]TJ/F1 10.91 Tf 45.81 0 TD[(;)-361(they)-353(should)-352(p)-28(ort)-353(automatically)]TJ -276.12 -13.15 TD[(to)-333(most)-333(Unix)-333(systems.)]TJ 14.94 -16.14 TD[(Once)-367(Tcl)-368(and)]TJ/F4 10.91 Tf 69.62 0 TD[(expect)]TJ/F1 10.91 Tf 38.38 0 TD[(are)-367(p)-28(orted,)-377(DejaGn)27(u)-367(should)-368(run.)-548(Most)-368(system)-368(dep)-28(endencies)-367(are)]TJ -122.94 -13.15 TD[(tak)27(en)-332(care)-333(of)-334(b)27(y)-332(using)]TJ/F4 10.91 Tf 108.88 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(as)-333(the)-333(main)-333(command)-334(shell.)]TJ ET 0 g 0 G +endstream +endobj +245 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +>> +endobj +243 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 245 0 R +>> +endobj +248 0 obj +<< +/Length 8496 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(App)-27(endix)-334(A:)-333(Installing)-333(DejaGn)27(u)-24351(49)]TJ/F2 17.22 Tf 0 -25.91 TD[(App)-31(endix)-375(A)-562(Installing)-375(DejaGn)30(u)]TJ/F1 10.91 Tf 14.94 -24.19 TD[(Once)-304(y)27(ou)-303(ha)26(v)28(e)-303(the)-304(DejaGn)26(u)-303(source)-304(unpac)26(k)28(ed)-303(and)-304(a)26(v)56(ailable,)-309(y)27(ou)-304(m)27(ust)-303(\014rst)-305(con\014gure)-304(the)]TJ -14.94 -13.16 TD[(soft)27(w)28(are)-370(to)-371(sp)-28(ecify)-371(where)-371(it)-371(is)-371(to)-370(run)-371(\(and)-371(the)-371(asso)-28(ciated)-371(defaults\);)-390(then)-371(y)27(ou)-370(can)-371(pro)-28(ceed)]TJ 0 -13.15 TD[(to)-333(installing)-333(it.)]TJ/F2 14.35 Tf 0 -28.54 TD[(A.1)-562(Con\014guring)-375(the)-375(DejaGn)30(u)-374(test)-375(driv)31(er)]TJ/F1 10.91 Tf 14.94 -22.34 TD[(It)-412(is)-412(usually)-412(b)-27(est)-412(to)-413(con\014gure)-412(in)-412(a)-412(directory)-412(separate)-412(from)-412(the)-412(source)-412(tree,)-432(sp)-27(ecifying)]TJ -14.94 -13.15 TD[(where)-328(to)-328(\014nd)-328(the)-329(source)-328(with)-328(the)-328(optional)-329(`)]TJ/F4 10.91 Tf 207.56 0 TD[(--srcdir)]TJ/F1 10.91 Tf 45.82 0 TD[(')-328(option)-328(to)]TJ/F4 10.91 Tf 53.77 0 TD[(configure)]TJ/F1 10.91 Tf 51.55 0 TD[(.)-442(DejaGn)27(u)-328(uses)]TJ -358.7 -13.15 TD[(the)-426(GNU)]TJ/F4 10.91 Tf 49.38 0 TD[(autoconf)]TJ/F1 10.91 Tf 50.48 0 TD[(to)-426(con\014gure)-427(itself.)-724(F)82(or)-426(more)-426(info)-427(on)-427(using)-426(auto)-28(conf,)-450(read)-427(the)-426(GNU)]TJ -99.86 -13.15 TD[(auto)-27(conf)-444(man)26(ual.)-775(T)82(o)-443(con\014gure,)-471(execute)-445(the)-444(`)]TJ/F4 10.91 Tf 224.24 0 TD[(configure)]TJ/F1 10.91 Tf 51.54 0 TD[(')-444(program,)-471(no)-444(other)-444(options)-444(are)]TJ -275.78 -13.15 TD[(required.)-444(F)82(or)-332(an)-333(example,)-333(to)-333(con\014gure)-333(in)-333(a)-333(sep)-28(erate)-333(tree)-333(for)-334(ob)-55(jects,)-333(execute)-333(the)-333(con\014gure)]TJ 0 -13.15 TD[(script)-333(from)-333(the)-333(source)-334(tree)-333(lik)27(e)-333(this:)]TJ/F4 10.91 Tf 28.8 -14.66 TD[(../dejagnu-1.3/configure)]TJ/F1 10.91 Tf -13.86 -15.36 TD[(DejaGn)27(u)-314(do)-27(esn't)-315(care)-315(at)-315(con\014g)-315(time)-314(if)-315(it's)-315(for)-315(testing)-315(a)-314(nativ)26(e)-314(system)-314(or)-315(a)-315(cross)-315(system.)]TJ -14.94 -13.16 TD[(That)-333(is)-333(determined)-333(at)-334(run)27(time)-332(b)26(y)-332(using)-333(the)-334(con\014g)-333(\014les.)]TJ 14.94 -15.36 TD[(Y)83(ou)-536(ma)27(y)-536(also)-537(w)27(an)27(t)-536(to)-537(use)-536(the)]TJ/F4 10.91 Tf 161.13 0 TD[(configure)]TJ/F1 10.91 Tf 57.4 0 TD[(option)-536(`)]TJ/F4 10.91 Tf 39.19 0 TD[(--prefix)]TJ/F1 10.91 Tf 45.82 0 TD[(')-536(to)-537(sp)-28(ecify)-537(where)-537(y)27(ou)]TJ -318.48 -13.15 TD[(w)27(an)28(t)-512(DejaGn)27(u)-512(and)-512(its)-513(supp)-28(orting)-513(co)-28(de)-512(installed.)-983(By)-513(default,)-557(installation)-513(is)-513(in)-513(sub)-28(di-)]TJ 0 -13.15 TD[(rectories)-430(of)-431(`)]TJ/F4 10.91 Tf 61.34 0 TD[(/usr/local)]TJ/F1 10.91 Tf 57.27 0 TD[(',)-455(but)-431(y)27(ou)-430(can)-431(select)-430(an)26(y)-430(alternate)-430(directory)]TJ/F5 10.91 Tf 221.96 0 TD[(altdir)]TJ/F1 10.91 Tf 31.58 0 TD[(b)27(y)-430(including)]TJ -372.15 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(--prefix=)]TJ/F5 10.91 Tf 51.55 0 TD[(altdir)]TJ/F1 10.91 Tf 26.87 0 TD[(')-294(on)-295(the)]TJ/F4 10.91 Tf 39.34 0 TD[(configure)]TJ/F1 10.91 Tf 54.76 0 TD[(command)-294(line.)-432(\(This)-294(v)54(alue)-293(is)-295(captured)-295(in)-294(the)-295(Mak)27(e\014le)]TJ -175.55 -13.15 TD[(v)55(ariables)]TJ/F4 10.91 Tf 45.24 0 TD[(prefix)]TJ/F1 10.91 Tf 38 0 TD[(and)]TJ/F4 10.91 Tf 21.21 0 TD[(exec_prefix)]TJ/F1 10.91 Tf 63 0 TD[(.\))]TJ -152.51 -15.36 TD[(Sa)27(v)28(e)-492(for)-492(a)-493(small)-493(n)27(um)28(b)-27(er)-493(of)-493(example)-492(tests,)-533(the)-493(DejaGn)27(u)-492(distribution)-492(itself)-493(do)-28(es)-493(not)]TJ -14.94 -13.15 TD[(include)-441(an)27(y)-441(test)-441(suites;)-496(these)-441(are)-442(a)27(v)56(ailable)-441(separately)82(.)-768(T)83(est)-441(suites)-441(for)-442(the)]TJ/F7 10.91 Tf 366.17 0 TD[(gnu)]TJ/F1 10.91 Tf 25.19 0 TD[(compiler)]TJ -391.36 -13.15 TD[(\(testing)-416(b)-28(oth)-416(GCC)-417(and)-417(G)]TJ/F4 10.91 Tf 127.18 0 TD[(++)]TJ/F1 10.91 Tf 11.45 0 TD[(\))-416(and)-417(for)-416(the)]TJ/F7 10.91 Tf 68.21 0 TD[(gnu)]TJ/F1 10.91 Tf 24.92 0 TD[(binary)-416(utilities)-417(are)-416(distributed)-417(in)-416(parallel)]TJ -231.76 -13.15 TD[(with)-329(the)-329(DejaGn)26(u)-328(distribution)-329(\(but)-330(pac)27(k)56(aged)-329(as)-329(separate)-330(\014les\).)-443(The)-329(test)-329(suite)-330(for)-329(the)]TJ/F7 10.91 Tf 411.62 0 TD[(gnu)]TJ/F1 10.91 Tf -411.62 -13.15 TD[(debugger)-342(is)-342(distributed)-342(in)-343(parallel)-342(with)-342(eac)26(h)-341(release)-342(of)-342(GDB)-343(itself,)-344(starting)-343(with)-342(GDB)-342(4.9.)]TJ 0 -13.15 TD[(After)-288(con\014guring)-289(the)-289(top-lev)26(el)-288(DejaGn)27(u)-288(directory)83(,)-297(unpac)27(k)-288(and)-289(con\014gure)-289(the)-289(test)-289(directories)]TJ 0 -13.15 TD[(for)-444(the)-444(to)-28(ols)-444(y)27(ou)-444(w)27(an)28(t)-443(to)-445(test;)-499(then,)-472(in)-445(eac)27(h)-443(test)-444(directory)82(,)-471(run)]TJ/F4 10.91 Tf 318.76 0 TD[(make)]TJ/F1 10.91 Tf 27.76 0 TD[(to)-444(build)-444(auxiliary)]TJ -346.52 -13.15 TD[(programs)-333(required)-333(b)27(y)-333(some)-333(of)-333(the)-334(tests.)]TJ/F2 14.35 Tf 0 -28.55 TD[(A.2)-562(Installing)-375(DejaGn)30(u)]TJ/F1 10.91 Tf 14.94 -22.34 TD[(T)83(o)-398(install)-398(DejaGn)26(u)-397(in)-399(y)27(our)-398(\014lesystem)-398(\(either)-399(in)-398(`)]TJ/F4 10.91 Tf 239.2 0 TD[(/usr/local)]TJ/F1 10.91 Tf 57.27 0 TD[(',)-414(or)-399(as)-399(sp)-27(eci\014ed)-399(b)27(y)-398(y)27(our)]TJ -311.41 -13.15 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(--prefix)]TJ/F1 10.91 Tf 45.82 0 TD[(')-333(option)-333(to)]TJ/F4 10.91 Tf 53.94 0 TD[(configure)]TJ/F1 10.91 Tf 51.54 0 TD[(\),)-333(execute)]TJ/F4 10.91 Tf -125.53 -14.66 TD[(eg$)-524(make)-525(install)]TJ/F1 10.91 Tf -28.8 -15.36 TD[(`)]TJ/F4 10.91 Tf 3.03 0 TD[(make)-333(install)]TJ/F1 10.91 Tf 66.64 0 TD[(')-333(do)-28(es)-333(these)-333(things)-334(for)-333(DejaGn)27(u:)]TJ -63.76 -15.36 TD[(1.)-660(Lo)-27(ok)-307(in)-306(the)-306(path)-307(sp)-28(eci\014ed)-306(for)-306(executables)-307(\(`)]TJ/F4 10.91 Tf 223.93 0 TD[($exec_prefix)]TJ/F1 10.91 Tf 68.73 0 TD[('\))-306(for)-306(directories)-307(called)-306(`)]TJ/F4 10.91 Tf 113.22 0 TD[(lib)]TJ/F1 10.91 Tf 17.18 0 TD[(')]TJ -407.37 -13.15 TD[(and)-333(`)]TJ/F4 10.91 Tf 24.24 0 TD[(bin)]TJ/F1 10.91 Tf 17.18 0 TD[('.)-444(If)-333(these)-334(directories)-333(do)-333(not)-334(exist,)-333(`)]TJ/F4 10.91 Tf 169.04 0 TD[(make)-333(install)]TJ/F1 10.91 Tf 66.63 0 TD[(')-333(creates)-333(them.)]TJ -292.78 -15.36 TD[(2.)-660(Create)-333(another)-333(directory)-334(in)-333(the)-333(`)]TJ/F4 10.91 Tf 171.87 0 TD[(lib)]TJ/F1 10.91 Tf 17.18 0 TD[(')-333(directory)83(,)-333(called)-333(`)]TJ/F4 10.91 Tf 89.16 0 TD[(dejagnu)]TJ/F1 10.91 Tf 40.09 0 TD[('.)]TJ -318.3 -15.36 TD[(3.)-660(Cop)27(y)-332(the)]TJ/F4 10.91 Tf 62.96 0 TD[(runtest)]TJ/F1 10.91 Tf 43.73 0 TD[(shell)-333(script)-333(in)27(to)-333(`)]TJ/F4 10.91 Tf 80.45 0 TD[($exec_prefix/bin)]TJ/F1 10.91 Tf 91.64 0 TD[('.)]TJ -278.78 -15.36 TD[(4.)-660(Cop)27(y)-221(all)-222(the)-222(library)-223(\014les)-222(\(used)-222(to)-222(supp)-28(ort)-222(the)-223(framew)27(ork\))-221(in)27(to)-221(`)]TJ/F4 10.91 Tf 306.93 0 TD[($exec_prefix/lib/dejagnu)]TJ/F1 10.91 Tf 137.46 0 TD[('.)]TJ -444.39 -15.36 TD[(5.)-660(Cop)27(y)-439(`)]TJ/F4 10.91 Tf 48.37 0 TD[(runtest.exp)]TJ/F1 10.91 Tf 63 0 TD[(')-440(in)27(to)-440(`)]TJ/F4 10.91 Tf 34.16 0 TD[($exec_prefix/lib/dejagnu)]TJ/F1 10.91 Tf 137.45 0 TD[('.)-765(This)-441(is)-440(the)-441(main)-440(Tcl)-441(co)-27(de)]TJ -267.29 -13.15 TD[(implemen)27(ting)-332(DejaGn)27(u.)]TJ -6.66 -17.57 TD[(Eac)27(h)-360(test)-360(suite)-361(collection)-361(comes)-361(with)-361(simple)-361(installation)-360(instructions)-361(in)-361(a)-361(`)]TJ/F4 10.91 Tf 358.76 0 TD[(README)]TJ/F1 10.91 Tf 34.36 0 TD[(')-360(\014le;)]TJ -408.06 -13.15 TD[(in)-489(general,)-530(the)-490(test)-490(suites)-490(are)-490(designed)-490(to)-489(b)-28(e)-490(unpac)27(k)27(ed)-489(in)-490(the)-490(source)-490(directory)-490(for)-490(the)]TJ 0 -13.16 TD[(corresp)-27(onding)-334(to)-27(ol,)-334(and)-333(extract)-333(in)26(to)-332(a)-333(directory)-334(called)-333(`)]TJ/F4 10.91 Tf 265.36 0 TD[(testsuite)]TJ/F1 10.91 Tf 51.55 0 TD[('.)]TJ ET 0 g 0 G +endstream +endobj +249 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F4 28 0 R +/F5 31 0 R +/F7 49 0 R +>> +endobj +247 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 249 0 R +>> +endobj +252 0 obj +<< +/Length 117 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(50)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ ET 0 g 0 G +endstream +endobj +253 0 obj +<< +/F1 9 0 R +>> +endobj +251 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 253 0 R +>> +endobj +257 0 obj +<< +/Type /FontDescriptor +/CapHeight 611.11 +/Ascent 611.11 +/Descent -222.22 +/Flags 5 +/FontBBox [-6 -237 731 801] +/FontName /CMTT9 +/ItalicAngle 0 +/XHeight 431 +/StemV 80 +/FontFile 256 0 R +>> +endobj +258 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F14 +/FontDescriptor 257 0 R +/BaseFont /BBAFZC+CMTT9 +/FirstChar 0 +/LastChar 127 +/Widths [524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 +524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 +524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 +524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 +524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 +524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 +524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 +524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 +524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 +524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 +524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99 524.99] +>> +endobj +260 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -194.44 +/Flags 4 +/FontBBox [-259 -250 1036 969] +/FontName /CMR9 +/ItalicAngle 0 +/XHeight 431 +/StemV 80 +/FontFile 259 0 R +>> +endobj +261 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F15 +/FontDescriptor 260 0 R +/BaseFont /GSDFLN+CMR9 +/FirstChar 0 +/LastChar 127 +/Widths [642.28 856.48 799.38 713.58 685.18 770.67 742.28 799.38 742.28 799.38 742.28 +599.53 570.98 570.98 856.48 856.48 285.49 314.04 513.89 513.89 513.89 513.89 513.89 +770.67 456.79 513.89 742.28 799.38 513.89 927.77 1041.97 799.38 285.49 285.49 513.89 +856.48 513.89 856.48 799.38 285.49 399.69 399.69 513.89 799.38 285.49 342.59 285.49 +513.89 513.89 513.89 513.89 513.89 513.89 513.89 513.89 513.89 513.89 513.89 285.49 +285.49 285.49 799.38 485.34 485.34 799.38 770.67 727.93 742.28 785.03 699.38 670.83 +806.48 770.67 370.99 528.08 799.22 642.28 941.97 770.67 799.38 699.38 799.38 756.48 +570.98 742.28 770.67 770.67 1056.17 770.67 770.67 628.08 285.49 513.89 285.49 513.89 +285.49 285.49 513.89 570.98 456.79 570.98 457.17 314.04 513.89 570.98 285.49 314.04 +542.43 285.49 856.48 570.98 513.89 570.98 542.43 402 405.4 399.69 570.98 542.43 742.28 +542.43 542.43 456.79 513.89 1027.77 513.89 513.89 513.89] +>> +endobj +263 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -194.44 +/Flags 68 +/FontBBox [-172 -250 1171 969] +/FontName /CMTI9 +/ItalicAngle -14 +/XHeight 431 +/StemV 80 +/FontFile 262 0 R +>> +endobj +264 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F16 +/FontDescriptor 263 0 R +/BaseFont /PFWZRU+CMTI9 +/FirstChar 0 +/LastChar 127 +/Widths [643.84 839.52 787.05 710.5 682.11 762.97 734.58 787.05 734.58 787.05 734.58 +629.64 577.17 603.4 905.11 918.22 314.82 341.05 524.7 524.7 524.7 524.7 524.7 850.94 +472.23 550.93 734.58 734.58 524.7 906.19 1011.13 787.05 262.35 314.82 527.78 839.52 +786.08 839.52 787.05 314.82 419.76 419.76 524.7 787.05 314.82 367.29 314.82 524.7 +524.7 524.7 524.7 524.7 524.7 524.7 524.7 524.7 524.7 524.7 314.82 314.82 314.82 +787.05 524.7 524.7 787.05 762.97 722.54 734.58 775.01 696.31 670.07 794.15 762.97 +395.68 538.9 789.21 643.84 920.38 762.97 787.05 696.31 787.05 748.78 577.17 734.58 +762.97 762.97 1025.32 762.97 762.97 629.64 314.82 527.78 314.82 524.7 314.82 314.82 +524.7 472.23 472.23 524.7 472.23 314.82 472.23 524.7 314.82 314.82 472.23 262.35 +839.52 577.17 524.7 524.7 472.23 432.88 419.76 341.05 550.93 472.23 682.11 473.77 +498.46 419.76 524.7 1049.4 524.7 524.7 524.7] +>> +endobj +266 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -194.44 +/Flags 68 +/FontBBox [-207 -250 1150 969] +/FontName /CMSL9 +/ItalicAngle -9 +/XHeight 431 +/StemV 80 +/FontFile 265 0 R +>> +endobj +267 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F17 +/FontDescriptor 266 0 R +/BaseFont /HGHLSL+CMSL9 +/FirstChar 0 +/LastChar 127 +/Widths [642.28 856.48 799.38 713.58 685.18 770.67 742.28 799.38 742.28 799.38 742.28 +599.53 570.98 570.98 856.48 856.48 285.49 314.04 513.89 513.89 513.89 513.89 513.89 +829.32 456.79 513.89 742.28 799.38 513.89 927.77 1041.97 799.38 285.49 285.49 513.89 +856.48 513.89 856.48 799.38 285.49 399.69 399.69 513.89 799.38 285.49 342.59 285.49 +513.89 513.89 513.89 513.89 513.89 513.89 513.89 513.89 513.89 513.89 513.89 285.49 +285.49 285.49 799.38 485.34 485.34 799.38 770.67 727.93 742.28 785.03 699.38 670.83 +806.48 770.67 370.99 528.08 799.22 642.28 941.97 770.67 799.38 699.38 799.38 756.48 +570.98 742.28 770.67 770.67 1056.17 770.67 770.67 628.08 285.49 513.89 285.49 513.89 +285.49 285.49 513.89 570.98 456.79 570.98 457.17 314.04 513.89 570.98 285.49 314.04 +542.43 285.49 856.48 570.98 513.89 570.98 542.43 402 405.4 399.69 570.98 542.43 742.28 +542.43 542.43 456.79 513.89 1027.77 513.89 513.89 513.89] +>> +endobj +268 0 obj +<< +/Length 23119 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Index)]TJ 421.09 0 TD[(51)]TJ/F2 17.22 Tf -421.09 -25.91 TD[(Index)]TJ/F2 14.35 Tf 0 -119.73 TD[(-)]TJ/F14 8.97 Tf 0 -18.87 TD[(--all)]TJ/F15 8.97 Tf 26.61 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 31.68 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 99.92 0 TD[(10)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(--baud)]TJ/F15 8.97 Tf 31.32 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 31.5 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.39 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(--build)]TJ/F15 8.97 Tf 36.02 0 TD[(\()]TJ/F14 8.97 Tf 3.59 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 31.33 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 90.85 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -13.31 TD[(--connect)]TJ/F15 8.97 Tf 45.44 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 30.98 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 81.79 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(--debug)]TJ/F15 8.97 Tf 36.02 0 TD[(\()]TJ/F14 8.97 Tf 3.59 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 31.33 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 90.85 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(--help)]TJ/F15 8.97 Tf 31.32 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 31.5 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.39 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -13.31 TD[(--host)]TJ/F15 8.97 Tf 31.32 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 31.5 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.39 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(--name)]TJ/F15 8.97 Tf 31.32 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 31.5 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.39 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(--objdir)]TJ/F15 8.97 Tf 40.73 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.03 0 TD[(option\))]TJ/F16 8.97 Tf 31.15 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 86.32 0 TD[(12)]TJ/F14 8.97 Tf -197.81 -13.31 TD[(--outdir)]TJ/F15 8.97 Tf 40.73 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.03 0 TD[(option\))]TJ/F16 8.97 Tf 31.15 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 86.32 0 TD[(12)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(--reboot)]TJ/F15 8.97 Tf 40.73 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.03 0 TD[(option\))]TJ/F16 8.97 Tf 31.15 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 86.32 0 TD[(12)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(--srcdir)]TJ/F15 8.97 Tf 40.73 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.03 0 TD[(option\))]TJ/F16 8.97 Tf 31.15 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 86.32 0 TD[(12)]TJ/F14 8.97 Tf -197.81 -13.31 TD[(--strace)]TJ/F15 8.97 Tf 40.73 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.03 0 TD[(option\))]TJ/F16 8.97 Tf 31.15 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 86.32 0 TD[(12)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(--target)]TJ/F15 8.97 Tf 40.73 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.03 0 TD[(option\))]TJ/F16 8.97 Tf 31.15 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 86.32 0 TD[(12)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(--tool)]TJ/F15 8.97 Tf 31.32 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 31.5 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.39 0 TD[(10)]TJ/F14 8.97 Tf -197.81 -13.31 TD[(--tool)]TJ/F15 8.97 Tf 31.32 0 TD[(and)-342(naming)-343(con)28(v)28(en)29(tions)]TJ/F16 8.97 Tf 98.45 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 68.04 0 TD[(21)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(--verbose)]TJ/F15 8.97 Tf 45.44 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 30.98 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 81.79 0 TD[(13)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(--version)]TJ/F15 8.97 Tf 45.44 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 30.98 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 81.79 0 TD[(13)]TJ/F14 8.97 Tf -197.81 -13.31 TD[(-b)]TJ/F15 8.97 Tf 12.49 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 30.02 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 115.7 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(-v)]TJ/F15 8.97 Tf 12.49 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 30.02 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 115.7 0 TD[(13)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(-V)]TJ/F15 8.97 Tf 12.49 0 TD[(\()]TJ/F14 8.97 Tf 3.58 0 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option\))]TJ/F16 8.97 Tf 30.02 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 115.7 0 TD[(13)]TJ/F2 14.35 Tf -197.81 -40.01 TD[(.)]TJ/F14 8.97 Tf 0 -18.87 TD[(.exp)]TJ/F16 8.97 Tf 20.5 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 181.92 0 TD[(1)]TJ/F2 14.35 Tf -202.42 -40 TD[(A)]TJ/F14 8.97 Tf 0 -18.87 TD[(absolute)]TJ/F17 8.97 Tf 40.73 0 TD[(path)]TJ/F16 8.97 Tf 19.43 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 137.65 0 TD[(28)]TJ -197.81 -13.3 TD[(adding)-342(a)-343(target)]TJ/F16 8.97 Tf 63.74 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 134.07 0 TD[(48)]TJ -197.81 -13.31 TD[(adding)-342(a)-343(test)-342(case)]TJ/F16 8.97 Tf 73.27 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 124.54 0 TD[(40)]TJ/F14 8.97 Tf -197.81 -13.3 TD[(all_flag)]TJ/F16 8.97 Tf 38.51 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 159.3 0 TD[(17)]TJ -197.81 -13.3 TD[(am)28(biguit)29(y)85(,)-341(required)-343(for)-343(POSIX)]TJ/F16 8.97 Tf 125.44 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 76.98 0 TD[(7)]TJ -202.42 -13.31 TD[(arc)28(hiv)29(e)-342(ob)-57(ject)-343(\014les)]TJ/F16 8.97 Tf 76.71 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.1 0 TD[(30)]TJ -197.81 -13.3 TD[(auxiliary)-342(\014les,)-343(building)]TJ/F16 8.97 Tf 94.25 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 108.17 0 TD[(3)]TJ -202.42 -13.3 TD[(auxiliary)-342(programs)]TJ/F16 8.97 Tf 77.24 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 120.57 0 TD[(49)]TJ -197.81 -13.31 TD[(auxiliary)-342(test)-343(programs)]TJ/F16 8.97 Tf 94.94 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 102.87 0 TD[(12)]TJ/F2 14.35 Tf 27.16 589.87 TD[(B)]TJ/F14 8.97 Tf 0 -15.91 TD[(baud)]TJ/F16 8.97 Tf 20.38 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 177.43 0 TD[(17)]TJ -197.81 -11.95 TD[(baud)-342(rate,)-343(sp)-28(ecifying)]TJ/F16 8.97 Tf 85.81 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 112 0 TD[(11)]TJ -197.81 -11.96 TD[(bps,)-342(sp)-29(ecifying)]TJ/F16 8.97 Tf 60.2 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 137.61 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(bt)]TJ/F16 8.97 Tf 11.32 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 186.49 0 TD[(31)]TJ -197.81 -11.95 TD[(bug)-342(n)27(um)29(b)-28(er)]TJ/F16 8.97 Tf 50.42 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 147.39 0 TD[(42)]TJ -197.81 -11.96 TD[(bug)-342(n)27(um)29(b)-28(er,)-342(extra)]TJ/F16 8.97 Tf 76.7 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.11 0 TD[(42)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(bug_id)]TJ/F16 8.97 Tf 29.45 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 168.36 0 TD[(42)]TJ -197.81 -11.96 TD[(build)-342(con\014g)-343(name,)-342(c)27(hanging)]TJ/F16 8.97 Tf 115.36 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 82.45 0 TD[(11)]TJ -197.81 -11.95 TD[(build)-342(host)-343(con\014guration)-342(test)]TJ/F16 8.97 Tf 116.06 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 81.75 0 TD[(25)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(build_triplet)]TJ/F16 8.97 Tf 63.36 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 134.45 0 TD[(17)]TJ -197.81 -11.96 TD[(built)-342(in)-343(pro)-28(cedures,)-343(DejaGn)28(u)]TJ/F16 8.97 Tf 119.86 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 77.95 0 TD[(23)]TJ/F2 14.35 Tf -197.81 -31.93 TD[(C)]TJ/F15 8.97 Tf 0 -15.9 TD[(C)-342(torture)-343(test)]TJ/F16 8.97 Tf 58.53 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 139.28 0 TD[(39)]TJ -197.81 -11.96 TD[(canadian)-342(cross)-343(con\014guration)-342(test)]TJ/F16 8.97 Tf 133.77 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 64.04 0 TD[(25)]TJ -197.81 -11.96 TD[(cancelling)-342(exp)-29(ected)-342(failure)]TJ/F16 8.97 Tf 107.69 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 90.12 0 TD[(26)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(check)]TJ/F15 8.97 Tf 26.61 0 TD[(mak)28(e\014le)-342(target)]TJ/F16 8.97 Tf 62.62 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 113.19 0 TD[(3)]TJ/F14 8.97 Tf -202.42 -11.95 TD[(clear_xfail)]TJ/F17 8.97 Tf 54.85 0 TD[(con\014g)]TJ/F16 8.97 Tf 26.21 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 116.75 0 TD[(26)]TJ -197.81 -11.96 TD[(Closing)-342(a)-343(remote)-342(connection)]TJ/F16 8.97 Tf 116.04 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 81.77 0 TD[(27)]TJ -197.81 -11.96 TD[(command)-342(line)-343(option)-342(v)56(ariables)]TJ/F16 8.97 Tf 124.87 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 72.94 0 TD[(17)]TJ -197.81 -11.95 TD[(command)-342(line)-343(options)]TJ/F16 8.97 Tf 90.27 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 112.15 0 TD[(9)]TJ -202.42 -11.96 TD[(command)-342(line)-343(Tcl)-342(v)56(ariable)-342(de\014nition)]TJ/F16 8.97 Tf 150.47 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 47.34 0 TD[(10)]TJ -197.81 -11.96 TD[(comm)28(unications)-342(pro)-28(cedures)]TJ/F16 8.97 Tf 112.36 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 85.45 0 TD[(26)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(comp_output)]TJ/F16 8.97 Tf 54.29 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 143.52 0 TD[(42)]TJ -197.81 -11.95 TD[(comparing)-342(\014les)]TJ/F16 8.97 Tf 63 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 134.81 0 TD[(28)]TJ -197.81 -11.96 TD[(compile)-342(a)-343(\014le)]TJ/F16 8.97 Tf 55.03 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 142.78 0 TD[(29)]TJ -197.81 -11.96 TD[(con\014guration)-342(dep)-29(enden)28(t)-342(defaults)]TJ/F16 8.97 Tf 133.59 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 64.22 0 TD[(15)]TJ -197.81 -11.95 TD[(con\014guring)-342(DejaGn)27(u)]TJ/F16 8.97 Tf 85.36 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 112.45 0 TD[(49)]TJ -197.81 -11.96 TD[(connecting)-342(to)-343(target)]TJ/F16 8.97 Tf 84.37 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 113.44 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(connectmode)]TJ/F16 8.97 Tf 54.29 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 143.52 0 TD[(17)]TJ -197.81 -11.96 TD[(con)28(v)29(erting)-342(relativ)28(e)-342(paths)-343(to)-342(absolute)]TJ/F16 8.97 Tf 150.02 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 47.79 0 TD[(28)]TJ -197.81 -11.95 TD[(Core)-342(In)27(ternal)-341(Pro)-29(cedures)]TJ/F16 8.97 Tf 103.07 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 94.74 0 TD[(23)]TJ -197.81 -11.96 TD[(cross)-342(con\014guration)]TJ/F16 8.97 Tf 77.12 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 125.3 0 TD[(4)]TJ -202.42 -11.96 TD[(curren)28(t)-342(test)-342(sub)-29(directory)]TJ/F16 8.97 Tf 102.52 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.29 0 TD[(42)]TJ/F2 14.35 Tf -197.81 -31.93 TD[(D)]TJ/F14 8.97 Tf 0 -15.91 TD[(dbg.log)]TJ/F15 8.97 Tf 36.02 0 TD[(\014le)]TJ/F16 8.97 Tf 14.1 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 147.69 0 TD[(11)]TJ -197.81 -11.95 TD[(debug)-342(log)]TJ/F16 8.97 Tf 41.32 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 156.49 0 TD[(36)]TJ -197.81 -11.96 TD[(debug)-342(log)-343(for)-342(test)-343(cases)]TJ/F16 8.97 Tf 95.08 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 102.73 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(debugger.exp)]TJ/F16 8.97 Tf 58.82 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 138.99 0 TD[(30)]TJ -197.81 -11.95 TD[(debugging)-342(a)-343(test)-342(case)]TJ/F16 8.97 Tf 88.9 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 108.91 0 TD[(40)]TJ -197.81 -11.96 TD[(default)-342(options,)-343(con)28(trolling)]TJ/F16 8.97 Tf 111.04 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 86.77 0 TD[(17)]TJ -197.81 -11.96 TD[(defaults,)-342(option)]TJ/F16 8.97 Tf 64.15 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 133.66 0 TD[(17)]TJ -197.81 -11.96 TD[(defaults,)-342(setting)-343(in)-342(init)-343(\014le)]TJ/F16 8.97 Tf 107.98 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 89.83 0 TD[(23)]TJ -197.81 -11.95 TD[(DejaGn)28(u)-342(con\014guration)]TJ/F16 8.97 Tf 93.82 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 103.99 0 TD[(49)]TJ -197.81 -11.96 TD[(DejaGn)28(u)-342(test)-342(driv)27(er)]TJ/F16 8.97 Tf 81.81 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 120.61 0 TD[(9)]TJ -202.42 -11.96 TD[(DejaGn)28(u,)-342(the)-342(name)]TJ/F16 8.97 Tf 81 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.42 0 TD[(6)]TJ ET 0 g 0 G +endstream +endobj +269 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F14 258 0 R +/F15 261 0 R +/F16 264 0 R +/F17 267 0 R +>> +endobj +255 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 269 0 R +>> +endobj +272 0 obj +<< +/Length 23714 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(52)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F15 8.97 Tf 0 -32.23 TD[(Delete)-342(a)-343(w)28(atc)28(hp)-27(oin)27(t.)]TJ/F16 8.97 Tf 85.32 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 112.49 0 TD[(31)]TJ -197.81 -12.1 TD[(design)-342(goals)]TJ/F16 8.97 Tf 50.46 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 151.96 0 TD[(5)]TJ -202.42 -12.09 TD[(detailed)-342(log)]TJ/F16 8.97 Tf 49.52 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 148.29 0 TD[(36)]TJ/F14 8.97 Tf -197.81 -12.09 TD[(diff)]TJ/F17 8.97 Tf 21.9 0 TD[(\014lename)-398(\014lename)]TJ/F16 8.97 Tf 72.39 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 103.52 0 TD[(28)]TJ -197.81 -12.1 TD[(directories)-342(matc)27(hing)-341(a)-343(pattern)]TJ/F16 8.97 Tf 124.38 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 73.43 0 TD[(28)]TJ -197.81 -12.09 TD[(directory)-342(names)-343(and)]TJ/F14 8.97 Tf 85.34 0 TD[(--tool)]TJ/F16 8.97 Tf 30.36 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 82.11 0 TD[(21)]TJ -197.81 -12.09 TD[(do)28(wnload)-342(a)-342(\014le)]TJ/F16 8.97 Tf 63.09 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 134.72 0 TD[(27)]TJ/F14 8.97 Tf -197.81 -12.1 TD[(download)]TJ/F17 8.97 Tf 40.73 0 TD[(\014le)]TJ/F15 8.97 Tf 15.35 0 TD[([)]TJ/F17 8.97 Tf 5.63 0 TD[(spa)28(wnid)]TJ/F15 8.97 Tf 35.98 0 TD[(])]TJ/F16 8.97 Tf 4.81 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.31 0 TD[(27)]TJ -197.81 -12.09 TD[(do)28(wnload,)]TJ/F14 8.97 Tf 43.77 0 TD[(tip)]TJ/F16 8.97 Tf 15.76 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 138.28 0 TD[(27)]TJ/F14 8.97 Tf -197.81 -12.1 TD[(dumplocals)]TJ/F16 8.97 Tf 50.14 0 TD[(expr)-202(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 147.67 0 TD[(30)]TJ/F14 8.97 Tf -197.81 -12.09 TD[(dumprocs)]TJ/F16 8.97 Tf 40.73 0 TD[(expr)-241(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 157.08 0 TD[(30)]TJ/F14 8.97 Tf -197.81 -12.09 TD[(dumpvars)]TJ/F16 8.97 Tf 40.73 0 TD[(expr)-241(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 157.08 0 TD[(30)]TJ/F14 8.97 Tf -197.81 -12.1 TD[(dumpwatch)]TJ/F16 8.97 Tf 45.44 0 TD[(expr)-221(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 152.37 0 TD[(30)]TJ/F2 14.35 Tf -197.81 -32.75 TD[(E)]TJ/F14 8.97 Tf 0 -16.21 TD[(echo.exp)]TJ/F16 8.97 Tf 38.64 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 163.78 0 TD[(5)]TJ/F14 8.97 Tf -202.42 -12.09 TD[(ERROR)]TJ/F16 8.97 Tf 26.33 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 161.24 0 TD[(9,)-342(23)]TJ -187.57 -12.09 TD[(example)]TJ/F16 8.97 Tf 34.14 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 168.28 0 TD[(5)]TJ/F14 8.97 Tf -202.42 -12.1 TD[(exec_output)]TJ/F16 8.97 Tf 54.29 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 143.52 0 TD[(42)]TJ/F14 8.97 Tf -197.81 -12.09 TD[(exec_prefix)]TJ/F15 8.97 Tf 51.78 0 TD[(,)-342(con\014gure)-343(options.)]TJ/F16 8.97 Tf 77.99 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 68.04 0 TD[(49)]TJ/F14 8.97 Tf -197.81 -12.09 TD[(execute_anywhere)]TJ/F16 8.97 Tf 78.39 0 TD[(cmd)-52(line)-236(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 119.42 0 TD[(30)]TJ -197.81 -12.1 TD[(executing)-342(commands)-343(remotely)]TJ/F16 8.97 Tf 124.24 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 73.57 0 TD[(30)]TJ -197.81 -12.09 TD[(existing)-342(tests,)-343(running)]TJ/F16 8.97 Tf 90.72 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 111.7 0 TD[(3)]TJ -202.42 -12.1 TD[(exit)-342(co)-29(de)-342(from)]TJ/F14 8.97 Tf 61.21 0 TD[(runtest)]TJ/F16 8.97 Tf 34.01 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 107.2 0 TD[(9)]TJ -202.42 -12.09 TD[(exit)-342(pro)-29(cedure,)-342(tested)-343(to)-28(ols)]TJ/F16 8.97 Tf 111.72 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 86.09 0 TD[(31)]TJ/F14 8.97 Tf -197.81 -12.09 TD[(exit_remote_shell)]TJ/F17 8.97 Tf 83.1 0 TD[(spa)28(wnid)]TJ/F16 8.97 Tf 33.81 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 80.9 0 TD[(27)]TJ/F14 8.97 Tf -197.81 -12.1 TD[(exp)]TJ/F15 8.97 Tf 17.19 0 TD[(\014lename)-342(su\016x)]TJ/F16 8.97 Tf 59.53 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.09 0 TD[(21)]TJ/F14 8.97 Tf -197.81 -12.09 TD[(expect)]TJ/F15 8.97 Tf 31.32 0 TD[(in)28(ternal)-342(tracing)]TJ/F16 8.97 Tf 63.48 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 103.01 0 TD[(12)]TJ/F14 8.97 Tf -197.81 -12.1 TD[(expect)]TJ/F15 8.97 Tf 31.32 0 TD[(script)-342(names)]TJ/F16 8.97 Tf 53.52 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 117.58 0 TD[(1)]TJ/F14 8.97 Tf -202.42 -12.09 TD[(expect)]TJ/F15 8.97 Tf 31.32 0 TD[(scripting)-342(language)]TJ/F16 8.97 Tf 75.66 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.44 0 TD[(8)]TJ/F14 8.97 Tf -202.42 -12.09 TD[(expect_out\(buffer\))]TJ/F16 8.97 Tf 86.02 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 111.79 0 TD[(42)]TJ -197.81 -12.1 TD[(exp)-28(ected)-343(failure)]TJ/F16 8.97 Tf 66.06 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.51 0 TD[(9,)-342(25)]TJ -187.57 -12.09 TD[(exp)-28(ected)-343(failure,)-342(cancelling)]TJ/F16 8.97 Tf 111.15 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 86.66 0 TD[(26)]TJ/F2 14.35 Tf -197.81 -32.75 TD[(F)]TJ/F14 8.97 Tf 0 -16.21 TD[(FAIL)]TJ/F16 8.97 Tf 19.74 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 172.44 0 TD[(7,)-342(9)]TJ/F14 8.97 Tf -192.18 -12.09 TD[(fail)-342(")]TJ/F17 8.97 Tf 26.61 0 TD[(string)]TJ/F14 8.97 Tf 23.88 0 TD[(")]TJ/F16 8.97 Tf 5.51 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 141.81 0 TD[(24)]TJ -197.81 -12.1 TD[(failing)-342(test,)-343(exp)-28(ected)]TJ/F16 8.97 Tf 85.67 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 116.75 0 TD[(9)]TJ -202.42 -12.09 TD[(failing)-342(test,)-343(unexp)-28(ected)]TJ/F16 8.97 Tf 95.14 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 107.28 0 TD[(9)]TJ -202.42 -12.09 TD[(failure,)-342(exp)-29(ected)]TJ/F16 8.97 Tf 68.1 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 129.71 0 TD[(25)]TJ -197.81 -12.1 TD[(failure,)-342(POSIX)-343(de\014nition)]TJ/F16 8.97 Tf 102.87 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 99.55 0 TD[(7)]TJ -202.42 -12.09 TD[(\014lename)-342(for)-343(test)-342(\014les)]TJ/F16 8.97 Tf 85.58 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 112.23 0 TD[(21)]TJ -197.81 -12.09 TD[(\014les)-342(matc)27(hing)-341(a)-343(pattern)]TJ/F16 8.97 Tf 98.23 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 99.58 0 TD[(28)]TJ/F14 8.97 Tf -197.81 -12.1 TD[(find)]TJ/F17 8.97 Tf 21.9 0 TD[(dir)-414(pattern)]TJ/F16 8.97 Tf 46.35 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 129.56 0 TD[(28)]TJ/F14 8.97 Tf -197.81 -12.09 TD[(findfile)]TJ/F16 8.97 Tf 38.51 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 159.3 0 TD[(22)]TJ -197.81 -12.1 TD[(\014nding)-342(\014le)-343(di\013erences)]TJ/F16 8.97 Tf 89.52 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 108.29 0 TD[(28)]TJ -197.81 -12.09 TD[(future)-342(directions)]TJ/F16 8.97 Tf 68.26 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 134.16 0 TD[(8)]TJ/F2 14.35 Tf 22.55 539.88 TD[(G)]TJ/F14 8.97 Tf 0 -17.74 TD[(gdb.t00/echo.exp)]TJ/F16 8.97 Tf 77.08 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 125.34 0 TD[(5)]TJ/F14 8.97 Tf -202.42 -12.79 TD[(get_warning_threshold)]TJ/F16 8.97 Tf 101.8 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 96.01 0 TD[(24)]TJ/F14 8.97 Tf -197.81 -12.79 TD[(getdirs)]TJ/F17 8.97 Tf 36.02 0 TD[(dir)]TJ/F16 8.97 Tf 14.18 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 147.61 0 TD[(28)]TJ/F14 8.97 Tf -197.81 -12.79 TD[(getdirs)]TJ/F17 8.97 Tf 36.02 0 TD[(dir)-414(pattern)]TJ/F16 8.97 Tf 45.83 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 115.96 0 TD[(28)]TJ/F14 8.97 Tf -197.81 -12.79 TD[(getenv)]TJ/F17 8.97 Tf 31.32 0 TD[(v)57(ar)]TJ/F16 8.97 Tf 14.98 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 151.51 0 TD[(29)]TJ -197.81 -12.79 TD[(getting)-342(en)27(vironmen)29(t)-342(v)57(ariables)]TJ/F16 8.97 Tf 120.79 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 77.02 0 TD[(29)]TJ -197.81 -12.79 TD[(GNA)85(TS)-341(bug)-343(n)28(um)28(b)-27(er)]TJ/F16 8.97 Tf 85.42 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 112.39 0 TD[(42)]TJ -197.81 -12.79 TD[(Granlund,)-342(T)85(orb)-57(jorn)]TJ/F16 8.97 Tf 81.47 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 116.34 0 TD[(39)]TJ/F14 8.97 Tf -197.81 -12.79 TD[(grep)]TJ/F17 8.97 Tf 21.9 0 TD[(\014lename)-398(regexp)]TJ/F16 8.97 Tf 64.47 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 111.44 0 TD[(28)]TJ/F14 8.97 Tf -197.81 -12.8 TD[(grep)]TJ/F17 8.97 Tf 21.9 0 TD[(\014lename)-398(regexp)]TJ/F14 8.97 Tf 66.6 0 TD[(line)]TJ/F16 8.97 Tf 19.72 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 89.59 0 TD[(28)]TJ/F2 14.35 Tf -197.81 -36.93 TD[(H)]TJ/F15 8.97 Tf 0 -17.73 TD[(help)-342(with)]TJ/F14 8.97 Tf 40.96 0 TD[(runtest)]TJ/F16 8.97 Tf 35.29 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.56 0 TD[(11)]TJ -197.81 -12.79 TD[(hin)28(ts)-342(on)-342(test)-343(case)-342(writing)]TJ/F16 8.97 Tf 103.28 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 94.53 0 TD[(41)]TJ -197.81 -12.8 TD[(host)-342(con\014g)-343(name,)-342(c)27(hanging)]TJ/F16 8.97 Tf 111.41 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 86.4 0 TD[(11)]TJ -197.81 -12.79 TD[(host)-342(con\014guration)-343(test)]TJ/F16 8.97 Tf 93.39 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 104.42 0 TD[(25)]TJ -197.81 -12.79 TD[(host,)-342(explained)]TJ/F16 8.97 Tf 63.12 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 134.69 0 TD[(49)]TJ/F14 8.97 Tf -197.81 -12.79 TD[(host_triplet)]TJ/F16 8.97 Tf 58.82 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 138.99 0 TD[(17)]TJ/F2 14.35 Tf -197.81 -36.93 TD[(I)]TJ/F14 8.97 Tf 0 -17.74 TD[(ignoretests)]TJ/F16 8.97 Tf 54.29 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 143.52 0 TD[(17)]TJ -197.81 -12.79 TD[(init)-342(\014le)-343(name)]TJ/F16 8.97 Tf 55.03 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 142.78 0 TD[(22)]TJ -197.81 -12.79 TD[(init)-342(\014le,)-343(purp)-28(ose)]TJ/F16 8.97 Tf 67.87 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 129.94 0 TD[(22)]TJ -197.81 -12.79 TD[(initialization)]TJ/F16 8.97 Tf 51.56 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 146.25 0 TD[(22)]TJ -197.81 -12.79 TD[(input)-342(\014les)]TJ/F16 8.97 Tf 41.86 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 155.95 0 TD[(34)]TJ -197.81 -12.79 TD[(installed)-342(to)-29(ol)-342(name)]TJ/F16 8.97 Tf 80.03 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 117.78 0 TD[(24)]TJ -197.81 -12.79 TD[(installing)-342(DejaGn)27(u)]TJ/F16 8.97 Tf 77.18 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 120.63 0 TD[(49)]TJ -197.81 -12.79 TD[(in)28(ternal)-342(details)]TJ/F16 8.97 Tf 62.88 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 134.93 0 TD[(21)]TJ -197.81 -12.79 TD[(in)28(v)29(oking)]TJ/F16 8.97 Tf 36.7 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 165.72 0 TD[(9)]TJ -202.42 -12.79 TD[(IP)-342(net)27(w)29(ork)-342(pro)-28(cedures)]TJ/F16 8.97 Tf 93.58 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 104.23 0 TD[(27)]TJ/F14 8.97 Tf -197.81 -12.79 TD[(isbuild)-342(")]TJ/F17 8.97 Tf 40.73 0 TD[(host)]TJ/F14 8.97 Tf 17.13 0 TD[(")]TJ/F16 8.97 Tf 6.18 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 133.77 0 TD[(25)]TJ/F14 8.97 Tf -197.81 -12.79 TD[(ishost)-342(")]TJ/F17 8.97 Tf 36.02 0 TD[(host)]TJ/F14 8.97 Tf 17.13 0 TD[(")]TJ/F16 8.97 Tf 6.36 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 138.3 0 TD[(25)]TJ/F14 8.97 Tf -197.81 -12.79 TD[(isnative)]TJ/F16 8.97 Tf 38.51 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 159.3 0 TD[(25)]TJ/F14 8.97 Tf -197.81 -12.79 TD[(istarget)-342(")]TJ/F17 8.97 Tf 45.44 0 TD[(target)]TJ/F14 8.97 Tf 24.27 0 TD[(")]TJ/F16 8.97 Tf 6.79 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.31 0 TD[(25)]TJ/F2 14.35 Tf -197.81 -36.93 TD[(K)]TJ/F14 8.97 Tf 0 -17.74 TD[(kermit)]TJ/F17 8.97 Tf 31.32 0 TD[(p)-28(ort)-363(bps)]TJ/F16 8.97 Tf 36.61 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 129.88 0 TD[(27)]TJ/F14 8.97 Tf -197.81 -12.79 TD[(kermit)]TJ/F15 8.97 Tf 28.25 0 TD[(,)-342(remote)-343(testing)-342(via)]TJ/F16 8.97 Tf 79.76 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 89.8 0 TD[(11)]TJ ET 0 g 0 G +endstream +endobj +273 0 obj +<< +/F1 9 0 R +/F15 261 0 R +/F16 264 0 R +/F14 258 0 R +/F17 267 0 R +/F2 12 0 R +>> +endobj +271 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 273 0 R +>> +endobj +276 0 obj +<< +/Length 24305 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Index)]TJ 421.09 0 TD[(53)]TJ/F2 14.35 Tf -421.09 -97.38 TD[(L)]TJ/F15 8.97 Tf 0 -18.59 TD[(last)-342(command)-343(output)]TJ/F16 8.97 Tf 89.12 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 108.69 0 TD[(42)]TJ/F14 8.97 Tf -197.81 -13.18 TD[(lib/debugger.exp)]TJ/F16 8.97 Tf 76.95 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 120.86 0 TD[(30)]TJ/F14 8.97 Tf -197.81 -13.18 TD[(lib/remote.exp)]TJ/F16 8.97 Tf 67.89 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 129.92 0 TD[(26)]TJ/F14 8.97 Tf -197.81 -13.18 TD[(lib/target.exp)]TJ/F16 8.97 Tf 67.89 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 129.92 0 TD[(29)]TJ/F14 8.97 Tf -197.81 -13.18 TD[(lib/utils.exp)]TJ/F16 8.97 Tf 63.36 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 134.45 0 TD[(28)]TJ -197.81 -13.18 TD[(Lib)-28(es,)-343(Don)]TJ/F16 8.97 Tf 46.08 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 156.34 0 TD[(8)]TJ -202.42 -13.18 TD[(list,)-342(pruning)]TJ/F16 8.97 Tf 50.83 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 146.98 0 TD[(29)]TJ/F14 8.97 Tf -197.81 -13.18 TD[(list_targets)]TJ/F16 8.97 Tf 58.82 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 138.99 0 TD[(29)]TJ -197.81 -13.18 TD[(lists)-342(supp)-29(orted)-342(targets)]TJ/F16 8.97 Tf 90.89 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 106.92 0 TD[(29)]TJ -197.81 -13.18 TD[(load)-342(library)-343(\014le)]TJ/F16 8.97 Tf 63.63 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 134.18 0 TD[(25)]TJ -197.81 -13.18 TD[(load)-342(pro)-29(cedure,)-342(tested)-343(to)-28(ols)]TJ/F16 8.97 Tf 112.61 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 85.2 0 TD[(31)]TJ/F14 8.97 Tf -197.81 -13.18 TD[(load_lib)-342(")]TJ/F17 8.97 Tf 45.44 0 TD[(library-\014le)]TJ/F14 8.97 Tf 42.27 0 TD[(")]TJ/F16 8.97 Tf 6.51 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 103.59 0 TD[(25)]TJ -197.81 -13.18 TD[(lo)-28(cal)-343(`)]TJ/F14 8.97 Tf 24.32 0 TD[(site.exp)]TJ/F15 8.97 Tf 37.66 0 TD[(')]TJ/F16 8.97 Tf 5.23 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 130.6 0 TD[(19)]TJ -197.81 -13.18 TD[(log)-342(\014les,)-343(where)-342(to)-343(write)]TJ/F16 8.97 Tf 95.17 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 102.64 0 TD[(12)]TJ -197.81 -13.17 TD[(Lupton,)-342(Rob)-29(ert)]TJ/F16 8.97 Tf 64.26 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 133.55 0 TD[(43)]TJ/F2 14.35 Tf -197.81 -39.27 TD[(M)]TJ/F14 8.97 Tf 0 -18.6 TD[(make)]TJ/F15 8.97 Tf 21.9 0 TD[(builds)-342(part)-343(of)-342(tests)]TJ/F16 8.97 Tf 77.35 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 98.56 0 TD[(49)]TJ/F14 8.97 Tf -197.81 -13.18 TD[(make)-342(check)]TJ/F16 8.97 Tf 46.88 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 155.54 0 TD[(3)]TJ -202.42 -13.17 TD[(master)-342(`)]TJ/F14 8.97 Tf 32.84 0 TD[(site.exp)]TJ/F15 8.97 Tf 37.66 0 TD[(')]TJ/F16 8.97 Tf 5.33 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.98 0 TD[(18)]TJ -197.81 -13.18 TD[(Menapace,)-342(Julia)]TJ/F16 8.97 Tf 67.77 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 134.65 0 TD[(6)]TJ/F14 8.97 Tf -202.42 -13.18 TD[(mondfe)]TJ/F16 8.97 Tf 29.45 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 168.36 0 TD[(32)]TJ/F14 8.97 Tf -197.81 -13.18 TD[(mondfe)]TJ/F15 8.97 Tf 28.24 0 TD[(,)-342(remote)-343(testing)-342(via)]TJ/F16 8.97 Tf 79.77 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 89.8 0 TD[(11)]TJ/F2 14.35 Tf -197.81 -39.27 TD[(N)]TJ/F15 8.97 Tf 0 -18.59 TD[(name)-342(\\DejaGn)27(u")]TJ/F16 8.97 Tf 72.03 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 130.39 0 TD[(6)]TJ -202.42 -13.18 TD[(name)-342(for)-343(remote)-342(test)-343(mac)28(hine)]TJ/F16 8.97 Tf 121.3 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 76.51 0 TD[(12)]TJ -197.81 -13.18 TD[(name)-342(transformations)]TJ/F16 8.97 Tf 89.81 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 108 0 TD[(24)]TJ -197.81 -13.18 TD[(name,)-342(initialization)-343(mo)-28(dule)]TJ/F16 8.97 Tf 111.9 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 85.91 0 TD[(22)]TJ -197.81 -13.18 TD[(naming)-342(con)27(v)29(en)29(tions)]TJ/F16 8.97 Tf 81.18 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 116.63 0 TD[(21)]TJ -197.81 -13.18 TD[(naming)-342(tests)-343(to)-342(run)]TJ/F16 8.97 Tf 81.22 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 116.59 0 TD[(10)]TJ -197.81 -13.18 TD[(nativ)28(e)-342(con\014guration)]TJ/F16 8.97 Tf 81.8 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 120.62 0 TD[(4)]TJ -202.42 -13.18 TD[(nativ)28(e)-342(con\014guration)-342(test)]TJ/F16 8.97 Tf 99.38 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 98.43 0 TD[(25)]TJ -197.81 -13.18 TD[(net)28(w)29(ork)-342(\(IP\))-343(pro)-28(cedures)]TJ/F16 8.97 Tf 99.34 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 98.47 0 TD[(27)]TJ/F14 8.97 Tf -197.81 -13.18 TD[(NOTE)]TJ/F16 8.97 Tf 19.62 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 167.95 0 TD[(9,)-342(24)]TJ/F14 8.97 Tf -187.57 -13.18 TD[(note)-342(")]TJ/F17 8.97 Tf 26.61 0 TD[(string)]TJ/F14 8.97 Tf 23.88 0 TD[(")]TJ/F16 8.97 Tf 5.51 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 141.81 0 TD[(24)]TJ/F2 14.35 Tf 27.16 589.86 TD[(O)]TJ/F14 8.97 Tf 0 -15.9 TD[(objdir)]TJ/F16 8.97 Tf 29.45 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 168.36 0 TD[(17)]TJ -197.81 -11.96 TD[(ob)-57(ject)-342(directory)]TJ/F16 8.97 Tf 66.96 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 130.85 0 TD[(12)]TJ -197.81 -11.96 TD[(Op)-28(ening)-343(a)-342(remote)-343(connection)]TJ/F16 8.97 Tf 120.37 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 77.44 0 TD[(26)]TJ -197.81 -11.96 TD[(op)-28(erating)-343(principles)]TJ/F16 8.97 Tf 81.33 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 116.48 0 TD[(21)]TJ -197.81 -11.95 TD[(option)-342(defaults)]TJ/F16 8.97 Tf 62.87 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 134.94 0 TD[(17)]TJ -197.81 -11.96 TD[(option)-342(list,)]TJ/F14 8.97 Tf 46.64 0 TD[(runtest)]TJ/F16 8.97 Tf 34.76 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.02 0 TD[(9)]TJ -202.42 -11.96 TD[(options)]TJ/F16 8.97 Tf 30.07 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 172.35 0 TD[(9)]TJ -202.42 -11.96 TD[(options)-342(for)]TJ/F14 8.97 Tf 46.41 0 TD[(runtest)]TJ/F15 8.97 Tf 32.95 0 TD[(,)-342(common)]TJ/F16 8.97 Tf 41.24 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 81.82 0 TD[(4)]TJ -202.42 -11.95 TD[(options,)-342(Tcl)-343(v)56(ariables)-341(for)-343(defaults)]TJ/F16 8.97 Tf 137.36 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 60.45 0 TD[(17)]TJ -197.81 -11.96 TD[(order)-342(of)-343(tests)]TJ/F16 8.97 Tf 54.97 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 142.84 0 TD[(21)]TJ -197.81 -11.96 TD[(Ousterhout,)-342(John)-343(K.)]TJ/F16 8.97 Tf 85.61 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 116.81 0 TD[(8)]TJ/F14 8.97 Tf -202.42 -11.95 TD[(outdir)]TJ/F16 8.97 Tf 29.45 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 168.36 0 TD[(17)]TJ -197.81 -11.96 TD[(output)-342(directory)]TJ/F16 8.97 Tf 68.11 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 129.7 0 TD[(12)]TJ -197.81 -11.96 TD[(output)-342(\014les)]TJ/F16 8.97 Tf 46.85 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 150.96 0 TD[(35)]TJ -197.81 -11.96 TD[(output,)-342(additional)]TJ/F16 8.97 Tf 75.9 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.91 0 TD[(13)]TJ -197.81 -11.95 TD[(o)28(v)29(erriding)-342(`)]TJ/F14 8.97 Tf 45.87 0 TD[(site.exp)]TJ/F15 8.97 Tf 37.66 0 TD[(')]TJ/F16 8.97 Tf 5.35 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 108.93 0 TD[(15)]TJ -197.81 -11.96 TD[(o)28(v)29(erview)]TJ/F16 8.97 Tf 37.23 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 165.19 0 TD[(1)]TJ/F2 14.35 Tf -202.42 -31.93 TD[(P)]TJ/F14 8.97 Tf 0 -15.91 TD[(PASS)]TJ/F16 8.97 Tf 19.74 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 172.44 0 TD[(6,)-342(9)]TJ/F14 8.97 Tf -192.18 -11.96 TD[(pass)-342(")]TJ/F17 8.97 Tf 26.61 0 TD[(string)]TJ/F14 8.97 Tf 23.88 0 TD[(")]TJ/F16 8.97 Tf 5.51 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 141.81 0 TD[(24)]TJ -197.81 -11.95 TD[(path)-342(lo)-29(okup)]TJ/F16 8.97 Tf 50.54 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 147.27 0 TD[(28)]TJ -197.81 -11.96 TD[(pattern)-342(matc)27(h,)-341(directory)]TJ/F16 8.97 Tf 102.07 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.74 0 TD[(28)]TJ -197.81 -11.96 TD[(pattern)-342(matc)27(h,)-341(\014lenames)]TJ/F16 8.97 Tf 102.46 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.35 0 TD[(28)]TJ/F14 8.97 Tf -197.81 -11.95 TD[(perror)-342(")]TJ/F17 8.97 Tf 36.02 0 TD[(string)-428(n)27(um)29(b)-28(er)]TJ/F14 8.97 Tf 58.09 0 TD[(")]TJ/F16 8.97 Tf 5.49 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 98.21 0 TD[(23)]TJ -197.81 -11.96 TD[(p)-28(ersonal)-343(con\014g)-342(`)]TJ/F14 8.97 Tf 65.86 0 TD[(site.exp)]TJ/F15 8.97 Tf 37.66 0 TD[(')]TJ/F16 8.97 Tf 4.07 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 90.22 0 TD[(20)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(pop_host)]TJ/F16 8.97 Tf 38.51 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 159.3 0 TD[(29)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(pop_target)]TJ/F16 8.97 Tf 49.76 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 148.05 0 TD[(29)]TJ -197.81 -11.95 TD[(p)-28(orting)-343(to)-342(a)-343(new)-342(host)]TJ/F16 8.97 Tf 89.52 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 108.29 0 TD[(48)]TJ -197.81 -11.96 TD[(POSIX)-342(conformance)]TJ/F16 8.97 Tf 84.94 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 117.48 0 TD[(6)]TJ/F14 8.97 Tf -202.42 -11.96 TD[(prefix)]TJ/F15 8.97 Tf 28.25 0 TD[(,)-342(con\014gure)-343(options)]TJ/F16 8.97 Tf 75.4 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 94.16 0 TD[(49)]TJ -197.81 -11.96 TD[(Prin)28(t)-342(a)-342(bac)27(ktrace)]TJ/F16 8.97 Tf 72.15 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 125.66 0 TD[(31)]TJ -197.81 -11.95 TD[(Prin)28(t)-342(global)-342(v)56(ariable)-342(v)56(alues)]TJ/F16 8.97 Tf 111.75 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 86.06 0 TD[(30)]TJ -197.81 -11.96 TD[(Prin)28(t)-342(lo)-28(cal)-343(v)56(ariable)-341(v)56(alue)]TJ/F16 8.97 Tf 102.89 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 94.92 0 TD[(30)]TJ -197.81 -11.96 TD[(Prin)28(t)-342(pro)-28(cedure)-343(b)-28(o)-29(dies)]TJ/F16 8.97 Tf 94.22 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 103.59 0 TD[(30)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(print)]TJ/F16 8.97 Tf 26.61 0 TD[(var)-293(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 171.2 0 TD[(31)]TJ -197.81 -11.95 TD[(Prin)28(t)-342(w)28(atc)29(hp)-28(oin)28(ts)]TJ/F16 8.97 Tf 73.18 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 124.63 0 TD[(30)]TJ -197.81 -11.96 TD[(Prin)28(ting)-342(v)57(ariable)-342(v)56(alues)]TJ/F16 8.97 Tf 97.79 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 100.02 0 TD[(31)]TJ -197.81 -11.96 TD[(PRMS)-342(bug)-343(n)28(um)28(b)-27(er)]TJ/F16 8.97 Tf 80.53 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 117.28 0 TD[(42)]TJ/F14 8.97 Tf -197.81 -11.95 TD[(prms_id)]TJ/F16 8.97 Tf 33.98 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 163.83 0 TD[(42)]TJ -197.81 -11.96 TD[(problem,)-342(detected)-343(b)28(y)-342(test)-342(case)]TJ/F16 8.97 Tf 124.65 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 77.77 0 TD[(9)]TJ/F14 8.97 Tf -202.42 -11.96 TD[(prune)]TJ/F17 8.97 Tf 26.61 0 TD[(list)-362(pattern)]TJ/F16 8.97 Tf 46.47 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 124.73 0 TD[(29)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(prune_system_crud)]TJ/F17 8.97 Tf 83.1 0 TD[(system)-342(text)]TJ/F16 8.97 Tf 49.52 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 65.19 0 TD[(29)]TJ -197.81 -11.95 TD[(pruning)-342(system)-343(output,)-342(examining)-343(program)-342(output)]TJ/F16 8.97 Tf 20.18 -11.96 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 177.63 0 TD[(29)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(psource)]TJ/F17 8.97 Tf 36.02 0 TD[(\014lename)]TJ/F16 8.97 Tf 36 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 125.79 0 TD[(28)]TJ/F14 8.97 Tf -197.81 -11.95 TD[(push_host)]TJ/F16 8.97 Tf 45.44 0 TD[(name)-193(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 152.37 0 TD[(29)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(push_target)]TJ/F16 8.97 Tf 54.85 0 TD[(name)-397(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 142.96 0 TD[(29)]TJ ET 0 g 0 G +endstream +endobj +277 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F15 261 0 R +/F16 264 0 R +/F14 258 0 R +/F17 267 0 R +>> +endobj +275 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 277 0 R +>> +endobj +280 0 obj +<< +/Length 22673 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(54)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F2 14.35 Tf 0 -92.76 TD[(Q)]TJ/F14 8.97 Tf 0 -18.42 TD[(quit)]TJ/F16 8.97 Tf 20.38 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 177.43 0 TD[(31)]TJ -197.81 -13.11 TD[(Quiting)-342(DejaGn)27(u)]TJ/F16 8.97 Tf 71.9 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 125.91 0 TD[(31)]TJ/F2 14.35 Tf -197.81 -38.8 TD[(R)]TJ/F15 8.97 Tf 0 -18.42 TD[(ranlib)-342(a)-343(\014le)]TJ/F16 8.97 Tf 47.09 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 150.72 0 TD[(30)]TJ/F14 8.97 Tf -197.81 -13.11 TD[(reboot)]TJ/F16 8.97 Tf 29.45 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 168.36 0 TD[(17)]TJ -197.81 -13.1 TD[(reb)-28(o)-29(oting)-342(remote)-343(targets)]TJ/F16 8.97 Tf 102.35 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.46 0 TD[(12)]TJ -197.81 -13.1 TD[(regular)-342(expression,)-343(\014le)-342(con)27(ten)29(ts)]TJ/F16 8.97 Tf 128.66 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 69.15 0 TD[(28)]TJ -197.81 -13.11 TD[(remote)-342(connection)-343(pro)-28(cedures)]TJ/F16 8.97 Tf 121.18 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 76.63 0 TD[(26)]TJ -197.81 -13.1 TD[(remote)-342(connection,)-343(ending)]TJ/F16 8.97 Tf 107.56 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 90.25 0 TD[(27)]TJ -197.81 -13.1 TD[(remote)-342(test)-343(mac)28(hine)-342(name)]TJ/F16 8.97 Tf 107.71 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 90.1 0 TD[(12)]TJ -197.81 -13.1 TD[(remote)-342(testb)-29(ed,)-342(connecting)-343(to)]TJ/F16 8.97 Tf 121.16 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 76.65 0 TD[(11)]TJ -197.81 -13.11 TD[(remote)-342(testing)]TJ/F16 8.97 Tf 59.55 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 138.26 0 TD[(32)]TJ -197.81 -13.1 TD[(remote)-342(testing)-343(via)]TJ/F14 8.97 Tf 76.11 0 TD[(kermit)]TJ/F16 8.97 Tf 30.62 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 91.08 0 TD[(11)]TJ -197.81 -13.1 TD[(remote)-342(testing)-343(via)]TJ/F14 8.97 Tf 76.11 0 TD[(mondfe)]TJ/F16 8.97 Tf 30.62 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 91.08 0 TD[(11)]TJ -197.81 -13.1 TD[(remote)-342(testing)-343(via)]TJ/F14 8.97 Tf 76.11 0 TD[(rlogin)]TJ/F16 8.97 Tf 30.62 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 91.08 0 TD[(11)]TJ -197.81 -13.11 TD[(remote)-342(testing)-343(via)]TJ/F14 8.97 Tf 76.11 0 TD[(rsh)]TJ/F16 8.97 Tf 17.02 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 104.68 0 TD[(11)]TJ -197.81 -13.1 TD[(remote)-342(testing)-343(via)]TJ/F14 8.97 Tf 76.11 0 TD[(telnet)]TJ/F16 8.97 Tf 30.62 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 91.08 0 TD[(11)]TJ -197.81 -13.1 TD[(remote)-342(testing)-343(via)]TJ/F14 8.97 Tf 76.11 0 TD[(tip)]TJ/F16 8.97 Tf 17.02 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 104.68 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -13.1 TD[(remote.exp)]TJ/F16 8.97 Tf 49.76 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 148.05 0 TD[(26)]TJ/F14 8.97 Tf -197.81 -13.11 TD[(remote_close)]TJ/F17 8.97 Tf 59.56 0 TD[(shellid)]TJ/F16 8.97 Tf 26.87 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 111.38 0 TD[(27)]TJ/F14 8.97 Tf -197.81 -13.1 TD[(remote_open)]TJ/F17 8.97 Tf 54.85 0 TD[(t)28(yp)-28(e)]TJ/F16 8.97 Tf 20.96 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 122 0 TD[(26)]TJ/F14 8.97 Tf -197.81 -13.1 TD[(rlogin)]TJ/F17 8.97 Tf 31.32 0 TD[(hostname)]TJ/F16 8.97 Tf 40.93 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 125.56 0 TD[(27)]TJ/F14 8.97 Tf -197.81 -13.1 TD[(rlogin)]TJ/F15 8.97 Tf 28.24 0 TD[(,)-342(remote)-343(testing)-342(via)]TJ/F16 8.97 Tf 79.77 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 89.8 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -13.11 TD[(rsh)]TJ/F17 8.97 Tf 17.19 0 TD[(hostname)]TJ/F16 8.97 Tf 41.46 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 139.16 0 TD[(27)]TJ/F14 8.97 Tf -197.81 -13.1 TD[(rsh)]TJ/F15 8.97 Tf 14.12 0 TD[(,)-342(remote)-343(testing)-342(via)]TJ/F16 8.97 Tf 80.29 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 103.4 0 TD[(11)]TJ -197.81 -13.1 TD[(running)]TJ/F16 8.97 Tf 33.25 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 169.17 0 TD[(9)]TJ -202.42 -13.1 TD[(running)-342(tests)]TJ/F16 8.97 Tf 54.95 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 147.47 0 TD[(3)]TJ/F14 8.97 Tf -202.42 -13.11 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(description)]TJ/F16 8.97 Tf 45.64 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 120.76 0 TD[(9)]TJ/F14 8.97 Tf -202.42 -13.1 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(exit)-342(co)-29(de)]TJ/F16 8.97 Tf 37.41 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 128.99 0 TD[(9)]TJ/F14 8.97 Tf -202.42 -13.1 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option)-342(defaults)]TJ/F16 8.97 Tf 62.29 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 99.5 0 TD[(17)]TJ/F14 8.97 Tf -197.81 -13.1 TD[(runtest)]TJ/F15 8.97 Tf 36.02 0 TD[(option)-342(list)]TJ/F16 8.97 Tf 41.92 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 124.48 0 TD[(9)]TJ/F14 8.97 Tf -202.42 -13.11 TD[(runtest)]TJ/F15 8.97 Tf 32.95 0 TD[(,)-342(listing)-343(options)]TJ/F16 8.97 Tf 65 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 99.86 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -13.1 TD[(runtest)]TJ/F15 8.97 Tf 32.95 0 TD[(,)-342(most)-343(common)-342(options)]TJ/F16 8.97 Tf 96.25 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 73.22 0 TD[(4)]TJ/F14 8.97 Tf -202.42 -13.1 TD[(runtest)]TJ/F15 8.97 Tf 32.95 0 TD[(,)-342(v)56(ariable)-342(defns)-342(on)-343(cmdline)]TJ/F16 8.97 Tf 109.57 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 55.29 0 TD[(10)]TJ/F14 8.97 Tf -197.81 -13.1 TD[(runtest.exp)]TJ/F16 8.97 Tf 54.29 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 143.52 0 TD[(21)]TJ/F14 8.97 Tf -197.81 -13.11 TD[(runtest_file_p)]TJ/F17 8.97 Tf 68.97 0 TD[(run)28(tests)-382(testcase)]TJ/F16 8.97 Tf 69.02 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 59.82 0 TD[(29)]TJ/F14 8.97 Tf -197.81 -13.1 TD[(runtests)]TJ/F16 8.97 Tf 38.51 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 159.3 0 TD[(17)]TJ/F2 14.35 Tf 27.16 518.26 TD[(S)]TJ/F15 8.97 Tf 0 -18.53 TD[(searc)28(hing)-342(\014le)-342(con)27(ten)29(ts)]TJ/F16 8.97 Tf 90.06 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 107.75 0 TD[(28)]TJ -197.81 -13.15 TD[(selecting)-342(a)-343(range)-342(of)-343(tests)]TJ/F16 8.97 Tf 101.12 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 81.85 0 TD[(10,)-342(29)]TJ -182.97 -13.16 TD[(selecting)-342(tests)-343(for)-342(a)-343(to)-28(ol)]TJ/F16 8.97 Tf 98.41 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 99.4 0 TD[(10)]TJ -197.81 -13.15 TD[(serial)-342(do)27(wnload,)]TJ/F14 8.97 Tf 67.91 0 TD[(tip)]TJ/F16 8.97 Tf 16.76 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 113.14 0 TD[(27)]TJ -197.81 -13.15 TD[(serial)-342(line)-343(connection,)]TJ/F14 8.97 Tf 90.19 0 TD[(kermit)]TJ/F16 8.97 Tf 30.12 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 77.5 0 TD[(27)]TJ -197.81 -13.15 TD[(serial)-342(line)-343(connection,)]TJ/F14 8.97 Tf 90.19 0 TD[(tip)]TJ/F16 8.97 Tf 16.52 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 91.1 0 TD[(27)]TJ -197.81 -13.15 TD[(set)-342(curren)27(t)-341(host)]TJ/F16 8.97 Tf 64.45 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 133.36 0 TD[(29)]TJ -197.81 -13.15 TD[(set)-342(curren)27(t)-341(target)]TJ/F16 8.97 Tf 72.38 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 125.43 0 TD[(29)]TJ/F14 8.97 Tf -197.81 -13.15 TD[(set_warning_threshold)]TJ/F17 8.97 Tf 101.93 0 TD[(threshold)]TJ/F16 8.97 Tf 39.92 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 55.96 0 TD[(24)]TJ/F14 8.97 Tf -197.81 -13.15 TD[(setenv)]TJ/F17 8.97 Tf 31.32 0 TD[(v)57(ar)-414(v)56(al)]TJ/F16 8.97 Tf 28.99 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 137.5 0 TD[(29)]TJ -197.81 -13.15 TD[(setting)-342(defaults)-343(for)-342(DejaGn)27(u)-341(v)56(ariables)]TJ/F16 8.97 Tf 155.01 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 42.8 0 TD[(15)]TJ -197.81 -13.15 TD[(setting)-342(en)27(vironmen)29(t)-342(v)57(ariables)]TJ/F16 8.97 Tf 120.3 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 77.51 0 TD[(29)]TJ -197.81 -13.15 TD[(setting)-342(up)-343(targets)]TJ/F16 8.97 Tf 72.77 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 125.04 0 TD[(22)]TJ/F14 8.97 Tf -197.81 -13.15 TD[(setup_xfail)-342(")]TJ/F17 8.97 Tf 59.56 0 TD[(con\014g)]TJ/F15 8.97 Tf 27.39 0 TD[([)]TJ/F17 8.97 Tf 2.56 0 TD[(bugid)]TJ/F15 8.97 Tf 22.88 0 TD[(])]TJ/F14 8.97 Tf 2.56 0 TD[(")]TJ/F16 8.97 Tf 5.97 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 76.89 0 TD[(25)]TJ/F14 8.97 Tf -197.81 -13.15 TD[(site.exp)]TJ/F16 8.97 Tf 38.51 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 159.3 0 TD[(15)]TJ -197.81 -13.15 TD[(`)]TJ/F14 8.97 Tf 2.56 0 TD[(site.exp)]TJ/F15 8.97 Tf 37.66 0 TD[(')-342(for)-343(all)-342(of)-343(DejaGn)28(u)]TJ/F16 8.97 Tf 80.38 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 77.21 0 TD[(18)]TJ -197.81 -13.16 TD[(`)]TJ/F14 8.97 Tf 2.56 0 TD[(site.exp)]TJ/F15 8.97 Tf 37.66 0 TD[(')-342(for)-343(eac)28(h)-342(p)-28(erson)]TJ/F16 8.97 Tf 67.9 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 89.69 0 TD[(20)]TJ -197.81 -13.15 TD[(`)]TJ/F14 8.97 Tf 2.56 0 TD[(site.exp)]TJ/F15 8.97 Tf 37.66 0 TD[(')-342(for)-343(eac)28(h)-342(to)-28(ol)]TJ/F16 8.97 Tf 58.13 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 99.46 0 TD[(19)]TJ -197.81 -13.15 TD[(`)]TJ/F14 8.97 Tf 2.56 0 TD[(site.exp)]TJ/F15 8.97 Tf 37.66 0 TD[(',)-342(m)27(ultiple)]TJ/F16 8.97 Tf 44.15 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 113.44 0 TD[(15)]TJ/F14 8.97 Tf -197.81 -13.15 TD[(slay)]TJ/F17 8.97 Tf 21.9 0 TD[(name)]TJ/F16 8.97 Tf 24.1 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 151.81 0 TD[(28)]TJ -197.81 -13.15 TD[(sla)28(ying)-342(pro)-28(cesses)]TJ/F16 8.97 Tf 68.72 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 129.09 0 TD[(28)]TJ -197.81 -13.15 TD[(source)-342(directory)]TJ/F16 8.97 Tf 67.13 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 130.68 0 TD[(12)]TJ -197.81 -13.15 TD[(sourcing)-342(Tcl)-343(\014les)]TJ/F16 8.97 Tf 69.05 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 128.76 0 TD[(28)]TJ -197.81 -13.15 TD[(sp)-28(ecial)-343(v)56(ariables)]TJ/F16 8.97 Tf 67.51 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 130.3 0 TD[(42)]TJ -197.81 -13.15 TD[(sp)-28(ecifying)-343(target)-342(name)]TJ/F16 8.97 Tf 93.75 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 104.06 0 TD[(11)]TJ -197.81 -13.15 TD[(sp)-28(ecifying)-343(the)-342(build)-343(con\014g)-342(name)]TJ/F16 8.97 Tf 132.81 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 65 0 TD[(11)]TJ -197.81 -13.15 TD[(sp)-28(ecifying)-343(the)-342(host)-343(con\014g)-342(name)]TJ/F16 8.97 Tf 128.86 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 68.95 0 TD[(11)]TJ -197.81 -13.15 TD[(sp)-28(ecifying)-343(the)-342(target)-343(con\014guration)]TJ/F16 8.97 Tf 141.28 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 56.53 0 TD[(12)]TJ/F14 8.97 Tf -197.81 -13.15 TD[(srcdir)]TJ/F16 8.97 Tf 29.45 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 168.36 0 TD[(17)]TJ -197.81 -13.15 TD[(standard)-342(conformance:)-457(POSIX)-342(1003.3)]TJ/F16 8.97 Tf 155.17 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 47.25 0 TD[(6)]TJ -202.42 -13.15 TD[(start)-342(pro)-29(cedure,)-342(tested)-343(to)-28(ols)]TJ/F16 8.97 Tf 115.86 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 81.95 0 TD[(31)]TJ -197.81 -13.16 TD[(starting)-342(in)27(teractiv)29(e)-342(to)-28(ols)]TJ/F16 8.97 Tf 101.85 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.96 0 TD[(22)]TJ -197.81 -13.15 TD[(starting)-342(the)-343(tcl)-342(debugger)]TJ/F16 8.97 Tf 102.34 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.47 0 TD[(13)]TJ/F14 8.97 Tf -197.81 -13.15 TD[(subdir)]TJ/F16 8.97 Tf 29.45 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 168.36 0 TD[(42)]TJ -197.81 -13.15 TD[(success,)-342(POSIX)-343(de\014nition)]TJ/F16 8.97 Tf 106.53 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 95.89 0 TD[(6)]TJ -202.42 -13.15 TD[(successful)-342(test)]TJ/F16 8.97 Tf 59.1 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 143.32 0 TD[(9)]TJ -202.42 -13.15 TD[(successful)-342(test,)-343(unexp)-28(ected)]TJ/F16 8.97 Tf 110.85 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 91.57 0 TD[(9)]TJ -202.42 -13.15 TD[(su\016x,)]TJ/F14 8.97 Tf 26.93 0 TD[(expect)]TJ/F15 8.97 Tf 31.32 0 TD[(scripts)]TJ/F16 8.97 Tf 27.77 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 116.4 0 TD[(1)]TJ -202.42 -13.15 TD[(summary)-342(log)]TJ/F16 8.97 Tf 54.42 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 143.39 0 TD[(35)]TJ ET 0 g 0 G +endstream +endobj +281 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F14 258 0 R +/F16 264 0 R +/F15 261 0 R +/F17 267 0 R +>> +endobj +279 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 281 0 R +>> +endobj +284 0 obj +<< +/Length 26944 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(Index)]TJ 421.09 0 TD[(55)]TJ/F2 14.35 Tf -421.09 -24.04 TD[(T)]TJ/F15 8.97 Tf 0 -15.91 TD[(target)-342(con\014guration)-343(test)]TJ/F16 8.97 Tf 99.14 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 98.67 0 TD[(25)]TJ -197.81 -11.96 TD[(target)-342(con\014guration,)-343(sp)-28(ecifying)]TJ/F16 8.97 Tf 128.09 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 69.72 0 TD[(12)]TJ -197.81 -11.95 TD[(target)-342(dep)-29(enden)28(t)-342(pro)-28(cedures)]TJ/F16 8.97 Tf 116.45 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 81.36 0 TD[(31)]TJ -197.81 -11.96 TD[(target)-342(mac)27(hine)-341(name)]TJ/F16 8.97 Tf 86.04 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 111.77 0 TD[(11)]TJ -197.81 -11.96 TD[(target,)-342(explained)]TJ/F16 8.97 Tf 68.87 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 128.94 0 TD[(49)]TJ/F14 8.97 Tf -197.81 -11.95 TD[(target.exp)]TJ/F16 8.97 Tf 49.76 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 148.05 0 TD[(29)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(target_triplet)]TJ/F16 8.97 Tf 67.89 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 129.92 0 TD[(17)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(targetname)]TJ/F16 8.97 Tf 49.76 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 148.05 0 TD[(17)]TJ -197.81 -11.96 TD[(targets)]TJ/F16 8.97 Tf 29.18 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 168.63 0 TD[(32)]TJ -197.81 -11.95 TD[(tcl)]TJ/F16 8.97 Tf 11.85 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 190.57 0 TD[(8)]TJ -202.42 -11.96 TD[(tcl)-342(debugger)]TJ/F16 8.97 Tf 51.06 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 146.75 0 TD[(13)]TJ -197.81 -11.96 TD[(Tcl)-342(v)56(ariables)-342(for)-342(option)-343(defaults)]TJ/F16 8.97 Tf 129.9 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 67.91 0 TD[(17)]TJ -197.81 -11.96 TD[(Tcl)-342(v)56(ariables,)-342(de\014ning)-342(for)]TJ/F14 8.97 Tf 106.08 0 TD[(runtest)]TJ/F16 8.97 Tf 35.42 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 56.31 0 TD[(10)]TJ/F17 8.97 Tf -197.81 -11.95 TD[(tclv)57(ar)]TJ/F14 8.97 Tf 23.45 0 TD[(=)]TJ/F17 8.97 Tf 4.7 0 TD[(v)57(alue)]TJ/F16 8.97 Tf 22.77 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 146.89 0 TD[(10)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(telnet)]TJ/F17 8.97 Tf 31.32 0 TD[(hostname)-398(p)-29(ort)]TJ/F16 8.97 Tf 62.04 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 104.45 0 TD[(27)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(telnet)]TJ/F15 8.97 Tf 28.24 0 TD[(,)-342(remote)-343(testing)-342(via)]TJ/F16 8.97 Tf 79.77 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 89.8 0 TD[(11)]TJ -197.81 -11.96 TD[(terminating)-342(remote)-343(connection)]TJ/F16 8.97 Tf 125.24 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 72.57 0 TD[(27)]TJ -197.81 -11.95 TD[(test)-342(case)-343(cannot)-342(run)]TJ/F16 8.97 Tf 82.37 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 120.05 0 TD[(9)]TJ -202.42 -11.96 TD[(test)-342(case)-343(messages)]TJ/F16 8.97 Tf 76.16 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 126.26 0 TD[(9)]TJ -202.42 -11.96 TD[(test)-342(case)-343(w)28(arnings)]TJ/F16 8.97 Tf 75.99 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 126.43 0 TD[(9)]TJ -202.42 -11.95 TD[(test)-342(case,)-343(debugging)]TJ/F16 8.97 Tf 81.98 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 115.83 0 TD[(40)]TJ -197.81 -11.96 TD[(test)-342(case,)-343(declaring)-342(am)27(biguit)29(y)]TJ/F16 8.97 Tf 120.93 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 76.88 0 TD[(24)]TJ -197.81 -11.96 TD[(test)-342(case,)-343(declaring)-342(failure)]TJ/F16 8.97 Tf 106.98 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 90.83 0 TD[(24)]TJ -197.81 -11.96 TD[(test)-342(case,)-343(declaring)-342(no)-343(supp)-28(ort)]TJ/F16 8.97 Tf 124.94 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 72.87 0 TD[(24)]TJ -197.81 -11.95 TD[(test)-342(case,)-343(declaring)-342(no)-343(test)]TJ/F16 8.97 Tf 108.15 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 89.66 0 TD[(24)]TJ -197.81 -11.96 TD[(test)-342(case,)-343(declaring)-342(success)]TJ/F16 8.97 Tf 110.63 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 87.18 0 TD[(24)]TJ -197.81 -11.96 TD[(test)-342(case,)-343(ERR)28(OR)-342(in)]TJ/F16 8.97 Tf 85.82 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 111.99 0 TD[(23)]TJ -197.81 -11.96 TD[(test)-342(case,)-343(exp)-28(ecting)-343(failure)]TJ/F16 8.97 Tf 107.99 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 89.82 0 TD[(25)]TJ -197.81 -11.95 TD[(test)-342(case,)-343(informational)-342(messages)]TJ/F16 8.97 Tf 134.2 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 63.61 0 TD[(24)]TJ -197.81 -11.96 TD[(test)-342(case,)-343(W)114(ARNING)-342(in)]TJ/F16 8.97 Tf 98.85 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 98.96 0 TD[(23)]TJ -197.81 -11.96 TD[(test)-342(case,)-343(W)114(ARNING)-342(threshold)]TJ/F16 8.97 Tf 128.99 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 68.82 0 TD[(24)]TJ -197.81 -11.96 TD[(test)-342(case,)-343(writing)]TJ/F16 8.97 Tf 71.48 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 126.33 0 TD[(39)]TJ -197.81 -11.95 TD[(test)-342(cases,)-343(debug)-342(log)]TJ/F16 8.97 Tf 84.95 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 112.86 0 TD[(11)]TJ -197.81 -11.96 TD[(test)-342(directories,)-343(naming)]TJ/F16 8.97 Tf 97.63 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 100.18 0 TD[(21)]TJ -197.81 -11.96 TD[(test)-342(\014lename)]TJ/F16 8.97 Tf 54.03 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 143.78 0 TD[(21)]TJ -197.81 -11.95 TD[(test)-342(output,)-343(displa)28(ying)-342(all)]TJ/F16 8.97 Tf 106.57 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 91.24 0 TD[(10)]TJ -197.81 -11.96 TD[(test)-342(programs,)-343(auxiliary)]TJ/F16 8.97 Tf 98.4 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 99.41 0 TD[(12)]TJ -197.81 -11.96 TD[(test)-342(suite)-343(distributions)]TJ/F16 8.97 Tf 93.44 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 104.37 0 TD[(49)]TJ -197.81 -11.96 TD[(test,)-342(failing)]TJ/F16 8.97 Tf 46.85 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 155.57 0 TD[(9)]TJ -202.42 -11.95 TD[(test,)-342(successful)]TJ/F16 8.97 Tf 60.38 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 142.04 0 TD[(9)]TJ -202.42 -11.96 TD[(test,)-342(unresolv)27(ed)-341(outcome)]TJ/F16 8.97 Tf 102.48 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 99.94 0 TD[(9)]TJ -202.42 -11.96 TD[(test,)-342(unsupp)-29(orted)]TJ/F16 8.97 Tf 72.76 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 129.66 0 TD[(9)]TJ -202.42 -11.96 TD[(tests,)-342(running)]TJ/F16 8.97 Tf 56.23 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 146.19 0 TD[(3)]TJ -202.42 -11.95 TD[(tests,)-342(running)-343(order)]TJ/F16 8.97 Tf 81.24 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 116.57 0 TD[(21)]TJ -197.81 -11.96 TD[(tests,)-342(running)-343(sp)-28(eci\014cally)]TJ/F16 8.97 Tf 104.7 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 78.27 0 TD[(10,)-342(29)]TJ -182.97 -11.96 TD[(TET)]TJ/F16 8.97 Tf 20.88 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 181.54 0 TD[(6)]TJ/F14 8.97 Tf -202.42 -11.96 TD[(tip)]TJ/F17 8.97 Tf 17.19 0 TD[(p)-28(ort)]TJ/F16 8.97 Tf 19.77 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 160.85 0 TD[(27)]TJ/F14 8.97 Tf -197.81 -11.95 TD[(tip)]TJ/F15 8.97 Tf 14.12 0 TD[(,)-342(remote)-343(testing)-342(via)]TJ/F16 8.97 Tf 80.29 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 103.4 0 TD[(11)]TJ/F14 8.97 Tf -197.81 -11.96 TD[(tip_download)]TJ/F17 8.97 Tf 59.56 0 TD[(spa)28(wnid)-380(\014le)]TJ/F16 8.97 Tf 51.08 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 87.17 0 TD[(27)]TJ/F14 8.97 Tf 27.16 555.85 TD[(tool)]TJ/F16 8.97 Tf 20.38 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 177.43 0 TD[(17)]TJ -197.81 -12.53 TD[(to)-28(ol)-343(command)-342(language)]TJ/F16 8.97 Tf 98.32 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 104.1 0 TD[(8)]TJ -202.42 -12.52 TD[(to)-28(ol)-343(initialization)]TJ/F16 8.97 Tf 71.8 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 126.01 0 TD[(22)]TJ -197.81 -12.53 TD[(to)-28(ol)-343(name,)-342(as)-343(installed)]TJ/F16 8.97 Tf 93.51 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 104.3 0 TD[(24)]TJ -197.81 -12.52 TD[(to)-28(ol)-343(names)-342(and)-343(naming)-342(con)27(v)29(en)28(tions)]TJ/F16 8.97 Tf 146.28 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 51.53 0 TD[(21)]TJ/F17 8.97 Tf -197.81 -12.53 TD[(to)-28(ol)]TJ/F14 8.97 Tf 15.96 0 TD[(_exit)]TJ/F16 8.97 Tf 25.65 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 156.2 0 TD[(31)]TJ/F17 8.97 Tf -197.81 -12.52 TD[(to)-28(ol)]TJ/F14 8.97 Tf 15.96 0 TD[(_load)]TJ/F16 8.97 Tf 25.65 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 156.2 0 TD[(31)]TJ/F17 8.97 Tf -197.81 -12.52 TD[(to)-28(ol)]TJ/F14 8.97 Tf 15.96 0 TD[(_start)]TJ/F16 8.97 Tf 30.18 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 151.67 0 TD[(31)]TJ/F17 8.97 Tf -197.81 -12.53 TD[(to)-28(ol)]TJ/F14 8.97 Tf 15.96 0 TD[(_version)]TJ/F16 8.97 Tf 39.25 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 142.6 0 TD[(32)]TJ/F14 8.97 Tf -197.81 -12.52 TD[(tracelevel)]TJ/F16 8.97 Tf 49.76 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 148.05 0 TD[(17)]TJ -197.81 -12.53 TD[(tracing)-342(Tcl)-343(commands)]TJ/F16 8.97 Tf 93.1 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 104.71 0 TD[(12)]TJ/F14 8.97 Tf -197.81 -12.52 TD[(transform)]TJ/F16 8.97 Tf 45.23 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 152.58 0 TD[(22)]TJ/F14 8.97 Tf -197.81 -12.53 TD[(transform)-342(")]TJ/F17 8.97 Tf 50.15 0 TD[(to)-28(olname)]TJ/F14 8.97 Tf 37.62 0 TD[(")]TJ/F16 8.97 Tf 6.48 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 103.56 0 TD[(24)]TJ -197.81 -12.52 TD[(transform)-342(to)-29(ol)-342(name)]TJ/F16 8.97 Tf 84.92 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 112.89 0 TD[(24)]TJ -197.81 -12.52 TD[(turning)-342(on)-343(output)]TJ/F16 8.97 Tf 75.66 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 122.15 0 TD[(13)]TJ/F2 14.35 Tf -197.81 -35.34 TD[(U)]TJ/F15 8.97 Tf 0 -17.15 TD[(unexp)-28(ected)-343(success)]TJ/F16 8.97 Tf 77.9 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 124.52 0 TD[(9)]TJ/F14 8.97 Tf -202.42 -12.52 TD[(UNRESOLVED)]TJ/F16 8.97 Tf 49.12 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 143.06 0 TD[(7,)-342(9)]TJ/F14 8.97 Tf -192.18 -12.53 TD[(unresolved)-342(")]TJ/F17 8.97 Tf 54.85 0 TD[(string)]TJ/F14 8.97 Tf 23.89 0 TD[(")]TJ/F16 8.97 Tf 6.64 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 112.43 0 TD[(24)]TJ -197.81 -12.52 TD[(unset)-342(curren)27(t)-341(host)]TJ/F16 8.97 Tf 76.11 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.7 0 TD[(29)]TJ -197.81 -12.53 TD[(unset)-342(curren)27(t)-341(target)]TJ/F16 8.97 Tf 81.86 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 115.95 0 TD[(29)]TJ/F14 8.97 Tf -197.81 -12.52 TD[(unsetenv)]TJ/F17 8.97 Tf 40.73 0 TD[(v)57(ar)]TJ/F16 8.97 Tf 14.64 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 142.44 0 TD[(29)]TJ -197.81 -12.53 TD[(unsetting)-342(en)27(vironmen)29(t)-342(v)57(ariables)]TJ/F16 8.97 Tf 129.78 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 68.03 0 TD[(29)]TJ/F14 8.97 Tf -197.81 -12.52 TD[(UNSUPPORTED)]TJ/F16 8.97 Tf 53.65 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)]TJ/F15 8.97 Tf 138.53 0 TD[(7,)-342(9)]TJ/F14 8.97 Tf -192.18 -12.52 TD[(unsupported)-342(")]TJ/F17 8.97 Tf 59.56 0 TD[(string)]TJ/F14 8.97 Tf 23.88 0 TD[(")]TJ/F16 8.97 Tf 6.47 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 107.9 0 TD[(24)]TJ -197.81 -12.53 TD[(unsupp)-28(orted)-343(test)]TJ/F16 8.97 Tf 69.3 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 133.12 0 TD[(9)]TJ/F14 8.97 Tf -202.42 -12.52 TD[(UNTESTED)]TJ/F16 8.97 Tf 40.06 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 152.12 0 TD[(7,)-342(9)]TJ/F14 8.97 Tf -192.18 -12.53 TD[(untested)-342(")]TJ/F17 8.97 Tf 45.44 0 TD[(string)]TJ/F14 8.97 Tf 23.88 0 TD[(")]TJ/F16 8.97 Tf 6.99 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.5 0 TD[(24)]TJ -197.81 -12.52 TD[(un)28(tested)-342(prop)-28(erties)]TJ/F16 8.97 Tf 80.33 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 122.09 0 TD[(9)]TJ -202.42 -12.53 TD[(utilities,)-342(loading)-343(from)-342(init)-343(\014le)]TJ/F16 8.97 Tf 120.39 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 77.42 0 TD[(23)]TJ/F14 8.97 Tf -197.81 -12.52 TD[(utils.exp)]TJ/F16 8.97 Tf 45.23 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 152.58 0 TD[(28)]TJ/F2 14.35 Tf -197.81 -35.33 TD[(V)]TJ/F15 8.97 Tf 0 -17.16 TD[(v)57(ariables)-342(for)-343(all)-342(tests)]TJ/F16 8.97 Tf 85.48 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 112.33 0 TD[(42)]TJ -197.81 -12.52 TD[(v)57(ariables)-342(for)-343(option)-342(defaults)]TJ/F16 8.97 Tf 115.18 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 82.63 0 TD[(17)]TJ -197.81 -12.52 TD[(v)57(ariables)-342(of)-343(DejaGn)28(u,)-342(defaults)]TJ/F16 8.97 Tf 124.1 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 73.71 0 TD[(15)]TJ/F14 8.97 Tf -197.81 -12.53 TD[(verbose)]TJ/F16 8.97 Tf 33.98 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 163.83 0 TD[(17)]TJ/F14 8.97 Tf -197.81 -12.52 TD[(verbose)]TJ/F15 8.97 Tf 36.02 0 TD[([)]TJ/F14 8.97 Tf 2.56 0 TD[(-log)]TJ/F15 8.97 Tf 18.83 0 TD[(])-342([)]TJ/F14 8.97 Tf 8.19 0 TD[(-n)]TJ/F15 8.97 Tf 9.42 0 TD[(])-342([)]TJ/F14 8.97 Tf 8.19 0 TD[(--)]TJ/F15 8.97 Tf 9.42 0 TD[(])]TJ/F14 8.97 Tf 5.63 0 TD[(")]TJ/F17 8.97 Tf 4.7 0 TD[(string)]TJ/F14 8.97 Tf 23.89 0 TD[(")]TJ/F17 8.97 Tf 7.78 0 TD[(n)28(um)29(b)-28(er)]TJ/F16 8.97 Tf 33.31 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 29.87 0 TD[(26)]TJ/F14 8.97 Tf -197.81 -12.53 TD[(verbose)]TJ/F15 8.97 Tf 36.02 0 TD[(builtin)-342(function)]TJ/F16 8.97 Tf 63.54 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 98.25 0 TD[(26)]TJ -197.81 -12.52 TD[(v)28(ersion)-342(n)28(um)29(b)-28(ers)]TJ/F16 8.97 Tf 67.65 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 130.16 0 TD[(13)]TJ -197.81 -12.53 TD[(v)28(ersion)-342(pro)-28(cedure,)-343(tested)-342(to)-29(ols)]TJ/F16 8.97 Tf 124.82 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 72.99 0 TD[(32)]TJ -197.81 -12.52 TD[(VxW)85(orks,)-341(link)-343(with)-343(`)]TJ/F14 8.97 Tf 84.54 0 TD[(-r)]TJ/F15 8.97 Tf 9.42 0 TD[(')]TJ/F16 8.97 Tf 4.49 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 99.36 0 TD[(33)]TJ ET 0 g 0 G +endstream +endobj +285 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F15 261 0 R +/F16 264 0 R +/F14 258 0 R +/F17 267 0 R +>> +endobj +283 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 285 0 R +>> +endobj +288 0 obj +<< +/Length 5533 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(56)-25998(DejaGn)27(u)-333(T)83(esting)-333(F)83(ramew)27(ork)]TJ/F2 14.35 Tf 0 -31.59 TD[(W)]TJ/F14 8.97 Tf 0 -16.19 TD[(WARNING)]TJ/F16 8.97 Tf 35.4 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 152.17 0 TD[(9,)-342(23)]TJ/F14 8.97 Tf -187.57 -12.08 TD[(warning)-342(")]TJ/F17 8.97 Tf 40.73 0 TD[(string)-428(n)27(um)29(b)-28(er)]TJ/F14 8.97 Tf 58.08 0 TD[(")]TJ/F16 8.97 Tf 7.5 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 91.5 0 TD[(23)]TJ -197.81 -12.08 TD[(W)85(atc)29(h)-342(when)-342(a)-343(v)56(ariable)-342(is)-342(read)]TJ/F16 8.97 Tf 124.24 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 73.57 0 TD[(30)]TJ -197.81 -12.08 TD[(W)85(atc)29(h)-342(when)-342(a)-343(v)56(ariable)-342(is)-342(unset)]TJ/F16 8.97 Tf 128.49 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 69.32 0 TD[(30)]TJ -197.81 -12.09 TD[(W)85(atc)29(h)-342(when)-342(a)-343(v)56(ariable)-342(is)-342(written)]TJ/F16 8.97 Tf 136.67 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 61.14 0 TD[(30)]TJ/F14 8.97 Tf -197.81 -12.08 TD[(watchdel)]TJ/F16 8.97 Tf 40.73 0 TD[(watch)-392(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 157.08 0 TD[(31)]TJ/F14 8.97 Tf -197.81 -12.08 TD[(watchread)]TJ/F16 8.97 Tf 45.44 0 TD[(var)-215(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 152.37 0 TD[(30)]TJ/F14 8.97 Tf -197.81 -12.09 TD[(watchunset)]TJ/F16 8.97 Tf 50.14 0 TD[(var)-196(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 147.67 0 TD[(30)]TJ/F14 8.97 Tf -197.81 -12.08 TD[(watchwrite)]TJ/F16 8.97 Tf 50.14 0 TD[(var)-196(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 147.67 0 TD[(30)]TJ 27.16 119.74 TD[(What)-342(is)-343(New)]TJ/F16 8.97 Tf 54.92 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 147.5 0 TD[(3)]TJ/F14 8.97 Tf -202.42 -11.97 TD[(which)]TJ/F17 8.97 Tf 26.61 0 TD[(binary)]TJ/F16 8.97 Tf 28.42 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 142.78 0 TD[(28)]TJ -197.81 -11.97 TD[(writing)-342(a)-343(test)-342(case)]TJ/F16 8.97 Tf 76.22 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 121.59 0 TD[(39)]TJ/F2 14.35 Tf -197.81 -32 TD[(X)]TJ/F14 8.97 Tf 0 -15.93 TD[(XFAIL)]TJ/F16 8.97 Tf 26.46 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)]TJ/F15 8.97 Tf 165.72 0 TD[(6,)-342(9)]TJ -192.18 -11.97 TD[(XF)114(AIL,)-342(a)28(v)28(oiding)-341(for)-343(POSIX)]TJ/F16 8.97 Tf 115.55 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 86.87 0 TD[(6)]TJ/F14 8.97 Tf -202.42 -11.96 TD[(XFAIL)]TJ/F15 8.97 Tf 23.54 0 TD[(,)-342(pro)-29(ducing)]TJ/F16 8.97 Tf 48.27 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 126 0 TD[(25)]TJ/F14 8.97 Tf -197.81 -11.97 TD[(XPASS)]TJ/F16 8.97 Tf 25.04 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)]TJ/F15 8.97 Tf 177.38 0 TD[(9)]TJ/F14 8.97 Tf -202.42 -11.97 TD[(XPASS)]TJ/F15 8.97 Tf 23.54 0 TD[(,)-342(pro)-29(ducing)]TJ/F16 8.97 Tf 48.27 0 TD[(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)-171(.)-171(.)-172(.)]TJ/F15 8.97 Tf 126 0 TD[(25)]TJ ET 0 g 0 G +endstream +endobj +289 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F14 258 0 R +/F16 264 0 R +/F15 261 0 R +/F17 267 0 R +>> +endobj +287 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 289 0 R +>> +endobj +293 0 obj +<< +/Type /FontDescriptor +/CapHeight 686.11 +/Ascent 694.44 +/Descent -194.44 +/Flags 68 +/FontBBox [-216 -250 1303 953] +/FontName /CMBXTI10 +/ItalicAngle -14 +/XHeight 444 +/StemV 80 +/FontFile 292 0 R +>> +endobj +294 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F18 +/FontDescriptor 293 0 R +/BaseFont /LWIKPI+CMBXTI10 +/FirstChar 0 +/LastChar 127 +/Widths [697.77 944.44 885.55 806.66 767.77 896.1 826.66 885.55 826.66 885.55 826.66 +755.55 674.44 703.89 1044.72 1059.44 355.55 385 591.11 591.11 591.11 591.11 591.11 +948.88 532.22 665 826.66 826.66 591.11 1022.77 1140.54 885.55 296.66 386.11 620.55 +944.44 868.53 944.44 885.55 355.55 473.33 473.33 591.11 885.55 355.55 414.44 355.55 +591.11 591.11 591.11 591.11 591.11 591.11 591.11 591.11 591.11 591.11 591.11 355.55 +355.55 386.11 885.55 591.11 591.11 885.55 865.55 816.66 826.66 875.55 756.66 727.22 +895.27 896.1 471.66 610.55 894.99 697.77 1072.77 896.1 854.99 787.21 854.99 859.44 +649.99 796.1 880.83 865.55 1159.99 865.55 865.55 708.88 356.11 620.55 356.11 591.11 +355.55 355.55 591.11 532.22 532.22 591.11 532.22 400 532.22 591.11 355.55 355.55 +532.22 296.66 944.44 649.99 591.11 591.11 532.22 501.67 486.94 385 620.55 532.22 +767.77 560.55 561.66 490.55 591.11 1182.21 591.11 591.11 591.11] +>> +endobj +295 0 obj +<< +/Length 12061 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 446.97 13.95 TD[(i)]TJ/F2 17.22 Tf -428.97 -25.91 TD[(T)93(able)-374(of)-375(Con)31(ten)31(ts)]TJ/F2 14.35 Tf 0 -41.04 TD[(1)-1124(What)-375(is)-375(DejaGn)30(u?)]TJ/F18 14.35 Tf 158.76 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F2 14.35 Tf 193.17 0 TD[(1)]TJ -351.93 -32.38 TD[(2)-1124(What)-375(is)-375(new)-375(in)-375(this)-375(release)-375(?)]TJ/F18 14.35 Tf 233.09 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)]TJ/F2 14.35 Tf 118.84 0 TD[(3)]TJ/F1 10.91 Tf -316.06 -16.44 TD[(2.1)-1000(Running)-333(existing)-333(tests)]TJ/F8 10.91 Tf 133.84 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F1 10.91 Tf 184.84 0 TD[(3)]TJ -318.68 -13.15 TD[(2.2)-1000(What)-333(do)-28(es)-333(a)-333(DejaGn)26(u)-332(test)-333(lo)-28(ok)-333(lik)26(e?)]TJ/F8 10.91 Tf 204.99 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)]TJ/F1 10.91 Tf 113.69 0 TD[(5)]TJ -318.68 -13.15 TD[(2.3)-1000(Design)-333(goals)]TJ/F8 10.91 Tf 86.93 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F1 10.91 Tf 231.75 0 TD[(5)]TJ -318.68 -13.15 TD[(2.4)-1000(A)-333(POSIX)-333(conforming)-334(test)-333(framew)27(ork)]TJ/F8 10.91 Tf 205.42 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)]TJ/F1 10.91 Tf 113.26 0 TD[(6)]TJ -318.68 -13.15 TD[(2.5)-1000(F)83(uture)-333(directions)]TJ/F8 10.91 Tf 108.32 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 210.36 0 TD[(8)]TJ -318.68 -13.15 TD[(2.6)-1000(Tcl)-333(and)-333(Exp)-28(ect)]TJ/F8 10.91 Tf 102.04 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F1 10.91 Tf 216.64 0 TD[(8)]TJ/F2 14.35 Tf -354.55 -29.09 TD[(3)-1124(Using)]TJ/F10 14.35 Tf 69.88 0 TD[(runtest)]TJ/F18 14.35 Tf 52.99 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)]TJ/F2 14.35 Tf 229.06 0 TD[(9)]TJ -351.93 -32.38 TD[(4)-1124(Setting)]TJ/F10 14.35 Tf 79.99 0 TD[(runtest)]TJ/F2 14.35 Tf 57.06 0 TD[(defaults)]TJ/F18 14.35 Tf 58.34 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F2 14.35 Tf 148.47 0 TD[(15)]TJ/F1 10.91 Tf -272.13 -16.44 TD[(4.0.1)-1000(Con\014g)-333(V)82(ariables)]TJ/F8 10.91 Tf 113.54 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 163.82 0 TD[(15)]TJ -277.36 -13.15 TD[(4.0.2)-1000(Master)-333(Con\014g)-333(File)]TJ/F8 10.91 Tf 124.23 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F1 10.91 Tf 153.13 0 TD[(18)]TJ -277.36 -13.15 TD[(4.0.3)-1000(Lo)-27(cal)-334(Con\014g)-333(File)]TJ/F8 10.91 Tf 118.05 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)]TJ/F1 10.91 Tf 159.31 0 TD[(19)]TJ -277.36 -13.15 TD[(4.0.4)-1000(P)27(ersonal)-332(Con\014g)-333(File)]TJ/F8 10.91 Tf 133.11 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)]TJ/F1 10.91 Tf 144.25 0 TD[(20)]TJ/F2 14.35 Tf -349.09 -29.09 TD[(5)-1124(The)-375(DejaGn)30(u)-374(Implemen)30(tation)]TJ/F18 14.35 Tf 240.1 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F2 14.35 Tf 103.76 0 TD[(21)]TJ/F1 10.91 Tf -307.99 -16.44 TD[(5.1)-1000(Con)27(v)28(en)28(tions)-332(for)-334(using)-333(to)-28(ol)-333(names)]TJ/F8 10.91 Tf 185.66 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)]TJ/F1 10.91 Tf 127.56 0 TD[(21)]TJ -313.22 -13.15 TD[(5.2)-1000(Initialization)-333(mo)-28(dule)]TJ/F8 10.91 Tf 127.46 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F1 10.91 Tf 185.76 0 TD[(22)]TJ -313.22 -13.15 TD[(5.3)-1000(DejaGn)27(u)-332(pro)-28(cedures)]TJ/F8 10.91 Tf 123.84 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)]TJ/F1 10.91 Tf 189.38 0 TD[(23)]TJ -277.36 -13.15 TD[(5.3.1)-1000(Core)-333(In)27(ternal)-332(Pro)-28(cedures)]TJ/F8 10.91 Tf 155.07 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F1 10.91 Tf 122.29 0 TD[(23)]TJ -277.36 -13.15 TD[(5.3.2)-1000(Remote)-333(Comm)27(unication)-332(Pro)-28(cedures)]TJ/F8 10.91 Tf 206.85 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 70.51 0 TD[(26)]TJ -277.36 -13.15 TD[(5.3.3)-1000(Utilit)27(y)-332(Pro)-28(cedures)]TJ/F8 10.91 Tf 123.34 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F1 10.91 Tf 154.02 0 TD[(28)]TJ -277.36 -13.15 TD[(5.3.4)-1000(Cross)-333(target)-333(pro)-28(cedure)]TJ/F8 10.91 Tf 144.41 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 132.95 0 TD[(29)]TJ -277.36 -13.16 TD[(5.3.5)-1000(Debugging)-333(Pro)-28(cedures)]TJ/F8 10.91 Tf 143.44 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 133.92 0 TD[(30)]TJ -313.22 -13.15 TD[(5.4)-1000(T)83(arget)-333(dep)-27(enden)26(t)-332(pro)-28(cedures)]TJ/F8 10.91 Tf 165.3 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 147.92 0 TD[(31)]TJ -313.22 -13.15 TD[(5.5)-1000(Remote)-333(targets)-333(supp)-28(orted)]TJ/F8 10.91 Tf 150.22 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 163 0 TD[(32)]TJ -313.22 -13.15 TD[(5.6)-1000(The)-333(\014les)-333(DejaGn)27(u)-333(reads)]TJ/F8 10.91 Tf 143.12 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F1 10.91 Tf 170.1 0 TD[(34)]TJ -313.22 -13.15 TD[(5.7)-1000(The)-333(\014les)-333(DejaGn)27(u)-333(writes)]TJ/F8 10.91 Tf 144.94 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F1 10.91 Tf 168.28 0 TD[(35)]TJ -277.36 -13.15 TD[(5.7.1)-1000(Summary)-333(log)]TJ/F8 10.91 Tf 98.34 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 179.02 0 TD[(35)]TJ -277.36 -13.15 TD[(5.7.2)-1000(Detailed)-333(log)]TJ/F8 10.91 Tf 92.79 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F1 10.91 Tf 184.57 0 TD[(36)]TJ -277.36 -13.15 TD[(5.7.3)-1000(Logging)]TJ/F4 10.91 Tf 74.7 0 TD[(expect)]TJ/F1 10.91 Tf 38 0 TD[(in)27(ternal)-332(actions)]TJ/F8 10.91 Tf 76.98 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 87.68 0 TD[(36)]TJ/F2 14.35 Tf -349.09 -29.09 TD[(6)-1124(Ho)30(w)-374(T)93(o)-374(W)92(rite)-374(a)-375(T)93(est)-374(Case)]TJ/F18 14.35 Tf 216.48 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F2 14.35 Tf 127.38 0 TD[(39)]TJ/F1 10.91 Tf -307.99 -16.44 TD[(6.1)-1000(W)83(riting)-333(a)-333(test)-333(case)]TJ/F8 10.91 Tf 117.52 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 195.7 0 TD[(39)]TJ -313.22 -13.15 TD[(6.2)-1000(Debugging)-333(a)-333(test)-334(case)]TJ/F8 10.91 Tf 132.45 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 180.77 0 TD[(40)]TJ -313.22 -13.15 TD[(6.3)-1000(Adding)-333(a)-333(test)-334(case)-333(to)-333(a)-334(test)-333(suite)]TJ/F8 10.91 Tf 185.22 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)]TJ/F1 10.91 Tf 128 0 TD[(40)]TJ -313.22 -13.15 TD[(6.4)-1000(Hin)27(ts)-332(on)-333(writing)-334(a)-333(test)-333(case)]TJ/F8 10.91 Tf 159.12 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F1 10.91 Tf 154.1 0 TD[(41)]TJ -313.22 -13.15 TD[(6.5)-1000(Sp)-27(ecial)-334(v)55(ariables)-332(used)-334(b)27(y)-332(test)-334(cases)]TJ/F8 10.91 Tf 195.13 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 118.09 0 TD[(42)]TJ ET 0 g 0 G +endstream +endobj +296 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F18 294 0 R +/F8 52 0 R +/F10 78 0 R +/F4 28 0 R +>> +endobj +291 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 296 0 R +>> +endobj +299 0 obj +<< +/Length 2800 +>> +stream +0 w 0 g 0 G BT/F1 10.91 Tf 18 13.95 TD[(ii)-26443(DejaGn)27(u)-332(T)82(esting)-332(F)82(ramew)28(ork)]TJ/F2 14.35 Tf 0 -23.91 TD[(7)-1124(New)-375(T)92(o)-30(ols,)-375(T)93(argets,)-374(or)-375(Hosts)]TJ/F18 14.35 Tf 233.2 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F2 14.35 Tf 110.66 0 TD[(43)]TJ/F1 10.91 Tf -307.99 -16.44 TD[(7.1)-1000(W)83(riting)-333(tests)-333(for)-333(a)-334(new)-333(to)-28(ol)]TJ/F8 10.91 Tf 159.4 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)]TJ/F1 10.91 Tf 153.82 0 TD[(43)]TJ -313.22 -13.15 TD[(7.2)-1000(Adding)-333(a)-333(target)]TJ/F8 10.91 Tf 102.9 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 210.32 0 TD[(48)]TJ -313.22 -13.15 TD[(7.3)-1000(P)27(orting)-332(to)-333(a)-334(new)-333(host)]TJ/F8 10.91 Tf 132.43 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 180.79 0 TD[(48)]TJ/F2 14.35 Tf -349.09 -29.09 TD[(App)-31(endix)-375(A)-1125(Installing)-375(DejaGn)31(u)]TJ/F18 14.35 Tf 240.03 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F2 14.35 Tf 103.83 0 TD[(49)]TJ/F1 10.91 Tf -307.99 -16.44 TD[(A.1)-1000(Con\014guring)-333(the)-333(DejaGn)27(u)-333(test)-333(driv)27(er)]TJ/F8 10.91 Tf 201.97 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)]TJ/F1 10.91 Tf 111.25 0 TD[(49)]TJ -313.22 -13.15 TD[(A.2)-1000(Installing)-333(DejaGn)27(u)]TJ/F8 10.91 Tf 119.26 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)]TJ/F1 10.91 Tf 193.96 0 TD[(49)]TJ/F2 14.35 Tf -349.09 -29.09 TD[(Index)]TJ/F18 14.35 Tf 44.26 0 TD[(.)-166(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)-166(.)-167(.)-167(.)]TJ/F2 14.35 Tf 299.6 0 TD[(51)]TJ ET 0 g 0 G +endstream +endobj +300 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F18 294 0 R +/F8 52 0 R +>> +endobj +298 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 300 0 R +>> +endobj +7 0 obj +<< +/Length1 2090 +/Length2 15387 +/Length3 533 +/Length 18010 +>> +stream +%!PS-AdobeFont-1.1: CMR10 1.00B +%%CreationDate: 1992 Feb 19 19:54:52 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /PNKVMB+CMR10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 12 /fi put +dup 13 /fl put +dup 14 /ffi put +dup 33 /exclam put +dup 34 /quotedblright put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 58 /colon put +dup 59 /semicolon put +dup 63 /question put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 91 /bracketleft put +dup 92 /quotedblleft put +dup 93 /bracketright put +dup 96 /quoteleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /endash put +dup 124 /emdash put +readonly def +/FontBBox{-251 -250 1009 969}readonly def +/UniqueID 5000793 def +currentdict end +currentfile eexec +€SQM(ì(Ú0_«&(‚Óü§ˆ‚¥±)þ–¾c(C¹¶¼‘¶X˜]µkÊ`îiÊ’Ï\‚ìæ.ÚÓáØ54ˆ"@ f¯e*ånЋW›s«¨ÏÊlqð<*HÅùÖ"f¯Jcuÿ` ›¬?Î4-hg§•Å3k²ós6g.DcŠ—~.©dN1ê­)ê3Å@àÈnmè«jM@§{¢uó•‰þ¢âÛ‚V­ÁÖùÌ€7¤~ÔiÅùŠ^<½JÎ@Ó@‹ÿ}Ø«°¬Wµµ¢Â +Q•{–ÄSí·Úå¯ý‘¤m“à¡3c„MíC#ñîm0*ê°$¥R1US\…Ü&ºÓ Åe€)vÒ˜Äé DÃbæ¿:³b¤Tî“Þ%ÎTAžuÈ âj„@KÙÞ:î?’ŇùW+ƒT¥Ã^ê~‹+¤ã3€!2÷`´ iŽ³Òs‹ê +¯z®–¥Xð‹a®ÇÇÖ[(‰»{™€ ÿî[¡šÉÎC{áÝüð¼¥g T;–D§‡&ÐÁZ½¹on ÷ʪ1•|¨, øq|‘¶:vé²S)Î&%·Ë{ù#ì+µìŠï¸Á£´"­a{=¤Ô–…ýDÌ!¡þ^A:³áYFÖ<~˜€wFGCwΓøóW +ûÕÛþwW†‘z¹ic˜~nü-?™úVì®d"W˜RVÌäïmoqÑ…‚p Twâ!Š7\¨Åȳ¯Ï¹gŽ»/ÀÃÄý14Å£ßkoLuì˜TfÄõ„uÉ]ƒ¦¿uH7Úùèhë ×nÄÓ‹Ù5¬ÊsáË›A’» +…?”r(ÃN’:‘3îÉÅ,bn)hÕO¤3¹p&6ûØ|]Äòx‡ƒP_BVÇz…\—¤ÞnáÔ||3é­"~×ñ 071¾¦ó]v@FîÓjÇXU©(LWsŠ¹…Þ§Ív|x +‘ç@æàˆË“Ô:H‘E!Þ-¾•Nô¹V;S)õü¾é'ª#0šÒ.ù4›l­ç Ñ›”`@\Þ¸›ña{,)zõb”X#_Œ•õ¼D-ë³M¥Ò éf`Ξ\Ñš„ªTô+oÈ||°Ë¼$™PÓ§ÃSÖ‘×{ 1È@Èô:" ütœãL'‘Ýb| tu9cÒå—”ImU®ÉoýHêý²ŸŠ¼‘“-Õ°eëÚKï'¸LC³ŸâG¸á•8d$m2SW¢F6[›+ÜhÍ×äM™Øld%e±ü7m.SH²z|D¶M:Éœ»õfZçoâxŒsEKÇ”±C.l:X»¸Ëï4]1xÈÐk&¿HZ\;ÓmÐ9°4å6«Üf2ë@8üÊàE>…³¾ØÃÔb +*¢Ú½ Ù0é¸édđîä[Y.N± 2ÈU+’O•_‘ì^g?öŒ*Iá÷‚~FÚ@H]r*­_'Ô›PŸ¸æ+¡Lª$±½/m¨ßŽRMÛBF¶ò’ÄlèÊí¯sauÄ—%T‹ï`ª‡Ç¸ýçÑùaʽ'ÌM;†ªEÛDQϸͿZ4v»Q“cHž²ß¥›0¬8(H™•×¹ìW€öK -õ7ñ¡©Pý¡RW*7ƒsSÂhWêÖAÈ @×®È[`E’›^B ÿF©KÓ}Ëlà)L˜“Æ¢d»Ï+çÙR4)ë1®¬'u¶‡ +xÿÞþH]#¿þ¥X‚Àoý©ê„â"™Ò°ÄÔL¶}Ð/¼½"¹ìàà(Ž8yÖ¯8bïèÈo5VöªX,c’¤ˆØ4Üo,½DWz`ë?R.Îõé*'Zº_ ð À‚Âè_¬c°ÿì§Nb˜À| f³öâ +s‹Ï›Výû‡(l‘´ÇA#÷…9 ’C—=S:'˜¾ ÖÔŠVŽrX¢Û'Éhg ÓÚ\vÛÀBšÝuž*´9 Íµž¾¥,º.“¢éìÒ-}Fàu/¾­äùŸÔg—DR´ë/³‰ÛUÕ׸²ÀýHO\c²Ï‰¢wnÎ8x…X³3T7ÞhÊvèEzðÐ…Ü?:¥KŽSv#eÞ£)Åv´lQ¶lo‹ñZ#‹¼UHý·ò]<ø÷_ˆèzÕ "*w嬃Mžd.Ñ)pd!Q鳂eD…‚Óa'/\¤jì}ñˆ›%ܵ€MOvâ2F}âã9´˜®¦klšùCþv$@!Ü´Z3_Ñ.ñv—r2ÕCT_ÿ3¥ÛZ¿ N¾Ñf¥Õ! j7Ý£2¹Ùñ>—ÿ(ƒª@ð[£N‹²>1õ¹V3©½×8>7=û¡¶-– pµùŒá|´h=-×þ†© +ô÷=Y©I ÚR}é1f5NM¶MÏJJrÊ H:3Ù YC$IJ£© >9¶F¦6ãr¿Ó}²ä½à‡ïåÒ‚tY²âŽõoÝ&Ý¿­®ÅõRôÜ ò‡˜ç'0_ŠŠ¾/¶ ‘–"ó–0 E£Çˆ¨šÀ“sü¥e¢óZzŸ§§›%kËÅý’–¾wr‚fOÒ ˜€ÕÑÛ‚ŽE¦û&%ÞˆZŽB80ÂÖ™¸bùôŒä/a¦“lì)P“Î@‘î6 +¾’f¶tâ1 +‰Ñíq*F'$1}Þý«çµ<5›®ù¨kö)æ’{*8³„uSmÞ§Ù¼k£NevU„6NR‘Okx“ÅBvm{#5^*¸î@}: ‚•ÎÞÔBü9÷HfONß 9 Œ‰^äA wp‡ì•vÄ¥Ú¥;3Iq¸#odÍià_â5:*ü0î$ù­€†¬×¢¹ R;á7…óˆx:©‘*È9h©(£¡~B +uœ.æpÕŸÔ¢Ø8¤^éZ×¹ ¼ˆÔ#¾58î„ôb%)5h ’þ‘ê Ö^òê–<#øæoíb ð«("Ø è)Fëۂq'ÿƒpòF'²ò9|.S©Ý×0O-=énr«¤p\©L¨ñ´â5I¿ B,"xƒ¡?DÓC8…ùÊ ¨D̆ ‘¾1Ü<*¬v„˳úP¾³öÑð úŽ±!Ʋ`íh…A„“®˜A“³w€ŒàE/ñìÝ-ɺHT8p(¨Üpù•÷gœ²pöþ_iòrºýT@¾F8nª¦ÿÞ=ñ3#ÁႺúÛg A‚=FWyÿ›õƯÊg¿oc¨mDì”Ç‹ÎŽ–ˆ«çÊÕ®,•¶–Â1¢§yŠ\ÆOÁJ*m KÛ¨·VoB¡î2š;‘' =hˆ™Áx& â¼äâ&w…Ÿ.é?²qá]*FœöyîÚ€bF'¢å\›~™ˆDU›ëí^Ðßg}ÏóØ ^Lµlú„ÉÒM´GUÍKz«<iIÞžŠ¾ÿ²,€*—EPT¼ì÷·ÜEs‚Nκ‹{œóè‹÷° Ò(«˜T¾`ðÏs`–/ ¤˜ˆ;çâbŸ)È^;~ÓKÔ3鬃2§~9….Ö:Q†Y´{ô1µ!²P$«åµÃ*«T‹Ñ/¹”t» * b¥/ÑÁ½žÀ¿yn ø:äZM^ÂOÆJJªü¾}„J^zÄþ¤Â›} !¬Õð\ŠäD ØÙ®,(¤¨w~”ãù(H¼ñËÞÔØ÷t„å ›ïeÔqv k°—¹¾5ÝÝ£ç™M¡·,oä¥Ê ŸÖ¤/&’j‚¶‡š·†Ðoxñì­MÑY9Õ?Õ ÊƒNö¨P÷‹®z<6`M÷‡Vž]‰×¾E-íN‡HWëqD$qx©?÷ÉmØU³Ÿ©†·ï¼PÓœµ×KI&¬ÙÃ5äꊅvCÌæáOoõá°mv_e¸Š`Å ôú@+æ3§ÿ gH´á¬Ä~‹t`ÁNÕh×g¾ßÿ ÿUÆú& Ý,ú:7‘I—ðEýFê`{âügþ($Fg2H¥Ð/‹zTÿel§qF,`yÁ 4§¹w™õO§½è™ÄXUZö×\ú ‡{BU$0û¶Š,Ž/õ…)~ŒHW°CH&‚b¯q[Q˜^}—Ósu(·/©ô”&)«›‚öÉ–ˆ‰9ÿÏp(ŽU*¤­ðý¹{.FíUb€NµÛL¼¢’áÕÿBOgý‹$c‹n5Þ²aFâuÚ|¾-X½°ØþÂB9FŒ”¸`'žT€sÁ TŠš^ê>ïôOàLd&´7œÙE<ú\lŒ +fPäÈ +îÑv^Ë朲*4µ´åôbÿŸª6ù©Rpï“f€Ý´g°>Æ毽`YÝa‘òE¿¸ Í'DGÿF7HÂlí*DLIŽ(šŒ½¨ÄGÍ|¬©±A$t5þkñäE¼zà›ÆFŸÀ?–)Ëü©òÕÌ.”ÒŠ±Z„Ï!ê©-¾â‹ã½æy®¥Fæ;ÊË•¿ár\.$å„Ç?d*x®™ÓçùÆ?®U‰EqO´IJ*ÑTE=¡€‘ÁÊI| Î•WKup.ƒ'&ë †ò$ƒÖ¢ç„ÃÄܼT-Š÷Žf>z¿\Ë<ZhC´®é+] @Œ;"%–Å<Û¶€ÍÜ/¹dÊ|%­(„ &Ègai•A®jFÂ& ^ø&£à–Zô—5E&™*èz¶¸‹Ø°{íœzè2V€gí,ŸrÃÔ@ó(ü¸Ü62m¶ŸñíºuÃ<Òƒm.a}‡nΚN°ºM‘ÁIF:­ê;7‚ÚF¸,ìÕuï•£R˜±PŒ8jÛ +bV®/U–B¤e À©Á0`Í­Ë¿i6˜|§òBd!‰ ‡YèòòUƼk{uO[¿ÝtT¿‡}ƃ"[óÆ¥²`õºvâôØ݅߇GÔ-,÷§Ñ·¬y+3jR…ØètAŸ8R\éìRûºÈËŸ&4B‘ƒå\A='EÑöö5îÊÜ]æb䜀³8¡(¸¬SJ/RÀ?°Þhá˜~µbŠ æ +¹ïò*HÝàé>Æ)Å8ª°‚ÿ±'‹Í ¼0¾W±×Çé[ß‚µ¼bœç£zóX+¡ÉWòÒ pŠ'„A¬Ä¶2´2l¿_ý“»ë6ãÒ!Íkɯ‰–œ”óJÇ/3åduò¦WÆo«T.\^ð§²ßÌoëe  ÄÒ+¯ÅÀ}š,Ä †ˆ!0d@¼•Þ,Äæe:L¡CÀÃ{M4Ë›²uUZ÷·‘…‹ö.0B`•ŠÊs##ål©1U½ãðKåu†]2 6¶ò¶'²{tn&fó4}½K‘TÜOýØYyµ>8ùüÃÄ”`FL"ò°žtI"ÉmôRÈ‘vˆÍAà¢Tð×àDc"mÜ–Q§ãÇiÙc\ÕÐ;ª[Oª(´Bâ G¿ÓmXGæÝ£Š-T˜Q=]"Z群6Ó´¦Q×6—ž Ü”Q›‘o{£oùûVTfJÁUïý2?&2|d[m[f—Ô^ê¹3p½é_¶b»©°°ò@d§˜´ûßÒ›~»+ìÔôo÷´Ô9ºÇw¡­âü únÝAÇs/³Ë +ß.d“aºƒ²B"=¯-Ým†0ºœ’ÝŸ<ȼ„Èè¤%oç_$n/`&³[é ›¬´^ç4H?ñ‘à ºU˜öáÍì«Åû3¾»¼É MÊ«ø7Ä0 4â&Üâ<  9BIAÍO°ß„{ô¯Î£.œ¯û ˆoy_ +Ãçúc/$=ÜŠ΋½ +/Ù®•Z‚uHÔ7HAY§ 0¶?ãˆd8Í'—„ÂHì÷(b²©\ ¤ÌÏè;œn¹¨Ys<Åøƒ]° TìkFñ.AÎÑ¡t £e¿¦3³ÑqQêÝôǃ éZ9øcwVêjå¤|×^àÃcìpWÄñÖ`Z’._”]^n£ºû%â|üÎ ÜrŽ¨T枌‹ˆ~4àüB§?QµS¼» ¦ÁQ{°k„Pþ¸´ñøý0íÆÆŒ?ÀEG€Fΰã´{ô½¨ ç H‘˜Ã CE1IâB9ŸXC­Õ‚bJ:«X†(ða”|<µ]&¸;ãE¨ÜEš+ë< ûu ÆŽG½ä¢“ëç¡öz–”Ú@ÌÿZÕþÚ ãµÖŠÝФ»áÄz™lû1•$8Ú~E"pAêm8w8?Öø«p +’ ²˜Õ©Z¦…4 4T‹‘šNQøaùÑæVˆÇ™8ÿg|úmÿm“I 1|Ö^˜÷ªBH«#+ááìýÑ^ +‡Ü>°â&7 +&j¿¦GOþ7:Ùœ„Y DÀgÄ6ÐÏ:PàŸ§ÈÙTk·ºvsG_О ø`­ˆº5´Æ“póŽ¤Fž­“ù¬>Æ{™O½ªù0¸»  )‰%Sœž–‰š•ôtoæ&’$€Ua–:y0¬ì³‹åIHÖÐíaRmç’éÚ`AÓ‡ãÞ6d®å8€¶’ÞXÙ%îåߊªG3e\D:Åômôž-å†)c˜»ˆó‰©Û½l4{K”  à²4SÏéc’=ÈëCßDŽ¿KÖæoÙð|ßÜSœ\ò‹æªáÚ§¾‘Íò%u6nL„½ñ&a÷ƒwçK?GÍèì½Ù)Å ~3óK:ºbÝV`­í,o”šc(ú 'e¾èyµ‘M/ÅñF²XÛF^ê°…I,x ¢„Ví%ù9/ùÅ+¸‚ÓxÐÑúoãµ纯Hw`î „r¢¦y9ÆMÞ£øäWÇN+Ò!êj-sMŠÄ›²U9ìk°1Úס4+_ƒ1ÅÜv/$*§Ë˜ŽÙ†Äž“¸7HV„kðršZxS=ƒÐH~ƒOhÂ÷‰×+kÄtÛ–j +fä.&†÷þÇ{à[Ò#~]ŸU¦ÔžÃY1Pån:k*À TéºûŸïózAØêÞwv®óÍnÔÉ )‹»Y h.÷®lOÇÆaÌÊ`Ôåª>ÃÙÉV0zÒöD¦›Ôñáñ¦öS~çEµm±±ÐgÆOóvË°ïi†;ÿ1ÏJN”ø’¬!·HӌֵªX,f¾ûð „”LíÞØqîÊ=ÊèG3¡ö¼¡ê¶`nÏCÛN=Ê=C~ûÛMÌRö¡Éÿp¬ƒæV™Žç5¬ /{BéŠ|"s?÷G€¦Á«¸d•jlúo?¿ŸÝÈ +UëÇ^»ÕsØeßÛÿ‘|Ü“©Üãf%d5m4Líéµ`¿ÎVÑ°$o·§jD¿s\S±h“‹ˆðJg^%ÿ¯ òÜ©FŸêËúý#’§>‘õ¦ÖY&¹-B%vä­ác剠ÁžWÉ߃ӥ²ðÖŹòXôzÁ­>™)µÕ€ý§æe ÷àuóüUN4zØ}ìÍ×]šPÉø‘G®=i¡P'Imˆ³·PHÌ85€ñ×ës^…yS(bŽÖóIõÁZƒ5K¯#!µ0MÖZŇ"¶Âá¾n4ugAu¶ÄÝ"8ŸH‘™ƒ„3/„d•Ï°XÖjŠo·TÞ0ؽ?½û·êÖ:V’ܼ±îÒ0»ÒÐ~ÞÅ +—×xУîÞéT´g+w†§BœÍ!Iw ª<æë£h;ÁÆpgMç yáÈRôˆm;%K¤CZû¾ Üô)©ÿ. /žÐf[ãšXEcFF©“¤¡ƒÏsr-£\)&!žy¬ŒæÍÑ“µòg=Hè+(™Ø]ßçGþ¢ðG“†ò P¸PIè:Ÿ$>[’§¥$ÏȪæ5àp VeeË([nž††pË{]«>¦IÏù ˆEw\TˆçM”O® ƒ ™ÓtØ ¯»ë;~\ï­Èà4öŠ‹þ ^€ÞÆÄøŠ™.?´¶;]áw8l_™ûzýÝ\iì¸úòP©Ñx‘Oð^ÂöÔÍ1/ýš3Þ¹À6ÓÍäU(ÿþ™û2ÒÉÆ+ M²Iæ2Ó¿€ÂŽ¹YU…H àšY©É¥žÏX`DZáåæeèD\ŸdAÔíÞ®ÖxÎã៨Kþ›Á[¼üç‡T¶d/¿ô 6¬0Ô—««ÅŒt­éùŽÄ9«[sƒSY¿嵦ŒüL"1wº ¢/9·Â í…Š×r ”Õ|°†øÎB©p:ÂœM@Ç!Á”5Ý»óÆõ–´qÌÉ$PÚ£ö?âÊT@r™¥¼8¼%ƒ³,ÜviXG?Ã<„^—fd¼'H4$Ì×tw:²Û}*„ÃS¥¨m¨x„$ ¶ï. ‘èQÀN÷¥Õë7Ÿ~'Ô@×ÞËe^ðóÔeAåÚ¨¡í[ÆQYI7u¯¿º´Öæ›'¢L°Ë?hhÅyxU4ZÝñIþƒê|Ê †3J,ª©©[¨C‡ƒþ´² ‚òð2Òæ?4ÊÐÏÖ:–§ËÄ,Œ’£„¥þ4‡ØYKn/\HÄ’ƒ¶«Ô â ›€G>ðb¡„Ðn8¨¤™\|¡/è×3Órœ¹¿˜µÎtÓjPÖ©!oÄ*‹4cÝA«0O-}Mt¤n7"%hâM'^òzÔ_¾…YÒñÏ¿v ®Lìíû‡§*W»:¤Ã6ÝÑeäå€WžïŸ3áÌM$Ô«  ¶–¾ &ÛÈúvD%-¼õ!Úºi¼…0Ø\ßØ4Q·'>àwÑÓÝðd¸XWÛq')r Õú¢A61kÙ ÂQœf¦/‹N`IÍê礚e?Ö,¹¤t6É;H ¥ßßYÇBÎn§TŽè2 ²fØ͇Û'¹|ÛÄ0ø!XƒÅ!ý/wK–æ*åYÔ»Öœ-]’¡ÎˆN—iLTëÆ3T)Såšõ8/N¹(Ÿ4‡Ûø4f¡cñv®N(t?%Ý?éÐäZ±î^3îí +œBƒYƒ¹R9iêG(|&¯ØM™_UÖõî:’Þ0 rQ ;7¦b¾ç*Å-­3Ïc®Öjj]AÍ"¡²y kŸ¸3š0ò5®FÌúù‡—kïÁÆ 1ÑöÕ¼BèV³ È럳[ïÂÀ'&†¥C8õUÍHu6 ¼w´>> cø¡(IÎ,yî=rfÜx«ú®KDåR?CÖeÁY*ùmO3‘ Uj;l¢„ ,¬ˆƒqG5Ï[õŒÁ_òüà ÔY$€_[(Á5æسø$G<±¦6Û„C•5Lë ¼9 *— L”KÏv„æá,CòÊ_@lªuUÞ+¢6Ø? µ#jtQÏÚñ}³åŽÙɧŒ†Ç#^T•O†PÀ™=D«ºµî Aó_͆®×!RY=òQ¼S ÌGõåuÓÈkÀycrMh‹ƒxo€|±jpcè‰a‘À‘Eþ1TñèÜêÕ0ÍÏ«î/0ÛéÆàÅ_zô¿”1“›¤°`ñùxML LéÚšÞâµl’¿Ù[zh–ùÐœ¿n#%ã?ú5àÚb$léž”­« ¾Õù¤†_›fk+Ý+Ê{%ÐßIʾŠ‰jmʪÞøç:åÌ„"hô]‡ÂIýŽ²jð;³ÖNÝÈ'%}$˜A‹lÈ)ÔßCù-ŸÖáÛ&^ê8.gžâ‘*«:š!Ûç4ÌRw¼ŽÛ¨ DŸURP©¾ÂÓ¿CiÙAdkÖ'S™\ZfÎ)‘ÊÐ~°¹Â?ìp³Œ œ"T‹-£­ž¾ää”Ù’¿ÓTŠ˜3oj=ârÌíó zx2˜֛2ºòâb…vô~w®Zè(†~ªÝU¸n: ‰<‹´½][žé_ˆT¿Ý¾×ê%šn_çJÀÜÝC!>zþoÞŠãêCÜ3ÉÉöDä3Ž‚úþ`ï(k  Z»äÎuV9sÐïï×t‡¡! ¹gÊ°Ç(Ì„³ëw%ï± 1ÚŽ³j"†ßß+9Û„»Íuõ Eð˜Ÿ8ð*Ý“Ø­·Ê÷õ +è ô„—E‡N¶öJœ¡r¨?ûÛGÏXáÉ陯3m-4B¥¬xJê Ko£,°2›KinU°îîßzèE‡E.ÑMÄì7dà{o3O/Œòÿ³cHš{ÿÆ`™•"ó>„«kØ &Ž£ê" ÒPâf-îº.&]Š¨Ñ0Äb¥LѧWØ#åB”³HJ%l‘•K£êÿ[r òt Bq1é¼9²ò>Ü~ãieÑ•žo™Ë¶[¯M’òýO¶õ§‡Æ¡·-ûçnÒš€ ^Dð‘4ÆŠüúeÙC^¦¿OÉ‘é9cq* ˆèv&†LP–dH1Þáš2ò­EÈéûžæ+£t(Š|â4ÜæÁjÀ +UßìSÄúIf‡âpõGUZ®¦¤ý_Tq’&å;1öºIöPÇÖã +fªˆ·üïú”ÜS6sÓG/œSd_Gœáý£CÌC`K}Ï°¸­„P@ÂÿBDA$ˆ¯\QËÇüPå؈·Ùºýt¶ú<ÞÖˆ¬Di×òœ#=ìÿÀpZóV{X êÂ@]/w®”β6h‡žú}ðU~®µ +.ŸÎ˜tßX™Á*ú|Oú©‡gúï^‹ˆKSñh€n* T¤‹î‰„Ñ€Jzì~Òh§Í–Y±¨f¼JYFEdÄSÒº¯j"Ž(˜w†î=—ZݨŽùYоž/w;‡”º`W¨y-Su²€˸ÊXHÊ>͹®tìuÆ#Äl lÉócj³p¦®¶]"ÚK‚|ÑTñM¥~–¬Ir{Òû[Ïpܹ¬À†äþ¸hÝôXW¾2îWÿN_F)ÑŸ %ÇÌx“k*IM}P>>—øî\ªAß 3òI˜1ÑUïåGñ½ï §@<…V‚´¦æ(û§tíY»'EÐHkå×ÚGªxᢸ%ÐëfÚ垨Ôqz½š{$7/B“¤JšüpL€ta·6ÌLD¼øá±Yp`Ùux±/¯Ó.BöÑòbUT“«ŸŠE:º4q4çï2+ØÃz¦KˆÿÃÏyÝ|R!£¢"&õ.ª³~Ï•³íš‚ÄiDbAwi;­°,ÁØþ‘BXŒb=Å.¡QÒþ ¶vs¤-©· +ØX]ÏYÃÊßYÔÎâK¦”¯û^ÅrA÷ªJ¤8 +›b·Ñ n³üo§¥GÙ㳸BËŒ- +ô~¡ÙU'å@ëèd?l6ÆñÁÖf)íÇ>`ÚQÈ–_%g@µ·ìýîµWf“©} hpÕÙèi¼UÆr:ˆ°­jKaû_¼Z:¦*CgŽŠ¸n#Õ©þÖP—îž•³ŸB§#r§É +²:KÖv.èö3H´q]7\ôf´Ê«´­A L¸›‡YgZg~#=䞣QJP¶­‰²Hć ‚Þƒ \Aq„eL‘\7c¬;ªÉ%r·ÕÊãdv<ì`˜¯àßÛ ‚ÑèÛãíq5<¶ºu.ü¦i»OzìLÖÁ âð +¸®n¢óÍŒûÜÌkiÈcäÆ';Øm³ªÞÎwHã2s§yqÉ¡ãœ~¬;«.×™Õ@cèÓI­H±!Si¡Y.Šüöç?ÅàÅ]ÐÛpóü¹Ž%;ài{e©$”Bw€Mk!Û…—œxËòEáÿ>Ì›@Iê~ˆ¶®¯³Â¢4‘ ìû£9äðfu ::•XƒÇ‚«¾`XßÂ"û‡Ð½´6ór;÷ÕCe`q˜ãý² GXIJà¼iHÆbmß5@(Êãèµ€˜ß2véMÌ\&“¾“išÙüjždAÉdd‹Z¸{c–t|°­`SêÀj—b.FÌÓ7lg+ý—5ÿp¸Œð9iMòYÑûK}g Œò [`CÓ–á̶ìiFfSÎÛr ä^kÅ*{нCg÷S§iö>Du*žî\j}+h9å©×_©t®¿X\%Q9.auw8{†ã1ææ I‘a1" ~9ülÅ=Çl¼&5×Ʊ˳j*㪱]ðZ‹—Ùˆ.e^mU‘œûµö˜§·bÉÝ85Z¶[£ ðÁå:*¹±í¹f¡2c;’eð¼IDôž$0'5S“j¢¨€«Z¶ïÙà­JsÁˆÿ–™·®OÆ|{©øÊå wÌ>¶‹›Ec榕4ÁhKàvtIÇ ES—?ú·Îø9OkÓŠ ŠU”·5ø©ò‡V¢¾Ÿ´ní¤z\/(0àíÏÌܸ¥]­E͘e\½kõ®tô)2ø5Ôo床Ÿ–á)¨xSî´ˆ%_!¿J{^ÛÐÀ_Ôc£*œ;ku°¾È€¬š´ÆÅÝ“ð-âXæê›mx[DØK@ʆ³ÞSÖhéR·5o\ýO±‰ÆÌ@o]Ħ°Rï—ÝÂAüÍY˜å›K–ˆvΫ R3/;®.Ñ0ºàÀ'΋ul,=ZlEjÀÙ¾Ÿg«hÌIÒ5ûgaX˜á?ÒëÅñ £z+ÆTŒlã%brкR up¸ï‘`ûá-nl¨¼¦IEÜ |R:ùdÛènAϺÅZ„ˆôIôÒ4ÂúøRr§ÎÏð²[bóÅäÌ{vk3ùz)•!ô×m‹cI­Q3§9©å(™ëœF6¯ÍOCúa‚³#dkH [–'‚æÄ$"ÈÛ´¨ob- …U‹¥ %gÛY7ÿÌ¢š»˜á–)r¡dÍ9[o»·–`ïÔtd,ã$uïÉÑäÙ^°&)—o‰ ZÒI÷«&yçЪÊåÓì°ž[#‘öõ+ +ûÏ6èåqQï”L{ƒ½^i^ç"Se¡+´Ôxò¡p´:ÈÏSÒÀ”¢ ÅiÞ¸½ÁW»‡Dz³~þ`h©`©¹UÜ*­•ÿ } y2ôrñï¢]$³î‘•°|ÛD=U¿íÿ=^g²ýÐÕ¼ûzTÏ‘Žu˜^ôƒ‰!ÂÊ-ÚˆÜô•Å¬F§”£¼J—œãvqþµñmcÑNòLOÛ¿J¬ݵ‚§Q¡ú0ä`“õ™šó}šEóÛÔéZ,ÛBævò“'½ßîŒ\R9Þíqwg?]ozÀÉÎòWy]Uã…R´:¨ûxrVaÀ `>‘Ÿ"Ñ$ã´PyÕäÝßYmð$øÆÞžŠJ–éÄYd¾uŠÌs¾qÔPÒ"¯>¯k úø.ã¡Kö?:œà)¢ÃÅ×+ÄMw QZýŠµN¯ý¿'Ñä¹$vŒÕ]W%†$í’3ÉÖî³MÍ‘Z}ôD‹NÇåÙ² t}ڳλhëˆ.ãõÃO< “?Ϋ§n‰Î + x-kÊB*¸ 9 r6±4Pú7oŽÞ'sãOŒ8»îW8*V9â¥S‹î„™ŸÎÖi®Ìr5nj:×=KhÐ*üÔ;ÌÛ,ŸJŠü™8ÖØeR¼XhÁtô"¾ŠÓj³ø¢.éŒìá¿Ö::Vß×b–Uÿ¶y¼ê&2Èá¶Ttž!x Ç`Ö7éåùža¥ +Ó ý[Ý›OÕð‘•æðLf6)|7gé“Â\;OÍåŸÇH†\ÎIzë²ùW +/ Öë‡HI£¦ +º gÏ—¥(W—§Å%”aÔQÑiµ/b‚>UÈüÙi¨&ç;‚ëxŽãÌ$‰·ƒŒ¹ãmQñH;½rá‰]ò`ædu?‘2º4=˪¢p3páÙŠ(l'©bšÕ}­ì8Þ"ˆ0¬–ÈÇ`¡Iå?ÚG}ÆÌO \×¼a…J½×5Á—ËH‰ÛÚòÝ1( Dy&Ûšøo7Æài`ÃôÏþ4jðvÁñO‡“Àžh®C°k½ -Œ«E™«úË«¤ÀŸeͪT‘üŒ2B“OE`uËaÆDìÀ Õ=âaOï+¦=ƒ~]` ‚ÅùÔÈžOÓ¼ty5«BØ%éÑlQGª£'H!à×®ëæ[QY,ÅS^¥Š;r$Áû/S@¸á0D=Å&oú†6•ïy4\W¥¬kg±Âã²²¡U±$ÞÈÏCq·gÓBDŽl”žƒ"œU÷ÅSÿ­F! +ù‡¨?”VÄ1H ^ ^éë9Hùg^Núzxi\hŠ¶;oSdKÄÕã á%Àö¦bÎ= ßÒð2Ü ã¤Zš7–ÞíM"H H6 +* B×´4°`ÿ°¿¹m“ûKK„Ö*‚ÑåkÀŸû*q¢ËСÓóSYñ×ßûÈÿ1zÚ¿U‰RƒI{ŸW.)Ñ3G?'0Ž­ ÞŠ0À³Äñ¸‡™9mn;¹áw‘Ñax61ÝþÚlŠv÷SNðbxü0Â=o!baˆ<Øx O¥m¦â^™›”:Ó×d’À™M¯‰6šíkß!£»=Uiþm³!õ°^^ç_6{g[© ·;†–?ÝÅÖú;·"­ ø$CvR[„C¿ínÿêpŒ7b|JƸ; â¦qñèè&:ç ú±Á³zú ÚýlÃo4¡[›*oÜn^Gå¸ÝA’ôƒM  v3ª ì'XlRôå¿À#g—Pt)zãòòµs3ìäë®Áºmé±¾¼d\ç(nå€ Iž¹iëŠÔ÷µ‚©Úcíú§2àꟀ†âk‰])™<Š!#·R)ÃØ*Œsñý9¾Å°9¶Î€hàÁÅ›ÔS!³a¯9†LåF¨¶TÕj?TœÚXL¬Wõ8ݺ˜Í¹^‡r pœr&i%Ârî„¿ Kžd\2§Ú*ü7% ßÈ6fÕ>õ‡sUØxz‚ÍÞ†•»B5Þ©Fø¦ëìÔáx]Žbà¬Xðƒ÷}ÄSȵÅ51–ªÐ÷úY3”V_E§è"ÜÓw.Î_øÌx\^¬#,¨£æ„ Ñ|¨]­4!\?3úï󮾄}ŤûÍÄ^&Âd¢€æ,1jRõ*Ä3N³ÁG¦3½…[h'i!Ÿ•¸XøB”ý¦5miHþåKˆ’æ°°‚Så9š:XeVÜO]#'‘l=iä»â¢ +Ó`pÒóNBœÙ?†©EqØ!`˜jß5u3’Á$´A˨½Ì?.«Qí0hC*Ú#ªë¾¡¶Ãqv·õ[[~×,5»¤#½i /Aã˜N„0Ï&‹±¶³”?µàHœ­‚&˜lö< Ÿ×—ª_Šz3^ÒñßøýÈø[Ü­?ÀÔP‘™­«¸`´¶kÝaGZ)Y˜LîøÈ¥%kŽMÚq†ÐÅÜCúzñÍQhèaõ`n”•kq¯î#8éPcûF³íºPæ „TÚ`ÜY¹$‡f>Ó®ý&ý…ó"ÍjB”ÍÒ*p²PC „ÎcË›ÈÇN¬¬‚Éqn%Ë0Ã~ÏÌmž5*$Ÿè*—pM‹¼ãx¥°VGÁQïÍy -¦Åÿ?dòæ•t{—Ñê»è™D‹IÞßéÕéäuäÝnª½å¾IìÚŸdv÷.[¢â¸ß`yÔùD$Vš¤•£T@ZvèÌ༛ ;<ùTíl¦Þ^„±3Ï}›X‡í=‡oµìï³»Ÿâè‹Ûréø.“÷}ôXÕƒô +Õ)B‡Ò¨ïCœ(24æíB+H•¡ptw/€:0¾×îj`ª³ —&0Œ]Ü^¾1ìÑɸF@·Õ” +†Ò·è +àq÷ÐEvFɺZ#4ªŠjÀ¶7[n <~0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +10 0 obj +<< +/Length1 1686 +/Length2 10475 +/Length3 533 +/Length 12694 +>> +stream +%!PS-AdobeFont-1.1: CMBX12 1.0 +%%CreationDate: 1991 Aug 20 16:34:54 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /XOEAXU+CMBX12 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 12 /fi put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 57 /nine put +dup 63 /question put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +readonly def +/FontBBox{-53 -251 1139 750}readonly def +/UniqueID 5000769 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÍÖP +½¥í˜5ö ÏÈð l.×j‡…kPôØ úëPŒ—ø(?ˆ±~M;Àö^Ãyy¬Ü*f˼[âõ:­ç-ѵZ/¿îeŒ¹_[³+ 5{^Ýòd tp¾ñÅ!¶ûÕÇ~¾Ùd¬Z+¾ÉسäŠå»:cÕEwK’+_ö°nÎCdZy°2}m‚3…þUó@-UÓ´HkçÑõ¿®\Gnæð^±ÒÊë&™X±”R—³üÎÔ†<½ ×ØÿÚÍEKNz—µŸçpæwQ›#ÖÀ„$ÕU$*Œ ŒI®ó”]™¹™§œçH®kýæ#ôF3qD/e#¥öÎÈ9§À%."Æ–ÈÌ­äV€åq‰ÐùŽ _•^59p³’ÏS +hÌV°]ß¿ l0t¾ë9ܼ¢r¦æ)ûzê,[§ºå {L¥•ßx 5)—ì>ådß"Ÿ»Tsõè̱ÌSé§â™¨ê¢›iѶ"±ðÏüX)Hu–ÙPËQ pÜŸt;ëïDö®’úÎÅvX™œ‹ð`a`9bÀi^¸} Ú«eeW Šf é®ïŠå_q¸¼v9My)gäØ;nŒ=™‡ÕåLS¿+»2…[”ds´H3½x‡=øäÇæhÿÿ%ª»¤tK$ÖË‚${0RÌ]fóñ¼ø¥j?´FêX{ؾ0%vRÎà5bŠíßØ(;ZÒ‹€­$ؘ— +È¡ã>T<äãÄžæ!ÅÎ>Šé0øcfɈ``hÙé#–ëõ³Û Eü= ÔpÇ¡M’»þ'½t³c¨Ž3¨é¨ZÃ!ç=Å+3;‘ pÅHs¤"-fà&¾m,ˆ•ŠpÁnå ð «—g^Ži"níP]6Â!¾ dtBDKð2_‰›¡^›Eù ÷=ÃIomàÝD¡yI¥(fÇ7t”¾ÿDA¼¤ü+ûryú)8ú›âÞv/ ÔpP‘H9ÞåÕÒ¶?ƒè§•83ïâI*01O2⽚u*½¨vîø†ñ9îÎ)ã &¥§rqÈ”P¶ËC å65þÀà$Ë ¹7,ôØ~Çê»aZÉ~ï¯îZØUºK#»Ã½vX¢Ú½ŠCA—ùsý1!\„³˜Ç]òpPª~æN]Ï2Å´¢y¤Mmç®Í –«`¥ }¥™Q¿ErP96iÑínûºJæø´­ÞØmjˆê¶ñpýon]…øÀ xÈ&(©À’ÑýÍú ë¯#ŠWRÖ3©d|Y QsܳÛàŠú–½ý¹Süq§“è†6òòÁ„F9þëAÞ‡e@¯¥š#Âçi‹ä¦ÚFèw1<þ=‹±MøY# +˜ßI6ŽÙž¢,ìXËKÝà?¼žH¨«_/\êꯞÂàûHÝP²ü ‡‘$| §¾² ëmJ†=î¿?üžâW]¿h({!5jPÁô?z ?hý" ×~Žšiý®T3Ô‘R¸Dî qÙŸpÿ¨ÉpôO^ø¤°]tÞf»àNŸëd™S€áRzÓ‰ ±6 + åÀ§ÿ=µs8‚·ì0pcŸ±Q\ÿ0¥Ëlfýº’g«Éc˜Û›°²%Ù [a™“èS?ãh¸åõ/.ôPTõ„H½Ë²‚4Ǻ$ +õúG@Î…Gª=žüíž`͈ÃGÂ×Üï®^\SÁŒ³/¾Dà0fïòYl#*5y€ ~ÊYÂ$.ר‚g´7±l8þïZ[žm”|Õ2ƒî³SÑQ— ÃɺÝh#‹É%ÏTGá]AÐ<ÍÙ½õ$ò#“G<|€FNúÕ“Ÿ /Ì՞͔_#šd‰ÞV" +ªÂ•Ybý@4(–Š{Ò«¿ð¹ÌT€†"è÷¹ô3´1Šö<©)IáÌH,ûÉÉÌ”8‚S¢Yâ=×êM[wu¢ü‹­–UL²û9z°3CÒŽ¥ôòV±Ë»V`<‚ŠÝqfSÚôrJ+\=24?!šÆ+Ë3 #‰>Ž^Ì'?zóÖû´/›õl ¥NÃäXµwÂá‹ÚÞçÙ‚[®ü“äªÉ! +È5„ºÖmðÒ,YðTjt.Ó§“êð¾'‹Þ8vd¡4_‹Ÿ )h9SõI£ MAÕZÄ2î£HÒÅ¥wF|•û +…Â:ýqv2Ê—•)f-÷½)‡S~>Çpê’Äg{šºYÏIdU&Æ2»tÄF»©–¸™onûSÆ”ón§Ä–ºNÔtùn¿¾w}Ýä$T²ûŠ¥ôx± ¬-Ã&ôii.ý°·èØôŘÂÐhè˜}([ c¯øO€·pÚcÒ­ü`¢çQæa®vI1ñ‘ú”.ó77Ǥ\´¯ÞiùË^‚Ì»BÆETiZ¸µÏ¥ý™Eãë³ù.[`œ«G žÉ!ˆ€"8 Ó —&5¯´7•Ô½;C:ñÊj²A‚ +l‘l/ŽNdrÿê,m+êó¤ÕHÚó’*vS»ªP`­ÕE¶/5 çî.”NÚs.Ï|¤mm|ü6,çl$uz‰1;Äša;[ýÙgX)Ø@=à@’•´=«³dásmºçÈj¹'ïŸá5ѧþÿ¸…$œyåWäMÓEUni1šÄvœ3¹E¿¯5´Âä®íl +){èÓßF›*ÎÚ×nšŸ²¤¾Úß +rÿfþþ|saÚ ÊQ5¸AE¤Ý6—|Î1 ¡G|d+!Û;ÍHUß Ål2f1ʼnœ[Èový)ê +‰=˜n}ªÍ§Ð©eåé–KTí1ˆO`Dùg ÄÅeÜ×ÃWy½3fÊ~ Ê<‘ÈÓglHAF³úµöåLƒ§nÍS@Ûh"ýònð©Që|ÎQxó¯FuúxÍ·Wô—…«}¯pR@kŒkV?>çJ×YÌ ¸„øC6‰(ÌöÑ.I,û&Ésw!„C>T_F˜í2ñЛÛ-¼d¡fo¼)V“mWÏr(öqžTIò¦ ª½ÿ¢Ü÷k¿,¥ƒX_sÓrÜÝߥ”dÉæ5‘•‰˜¶ˆZÉ„”×µ@Æ/Åx¦‡wîh¶u–íÐŽõ ÆÙ\%ùò=êhîošñè†Øå—©gþ— Ä9m¨à¸Ì)ˆgõ‹ÌÃû§Âk30½]\¢ó…áYCiEJ9þ¶4ûáˆDûNyêEÃb3–«2ÿøüRý*oS /üÕ¹I¼™çn¸?ÌÏeÅF–¡oïÆÌï³áVn—·*ÿ£dXåúG}ɪ?¨ârulEr‘²ڷùøx Ò£L¯Ï »=­ÖØEßÛgReÝfrl‘ñ<Ä +9¦Mü3ÛhC_z @þOîõ¼çã†9ÖÝyTƒ•Ä'Œ€,„ŽYF¦YìúØêLPñ¸¡f¨€Z©ÑÜwj®ó†Í*›Ä˜AŒÀcž˜­z³²Áµ™oºŽåËéˆìåPk€Ãó‘×AâRæk§kÉZܯп’Mhn§ð2Éx#’…u©Bß­ÃÇÞ-¸Aª•0-RêDÇ%…’H W•&Sx<è–ÐÍ]ò“Ž¸õ9{a™XÞlÍ¢!ÿq—U%=Æß=œœg´–¬Å〛»U3X§ BrNÛ­^w»)ÛºSk¦cY²]à-î™ù4(A°£’@yJz»f›™ÿ“˜¿¨Â¸D@äâ Üx§ªÓUÒJ-q MÑÚÓÃVU”î’n,š'¿qÏóùfŽA&Ò&)ÁuDµ]*þ• Ýß.‚'òJ¶¯Þ55ÚNìã“$kDn4P;Á›³šæÚI$Q§t‡»Ìq©íw|”`Ë°õ²n>`M?†– +‰µ²Af³‹×î¾{fÿµ)ÐJï¸"?¨ð“*$¤Ù»}Ùa¡xGF*øŠCRS™Ã\ñaYQWé/H³¸$(F:»Så’Ž›ï~ÕxtT•µŸè• ‰lЕL°CRÄïWâ€qÝŠBÇñC RŽñʜޣg½šöÉjìh¤¥þnÐ1–µœ&ÕÈ£J³Ù$ËŽ/î°ÁÀîLc€=‡!i䈱°m'YYКH§Û®É‚b¦ê<­á(Ÿ3Œµ’Á=†ÜR7NCý ²ŽçÉ#KÒ=hÄÐþ‚7h ÷@ɹªŽ"T ÖÒ&{ØqEizμßâTU¶cÉUCðE¦(XK‹j‡#ìßé’ÚPÂdYY%p¡ÂŸ¨Úô’éËå8Í€Ï?XdŽ^H0’[Ѓ²ØÐ]±U­‡Ä«º,<[ªu…äpü>¡ÑÉöæG´Ážã“$4‡ñ¼4•i{,©Æl¡ùüøÊ1ìì¯gÀQ‘nQ”qG\Ù¿‰¦`¼%Ï“èU€¹šF…7ö]i%9„0NµÛNÁ…Žº³iFîƺ§@¸sLRœVÌG½f  €@±ÃkN¸:ñ¤áºxQ‰UG8‡øÝΙÎ:ÖÛ÷ÛøJã\േ< VÔXdçtÿmÕ>†72VÏ7{ñâ¹1G¥/hÔ"G1;ú§"û%Tð䶵[ÕÝMvò»Mù*2ŸÄ¨ éØÏ×Ö†õOªïFÛŠL+2ÌÞç&´øDÄds³cÂÂz|î<ÁÈŒ&#Ê!Sôp¶ûYسJ¦1!‹@#ºRT¢{`vÓþìä”´£çëw… Çί$^£æ¤•q¤Ç\•IíìñC–/«p–Çkן ]R†ÞetðÔÉö«–9Ï!?§§^×u–LXê Ž’;,¾þN\ÅšWòHÊo€É{¾ï°ÜÀqŒG™‚ñºaëˆp,Ó«x +ÏYèóg=ñ +rñW§M”TW¶–?)aÀÙ|–;Ö¼FµŒ¦Å2NÕ“ÅþòÂI«{52 ‘‹Bê?åGç›ôÀA¿Ü(™Rˆ.õ “K O|î2†Æ„`?¾¨À±™˜¹6ÿèüÇ.N™°tžG ã$) .¹ÒJ5·ð¢ÍKý;;?“†=°WX+.cwÑêB…¬;&“^,ç¾@ÿnn–ƒ5œ´T‚à½Ö ë òî̧/Ÿ¨Ù®&cE·aô«Ì¾x/žN¥ŒÌ€Ww G9’˜šÚX‘8mQZs^ü-³]ÏÛÄ™CéCV2t;-$Ý$š ¤àÈÎw ™ŠŽ¥]Áu1^5Ô?²)U`óß½»{ÐÙÁ”6–î8ûÀO€K¹úþ4ãtý}«ËŒ8áÔ?;C9éé‰ Æ$]yV£·ˆžòÎŽ5@'òjßôi_£Îü ßÀ‘+m®F…?åEÎÿ Гñ>]c1ᵈT®º±ùƒ`ÿ¢ŽÊßí¨ º5Õ…ucÍa9ûžú3Uf8(Ü›5ƒñé*H@]ö!]KÍþ¡›b±¥#E™Üd,Œ¨÷‹ÏÃdÎHaÆ´hï&¿åﰗǨŽ6S•¤ƒ\E“ó‰OJz‚³íÕ\Lå¿£Û¬ÇÝÁœ8¨¦Ó »¶²*>¬52¿ooúПÃ0uÑž¡{à`‹gTª˜kG$¥]Ú™.í¥¯Nþn_QÒ9ìZ:šâ“LÛBvc«²¸Û]2ßÍlý|@ч"šêPa +bϾ&Šá¼à{GsJôJ#ñjèx7[ÊQ&œ™4Ä6›Ô_ؘÃȦ¹s§ÍŒ‚úÉßý*PJcö¸ßŽù.pX‰LôWM@.Âh7¬>#õ+"»……v_a 9ØP+Üù£Â ¦x#g¥9ÝBéÑ- o5ØWáÎĸJ=Qy–o½¤îžâ»ö¼|â‡Ú½¬BÁˆ½âºÄ¾@ƒ“…i4* `ÐôÕ© 8£’o‘@%1zý•à¨–ÝQøоØ!R'ƒ·!“2ÎkÌŧåÙàÛP¥i¤P°íÖ`’·Î4R’&]äœà#oÍIpÙÈÌ$š´Ž”ïÖëCLJ +W†­þ_î71 îr/m0É>aþu^ï@ PÀuõÊž4–´ ¬Mé žúrk´Á…G~oÞT¬Öì¨aC ßkB’¯j¤eÑ7f¿ó¦vµÔ¥Ìè$ŒPbF æ³(=;*ÿŸ¿.‰‹·†4>(˜R»Úm86Ùí»Ìwe +è¦Í®¿gyŽ6?s¥ÅùÌØ°p®Th@lè?ÈÌ—ŸøL@Mä’ *2úÝB•D˜Ööü àu÷³á“AÜœ¿iòFÊÔcOZKúÃÛ÷ú8,HJ‡ó\@uiUä!ŽØΓ;Ux–M€fÞøÓ5z½é´–ë¦u´›ÊºGÆŠÌ´Šîb°ï.nR “{T\·h࣡Åw‹ê¤ér r—-^UÈ1°ªn¸%pºkGHÏú(¤–#ŽE›ÛuΛ/öP/ávƒ™6az &0"-„Ü=lĸ<ŒD*ŸÁñ^'Eûš2ÀÊxä»óÓR”ô±º_Gg×#"b’4ÿ¥¦zËÄ„ÛÍ·ÜUz_ˆ€[$r+è­&ËÜDÖDÑ(¿gÁè—x±ú5ªD¨Á™Ø¬ôüï?£SÚdS Bò½A&å!úÿ›&ã¨ô0?º‘‚¦ÃAÙ&¦ª¶áÍEì.(øÌBä¶ñc€ØÒ1ÓL[SsŽñ–úŒ1É[Ÿ„Ò‘¬³>@E{ï¹-UõTÆE0>±Í×cüu¯AmþDVT“¬ö›¡[Se65}Ô¨$®Å{ßÂíéDµ¢q’üp3éë¯UÇÁ–¯©ÇöÌÛ‚Vˆìï=N¸3«Q¾§ÅCð…ûÙ…à×Jú«„>gnC‰œíquù?wŠlô‰¢r–awAn›ëÖýê¨s¡«ñŒ®lx¨ãˆ´e=ÖÅsI¡E€ÿÀ—líReNÒû™ŒS³ôCO‰›M˜$ßùÝâYã†*µ£†lÆ çpÐzݺ[Â*´*ûæË$&×¥èjRÞ]ÄOÒ¨(™@àÙæ0ÖA™Ð‡Ã@cŸÙå{ãÄ䉅‰ÁãáÅî–Î,ݲe³wRvæ5Á +—÷%ÿ½B<žoPÉ£Á~.PUçQÈ +•:cIÙ®ÄM²¢Â]T¿hG ~,à]ö Û†l,ôn5߉+{ª£ >r0¨U¾ZŠ…e§Šòž€£PxÿvGFàRl”füØú€Ç ç;ä' t™ï¾5§ÿ+ÿv0~Ø>Å–iY¸f X¤µ€ê­¦ü ¦:è£-)!ªÈ†´Bb_ÔÁkx +,¡•ÞXESX]¥¹7d½ +¦¿³4‚`3Ꞻì…J±e¡ ž*>9R×·|j5~ïb‘ùæÜh3¾u ×w63òqð½TD?í¬]ÞWÜø)œ¢9™Ð³íX\Êl­×ºZn(x8 ¤2LdÄ'¦“ÄóIþz,í:í©§X`»X—¬`aOSEów¶²‚ºÍ16&'ÅëÝp~Ãé±¼¤wοb—:‘aN‰aØbümúd³Ó÷½]§©½üdÀÇõQèZ—óŒˆYBWÞy9Úi¢éCA&ÔpfÿxÿCÛ^ †Ú)YC±Ûb±TÍu}(ì;ýØöÌ=2S€Ë!¸ ÀRoûÄ H‚ã û>ÓÕQ,’#&qx ‘LÀ¨ÃXš°%D3œ$ ®é@ü.u†_êØZ…¸g›Ô¦Wˆ0$¦ãç”Fͽ³8½2‚óó×Füíú ÁµmŒþž .ÉžÚòŽ‹¶x®_îqzn*ÿœ¡±·OT£¥$kEφYçÖD¼¸jxÌôó£_’ÑuìRˆ®ï/C…äE²3©KI\$Sƒ³ªÖ6zkrmgxUkì t0$ëØ¥ðÉKo>Ïc>ˆ,m¥_¬´„£’¾ñ¿7 ÎÕšCH„¬7G®®FC1Üô~‰t—©.qPÑesƒ &ÄÑôgî:BS¹}Ý×ÿ€ëoAH8ñ äã±-8&ÿ|WÐü¶÷ÞÂ`J@os‘²‡V3g¡Ì¾¹õK*àÙ"E1Ô8üÞ‹1º*Яy4À‘*´µZMÆ.O±t¨ùFÂZzV¦ï®™Ó~ç]FnžÏqešÔŽg„àÿ;]Û!7/!Ÿ¾B^ÖÜÉ2‹òruK[ˆs/gp~Úƒ,¾|ÝkÞåöLW V|¸ÛXñüŽ1Þ› Ø~úݯDfsÌLÇ¢¨òbõ¹û+…£ÀŠŒ P †ñÀ$Tj‚K©ß`Éõ“nÈ;a''…‡HD}Ø?šÂðÅ2_ç;U«”wi·6ƒ¹uô ¢E9CÕN"ì S‹¿Ñ›ÜLjï$VýNÓÚÞDÝ•«ð +«Ú/F /†)Ë‚jí>öÍ ùÞG¸ÔKB•Ê¹Ù×"X^ý9Áo] r=¶ÈÑÅt#¸Î:ýš¾CG¿( '‘½±¿"q…ç%ÎÇ D4×l¹Í{N‚˜o ”#²·œ°R*M‡à§¬sÇùg+rŽG >ÍöXŠ›­ö&JâÙ$Ý÷Æ–Ð¥#)øøñþ<'vÂÄ’6ÖãÔë9y¶wAqÅ€Ai‚+ŒQ?¢ÆQ©ÀîÆÙÃþ e}¶cVú/dT„’ˆÈÏe“µòõ=N}Ç +¹J‘È ±¡~μÈh Ú4AöǤY¦“Þ‚38¾®Ñô +f„1¾pRáن̯–a0ÓÁ{O^ N€’œn¶Ý¹È¦\nù +ßÆ5⼮ŒÐ=¯«… ‚Õ5(à”ñÙ¦M„õ}â¿ÓA¾>P¨ylÑB/hƒŽ– ¡»! üá¾Ñy¢{Lïˆqâ2ÕmoN“E§fº§¦­>_s•\ìšè;cú85øìºx»Ÿ‡ÚàH]4ªŸ½q¢E|Px•vqüEDÀk÷3z¡œzÙ}çÁߤŠE—íCvª5pU„ªk~¸\”tFñ´Oâ~:´–7Þˆ¡k ]¨%³¼Îr#‡ºÐAŠ†ã¿OŒ™TÛh=@Óssö>¬rÆoµ¥­óÈ‘„)´Xé­þ2Ø+œj|î=¼jd%œh7=°hÃsb Iþó#ÏýMnÆ žs  {½‚U¢•:ø9J¬¿ÖÜ|"ÿä•VbÉlŒa%’€Ð|Šßô>¯!s…Á0~Ú"ø}taÄÓõ½Ç=Pa R‚ðý¹ºoM¨#ë0Ë^VÕF"l3XÓ¨ `Û/$j4æ=–Wµã¤;ñ‘Ù4” 5DàHR-b¬©†AgG÷÷Üå3£F„;Enõ‡ODÜÃz‘WÁU·#ý8lÕŤcòÜ„&à|v¦¡Úƒé²ùo˜6‘ +<[»!YÚßW°—À€\˜(‰çVc¼Hv”:Tð²ó©8”kvz·lp8YÃÕ +å}ûEeÜbvúþ> Á•¾Êå˜OöÉ =äžKfaTÀûÀÀÔØAAµƒ(0x×~Ã4´#-RPMGO“¿_t˜ ¶§u´%DáF?¼5s•‰ ¦¯¬bk*K¬·º=DDƒ”A,£êK_áŸH’à âÈ·¨MÉá-µq¸ë™6âhxåÔP¡CøJÆö@œw®J(˜Û!!d¨ðVº±í”ò(u®ÀÐöùÃm&[ªÝ…nƒÚ‡²ÜfòŪè¯ŸÏ ^_~&Ɉ¸Ù ¼ÞO}3zÅPÂÌóüÓJ?¥–üQ ÇŒ·¸Ð‡¡šíGóâ¡yf~F$‡(k¹Ub„ìÀ«ü˜úA©£Ì3H'È£$ï(…|­üœô²ÍÅá@öB–ÆkW· Àr¾2ÌÎî>1=“üº"Mï£ñ~÷AtKçmõrqâS­i MÆæú€ ¾ø¸|oÒ{$[ Ô’ÙÏql‰[¡ˆ š ; +0õÐO¦©3Œ!û®|&õÉÂò ñ #*sƒYó…/ŸYÐù¦cŸøu† 8w7þá(d²òþ^=g’T¹¤(»_„ƒ8õÐCÓõÜ¥ª§W.ÎRÈÐr1š"+' ‰GBd‹ÒiÎ;àáè Ñ YËpbÙ¦qÿ¬;ómßü4ÄÖBMéY¤&Ç•ŒˆY&|RÂЂû#¼¸¸3á%åЈϚkÈíKÓÁÀ d˜h¼È ³@ËpÊ ìõ$è™Ïtէ󦄣_=wÃmÉJ«ð•‘3q_ö¾K`ê°&Ô&G3ÉœïÕ›Ûqï<TT4.§Î]6%èÀJÛ+–æ‹ß!±Ãˆjêܼ6£c÷€Ò”/(d·>€¥w »õî‘–éYzl£¥à›³¾ì—ü Í·˜Ã!¿Æô¤ÄæzPú4(ßZßö\¤©à›GCQ„ZQy`!$º­E¥Y‘üW»öÞRgPU´Ö@Ç_ãÓ“¢C•i½4¿Þ zÅ÷dʘ%ýIjô§Ë.¤·éhÃS›[rñ2wÚ-Fö}3 +#òu\˜NÖî7Ô—ú™la—á¸Ññôч¹âXÙ4ñì™sƵ¤š3#¦&"g÷¦`ö‡¶#ñvT’uÈÒq¾ µáaàÇ|ˆôUø–P`*ö†¢Jï­šqxXR8ßH ”Ýšâ{(RcƬò׋¦ÎQ +ê¯:a,9•€3µ‘‡ÓÀ‘ͪËd’|šÜF)™¬ðÔ#íó‰*ô¿£†oIÒàZ9hÇE¹øÛ‹z„ƼŽÁ*•é8þÛÎyË.ÒŽì;ºÚÎå…ÁkÍ +§Ñž¢Y4§ÚqÉéóŸtÒY¿Ÿ•(ímÌœ[î;JÝ·´öÏîN©Ã—“jRéêÆ|žÒå áŒ‹Ãej}©„ñ@kî½Q@€èX{«LIrœÎ¢ R®ÑP°$ppvéWÕ¨BºÞ {ÏJ–&Öwµ=ñn(YfKØF±¾ÆÁ.˜Âä'Ì +&%.¸¨øÈ»jç[­=H©•Ûû›à¶y%ó cKíû*ÃǵèʸO˜ç,&ºÆ~XθaMŽQ´¤lÕ‰‰ÓZQŸü$Àm"ºÄašÿ6@º2éÈÜ~>]Ã(kk½ËßÀ½ÏF/B-1'膆¯“ûVNŠ}*<.!W¦fß0<•Vµ½öÚ0Ò·‚_þ®ï—ÿDLdÂl`§Åk´Ý1ËÙGiB®¾Ê«RB¼ü?íëuT5G˜ãÊ謨i’ó7Ëé`|Î#¿Òö]OLæ°9<¡»õ†¸:¯† Ww3ÜשÚSTtž²Fð‰P•U•óßü¿Á†DGb{y¸+¯ÿ̆V•'BEÂÁ/ N,awÊ>¢ù”džÊ!}@c6Ëñê‰éVw¸,0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +19 0 obj +<< +/Length1 800 +/Length2 727 +/Length3 533 +/Length 2060 +>> +stream +%!PS-AdobeFont-1.1: CMSY10 1.0 +%%CreationDate: 1991 Aug 15 07:20:57 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /ZRNQXX+CMSY10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 13 /circlecopyrt put +dup 15 /bullet put +readonly def +/FontBBox{-29 -960 1116 775}readonly def +/UniqueID 5000820 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÈÎÙ°š'Z²1NÏ‚“R‚oN—]ÎÎÇ+,󡈙ÌÞÙ5Ð; lƸ<ßO#¹¦ ´™v¬32cÉÜïͽL„í£nt‡cMŸÔZô£ŠV¤A,; ¯úëq{ðÞŸûz„`¿GZg°ÇºW¹Šb3ÙéðÃðÌk,j›¢:ó‰æßÿNþÃÞÖ'lkäp<å7%–ô탴›¸só¦9ÎóV"›dw “?ï;¸+ÿ§÷Ug±úMs›w/gNVu4ÆÅ»ñÏaSr¾ ±„r÷ªX¾Œ!m½ßÌ +†¶Ø1Œ¦â,Šñ;T×WoäÊZzù^¥ÌNÛyÀ«fŽOìKZžµðäÀˆÍŽÌOëK@ì‹Ò˜ò3`t¶LC5󯋌YÎ&1ƒ6…@Ad­Eÿ$| بvhØ54’30Hð'¢Qcã"c¸W6~9é´©©ÏV&üüäÑØt$±›oRÊ„mCÀUOXêjmQî·‡'p !Ǿ]öèíDºekÓ©ï9¬NãC§÷6íÓnÔ<¾=ðr0É´† +öçÑ«¦wÙ&@g(;ÅÖ ÃGt`çE „*㡶Ymä÷4Ö6 mm8µCv/üdyù./“rô×0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +26 0 obj +<< +/Length1 2237 +/Length2 14365 +/Length3 533 +/Length 17135 +>> +stream +%!PS-AdobeFont-1.1: CMTT10 1.00B +%%CreationDate: 1992 Apr 26 10:42:42 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTT10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +end readonly def +/FontName /YSVNVS+CMTT10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 33 /exclam put +dup 34 /quotedbl put +dup 35 /numbersign put +dup 36 /dollar put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 42 /asterisk put +dup 43 /plus put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 58 /colon put +dup 59 /semicolon put +dup 60 /less put +dup 61 /equal put +dup 62 /greater put +dup 63 /question put +dup 64 /at put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 91 /bracketleft put +dup 92 /backslash put +dup 93 /bracketright put +dup 94 /asciicircum put +dup 95 /underscore put +dup 96 /quoteleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /braceleft put +dup 124 /bar put +dup 125 /braceright put +dup 126 /asciitilde put +readonly def +/FontBBox{-4 -235 731 800}readonly def +/UniqueID 5000832 def +currentdict end +currentfile eexec +€SQM(ì(Ú0_«&(‚Óü§ˆ‚£yÝëELì«:ÒD<ˆ|X'‰r5Vså¯þ”ü}³ãdäõl$<}ò&\VD^Æ:V•¦¡¹DáÍ·ÅcV¤ý~nÜ®²ÐÚlž“–ÕJXèýÁW‡0ù’CU`¦âÓãhwî/xõ‰c‰¬„p¼€aiëv.‰¶Üšß…~­ef âXš®r,7¢íz)AÃ`°gî4ØÕÊ;ö·%aM“kË wôÔì*Æ{¥­?šÝ{^=H1ã ÀEFúè<©:5˜žeÂuhˆ÷'¹~SɇÉnLì9ê¥ÇDuD…çÑi»É‹ørÐynC·• 7†%}‹àj¶ “’12˜2uI¨¤¢Î£i J3>EªZdúÊá´F@† ‹†‡¯¾ý½[JTrQNçÓàu*óéjˆÉ]1úÓK¢ð/Ûˆ±e„OasJÛÌ 7¿tÞ§è¼Ü pÃ7r÷wؼÝôa¹Ìÿׯ+°]ïÃH Ú³ ïòóu¯´àß/€Ñ „`Ë“!¡ê¯4­Ï«˜e!½·Ë§*#S”/¾¤ Ñ¶~Í剦Zøç¥úK‡g*Õ_W׃ÆmáÑ +¼ó%0i#€Ç0Ñ(4wzÆu…w°õ;bf5ÊÓ»ŽŸTú\¼Ë9O_²â%æ,á.Œy/[~#FˆÒªbzFp3ždc™ù”BBcåÁ/Ÿ=A¤DIa©xZ û§3ÿ*x’ÑdƒlÔ,X̸AÖ⥮0úÞ˜F­˜#`Ly›©—yüË¡Dt ¼ÇèW´³Þf’vb ðãDþ !_%wéÉ,jÐ/Ft ä*Åå©l<Vµ5ÿÖK¥SMÝsÀÆTûÖúôýüUß*7¡½Ôéس`Óéþ%cMpœ(žRJfßÃ<Úd 9ri½žËèJ}{“©}Å"¡kie·Õ×y +04Ë>€˜Sq¥›8;ü\ëâÙ Cº],ì};—-2ª“+u lÈ49sû¹—-„g +ÅÊÅеç\à!ù”“Î)®¼ Ëu‹°¤}úæÈÐu;ýs‰‘ ¸ ჆צúøŸëÄ­*ꈄëú‡~"Â" ¶ÐKÆݵA(N@(î¢u$Ki°3Ò­™{çÑÞ¾Ïx;árx$läµãóM ú²6t>rÀ3™ze)‚‚“vß‘«õ3ð ò$ÂyÓQQvßÕl2[=z>þ ïøB3µ§î&%WøMuO| EÛÕÜY´kè„}¾ÝpyÄ-H„âøø”­Õë,ñŸRUŠøM嶓† øÞvGýAtYÖW˜°nÅÑ2¬âbN—ø l +"æ²x©é C\Œ‡Ñ>@µkOu-ZŠÀƒvÛž÷ ¢ê6OMÂëWðåôwΠëxkѲ=v,hblGÂYÿN‰ø:BØßå?–|Š´~þ÷$í(ÂÎì´¨¤µ¤€YZ*¯“"Žãr$(¼Ì´hRF¿>Ÿý²„\ ]ýIçDƒbl/ë´çlx²­j–7-®Gô¼ÒšCɬ+&›Û §Ù´ÈÊBçÚ1ÝÿQRl ¥J=i$gªç¡%´ØaiÜkîœ4̹ò!©ÎÛÚ½žÅz“x]‰ì¢ó N&Šù¡¸ô)%a Ë0¶þK +Æ[áÍ"êÓ£ªË+£Ú€V1Ë: /¤­a¯0V$±ˆ‡G0C[š¶·Òg ¿¨ß‚>j}¦3õ( HùÄž¶‘&æëŒSĬžT†e2¥G»Æœ uï&Ù¡ýŒ4¿Tˆo$*ü>öZ™–Óˤ5°õ^žç®Ž‚ˆp:èA{´ßÌï#î‡uN¿gAY6kû[ÚUÑíWÍ° mÿÇÑaô¡ YD½nÉ¥çÀ·\Ì›ÉgaŸJ÷i-Ðܶ +†™ JÔœ;}s'¥¡{µí÷È­0RÂÀéþ Gfݶ…P#`ñ³?¨¹SÅjI´M-z5köÈÞØ Âám­53 ÒÎs¡‚:ÀÔz(¢SdUpÕ¸ŽÐ‹ÜÆcå‰?±–§|AЂ¼Rî?‘ZÚ§Õv*­ SS j_bƒåtN*O±¤àÉ R|ÛoÚA½Ûµ|Á³šÿ°<ã'­yÊ’S£Q½'¹uEùà úòç†Ãà•‘ö2RnLœta8o/~2H:â ôø•‰zÿ±5>4YÂ’^!:g8p0'sF±«ì9úúì¼-Þ"ŸGOÛ¡k1¿V™UìðotçY}…²£ƒÈÛäœ*i] +Ñ1[á%Dl…·«_r(¿J&fÈ`v +®½é ¢ë7µæÖ©ÕæùùV +[‡­æ Môáßß¿§»µõ˜ð¾ÊàØ7òØ™²ó qwHf +êêÔV§Á;w.øvT*— +813Úq}ˆ`ΕÃ=é­¥?Yÿ——lò¯l_JNi7\¬!BuÕ©uN†èú3éÌo‹ïS—¦R¶¾ƒjpôl'{ÖÙÿ¢¬1|¯ƒ@H›ÙÜ/ÊŠÞÑVŒ³Düó¤—?G¯Çã^AzõŠ —³JÑ“JmhÛ"q;äV&¼šß# šú)ÎÙ_s‘,Qôù6—)ïG0{Så«ûË›íN6N5‚Œ½Ñ=áCWv8µägóïïBõ¸"·±£y¿á¡z=˜Ž6ŸþŒüI`³¼j!„Ì¥ôÞ×XÖ¯4&Õ—@üûêýHáäÈj-lI2åTØ$=Ó(`ô~î+ SÛpY,±Ó—+BMöT&ì¥Ðä(ù±2²zùDWUœÖÓÅ uùÉ<øc–ƒ!ðä ŒÁ9ð)X7Í:îa¨—3gìû5.Œìs¸M\Þ†ªž:ñí'‰üíΚl¦ßÅ.Îö^ß-ú›Ê7\±ë¼O®Œ£‚·2Dï€$-;:4¶pîùÕ}aa•Í5ùþ™…<ù\n'âן4ÆëVsi´P¸ß}RÐõ´Òb,¹¨¼@Käù-9 $†ö’µW<[x´bVlNˆv–&¿ü4â‘•_Ê9~)5áE§ùUšÀ j}¯%©úÔJ˜1kô"oªŠ À)u¯ä¨•i\w¦ íõßÞŠ©~?OMÑj”©ñÃ$’Ÿ„\ÃyÉgʅȧ¿`„ÆœçJDsøÔ9Æ »ÔÜ …R8ô9¬ù/y¯¾InÚnøõ%/Ô“ˆåpøÝgF˜'Oœ…Œ2í´‡è=¿E4y›Ü:Ú¯Jþñè°ÁP³ÃÿŸ°úÖZß-„†tN¢&Š“Ta>o5ý Ì[cµy^¬€ø4ÅûIíÍ‘Ž)Ó5g¶.Nd™ÿFàòín7Zòƒ•nK‡?¬¡ôÍ@Ç…«¹%(„d·+ç(€z|´én®3Žø¼ ôíõv›T:Q‘¯ÊâþQ¥T4Ú=Òø1`,µå”EÌx©EkÃiB^˼í^âÇhåü„ š5}ç¾,÷Lí´;“y]AõL3å" íu0·Ü„k—ç2z"æFÅÒZëÛ¥Î÷àï +í€û_d=­„6ɧj¢¢¯¬šÎër¡ôT6°vžF€@Î|i¯BÐ+lžÕ,ßVQ1éÜó‚]Êfsá ~«\I&ѹ’ÝÌϽ¶Á›®“÷;(»Ä‘F«zdƒòC+$xÄ-bpVd¢eÁΟÔ^<¨å`ÁÓB¦åqê– +9§Úx†ksèçhØ©òUVzl‡Ø2¼ƒ>Òʹ4°cÍíõ#GT6,m8œÍô”&4ùô¡T B…H^‰ ˆ°°Lß…Ü¥,ví¯µÇs~7œ 2Ïdw@ˆËÛ~ôÉ„óŠu¾1[¦œŽýå°ævT§î.”Òn±,Û€–»À<Q« î‹ÿäonἈ}Þ¶] þ„xþŽk¬ÑÑ <ý; Ör#,?;ØE®‚¿´Ù«»Oœè ÉÐÅ»YŠá¯…•pucã±<¤'À;ÝI›.Éf Ìx¸=@#î(‡ó9qÇŽò!isÎ@ëGÙXY§Ð¥Íf‡É²ž¥œa°>~ÑÝ ³ðì¡EP1h»BÈâgMð®É¨æÝNî­xÁRÁD¼“ÒZhfbp'šœ0s²`ãÔúóÇo^Äo%‹<¾\ìöˆ™h÷Œ'²ÖÞ¶ö¢¨ÚÎD½ s…í°àÞª¦¦“ælÝo¶òˆ©°$"ÜzDçÛ H +ðÃè4ÅÞüÉäì"ŽÒ+X½Ýæ¥A¦“5,¥O|H1¦Y'0 +Óyy³~³l–¦,ãö€Iá¨ãåöÙT.¨’X"\I}ªçbh¡¢ð ý6zЪ<ÔN˧ðCz]Ÿ[­§Ëø®†¸º\Ä~©ªhJÈjÉÌO=äýô¯¨ÑDl;dº8hql²µtoñëaµ¤úï:…~ò‘«6;l·{iJñÀ†Æ'ô8lµÖáð,kCŽ}sÔœ•g\‡ì“þÅ£œ¾cÁŽ­˜¡µ#~lÉü—%#Cl¬¦é,fÖt)œp”G³•‡’n/è˜b'ùÓ”B Ϲ/ž¤›ú-RìûáØ+…ðž¥AÞg¥³¡×ZfîÜJ¸…Mºjù$µ»Õ‡Ðè4‚Îaóøì-Ñ…qÉ"5g Û3Ò%ú㉞•ä%éQ~fw„]gªÀk¯ÏQ4ÒkÙ¾.¾u±V›¯ôED¸ ¡ÆŒé[{!ÔLcºï¬¢úòh$¹õD‡S!WŸ/DhñÍ™‹õ§ _7p5ßžü’•ØïDãþXª€!â®î£¥¡èßú«”"ӛƖ„ÁI¡Çr8³Ò3¨b^Ÿúqÿð¬Ùt:Lácù/_t ßË&áªZ¥Õhó·z¯=‹F©˜ÏâŠW†¼Ï¬}&àØ4ŒÒ‹ä˜éqDnÑæÚf!þ´éòDøVTcI‚¤³¾Äëxѧ*|I²'pn6¨–8¼˜Ê¡£ +€iâÝ +muYBÌuµf]É=Öf·é&éºÛ<Þ¶x²Â…µi¢÷Ͼ˜IT¦Jº©›*†AWïÖ@G¡‹[Õ‰"Óñ‹ØU“x *_»èG'M¦^DoÕ»ò÷+ªO6ÏÔojƒ¬e§Ûþ•gÜ}§‚¶¥p¸i1Åþ*¤»©+…}Ï×!{Í0}$oúniÔ.3piYØV˜—)ç¨÷L[èù2·ÓÉ;€œå3Øå›,lEiÂôõ¸ Þ(¡Ü3å ͤHõƒ^ƒ°`€MçØ»5Þå+¸cä^bs6½Ÿ…,Òf›œz÷îà›E­þ?ŽL4eyfŠÿg¾CviLUý¡A(wG!®¦æ~ÏøümôFmyI¤à®<ÖÑ|ÆÂní䔉P¾©6À Wǵäñ}‘¿Q2Éï¬+½u<”š©ï[ß®“þ3¤¹E ûy_Ät[te×ò¤{NZñÅòŠþGßê¤Óì–È<ùÉ}íGAlX tÏí¬T›Ø‹)1¬ö¤¨Í)ï+EéÔÌqhAbðö§' “¬›ìƒùbÂÍjP¦CÖ@c¥>eM°=6 ñüùIPg‘E€P›/T=“¢×”õæ_DpĨøçN“ È3ñ#;ÇÝÜ<ƒ‘áÜ +Îÿ'½k?ât$í:‡” ^´^þ6T›@W£™íƒ…[ù–¬‰ßGÁºªwq˳ÆÔæõöÌÔ ˜-EÊ-àÜdŽå£öU‚é·4Á%™‰’DvÇøs  IýÒà#G€M8DÔ,B¬•©,þòA¢¿˜02} +8 晽󗨓½ '‡¿K$.§m˜«:÷{ˆwýV·Õ—ûÊ\Ÿ³!{KˆÆÝ7fä–±9¹Ts^d¥u.Œ‡7%ŸÝô°ô-ú]{N bô¹øwfüâ}ž±È ©÷DÝ3ÂË`%)Eù`cªLccÒÎöiPKL0þÕ¸F=ùÝ^ïŒwÆDãϨ÷vÊS)ç¹îÁýë›l/KRÍ µÈ2öjæÄCžs4:èIjÜÕqYnÄû$’–0°Bvjé +¹úxågC[Ö!)è80*²€R´ô¹’ÃRBÌfãÔcጠ̾ŽÓ–‡ÁÒ]F?¾pÒ.#†²!–°Ê%ËU˜„jßy¤PIƒ«tüèBjN©¬GœD£ëÚ¯I7nÔp¸Öl,Ë›ý¨ÅÅ>ú–ÌÁrëáÒªÒÔjªGÕÉkMÇë ÄßÔ,šH_*i«0‡J’m­H‡/®Klb¯æWŠnéö>¡Ì8Nšdí¦.øÛà µ4Æ¢ôé%dÅFöd·\@š„;6WŠKÚËå4ŸÂÖzìG¯îgEŠÚב˜ èèå­³l‘›"“ù±/üÅî¬n\¾²^_l‰VE´XöŸ ‹·ßÄ :»sÆS®ƒÉî=<Æ/¼ôó¿jõ¼f^Ã<9#ïǹ%DbÊ!DÄrÝw!šÍ¸|Ô¤g/¯ãúVùW@‡‡öPt×›ŒeÝCÕ/xzU{¸3œ—™FžÿGASkèdÛ"ྰ ¡=Ǿo#¸„îÉds|yFzë¡ÞºN•”C¥Ùr‘¢u­cÂoš¢ð$,ÇljeÝ”èi;/]6]o¸®óPc·KÖ$ä’ZµŠë¹¦ïB…À ,¦Ê¢ÔkS5Ä(öÊZi…í¾oJs쀗éYïLEêdùáÄÉÝÍ+dš¢L”Ø™ñchj™äºÒ¨2·pîiôyB=N5˜·z©Ø|.D”ÅV©^ì–0/°ñCW‚M 0¤·Šªˆ<ðCÍúÞÇ>€„)$Æ1\QÈ\²]ðµ6å†æ¬“9±€\¤Pµ“mÊœEI!ôñœ #bÊËŠÒþ-“’GÀéá“ؘîLs©Q +¡š"zjú’=¤æÖÊž)áÖŸ ´ÁUä€õïÊ8/½DŒ>¡$/šÀV€û@Ÿ}5Âñ2tùs½ÿͶÎdàº-L~Öñl¬Œº]ë>f{›6P„Þ@uH§6Ä”{»½k†\f5òž£7¢¸rv¡‰‹^ð$ØQOýu ‰S…æ1ò܈ÝoבŽõn õÔÖoÑÄõáÍÙ”º1ŽÍõ#“(^îõ5++³läu¹f‰Y]$‰]ŸpT(eF{9ŸÄKleã—ÿWU&pÙø œîx +­M…Úß…g¸ë_9ô=âå‹YÂÀÃÀ<Ø¿1°­d“ÀCSð–þD¶×îzˆ$[¹½dÏjW2^#9&íw1Ì"/lÙ€!/Á±€èr´œ.Õ[#Ÿ˜æ1iùŸÉµgm'p•®` ©F4±öì¡Zz¡/""¹AƒàQ}VÕ¹Y¸ W¹ão‰†¦™¿i!'$S’:ŽR}®–^UªW˜Iú¾ï‹N>;~ª¬ÙNrEÈ4ìJ­JCšÛhV Ä>×[®º%ê À]O»¸*]fMâg¹B˜&ÙÌã\ƒœ6žIÀyà°áIn‘#œc‹~³Í"eû0¦º°€›ÀÞ[nâÆ5î-zUö,ôýYßW\ù0‘¤UÔëɪŸÖh$ASl ÆÚ–þëþ@Cå‘Øš‚³rXºûµšXÒÂ/`Ùciw# M'qvŸLêŸ4‚¦D*õ+u–ª8* +Ž?.@-ËsaŽ*r^YKÊ›©é._ò¼¶üem¶åƒ8ÎÛ;Kâ*ÝW?FëT[Ó4sp«¸òÀZ@ÆÕH‘ï;©µ×Rv«·bîý6¤"Ð2yªí^³ÕºPí3òŒšS¾€-ÓÊ ¢â[r‹“‰aK[á=×öÙ\¹ÖÙÚd>L¶ç¯ªÕÀ{²‰ƒ]Èâ +p’X‹:·¶k@m­1îÚuÄbÇx˜GžO-â3~PÍ…£êMYbØlï›5´FÄ 7z7¾`.;Ù§½T,Ø|IỚ!>¥²ÝDåѵìk<–ëKÛ>ÚW«¦,·ôUßÄqG$­å7,W¬ÁÒj}‹áóÚ¶úÜöóÈ’Ô§r€’*Ùw#Þ"z¬¸.â&óÜ»G,,u[j]¦“Û×õÍ´¨7½ÑÅÙë‰só´©4œ úꋲ*’b}J¨#?Œ¤¼f¾KVµžNß_ïöºAÐvÀ+)-±Sø8ØíùŽÁ}6™ò‰8íã²OK•ž–®IÚ‰Ö÷ƒ;=ṎÌ0ð/½Í%¹¬âÇàJáü‹]½²jÊÖã0à¦ä¾ƒ¯Eâ["‚9ãàðçQ*-ô{¤k·m`l"“¬d­1YÖø:Ÿ}Ä¿â³Ë(*ŒŸ3àíPE^FùÅþ¨ý_Ho.õ©ÝZ‘¨£âa ì×Íèõ” +¯{ÖZ‚¢3È‚X¤m‘‹€T ÎÍJ*2›?ðâ¯C•cAKÍëñWïNc$7ŒqžÊèDc=B;ÉÝŸ"ØP:J-K +8ˆðXñuÅ+ßaDÕ^îÎùtû¼-¦ôÇ„>€²kwØ÷ë€[ãÀ%k@AõŒ¾ÇEˆPPEòN±œø>îìà` a +ø5ÃZª‹æ¾ArQõºNô†ø褧"$ȇ¢gûEäDœø~ø]§”ëù»ã5ý¦Y§_}å¯ZØU26Àö÷šu~¡'}³øŸþ¢‹‰W´‡)§U„ á#EÛsnAÔ¡t5Hù~\H+R#*9 U, +`¸?ƒÊ¹qÝÌV“]Ï{è·æœ«©ØMÚVÂ9{ ”P$­x†1£]ÚÖÿW‚«Äš÷8^ý†ÅP^ý# l-CD|†N¢R¶ÖÙ¯kFyc;†Ë¥Ò³)©"\>§¢’¬Ö~þ×Ò'K›•Ç#3YÌ+ï¹F1‹S"K”ØBA‰‘ƒï>s8Y×cÝAv”†ÿñÏ*ʸŠg:ôÒ/r£sSØèIŒ¶þBæÛi[“êËyµÛýUäbE¸7_/И³¯á4ÑÂ;†ÚR"xÑGS}‚hÂ%¿±—êÝi÷Î.|®@ñGç÷Ý5:)HNK¯møù)‹V?ñÎH%áÄ3˜þªj—8(›iÒˆJĸØk5ßåYGªOÕS·`ÙS ¹©á° ä”àØÂø²¤»$8”:G*JÍ8-dÖÍÿácŒ£$rW~A~ê*¹­úÝ“½XP§N GwÉú>=²ÊsäðBìpvôÞ4ÛÙHQÁ¯èä­ÿ #Ñ]Ž_±+OH®ÍI¢™ó¿Nvß-<ƒS?*ØÇëfß;ÓM«]íôØ{Þ]ñº”W!—õ™ü¹™ÐÆÐå.’iµ‘ƒ5CëÖ$ÿ_ÛéŒ!œÜÂS³‰mw¸n©ŸZ¼¼ªÖV%¶•+«g@>³¥µJk×#Ä;5 Iì´üy¼P—võ.°Rçîa +̓߄7m ÉBÕwÁÆИˆZ¯XÏŒûk‰wEÔ4y,üÍËB[GÓ9iä¸Õ9‡ñp¹·tu ÷µL΄týG6ŸÜmêÓfô‡ j¥®$ýõÂ`ú•Mg\Cs+o¤Ž8üeD°Á>SàŽ†A¢»Ì•ûòÂÊo'd“TŸî6|ÂaRœ‚ߣ„¬.RÜ¡²v6ˆËQÉßÔ&n$ïbB‡<ÿ] ¤üË0ŽÆš”¬øh½"ÀÈþÁHO¦ïQêC–ÒuüùG@™ëLa¢ï'yÂwŸÏ¶mÁèNiàOYx³¹sï)¬í£_ŠC„Þ?ÄQ¾?óµH¾}žFãQžá3¾v²³CÚ²Ÿb[Ó×O=7Vª ¾2:ï#‚r24­ä‡òýkl›jtÿËZUÈd6PWz +÷ú*ü< `‚˜¸ë”ÜÙ;µjtñÒ«ëÂV§©¨ôJkÚÇ)ì’`ó¶åÙ¥¥q•á[fj„<9Ñk1PY`QÃ]eu¿J÷["W°ç‡ ƒ•/¸ ¹_æʱÎrH+Ú ]º4wÿôEÊHVÁó|Ëè“Vü*Tö¥à´¼ª/@ù]R xàu„ ¾ëÄßÕ¾èfz›n‹æžBbß<ιáB¦ŠÁOÐÕ£©àUÍt¼HÊq ¥È.ïÅå°—„NŸîmÀÕ¹ˆÎ±%ö:D‚?ÍÍMfŸ ¸†_Ó°V]¢dõkC3?Xy'¯Üä8àbR‘iSŠ%Ü­±nMF›F4ÃVÝàÌ#\ÒzÂÞ,Eròƒ-–¡ßg>u¬‘/ä (ûÓþW¹åÀÂ:_¡£B<HRáï棊çžÒ²¥ÿŒâz'áCM‘-•¿C> =µ`åîÎ%¦ûôRÚÉœwhQÏðøêçô­ž;UঃEËý¸þŽTvh­ë,¶®ÍÏ›»† hQaˆ½·œ/©znDïx² fZ?ác (ÖQ¸ŽM/Ìx§&ÐKägZô'?­É6jCtöeÊpŠÞº90 V1¹üv›Ë”˜¡=ÀÀ”5l#-4¹³n*tÜÖJÅlpü¹…¸Ô¤{ÈaúsjÝ 9º] ®LÄŸ•¥>õ%Ü'‹Û=éÍ“ Ÿõ-Ÿÿ¾¨LÐç¡4cÑC|]÷²e²ñX× +\}¼enÔ…ý‡ô².ó€½_¿ºŸ +Ç(¯¼Q4ÉÖÑUÁîÊŸYSt0,ëô!¸„œ„Üm~ý½1N/o¢K»f§’Dx}6Õº6ÆpušâTÖ=A‘Mhv}ø èWïx~¸¹ £ àî•Eñ¥"0‡xᣮŋëÒ¢»ã¯áñÕîï–n‡ÿWg¾­êîË'IUÐ,Vóéؘb­RÔ6‡¤wÌu9æKÆM‚4ÿ0,ÍƾPJF?ø•H»•{R¹Èуƒß‘ÃŒ‚Tß¼£ìÈKæ—ìÇp¦‡={sXF PÔéy~ÊëˆþìË*ɲ^Šh8œiil}GŠN.yy„u»–Xž/4˜8r"P™oÕpŽ,äñùb?Å8€oU¬6ù¬ÿKM™Rß®4ïààbqeø;¶vðÜ({¿ žè‘ :ÁôWÆ?ÃoªZ’šÌ~vL&ÝÚA#­/Úï"¬\å<9—"nÁö{3Mm–7ï[§!8²Ô¾Pˆçà·aÆÄœ$àÙšôËÇÊ^ý°[ +dÖ@$mG Ûþ>áÙׇ ó2hòaØÇÆ÷]Ê௓aAÛd»¹5E ©p…"…Ó,ö«cKèÞ¤á j´ÐÄdCÞí@ꇛ H-õÍ&•â”' šˆqžÜNºç3’1ÇÊsÒXßÌ’Wps–¼ˆré³õ'iÄ"CxUÙQѬ]hÁHù—ñdw +̇˜³‚Yœ›Aq­„G´`Ä)]ãi,ámêè3LÙÜ«J¼ú1|[üˆ;õ>À¶  ÐÄŸ! +¶¾M’UŸ¿‰-ûì&J>RxÙýÌpÍDÊF‚µ•‹—·S»ŒÞâxÖ·ð½µ÷}€®?ƒ¯ÊGP³¬T-žg?¥™¸|½ì À&—ü]†Ò^¾ç<„²d> +stream +%!PS-AdobeFont-1.1: CMSL10 1.0 +%%CreationDate: 1991 Aug 20 16:40:20 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSL10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -9.46 def +/isFixedPitch false def +end readonly def +/FontName /YXBGJA+CMSL10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 12 /fi put +dup 45 /hyphen put +dup 58 /colon put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 73 /I put +dup 76 /L put +dup 78 /N put +dup 79 /O put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 87 /W put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +/FontBBox{-62 -250 1123 750}readonly def +/UniqueID 5000798 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÎ僥É99>'´~ ¤}(Jܤ—×r¼¨ÅC8ŽmÀÑâÄ”G@G ö^û7°…+§©  6Ð}¦¼µ) ¹µžþXw4z<^efªÓ2þo¼ÎÑAx‚*;Öxu&=k½ K¼öä‡î­`ñ»v¢qמž#ÒfåzÏ,ØÕ˜ •ÌÈxo„Ë6ÂTvŸÞ™±%^'ØskhàGÈ9à‚¡3CçÁ’á^¥™ÿÀÒjÈ†Ì Wå ÞáY½§ªf~ªÃw¦µ‘~‹(ërB}’Ž°´¬®~/±,I+Ø×y‰œ±¾9ÎÝYcÚ×HwCU;O~÷ŒägózWµªSº¹·þöí¿{ºü@×û¼sf¹â¸Ê¨A°TŽ¥ÓãW8ÒS"e¢›ÇËÝ¡¯ä´ª …Ò¼á¤Àd8»hmîrp€ÅÉ2 ¤¶ßõÔlA‚&$Y…ÙÉËÊŠ{iƒa ÊÎCµ¨ûd±”1@V)Cú îZîOÇî.ÖY\ED0ïêÓÙû»x¢ÀSüYaͪ`âÖc=ðïHdªó‚ü> Z+zQ@ǪH^n„˜w ÞCÏØ’¦¸NpGü¯Oå5B5îÜŠÍ ¡_Æ¿ý‚ªÉ5’ÕïK³¨lkÆ åé Õ +oYãp§¯¼ªhؾŒÊU%W,ÛÔ >æF aHòÁ¦¡IT°ªýÕø_½ +k\i`+ Ý¥°i3u.S}xâAZÕÝá°ƒ¹rÒÒÛ¼nÙ¨¡ÔôœÞ5 k²(q¦ÖºoWà[Ã{’Â¥d_îŒ.ÊL•Øʨº*8ÀãÁ6#FË©Ùg4OŽbè:kGŒÝWÐÎæáÀ Ì^$wf ®ÊCmœk‰ÆÃÛ)lÕž¼*,êW­J]r³ë^ëîí¯êí*¾†LS@¤´9Ÿ÷TjË"2ãz7–¼Ÿ-ágk¾ï75ýÝí}‰˜,• Ô¬]ÐÝ–ü¨° í'°Dh™Ñáãê*˜« G“¹³o3.T~j%D…¯¯š¢-çÍSH¬Ÿ~¥›tÈEóøTÞ2¦·(]'8nµjb25ÿI#ðĈºœK棯`o—”‰žß ði)ôëÜo|p`Ad ;Ùÿ¾F­'MÜáúžì{/ò×4&oLѳÝëUm“‡g«²L¾ø¤ÿmç5]¤÷+ö‹øDν\kRO +êWz×#xÔ“Ž ¢;cn²]ï…,òìdi*_ƒþS/b +ö €Ãýfx-$ ÍðÓ ‹j%DhéE[Ú®hëVqÙ9Z + +A®ÖjTž[îTpð¹ßõåRɦiK¢kGUYÀŽàêÂ*÷÷—u"ëJ_"%H7-«bÈÐü†œ\É̇lÍ¡–ÿíLï‚VK=< +…™å&¾kϦ¡¶§Ù÷¥´çÅâ»-V!Vì P )BÝè1å Ø&k·,'B¡w|®º|òÿ“›Ã‡^î…ÜKl˜ãäûæ‡LM$íÿ„°9äb£Ö¶÷öTà0ØŠyhœ›„¥’q÷)©¾šØWYvš¹i +¹4€änÖ½¹ƒœ´cQêbq$ñÒ%UŸéX¿ÑpÀª˜÷Ø +ýýK |v§”+ÝD_Œ}™AgUoÕ$~c>‡“n?»à“ÞÓ¢ÐtOl²S`1N{8´@Dpäw`ò¶HJCƒfY †ˆÝ*hdùÅ3‹[¶¡÷-0ˆß Áë[85¥D«Œ;O›7_æ\¶”YË%3Æ/“;&i—æßÄ jã¼²J-äJò…¡\79‘ 3HMžƒØ<9HªœIŽC忼úê&E7A™nÞz0¨‡Ì³¹àÁ—'·¹!‚¸B”/’ƒ¹ðÎpÁƒOÀº{ÍlÁ¸hÛ9Úò–ƒ×™³éÁpjŒJXä÷L™Ý~p¾Ö8þ$¯ñó)O\Q¢z"hÅm>.iJ ‡Cr|ÜÙR-&$DdC/U„m‘ž„aë(Þkz€sU`ó=Ò›à黡c‰àmØZíwò:ÝoS‡ŠQÎå/¬ãJïY0˜M[&Ò^ïÑ"ŸþÂ×B²qy’#>ç­%oÝÅ|ÝÆ1á‚à„‚ñÙ¸<ÐîµÁ–¢Ïþ>˜Äd>ru}#ƒ©|ík~yŠå©8·4ÝaÔúŒx’?·X@öÒÖgXéžÜ†Z^.0p6D³Þ‘êx‰>WAÆÃK0; [ì#ù¹~âÎr³«Ç‹,f?Ì¡k§ýN<¢òälßþJÁ%cˆ­»1îUwd×°`›¿Y É6¼‰}µÑ»†‡úg–Ðb×¢ä`f7êªaF\„·­BzÀæ 8kœXÖ¯P(3R|_:`T¨H$xøb'ª‘F®î" îŸE¦ ™%k³éêÀrHË4B‹/$®Ì*6 ålŒ·Ž#Fçý +—„ÊJ²Ë©O~›ð‹X«Z1k€‘’€ ô:Æó¥Fá›#•V¸M~¸úÛ‰ÁÙ‚Ö +zú2¼V˜®úèiFð‰”R;Xõó@2j(ÀÌ5!i¹ô–ÈHšVg{Ìà…âP¡˜Ý5µ7ŽÒŸ¡1‰Ø:ߪ uÿ^(&l¹Giðª8 ÉÏõ›4òUµÀí |V^¸4ó¶ µý{¯³¸©z’ )¯`D® åH}ú³Æ?s¾ûÝ„E†âè²ORÍmZ#yƈçïÑzO†Ø +tîÉî6;­mk¨‰½9µy:\ØM%0ݦ¦rÀÔ!\CîÎÛ\ýQ]4»OiúG¨Í@:@¥x7ê…mR__õÃÚ Kpv…cü¦4³-¤·ËÙ¾ä¶E†}ç'Tv¶—ݦ8ëý¥ÿÖˆÒ>¶¥Ÿê³8“Îò¥÷[#îûQ©Ày¯SÞ*Ag ˆø$KÅþ¨üAÄ\$òíkàýÇ/ñ'J\øTŒï_¼4A„!“áGñÝ$F³R3ƒ$`²ÏfcÞçWZ”Ü q¡[ìlc LY¼¨Œ,~ƯÊuÿK8{?º¥_ò™3У޺¿Ö¯*%ëñp P»MÚ¹y¸¸v=D¨Y©lmH~¨-ŸíÍûý.ζw{t¾kÑ„~†É ÝXƒ²¥*|?‚sö[Ô„ô-ý7À-ÆÞòkãI/¥ Q‹êŒ´š¶¨ …8”Eö¢Vl!Qü@=®H4&O ÓݨN˚Š+´À%3s»Â#®>ÀyØLõ”3ÝaZÞL\–ª~EÜgü\\HQJdÒ A9……¶ÏÕó¦´^½hU’÷áçá>b‘ò,G¬-Á‡X5ó}¦Êá4ái>²j€KÎF¹×’€È’;VQ«}ÑÜ[ãÝY_¸4%žÁ<ÂÌ©>…y`zÏƵ¾î‚“à¿#â3æ +ý(¿¼‡I”z^ª¤G{Réa_Õɽ¢E±Üí¡õö„ýÙž(%O]ÂàŽ%ÃNÈ4°^•.‹ï +_ÚO{‡ç¡…k§Ê‚À„¹K—H¡ËàQ;(<’Q€ -3Á˜¾a6Å›ÜXü°/;)KR8› +/¦£ÌØývÆû˵Ÿû1;‡˜‚‹ÐÏØdÝ©HñÅäÜ.OÁÈ9Íâ¤17Ý©ƒ5¯#}Š¤§Õ‚º]ûkÑ«=`<…Ø‚]¢ŠÇ¦6=,¼ÿµ×Ê.ˆ,Æ3ƒ’si5öeþáô(¨hËèÅGœKôû7ÈXŽìÚ@†®¢bÂUÈ4ùÍC˜êÒ[‰4òE2¶ƒ2ÜÃ"u…C¯útÉLÀf6â3ÕÆ+‘Ó>Š²ne…\zÍ„KDÎÞ„ˆ¹R’lã:ˆNN E$cìÈϦ4-Wã¥×epi°W fxžf©‹› A_Ï¡7`Û&ž”õð€_úпܙî8ü{²Õ:Æx ¡‡‹À`6Ó‡¯!Rå:N ñ½ƒ²ëyœSõYáÖ«ç9EšMõΞpo< øŠ Ñîê-Ärß'ÏÙ~G‚éùz¹.fD>¸èZ‹G}Í`ùÓ©¡1›æýrÝô4½%>¹iõÞ0bn ɬP\!/ÕÒƒZ#³ä”‚tv+³¦Aðiµ×»yjO‰µ=oKAìAïÓX¦ó+…kZ˜ýpÌ8zËâwÁ4’w[ Þ¨ž¢î_¸thÄ^ˆ^^)@î ’oB̤ê쨷à‹8'¨n³‹º+@|—˜¯³¦cÞåf ü™lƆGw‚OàˆÞà›!b¸ðÈrôpËS7æ2‡iߘCHªRé³G#®ò¥)ÇÚý™åà`ÊAÈ/|מÇqÝüÌGºgƒnÑ/€ ¢?iÖ+¸†¸„²n*àíkÞ}dÒLe°¦´çXò:»,Œí 4w{½tª!`J6^ì‡Ù‹¤¥Ì4FÞ¢=èS‘=aÈöÜ5 Ýx[èÔðf7Mþ‰¦’Ÿ¯o6t|åAÎ|ˆhGmA=É]ÚùùY O,I 5º=;°ã«©8y$s) é9Qÿé\½©‡*ø;`¹˜K ýÓ­ÊA{H¬,Ö"Œø€ÎyÔØ—¸7(Œ<ŒžfûÑ?Ñ°m% +ü•)ì\lép¼0w&ép±‚Lð‹õ5@I™Š~o[ëõìcÖ¿[—ý$9•ÊNÞ†±¼ N—³f§Ã +í‘äø `ÓÉ÷c™>óµý§I%·v›hšö'‰pK!¯ÉÍ‘É.ë?Ÿvþƒ†z^Æ êÒYnÅ=Ó B÷ŸËÊ ˆ²JÜšÔô¾@Ü`úŽQmàÛ_e`»@ð½µKûϼõF¡FZæJÞ^´âOq•%xû’¨ÆÙÇ épUôô:ÜÚmä”vhÅhº¤Ÿ¼L‹ÆÂGQé‰IXm{`P…%ÎRanÅ FÐYÜ"'¥HÆÇŸc…l#»ŸLˆˆTaþ.è)™Kµæ €Ð’ã"ÕÀ!oÄCFì–¶ ¿¹ï-³ûz‘›xù©p…ŽæÀ½²bßcð[;å©ÙˆN +DWRþ‚„ÂË_<Š$L¡¯©*x„Å¡M»îe˜Çk÷»X_wŒìô¦Aª‰¢KÁñ<‚wd–Gf·œ:Ë iêšm/‹±fp^Å©õËÀ ¼˜9*â4-u§ræ@º6 “%Ïs¥‚IÍÀ@G Éͨ¯^Uqáƨk˜tæî¢ê·K6.£€¬†¿ì•.Ï Ê9bêÅÈäuˆÓGggù']¼ÈÁÀ$™¿È–ÊÅe$6pò1ÐDß$Ë1û¾],užc´9­Äï (ÉÄs\÷݇[ÒãÅà èĈ§=Êƒåº ¶;&úR@èþÜS<›5—ŽJ©šƒËzK÷~}TNëý+Ä1³-ùÊn©ý¯ÂÚw™k1àÈˇäØ¿ÈÊŽ5ÖÊÆK¹)¦þè—\šò‡QJ„Ó:äÇ÷ƒ]Ã\q™¦& +.<–®ÉwE®x´r×[ÉIþ(§·QâÙ%)þ#ɲù.ÓÍÞIóÃ#=,âUc1ÝDö๸@\*%c$õä»á$Õï?Ô´:ñ]½mƒ$䬼]Úì"CFZ'?z´"`t”óbJXìX‹ /O¾eœYC°Õi·{hþžË3ãp书aÉ™ÅWâKYÆÕÄ(]Vª‚TG‘.eâå¶æñ©ÔnÀ1Óúv²ÎëïøpÙ¨R%°bŠÜ•~)ïÙ% .jÅÔµ†Ú*œo÷Q)Ï\ÂK!í+©bÁ.‘Ï>íé3ƒÍš_. +Ît±uvàÎ ÓšG-@‹ÿ}€©¯ŸÒfiíìG¼Ðz—`'—7—#†ÛXÒÊ>͉ š€©ÁÀHŸc{•¢rÆ•L\+'Ñ^Æë+ÍH;iŽuÖRßÆ8èÜÓ_Zp¿‡‘y®èÆÛ¥± `:‹rL‚ßW«D^ù²–뫦Üðèå@ѳ|„¿ìP^Åë¶Åã‚œD?ãýÐ.’’aÉêÖÅ{úébÿF +ÝꥹI °÷/LÃ’†ŒÆÏ“‚a‰3#¬KxÃÞdiŠ=3h²p„ÜÍ£ ÏýÄœââò‡àDïÑ-¶ªDOö ñ,ˆJ¼Ng"§…¡{@°Ä §V°ïEx +Le·oB79¼ Ç¡¹Ô]= û’E’Ü&q—ÅÀ£ÌnMÍ<íÿ¨ÁþY8é-}¿MT'—2y´$É‚ÑUeQ„Ç%ƨ)ìñs +häɹ{äÍ¥ä«UtþÔЈ™z²\Ƽ "ž)ìlrR…‚‹U†m9»à@ü¾O|_µ‚ue'.Cá¶ê¶Îj ‚,ì´U3Lwä‚æ^¤½À1ÀD÷=l%ô?¿ P;€#·gÑa O¡M<¼e¯pß’øìw4[i+‰éëN4}…9·5U†Ô²ø ‘×6Ñ:Ô/vY_ŽÉÿX%øýc“øYÌŒKeŠõ…¡+s^ùî5¥¦G·ÈµÎL½™nž»MÌ¢S¸Ú=#‡àüõsK-~`õÿ¡IŸ4kˆnY[Dî +. 2*Ìj>1z1µö§#ˆôñ’t8¸v.¢þ²{;‹übCƒ¶ÓaÐÛÐë-§Ô'œ]-Éh¶ÒóÜÐ\âë渮&v/èhÉN6ÙHads£Ñë÷ò!bßY¬çf-—ÿäMC”ë¥=çòë.f$mÊîL£É´|꒭鉴äW[Ã!·¡Ïà¹Äø“˜ FÏúé¡ÿS …Mù ïÈK¦rCdÑyspLCÏQ#kBj<îñ¯e¥Uw««ÛD¡Êl¹–= @À ¡ý¨¯KååY™× +\Š³íâÀËÈ[-µSR;ø”†Îó(·ëåäËɶdµoe\ÉE± êK’iî$‚SçØIãPðaŽòk~¥ÖI©˜›0‡æÝ×úáu¹Ìo)Æy2^~Kóœjh6»ÃUaǧéì?NÒ!eä“Q†+:êœÈA\ɱðhÑúyÈ6'ê:ƒŠ4 Z´bG‰ –G žú@é’8aõbÑmw…ªÍ–ÛÈ}­ ï "Ãá—pö!o®[:6-9L5'øL’d’}?¸ƒ¾7ŽB«è_H ^4Õ`ÔlÐ)EfºŸ×ìóÓø24é\€ÅØlñ*‡š­ì–‰÷¤›/ç•úûdô0F—ôë2¡¥ ¦a4ù²[ËØëWÿm„¹x± o¶G¶I<‰ $S¶æ¿º3`#IÉ:PÓùê]©þpd]5¼ㆅVˆ;R^üã¿“Ã:T@Œ§Ûd»W@Ý„æ •'7Î×–UŒµ"ÕŒ^@5TwÇÍQ=ý}îdŒ»)ÉÚ•…3©`‚æØŸ£Ñµí˜9]‰»¡Z½Lý‘:@±9·y‹éú@ò <äµWB/qH~6`å^­îÜ°¬6ÔX0Ë‚4šÏž5Óš3²Êw[tÌÝ‘•Õ#è¯:‚æÜÃWܤ¯ ‘h#I¥„}W¡Þ|þN„Ê›¦•æh + ©nûïãþ‚IjŠ¸ +}ó‘NÒ•;ÓDR‡êH"t€B—)>ãu¨ìÂaï¤]¸ö.d¥Í.}œ6Þþµ½Ò†èÎ2é\¬áªT˜lúÑe;^Þ¨©¡¨"l䌙~¬ÛŠL¾vÝåï9ÜîoL ¾`qî´ Uuˆ!©æÙ-°:UCë/p³$Pfö¦¶Ê”X²æ¸tsϵ,'ü#ýô…Æ-±‚[úƒA•à~WMä\ÂÀQ‡ø4ù1lk~%v—±õE÷x{§§Å‘¼Ýïléî>pOâ™Fj¨R'Ït?„…ôêUuPjh¤•0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +44 0 obj +<< +/Length1 794 +/Length2 1508 +/Length3 533 +/Length 2835 +>> +stream +%!PS-AdobeFont-1.1: CMR7 1.0 +%%CreationDate: 1991 Aug 20 16:39:21 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR7) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /AAPMXE+CMR7 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 49 /one put +dup 50 /two put +dup 51 /three put +readonly def +/FontBBox{-27 -250 1122 750}readonly def +/UniqueID 5000790 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÍÖP +½¥í˜5ö ÏÈð l.×j‡…kPôØ úëPŒ—ø(?ˆ±~M;Àö^Ãyy¬Ü*f˼[âõ:­ç-ѵZ/¿îeŒ¹_[³+ 5{^Ýòd tp¾ñÅ!¶ûÕÇ~¾Ùd¬Z+¾ÉسäŠå»:cÕEwK’+_ö°nÎCdZy°2}m‚3…þUó@-UÓ´HhY@ržn"ô¾ÆP\º†yP“õV¶K€×ë“m:È>Wƒµ÷åm6:Y &¥aš5}!Äç{ê²K }­“Žß‘)@éÒñy"³X…‰FDwss ±šùçSá·^Ü;':—˜‘ÖÕæ$ô£ˆó‰~°EãKNâõäü^™m5IdÆqÞÑ‹ <Óå}¬"å›û÷²”"#põ‰ϪԵ |XíÍ’=onV%̸‚Û{m ¡XeèËd*šF‘^J–â‚œ²"ÁÂã`´‡¤Sý"ìŒ_«cåK^„MKÊ/ÿ7Æœ6m×*Ð)"ÁL 2ö^Ð>BÁ–.Û­-Íê©Á è¯8¤®Râ³w$[ ášwÖÉ6çS Äз Ä©&˜ú(púTòØP>-³Õ/²þ» ò²¯ *’ž¾¦ ‡™¨XãÓ–1½i%¡TÑaß9JÚkÕ+­Ý +Ü?âÙñ^'Ë÷þ‹˜Ä \!ú‘àYòù“"þÖ?5šÉÚ—®Ãƒðgò>]ã1Qè +ˆ«PþÚä¥Þ“Á®/Ü aP³rF ‡Ë#%¦ #I*㬓NîfZ‰Sýþ†¶çbQË%­ÉgÓйåâyá6«"´ÊQ –CB8:„ ïÓ–§(jÁ4ätÿ.xJÔw5†M¸El¾B3$.³´G÷­DMÁlûi«Q[<5yðèGH™×òƒ=¶çojØÉ$S/ZûÏÙ9TK·ÚP…ãpó¥mûÁzIÃsBkÆÙN‚šŒ¿ÿš%Éâ‚:êç9ð ©ŸŽ`” $ãÄ…*iÖSͱzØì/@|K’gQR–Gйòaã•dÇŸ ×š§ÊóÐ…VÆoí«ÂxpÊüðñ‚Ž“’‘Þ¥ð8ûù(7èÜœª~ÉÙgq\—ÆÕw YÄQ=Ò9õ^Û=n'‚onÉnR breÊkçA ØÚ÷)঒rãHhøé=ãI&.*…B‹’»Œ¬Œ <_^?þ)á2Ž4Y2PÑyQ¡ôÖs|pB҇芺Àâ$hºl³à˸”éºWÒC碌¾…E…öãkî³Üm®”%+·¾éçÀ†Ç‹}TáF2<%̸ cWAͽJfþ¨ìÑ•«F/ú‚MñU¼¢hÉÛ¤Y8áȱpî\#ZÙPŒÍN¨º.Œ™lÅC¬5Ž)5"Cu³Ÿήp¶Ö{—9m€YÀ–*8§-"oOõd*8°‚={Øí´T%€mUûPí!†¥Ÿ+4Fš&–× ~©õkëJÏT…*À7ãæÎÔkÈ èž½pfÚs•×p>føX'€[­)óqn©2òÇ:ét +É‹Ÿæ’‹ðl{è[ƒßHq§½JËèoŽj‡Öt¦U‰/f¸4hað¸9Þ_7Grh£™ÐûÓ_ÆÔ$0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +47 0 obj +<< +/Length1 1031 +/Length2 4023 +/Length3 533 +/Length 5587 +>> +stream +%!PS-AdobeFont-1.1: CMCSC10 1.0 +%%CreationDate: 1991 Aug 18 17:46:49 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMCSC10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /NVUTVS+CMCSC10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 71 /G put +dup 78 /N put +dup 85 /U put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 105 /i put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 120 /x put +readonly def +/FontBBox{14 -250 1077 750}readonly def +/UniqueID 5000772 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÎ僥É99>'´~ ¤}(Jܤ—×r¼¨ÅC8ŽmÀÑâÄ”G@G ö^û7°…+§©  6Ð}¦¼µ) ¹µžþXw4z<^efªÓ2þo¼ÎÑAx‚*;Öxu&=k½ K¼öä‡î­`ñ»­Ý˜jÓ©gÀqÉsÆ&µ˜?a0”YAàêù¾½P…ôSHÎb#÷ºâ÷ëÇô„ ûh{5—42O9N¬ì¢W~4}ë1ÑxÔ/اùSrKÎHM‚¾¾Ì’`LÈ’:Å×~YI¶”¶«ödbkëœÉýØR32Zð8øýü*m]¦Õ€IhX¯­°-q ØeaÑ|ˆ’…·;~-ÛdyÙ)I)¥žƒWÓŠi5Þ½byr¦ßÖ“g‡œcÀ”!AÅŸÏ…çÛ­JEõe@å“‹&Žò_ŠîþG¶¯vƹ²vmi5ì°•Š]7ú_ s‹ òÚö†¹¨QO¸rd¹bi]³Ú\oÚ€Á';†giŒÏ& ëOfÔª74¾]á]®Ÿ Qé\sÞ/×™ "¯2‡òORÔ¦)þ]^Ûw¢]¾,óêêØÌ‘ ½KŒ²^$­0e…MŽò^š¤Wê¯_^\¸®6š”–@í•Îø…R½ß2°ÞDù6È*û\1£6XéßÀº:Û9Qr"Dƒ«:WIÙ"Ðôµ$š ‚®Ü ôQ‰œõÝgDÜÖh@ê.À¡-¼„Òêb‹ŽÅü.?Ü“Ë;RÑÜÍrÍþJý™Ö´ÀJDÌ߶/R„VÀìñrp~.o þ´«×ìR¦ÍþÀTWÒ)óåAxø:gk +I«¢ê·¥FÞEÖÁYé{Ö] Þì'h…Ë—,$´Ó±¢Ô½sñ½™‹Rújô~¾k;lêUk 0>”Ô…`"ü’©³v?À þW†ŽKº˜wyçJ%X©íÖžAeLþ¥ì%”aƒC•C£,‚¿³§».ù…×JíefÓ‡)Ý]9AU‚̪ÓE™vWÞs+×Hî¹î} QPÉßcñ„ÈìƒÅu.Ýcëk:õb=ŒhTK-Ë“€ÙôÌUÌYSâZzÃó"$ü}æ[zÉR7Dߨ¾Æ;Þ…MOk‚p÷ã»)OtÀdº|cuvngÚèQb¶?^þË®¸\¤²=ª©Sçúðuo=i½ÛÎwÐAïm)m…œá Oæ¦Èmf6Qb»£¶F·ÎùIcrè9rB´àp˜ÖH[õœödaŸYFÕ·ùDÌÖQ$‰­¾Q»©Wiú!5+…`0O¬iHQub•=E8Uƒ,2Ý‚£J²p-UvyÒyœÓc ½áSÊAXëÆ.ÑÒ(³Pëæ ÝóÚÞè¸ç>5?ëKܙ뉨ŸJ´£tŽÿ/O_Yž“T--§› Þ~Kç®î‡¾ïù ]ŠÎy¤eÚÇì'È|ÇLsž÷±*ÚúÄf™…Û#J™ÚâäbN*‡€.Rt™³¾Míb%«cn>³W/È-Jz$åM1'{«ð*§…¤ïuƒF빜¶ãÈ +b½ÌMÜÒa”©›$mm oÎ{—ŸÄê7™p¼lâð•ÃÉï^ ào2ž®ç’#„›D1è2Wq’(ã–È€ºêì>Íô#N†8DžãØV0Æ«…ÈP0 +MHÎÁT¨#ïv£üùü´—ãlä+tEª¨âç8VÓÖ‹4h6æõ È:íP­Ñºxê°øq®¢ÛYŠœîËÄ_Ás®\»ží# 9‘úrOâðÿ÷:„sœ‚Ñùè+¯Rñ+ý6  3›‰fPâpÕƒÕ©àkOëyé÷.¸ñp®¥¦l28ïO-ôœ?I_Þ,C<¨ÇSbãîDnxì‡H*ZkòiK9wàÑ–kÒV‡Ú£€–ÇðóO×Þ)íU0î`7YrËr©î L[|e'Ž2*¤äðáQi’íÓ/GjÑÃ(—øÖ#=l±:…S¿q™jÂ6cñàz™±Ï@×÷QQ9í ²‰óF.*VÞ§ÿò™Á¼+êÌÞƒŽ…4Ç4Ê\óžø¦åÄ&Ø•UрėՂnLÆÑÂl|ø’Ât§L¦oJ¾ÿ…†¶TŸþpÚ‹O’We3 +Þ¬E±"+‘ŽùBs§Öš'¢Ñ©kLÌÐä­·ÿ-²u=¼žÔÇ…®ƒÌlm`“u·SZ¡°Dô½;,’)3ÄC{yLͦmøÍPr¹¢+Âo av™ƒ˜Ð3®š·tи à–Ï‘åul åXE- HÓ@.ܨi,½l)n­ïôÖ×I/.Æù{3¼Bûº±ö³ê ÿ>¤9¾’áVó%t4¬&p‡ ”ËÐdÖ+_*>(ÖkôYu¿“Q‘ÝDm¬PíÓ~RQ*¨Üp>V.ÁTi~iÛ“ñ˜ÜJhÈífpü¦u{¿«Ç§Øn’ÿX¾MÜ¿õx¾4ñØ›xdIʼAñOTÞ y3oª$,VZòY·QSû¥íbÊîÿÑoÿù¾}ÂÌQz9ÒÉ$ò«¡T¹`v¤È¸:Èì{Ðo·™]¢õ¹°†]"\ÕñØý­@¹m‘ÿ0ÚÿÚsµ[PÃ4\Îç³KÞ?óz‹?³6‘„Ár3äÒw˜åÆgÌ.iwØO1Dí4ÛYGdQËl8áêCÀ²¾¾úÜð– ’€OÝ€ 7²Ä…óu-$=%+þ·îÉo@º4È;ª]~³US¨û ¢R‡Ü,9qYÅœqªÔü^D7jŽ ä£#¦UŠ¨Ä¶ŠÌÆz~hOZõçšö°´ˆ©â%™B;:‹õO÷ÄQêîc£kyî$h]?ÁLXÁZ –wÛ^Blnàk¢A$- ‚Ưƒä\ û§]Šm«i®¤ha£ëÌ÷ØSéÆDÄÎ{3˜«Ú}î‚^Ou&A»<æ!’ÛE·¡ ­ÊfÀŸOÉ®ÉówÚ6Ì0XŽ¬úáèÈ›õbÃS ·øgOæ‹ËVꚤ+Èøö‚Zä$í—GOÔã¬#¶¡È·ÙϦÁnqºÚ#(ïf Ï'],À +؃Ñâj "ol1pà¹yªVo–lQ +V©©ŽU»k{ÝmûÐ ®Ü‚dõ¯:ÅCï€FÂÎ-_9w 4¹÷¡$’½€tG®k;•u¯žàý”H¶è—R,¯K7€Ç$¨R­.9ÅrE-d´xÍà,¬ÝcÇýŽWiÉógWq­åän  `͹!vDhY¾gmúrgÑ7s”þt ’ÈnõŒV%û¨³6N?¾o±›ÐúEÍÝÚ¼©'*/•¸]–\J²¡Õ5û†çGäXì´b6³#g6ØøÖSZÝ™\I SÝsÔïlÜ‹ŒT„4S(½ÔÏ@˜Q¿ížØS”¹ 4¨êˆ,š¹ˆQ†É+§0æœfÆ3 ¡Z¨åÄõà’ö,‰?#\:–§&F›h»N¶E²a"!*‚!Ç{5HUcÔ¿H?\G3˜<Žkð}R@æÞ6 ±úºôM8dû²tYLÙ•³IÚµ [fšc‚Ùµ7iCäêRMšàCïÖ"ü«lP‘Z_ ì]¥Ñ'#öªm@ŸèZæîå¸CÃç ø®¼…‹ 8½®Ra”ö|Ï *Ž2®~ÍÜŠ×G,X~«tµðÞ°¦ÍñN;#x/ªƒ'¦ÞKtÝ +rÆüW„“í|Ät'ÈÉÏ4=ŠsÐgH:äƒ@å÷ïËë`BZP™èŒ{NÅ1xv×]›¥€“'#ÿ|.Ô½ +ü”o‘ù…*­“Ê—¬a$ÝÓþg))\߆žåc32Bu”BDŸ›,.}ìQ¬!º0wF4dt¡<5f6šÚ|à7r>0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +50 0 obj +<< +/Length1 1312 +/Length2 9001 +/Length3 533 +/Length 10846 +>> +stream +%!PS-AdobeFont-1.1: CMTI10 1.00B +%%CreationDate: 1992 Feb 19 19:56:16 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /OXLDNK+CMTI10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 12 /fi put +dup 44 /comma put +dup 46 /period put +dup 58 /colon put +dup 67 /C put +dup 69 /E put +dup 73 /I put +dup 77 /M put +dup 79 /O put +dup 80 /P put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 87 /W put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +/FontBBox{-163 -250 1146 969}readonly def +/UniqueID 5000828 def +currentdict end +currentfile eexec +€SQM(ì(Ú0_«&(‚ÓÿÒ&”{ed›S>µé㨊‡þ˜y¦‡• &öGÖà‹ñM˜>ÑÔ¨Ê-¨Ù…ùD.¹õ¶í—¬|3áãj;ô`ÓLä_1‡—ËñŽ8‰Lô¬8ëHÒOã¾{ꤣs‹H1þYÖÙÎ.Fkbœ{¢ùÎ>Ë¢ô;Áb¥ wÊ(‚¤*ýÎÃô·[]c༎]ÉRWvmŽ¤g­œºô{æyu€Ìíh„³¦pÉO߀ýí‘9çô€Ü:v¯r­›CA‡s ß®þL¿åÇíʯ$’ýp0“.Z<'¾F‹}«iÚ¡»¶3Z¸ÝýÆ–|X'cúCV;¡w™EÏBü±œ÷ŒQßÄØQmCÁ«8èeï6†_ÿ:°¼°pºH“÷H-ÇšÐ=3~R}ŒØ;¸¬zÿMógQôñ*ªê+mr`Àš&é‡É>#}¼Ä¨äè\Ó%Ÿ@ÓÊõ\t,»@­ ±L ¤ñ"¦?{”[úif!‰ÎM”dÒêÙöí`µ°AÕÔ^—¾'¥v5N›„dò ßÚ…^µdÓK .„bZvÑoí¹ˆ¤=-dÃ'hÝkŸTèæŠÀ»s™áoMK t²- +N›[ü!¿ Õ1âeåÿÀTÝNÐ×NÊ ç–pAŸ’à;ËþìóUMf–öòžÑZ% ‘þz‹n¥0GÙ{¥dXšeÊa‘)ñâjÿæÂ/ 8TŒã~ûnž›`µZœ´EO×Çù//”7–‡«Y5¹F¥D‘§sœ’iàñûH±)‚í³½QþeitÛŠ}©/OCÜk6im†Ò6 ³a‘ÛŸêré‚ËÅ8/iÚ7|é@ˆ¢§aµo9„g Wó]ÀÃwà,‰Èrâ.:\q#Í'ìÍÈs’©ýö;´·dœüSï“ìpÍ´£>L¡tN” çxâF“„)àž„õÙ("'.iz+NÅ.ÆMgIÕ«|ZF{|O²µ™¸Sg&“Z_Bm/-­S™[™—tL B|ÑzâFQ@2óûªöþ›Imj+È¿·p@ÒnªCF þ‰Áÿü=€¸f5‚¸“‘+||Våu=#Ü/ï\:ï ™)÷G +½Ü™ìüÄL”VR¡›Šüÿl˜½È~jyù€ê ýÇ­¼—ÿ™W‹€™2Û{›jx2"(U ¥†sù5Óþ¸’½é@Üw„*Û—56«ÂvJ®þÐ#§ð£ ³ŒØÕç¦SÏà‹5tÆ!ËŸŽÛøK°4£™öô#qqÂÓ©gâÚ²‡ð%¨Õ *bÇqßžyïÏé,µæj¡Ó ¯@xžÈ%3o°ÿºC¼àóˆâ…´2é¼…­VA:ï:Ä5ÏÅÓºi{PS…ÞÀÓov„ŸÅPah äÒìÁàZ©„8©fRcDܻգU.ö±Ë 'gJ«Y@tÜ{Mß|U)¹ìß9¡HØU” +`ªØ÷¤ËŒ¿ø«>Á ‹mɵ~|·á¶fE˜mÆÉsopzϦ‡àJ‹Ô‰¤“9EûwR/Mò¥dyýN¡tvqà2EºÒvcÜ2­å‘ìW¡AK2¾>ÜVÖãTÏ”Áד©¾àdliÄí"_A<úsù) Ð¼ì•kü)ú{P ¿ãŸ†CŸÒEFRÀ!=3e븣c-3Š…Ò+¿™ÔâjøõéßÔdÉÏ$ûY¢õÐŒæi v„ƒQI(«‚?3^=^æ¬x ~‚ ÷Ó®ôg«á“þkT¥ãcÇyZ»>fêˆ=¦9ß0„ÍÆú¼C3P nÔ)óCÙwû<<‡Ð×›ö[Ž;'é·(yJWÚ>%ÝÞíˆÐ1?ò󌠴æ‘ñTaø0ÖƒGÁØ]óžPaLÚ%¯ô¶0*fOøøÄ+ý² *B­ŽF]=NÛfÈÙ'Oú6P¾4 "QÄŸ*v5À暢£fŠº4€¡%Èn¶< "ä<ùÿ¨ÛŽBºÏu5~9<=†=Û¬Ø@ò“Žjӿɷݦ‚FÞÉï‹ØrïuåÆCÏ`²¶…£W®ˆð"jêÎÁ}¿˜ÔY?øªCI ssqüd½)7Æâ"mÿØxy¼^éY $U‹]3.äѧÖ4që–Óõæ:³èJTã_ŸÑÍD­o§|àmp™äV㳊 ›§€q_ž]“zæÙ÷° +Bîo”ìišw‹vé0aw#EÒñ ‘®I2â*ãÿ¦Ñt§Rô#ÐÁ@ËOÅVPÝ9E:$2û žéÉ>/@ߎ‘N#·ðÄø'¦ª+º5wµ®c£Ž °c\D¶^¼=K{d»;îi«ïäEÝšhVðÑR»gôÔÇïÈ22µÑ¸¥âÅc1Û3ûøIŒjºò@"Ñp!óP.qõl4ð›vÚ§¢þ!“Þ½uæE^’ški_KÛÖììÏÞ¶Tˆ ¹Y¢[ÄöAd:ùñšÄo¦>ÐT)‚4ØÜçÄh`ìŒÆTýÔxU%š•¨Í/Fœ¶ØÝ-Âüªé·@Râ+:Ó°B{_À'–€RWƒ<SSÓv‡»çN¨ß#óiRv#z&ÂIrd„Y„‚¹(˜ùÃORù×ØjT@ÔŒ£øóÉ7=àÝiëq¼¯­ +´¾ßPK}U{Ÿ•)µÖ .Œu%\L*/TÔAÔ\$ðý!¾ÈÕK˜6°¨Çöœ^âå"¸Ccc“Zµìh7`·F”õÖ©::cÏ GõÖ–iÄü!û°8´?!^û®–] „Jÿý1 Ýu™m9ŸÁu…KYÁ"Â{+![H‚¾IíPߤn«…ŸM,ÂqA'ôQ f‚žã˜’’ÁS<ƒìi΂š&qÕ²póçþœ?å5þr ¤eà`=hú±‡,âÙ³¡i£àI6Õ>=\Çèå ’ î}X:V]> ¡Š]ýM}û#¶Í„¾]!kz„Ú÷¶´nÂɺâRuT˜–3i3Ökº”pöfÿÕÅç£äVÌø”6€AïÐÞ 5nËq#×.ÀZ—íŒ"Þ öչ஭Öõ_Í„s‡ýS.ˆƒצ}ßjŸ;šX¥›#™/)‰Ñ…–½Ó ^ÝiÛúH€àؘ‰=”cÖ¾N*½HF‚ ̬°þ3Xùê%â H†F/´Ä¹\’>þPAeyÅxÑNhà‚P•ÚÓ¿¹9/ÑŒ€¹Wòaº½~o*àƒåú% iõ&¢J1A»1¾‰”„¯öõî×ü UÚ&DÌö?%o±Ð‰€@T|C’Ÿâ†ìH^ÒÏEinžÔ’‚§¢:‘BG{–Ñ Ó,bc‰÷ç(Ì€Hý,â E>'½ô`¹•>LÜ÷…¢ØT}"élYÿóžÁ6{bºçn&-ÈíLIp‰â›(éÏ<»ÏPÌÍr¤D6v`ûò’ù­Õäçô²ÜB¹Y^íÕŒó/«íÒåNWçÂvµelÕ/ø–·g¼&·I°õ9Ó“l.Ãsþ¢'Ëu3ýÆD²a»*8bè5¥…‹—˜[RÈÄ©ÁkKËN?VŒ·ÚüWväúú‡áE?;¥á¢6×É]“ÌÜü>-SK‰¬­v‹¥ +?׳ÐYŒÔàÓ¬Û¢ì—á´ˆýtË_ÌÐú/èv4v+¶*„0&ENøaט›fmµGNð‡;@ó²QZ #ú¾6A\e_&V¯Vzc¶ðdc"P槾ç­å¤þj¦Ï…“½ó6ýÃøk˜ú½ÄÿÜû– (¬Ì8ë&ÏJË.»C×(â=+:÷ +À‰LM}Í3ˆÿ7ÏO¶w?ÂêÃè) • ~›RýÕªòB€õ ¹Œ–S#:"\$/dêtß&u³lÈ<³ß!ÁxÓ~4,tgœN®æ¾ÿd´[™ŠÊÊ ð„¼Ükà]9ÊŠ+èb·y%hLtyÁò»š¹L‘9ißóµâêÌ@!‰bM‘g^ôºLZwÔ³glHÔð€€âa°˜ wÙú^îë kÔdï‡÷æùôCfä…œ÷EV}ÑôxN´œ yÍ%‡F Ë!­C‹0e²4½ýe`©g5¢qhÉ¿[Çc|äŠ3!ÏŒ+I­‘3<Ž¢–­½>ÞŒbb¹óo^L ŸŠ’R– ½4£™*ú¼îH·ºÁ•j d`ך]ý¨“ÎÙ%¿Ôâwj­ì‘±ð Ný¹ ªC‘Ç%ìQÑmÐ?|ËAyóaܶˆ/KÀßùW¹’šÁªáý]ç¨GúYàÁtwèózßÏàÒ¼Hì•cþŒ½+i1UÁ†Yceæ[ ,CK=µh½<ÀJSñ¦„Rjî!srå(ý–БõW´ôh<´pìÓɨÁ\j¸,†›µ¶¶ué8º#•ÝgJ‚&ÔK”„]\2úñp8…ù±" 3Œ¥’'¬áÇÛoÖàE¿Þ1MçfKVWI[†Ô÷Æ)ø<ÏlZ"ô½ìÕjaí<šªÖFh/ ÎW©]×â*E—™¾N}D±ýœŸw¹Mq +~ +qèC\€D¸µßßQ3ôèpT7ìЮúRši—FržÌIæµÿð[Òû]/R' –kH ‚Ûþˆ©[µšt€"Sxh\’¹…¶D ^º>ÚÐPÇ‚!¹¡sÙ#ÁÕࡘ̷m&Pùs;ãX\û[1ëBÍ»ÔRF`èNÜ…kÍÛA[k{ÐÏ %I«[gÒX\5O=Á+ðÓLînýÈ̼Þ}Y÷)ÃâÐP=‚ ¬ÿvgx€w?f Xý'* Í^þoZpÄd„ÿ™A´„|me£$ÑùŸ68œþ’£ì]™0 6Ĩ‰ HpOΘ蓾À.Üa6§@ˆ4?Ö‚ +ÑŸMAAËÃ/Êw:™GDæ¸z;`yxõýqÎ&­â/âÙz¶¨V¢3úÓ…JúmAaCfÙ:ñ}y³óüÝ9[9Iì騺݋ÞúrÍr‰ èû6!J¯|§À,£1.ã[Ú?‹¡£2wñ÷ãòt¿ZIsÈù§ªNoBKçÿ—wˆñZ0Iü0úyU=«Öœ¬â ,¸ÓÞW5¸`ê“4gÑU|Ú›šîKC³p ¯“Æ¥tÍÐþDà”м§!”ÄJQlGµ(Z³Ž«–õg<¨ôÁþÁ™8·(NO6ÿ_AEX×åôøÏx<Q,ÅDÀÆú_—O\õØü‰èÁ)~² ¯ ˜#€òR8”©wÏm8„F×Á^î>ÔÚ ™Ð)‚Š––C@îI¨ƒ „GDH²rp >N*?fw©ØâÒ9ûºËÎF¸¼ ,ŽŠo%BAÜ:R‡mï +¥j*²¸·%ò5ôW¼çBg$;¦¼‘ƒœIÅÿjrÞ¼Û*9d§©âàÔÊèÛÝÎ~Ÿm‰²Û‹›Sq^S6x¼ªÔå…©Òì%;v§W™LšÃB•k)æ²h¾¯ööïêv¿îˆf ûýÑa˜T‘9h "ÌælžZù|A,’Á½Ó ?ÎÎõÚ*WK¶pÙ.V£`ª‰7lƱ†ïqK+Q#º²+mZ‹ƒ9 ¯ÂiÞ½¹¾¸ßÉ^ ×ú4Ë;ôG#ódšín ·@^=2Ìàw†'¼±Yˆ^»˜5ÇeÑ„Ù}?¸|!Þá[Ù%¥ml´rÌ= ªŸœ uOFc¢èx¾ðƒ +η#ªnÄ‘xma§¼ë ÍÔyÇç¿*õg¢(þfuÄâq»@ØUÏçA²¾a°³}d ÄÒ¹ïlŒ¾­ûÙö\¯Ë“ª:”°È0V·ÙåQaôÒÛ?ô@q×¥ðfêÂFð·M©£cRj!E£ÀkîÝæFGG £·›·€¼lÓ«ƒ.êœû?4?W*Ø FÖôzÏGcÄóq¤f¢óq•]Ç·ê„Êv|ØSmd¾³9ÆÈ”À©ÔÒªðMÆÇUX4«™¯™X1f±cÓ’õDÓ=Îܪq<€µˆ; Çw +"ëˆ6Š¶•œéHå2$€O6?t²A—qØ&Úüõl.®ý¤µDp ºÈ&¹ J»MÜŽê±fo2Þ}êέQ{™QŸ2àÌû§èYÐàÝ®t·ÎÂ)dÉàKštZ{‚´n ”XžÖh@aØuv›$ËèµúZyj$¨‘zœK`h=î8ÃsfãXeÁûÖ˜Ý=P¯òÙ“ÃLo‰NÎýÜÐâãÇ®@n½kÞ…zr©äæ^ç7ÚPc{ïõ6gË€cÕÙæ¨Û@ ¤äjÂW¥@1=Ýèûf Ö0˧$ñ+{a3Dn6*´S[ tµ¤ISYÖµÓÜ/@"†t„gˆµœK¦2Eô¼Œ£è#çê½îza% Ìt*]JDô %GŠ_*0%Ü}—ÏÁ¼Ê_ %Üx §Š?Ú?¸/™‚‚a’Ñ,ãÔŸðˆ0ùŠg´«sµ³OÕŤ@Ë'(âóû?èë‚ µÞˆ3¡E³ßÌ@7ëa)~^äÒ88ÏV—§uÃåßùÀK8DÌÐü†L`´ã¤äö^Ĥ?ßÖÌ›w@®B,{˽ܹF“tIõ}¶¬…Ïsqä×Äê&Ň,8á{s#Âü@ç%øïlÒòËÔq¬‚áÊ ôIÿt«q!½å)'Κg>;§,&YWMÑ.‡-Š¯‹¨ë''LøÈÎh„`m)–œÅBÃü½õ‹ß§ô}–Yn¸Îs_gC[Ζ¿Ü¡“I:)áuùQ¶ò£|§’\6X†N ´AP±üø«Y Àôî=¸eŽœôR]¢6PŽ¢Ž>rúx+@VZ!!éÑù½„PéÝØÁµJ p©Á èq=JŒ‰FÌÍ,Ý”‘Ý’x]xÆI²j Øñ ë®Èg‹R¼Fn#>)e̺"4&¬¬¾bâ9®©TJÿèNpLvG¡GúŽ-õ–Þãžd™3âv zÞÓ”y•+2–=']3rúYȽô„lU°œí@´•Ì+yÓvéÝôÙù#¢ŠîD#ƒ·kíºý#ˆa¥òC:î XF¦Ç púwñ³©ú˜ÛÅ8ÓÃz`êý²¢ŸmÑ­\y^Z•áÉcè¾sàõKÓå±ê6qqIŸ¢Œ‘×ó?+M‡“~]ðáêõ¯Õr´0yÔù +ª#ì7–ƘB؉Ål7ýcI‹¼~“hö‚Ýüpª±2…ø²[eT_^CöÚ€ë'ñø¶q@³ Õ:SùÐí6èÔØN±É*¯ß >yø±n£ÜOm¬- ™z àZö´¹+â×?x«×¼ýͬÑY+×e…¯¼ð‰xÛ(MK.g„¤y¦¨I¶x×CæKQ¹Ù0ìÉ£â§sÒÁ>gÂ~Ñï¸ú—›ØKIÞé–±’6Ðu^ì;`ÒO*?Nô¥m\Åaߊ±p·@ï—>~uœç®f•Íp­#cäî‹{ò ž9”¼—üߊ>BϨ´r]J÷]?%Â^j Tˆ‰i‡×ÌSœ˜>³å§=å±ÞÉ°¬O :15„ïW'4g—ŠÙ b’4¸Ž‡jwph—}¡+¨ ž†òâÑÓ^“;±æÝú¯‘Qa5ä}[<^jCi»e`þ^Ôîú]ýú¨:×+dŒVã°´ŸïƒëÐûV”ôˆ'Þ‡{xé°±»@WsLÜÎè½—OßÏùŠUË zl³*~ å×"xŠnk+“͘X{>â FLÃôR´àx*<”ñ6ì(Áodð}]r6é}„-Ö[±É‰>¡ÖO4r}®ÕÁ…^Ñc,Û §Å0Q•“7Þ”ø˜ê˜a£¤J¡Ÿ@ð÷òxÞ4¤ŸÜk_-Þ½wšÌŠE½Ó§v®¸±+óÂpŒµ Ëåìӣݚå]í½JÀîúF¤SE¬™a—º& (ÿ/[óu ­ìÆ—«®ƒ•ÛÖµÍð^?¶–]“Ôbè„‹äf–äª2WÈOÍ5XD.ö![×eDþÒ¸ºMè É\¬I“ªÑÃÀTOÚNmùÆe £ÖØa¯äÈ›×[”9Þ¿ø±“°¹—u¯JW”šäâøÙCßäJ5Tù²Ç*·e‘ÁPÚmÂ4ß›\᳕¢@ƒêhfÕ¦¨1Îœ#¤¢“~à©lˆÜN3ÜcG…iÃð0ž +Ø çd_ˆÍAÂVü,­ òّȵó4Î9“C­£Cy3=qèIRÀýiËBð¼¸qû~Ò =ÌÅüSªÏf'š{¿æw'Ð%¯!'ð¹çìpžr–€=@ý…üÁ›1¦ÿ¿Sâœni×––Ë"Õ%6x³öH pŒ]ú#D±ÄòP¥Xj),T©¼¤rBÐ×Øàk3Ëi*ˆCÚžíçl03A¾´ 1T9 ñ•v^u„mEY|Yà³3|Ûà/››æü°¦‰Ëé6Fî\ejb¹\JëJžlSŠöÝGÌ0cÍG›£j¥‘>°0­p²¶›±FíÎßµÄPTü1s!kYÿkèÚ'>Dttiø´bûÈ9>Èò—cÖxf$ÚÕ?$ E;‘³ø´Ð”öw„Kò½[G’wÎX¾>q-–T‰EªÛI§t=.~/îè0ÚÉàCx"=Ú-9Ö/ +&âÇn`¼eh¨Š{–?áp–¯|°Èè7”0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +57 0 obj +<< +/Length1 815 +/Length2 1173 +/Length3 533 +/Length 2521 +>> +stream +%!PS-AdobeFont-1.1: LCIRCLE10 1.00 +%%CreationDate: 1992 Oct 23 20:21:59 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (LCIRCLE10) readonly def +/FamilyName (LaTeX) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /BMCYBZ+LCIRCLE10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 8 /a8 put +dup 9 /a9 put +dup 10 /a10 put +dup 11 /a11 put +readonly def +/FontBBox{-2000 -2000 2040 2040}readonly def +/UniqueID 5011942 def +currentdict end +currentfile eexec +€4y‚«9BÙ0ài§ H1uÉšFQ}Õ_W×Ðn®ÎB¼oGÒ°¾â´² 5¹’±žŽAP­ri³­ð#¯’Âh;V ØžZ¤æ–‘'üð«ÃáßÂS2iÝ”„kd¿ºk„ Ò\@íœfÌ2|jºòð8;P¯Œøíˆ(b¢ !$Ô³Ýe0þ¬Y0kq5«²ažÎÐ|½MKCæG0áK¶ÅBG¡÷ù”ª&ëùÊùÕqjÄ9õ¹OÊaÎ!Œ"K>Á¬Ý ½œƒ'u>,¡æ•ÆŽÌôáÝ94^P}Ë +d7Â‚Õ K¶£•ÀË@Eì¡‹¶`ò{+Z°Vg®|Ãç¡öHÞ¡Š'Ð ƒ8fd]â^ÍšÀé.(KŠù9W>zí ½Î4•íç¬#äÞ5^²¤ýxÖ¡ua˜Æ“tñ±æ +ƒjûçc¶g´;EÈW Šþa“MÏ.¤· DÈeöOv^YµÑY„né8o1ï"xÙPÄ1îY¬?¡½6¨ÌäÍ?Avý‘ƒ›ˆ©ó 6 iK[ðfš*a×+ føhBØAÚ”~˜‹¶®X³É²hÀ¢3-„?þ[ë3^©~©L—³[<²=@Òëí¬Nbfó8«WÑ檢E͵¿¢óóÿ³îíMÄàZ7EWG°õíDF¼àµå;Üâ¨>.H?h¨3fA‚ßs<îõ妅Ρ6€&ÖË /—a¶DôZOi_lv4®<í{úÓʼ@ÆXÓC¶ÏeÀ« LÇË –^Ö¯±¼ÎˆØšÞRàÿŽárò*+²_•üÎìøóÍ›–*eû€zà$çùÌ€^Ì;wMĽž@Zÿã:¢¸ MÒùù–¶¤©€µ¤ñ궉5,gE“'ä¬ÞjVwzÀ€-ÂÓE#Tf(¿4 ¸K’ɤù9Èz²Çq¤Î¸¯>°E+nhjþbˆÊ0`5¼îIíÛ å3"[ W–Yʺ)…·•ÐÍð9jK&—ÿ¬>³1צÓT`ÓÒÞ†bà>ûü9É¿<\\C©BÖxOZaÜá³¥+óŸ·¼¨gÇl‚• –7„)ÎCá¹ìŠ=.úª$n›ö6-ê¾[%|‡e ò™¶EfsÜ‘#œ´‡Ôhb*öÑáf=q€Nmò´¾Ø'@ûUqIxÒl ²R¦xÅXe3°hT{1Èa¬K8ô˜þù]5¤Õ°º>¤Ô)$S’ª’lü‘è6ñOHðÐr”š£èõÆ©ŒŒò-—'”îmó—‹Ëˆ]}abXòÝ¢2õ +²CUž×Ìcél‘ê6{‹™¢í²sPQKX[äà›¤XÀÉ!kC2¡QúÙýö†ºjÖPÈ/ýÁ(æˆYð8#=q3Pâ&…ÐÄ®ù¡5‹%éÁQ¦¤‚s]vÆ!Äñÿ€*àZ¢E~NJ s |ŽÝšÚäå‹p>jίQ¦ŒÑÑ~š&30¯:Òß ºa÷v™7¦è¥ºž¹ äD…u§ + ¤;ní0dç>1þÛ0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +76 0 obj +<< +/Length1 881 +/Length2 2369 +/Length3 533 +/Length 3783 +>> +stream +%!PS-AdobeFont-1.1: CMTT12 1.0 +%%CreationDate: 1991 Aug 20 16:45:46 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTT12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +end readonly def +/FontName /QZZRHI+CMTT12 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 99 /c put +dup 101 /e put +dup 110 /n put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 120 /x put +readonly def +/FontBBox{-1 -234 524 695}readonly def +/UniqueID 5000833 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÍÖP +½¥í˜5ö ÏÈð l.×j‡…kPôØ úëPŒ—ø(?ˆ±~M;Àö^Ãyy¬Ü*f˼[âõ:­ç-ѵZ/¿îeŒ¹_[³+ 5{^Ýòd tp¾ñÅ!¶ûÕÇ~¾Ùd¬Z+¾ÉسäŠå»:cÕEwK’+_ö°nÎCdZy°2}m‚3…þUó@-UÓ´HkçÑõ¶gîØ_­ã +²ìN/OçPÏšiPdXè‰baÀ±Â“¤*¨}äéøjLœöŸºq‘ø®Q +L¥‹o=à'öro2t=Îs•ÂÆóÂÞíÜúŽí}¥mÖ¼Þ3Ÿ÷¦”vIä2^Éa²ß­Ò­Fñ‡ûÖ>ìbÂo´jfj ˆc‚Üë©÷ÎÝdÝÈ¢ñ_ã@v dÄoëÑôÜ7®Þ è¯ËŽJÚ - TºÊ[ç(«‹ó/× )ªò}eŠhôT¤¿8oc"MÇð¨bOk†1šN/Ñxõ–ó² °2ê(ÁW¦ŠiúÒ¼ˆˆXÒ(l Nða¼ 1Eò£~¾À?QÞ|Ú4Í—~°—X³¤–ôšt'žóÆ2-ÅIEùPbÅózQÏ~¯Eò³cK-}ì;)ó[fÍ0 à–öƪ+ðLJ“aÁŸêXœ®ÛXoÙ¸ôß2ì‘›t4Õ»å~‰.°8V}õ¸¯ Ú^’Ejó``’æ×ýÕ¡4<=ŒØSÄ…Ã7ÄH®¦O1ø‡'V–£'.ø†`¯±©2${pÔ_ì›uƒM¡oé¶Ñ—}lòQVŽÆá²2 +à«°Û…Z<“Ûbgß3¾4£E¨4ÀõpïÄæ­›ý5?$ø–æ/¯¢çμø“xAµA'‚ sx7ãµT{Ñû`t`¯Z[w".u™ñÝÏÕ¦‚^D°¥âÈò3zj>#Y$(µxxkÅ'ÎëàGŸ/FX꣪9§þ£óàyÄ´žÊ—AV‡qò *ÿV;µôpÜÖÏÿ“׆Îvr¨ÂçK™:Ü)+È‚ãƪ¸¶.ƒÐ¥Ø¾g¾ïä!hò\¼è–Þš;5j€ ðf¹à¸oâõ¤æ,ëu4Q³­jvÌ4î%€iGŸÔt©û-é¾C‘¨Ín¼O ;u2¸ØÍÌ£‚u b-ŒEŠ”ÕjNöK ÂjðK¦Ÿ“*1nÇ2¸“voèÿèGoS½RûMÏ87dŒy‰•Ï»-ReDu}ît +Ð/aûÍkž›ÑhÙ¥*!£Õg…ÉÆ‹îýB¼Œ©Ö×æÃðÝ/iQÍÆ5«Ä Öô®Ò\—çi/Bꬵ0Yˆ\‘Œ’›¦””¾A!9Âôç1X%Ô<ØΊ\óËc¿¿7ÕéæöÛ&ÇŒgŸ¾Ç3Øu‹ãäÑÔ@“¾ÞZõ'Ò0´}Ë| +R«A¤6Šˆyvøí§Œvq¤^—óõ£”eüéŒûÕ N[9Þë;!1môž5?:lé‚Q厬ø¬W›å&ò<_JôüKÂQ…Š¬-jAR­îIcœÉÿQíJ<¦wPb´©fŽÛŸHg 7du–×zNºðFª”iÓÊL ϡ¨*9#‚½3¿ÑSQ*ú1!¬OHC]V¾gn3e@LAäA>ŽÅÚSû4vk ³E(x‘úÉTœÃŸÞ$¡ °«Xi4Ÿ<2'y{³¡#3Óöf-5·i·VûÁ»þÐê÷«ÒþÓ\ ^‚l‹ƒ‚/)3d±À Fˆ¼“8ÜFÖÐëp:@ÈÑ]ÆLóÃT=™hÛ„\œ­»õ"¾€QáÖmì>u9SU? +9`œ;ÛQ z[Ò&óÉä1¹#œ,1÷—Çh=šuÎ ;Ý —ƒ )û5x8£\†½ž#é°:L)¥Âç6±Mêó¼­”¦WE9EµcqpKÙl³mУÚËS]j‚ZÏMœúÎs÷âÃÀô+t?ê.°8.ÁiêÞ黧XJìU*¨Ì{?d!½ŽPj0U:ã/a .œYL=T¶º¢«‹©:¡<Ž¥¿W@2#И»–á]2]5ÁHÍ|,;ozú•­ÂÎÍqŒ”ƒe6%‚Ø®Š€([µz1‰Êj&ãŠ7íâÜrÒʲÚÈ¿Ó[0þÜ©1jvuª!/&Ê% Tü'+ÒU+f¹^¶¿¡½{EaÆ­å¼Ü5U«ÒfHœ ,olÊh vn:J»]ˆEË®Í\²3XÅfë§=®W8ؽµæ6q[zç´ÿå°°¤´ìªÒ‰\£6|)‡EFlµxô¸{dù眼«ÊdÌο®q,6±Ü=þO­°¢W°‰T'à<ýŒ xÅêãyÈt,>‚Ä,8õ8uLï +Âõ}!vg|õgÉ—æ_¸¬¨F•3°Yó1â§ü¸WЦürŸ4ß`áÜÜq㤴²@§Òe+b'y&Ýeº“ ì(t“¦Ä~~ ¬Ì<ßbYßûf^pš1àö·,à¿ÍTÞ…›”çÊ^Ù©®(˜b\Ä„ÿéÄ –ÅO>Í‚Ñý7pŸèXçD1†ÆëÍ$Qù#©‰Æ1JªîÆK¿î_ã¤.~fG “– Á¯àx—(zaÄ.J ÿ\6ûÔ°öë1»4¡î†Mt‘0+´ÑôÛ ýzšMÏÑ}§·»k“A>hKD7^ ng•Ý“ Ú£ö€ v&é¯ÀÚ9aÿcr + MP:àðØ_€ntßå?1ˆtNJ s vKi56ˆœÆëqµT•¥©X$Ѫ%u§™Ï†ÄKo"Ò&Ìÿ¦ù¦9«˜]†G.IS¡Z mÄCÈ{= Äô]Ò’ÓÞAŸ{'3¢0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +95 0 obj +<< +/Length1 810 +/Length2 784 +/Length3 533 +/Length 2127 +>> +stream +%!PS-AdobeFont-1.1: CMSY9 1.0 +%%CreationDate: 1991 Aug 15 07:22:27 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /UJKJVH+CMSY9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 104 /angbracketleft put +dup 105 /angbracketright put +readonly def +/FontBBox{-30 -958 1146 777}readonly def +/UniqueID 5000819 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÈÎÙ°š'Z²1NÏ‚“R‚oN—]ÎÎÇ+,󡈙ÌÞÙ5Ð; lƸ<ßO#¹¦ ´™v¬32cÉÜïͽL„í£nt‡cMŸÔZô£ŠV¤A,; ¯úëq{ðÞŸûz„`¿GZg°Ç·Œ:ÿ€Œô¥í¾(1·Zzî f°T—¾ö³ËÁˆæ%º€‘°¥ýÁ“Ùi²h[½6*Ïõ>&µN}ï­û“+P]žªööVxOÈ2Í]ÐÈ×ÀK­#&ßþ/h ­oÐo€oÿ?f„o#FK$âb¶·Dä¸õ4®Í—§?uûʈ¶ý”ÇEL8Ë%I¡™²òr ßÍÜóTƒ{LÒ°>Ë5—1r˜Ns@cç)B+±Ñ1Rˆ­7qÚ³ÏññÌ:¨L°;´ Ǚ՗p+ÜRRì£È^dîÁ+™bÊõIÅÞÚåãœæ®ÚÉÜßn.gŽµþ ÅËA¦¢Ø·µ®±RƒŒ|E™3çý /#<Öü/qè<î¸D|©41phP)34›«ÓVWÃCÜÃø0U(&Þ©/>#Y0”Aúb ­“=ÿbÉŸNh*Ès ë¬ßèÛzÉ'ɲßi¡ÖTM*3VБ\ÖöfC7±ÑÝîIý/hiù¿â.š†ûpú8š4ÄÅa©Z|6¡Ì’'‡jnXã@9+جìÖl¹Šš¯v0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +98 0 obj +<< +/Length1 833 +/Length2 1926 +/Length3 533 +/Length 3292 +>> +stream +%!PS-AdobeFont-1.1: CMR8 1.0 +%%CreationDate: 1991 Aug 20 16:39:40 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR8) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /PLCKEA+CMR8 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 45 /hyphen put +dup 67 /C put +dup 69 /E put +dup 82 /R put +dup 84 /T put +dup 99 /c put +readonly def +/FontBBox{-36 -250 1070 750}readonly def +/UniqueID 5000791 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÍÖP +½¥í˜5ö ÏÈð l.×j‡…kPôØ úëPŒ—ø(?ˆ±~M;Àö^Ãyy¬Ü*f˼[âõ:­ç-ѵZ/¿îeŒ¹_[³+ 5{^Ýòd tp¾ñÅ!¶ûÕÇ~¾Ùd¬Z+¾ÉسäŠå»:cÕEwK’+_ö°nÎCdZy°2}m‚3…þUó@-UÓ´HhX²¤µ Ì.ô⤠çHH<;Ï]ä|Å& +:–|¬p§£[ˆµC#´\zC)‡“Œkí­;r­c‘‹nZ E~ N¼ K EAóEì6zè\©½$VŠÓ¹ø _t æÄ#ijÜÎm¤ÑÈšVÐxàÐâòb¡6@ mäNã†l4qûXþßZ;w)Ee½×&}9¥Nqqu-½æ:Á›´³é^µþg9 ®MžÔצtCõ]άٖÁõà#Éå¡Œ¾ìà #v:ˆÍ×Í8çNHI^ÇúR9ØŠË<‚buF›h‡jE~}[ègDZ̭it*Œ› +ÙCH+ò¤­ +í@ºëi #;­6´Ê--§2)VÇuÑRe5²ò-*¶™ ­Þ-¡KI÷Q^d¼=–¿wRXü}®NB¤É¶ÚŽÝìJ€ Š­È×^HÊå!7à\g]j‚úFÙòüVÖ.\`Zx˜¸Ñ@,¬"¢È§ªà–òÅò’“ ›™Y9’ƒ¾‰R‰‚8·wÛ˜0ÿC¢˜²!Ĩ ÇÊ–OÉžkž°ºü9¾š©ßú/£&²¤fg&³ÛÈXDço“«S>ákËGfÞU¶ŽnÁêaõ2Ïþ¤WC$K2ê8¸( b°;ÏGj2Â4츠ú*??3“Õóªw@fÐ$b XX›OêÅ»—lk:ã7&†±¼¡ã -%S¬â\aGƒéT¶9[‡þ]x]ìAÏéls ‹.é#é!²©Øê ­$ƒ2Ê]ùßÕGû™;b¨²ÝBIû‡Ö§_¹†J>0f²- LÒ‹-¤´‘sl—d”Ø|i¨Š?í“%û(ÅÓ¨ž`"© Þ#-ãÚ̧I”¸ÉÚ˜/hã§[Ù(`…€R¯gŒù7B KªÀ|ÏÅH%Æ–ýèRÁ¯¼ ´O·Å¡D.àc5" |QuÖ‡áü¥›9(_å1Ðtroþ#"(Qr3oøþ•Æ…ãˆL¶3ãñÓcªjœÈaŽ_¸ÎBC<ß«[ñ möÔ'Q'†ÄfÍWª5RîÜ2©y“8ü)YW™;¤öZˆöyzÞžF~sa§}6IjååW¦uéÆøê±0-É^ÅYoˆ}{¥Ì,J¿3³5 +›°Œ1L –5P|J~ç;¶yÙ0àZHa)ï’ê-%êP½}ÖEr7CLLª)”CðzžØ rŽ#%^ð±œJ§ÎÝåÔ- (XomMj›Tw±™ËE½HË}ŧäê‹8„£_|€¤ŽszÅ-–äVÄDá@ßN!ŸDH;Û«ÚÛÉè'GœÂcTíðî{Ði‚LÌÚŠœÝªˆþuÞKñŸëâÇB·ØâUºàTZSÈC>Mõú[hMÈ}󀘟-ãºO;™Ì~y=Ù¬M… -ЫUoßçºË&¢³)þ‡*¶mC4¦¨VœÊ~izøw˜=°x{^³2H# *Ƕ?dEn÷‘SÕž!D«(§¸õ“¸ºÈU´‰R‡v˶®XÒ)€sñÞ$ÜÝáÃk ×ëó÷¶²Ž€è¬´"Ó8‘Z¹ÃÖ]R±‚§Ï#ú0Q'i~T±—ìÒxùKpýóÕyª(Ž±*<’ǯÑéÂY$Ôak7e3턱¯ê vY´–ï=[ûKß©¡n¿PsY~Ð)¯,Â#‰ò¸d…Uàž¿ª1ߦղ%9-ÓRµt³>ŠœwÏód$´Kðèr½v“mÍîí¿20/ZÓµ=x8d…ºÂw‡Âitç‹ (ú/±¬$>è]–Sm—¬‰˜ÞKŸˆbwÝâ¦%£‘=“’='ÀÒ>ÈZÉy\¿’q¥*ÙFÄ­)Šâ;RsQ{ý±µ¬|šTôè¿Žév¼ !&.’çî­YÙè¡ x€cï]ùZäŠ>¥`›Qâ.o]þ™,5n‰wo““Ô€…béÒMGü&¢kéê F[(±&¤~áæq7øVÕxÝH#mò§7G¬9Ì5jRl¤ÆàŒ^”,]n€µöüËpõO¤5GøÝrS“Fš³îÁH}Òáa'qQÈ@Ñt"ݦà@|¥×ªÎ˜Áò¼O> +stream +%!PS-AdobeFont-1.1: CMB10 1.0 +%%CreationDate: 1991 Aug 20 16:34:36 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMB10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /EUXRYM+CMB10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 40 /parenleft put +dup 41 /parenright put +dup 44 /comma put +dup 46 /period put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 53 /five put +dup 54 /six put +dup 56 /eight put +dup 57 /nine put +dup 65 /A put +dup 66 /B put +dup 68 /D put +dup 69 /E put +dup 73 /I put +dup 75 /K put +dup 77 /M put +dup 80 /P put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 119 /w put +dup 120 /x put +readonly def +/FontBBox{-62 -250 1011 750}readonly def +/UniqueID 5000761 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÍÖP +½¥í˜5ö ÏÈð l.×j‡…kPôØ úëPŒ—ø(?ˆ±~M;Àö^Ãyy¬Ü*f˼[âõ:­ç-ѵZ/¿îeŒ¹_[³+ 5{^Ýòd tp¾ñÅ!¶ûÕÇ~¾Ùd¬Z+¾ÉسäŠå»:cÕEwK’+_ö°nÎCdZy°2}m‚3…þUó@-UÓ´Hkäe•›U”ó»üRj¼z•¤NEß)§…WÑÌFý¢ÀÐ$ÎÛàLVy½†ýF¡™Ix&6_ Cl¼àþR‡%jAg £gº WMDÃÜÿä½WTÄ4ÚÁ‘ZÌL7 ªãçÀå¸{ 2(µs—•ô5þ,%> ë¹O‡+ÿ^‹B&…5»Û©Øà“?`²l§:`$  ¶\“ú3½þ°q6ŠE„ ÇÅN5<6EÊL2~œä(² 3q»CVÐhõèEu«ÙÃûšj]µÃBQ|Gûº`'Û ¼†x|ÔuMâ0£¢› +‹s ’za§q=Ì)W’)Þ;+êÿàæÅt±ªºA²µiïÿ†)ú>©Tç½ ÁÌWc(½å¿ÙJìöb° #Õú“›; Øtœ]¢Uû§àÉoMKs*Þ¥Ø÷¹}LŒO +g­¿5¬ÖrÚwÿ*Ñ.7|x ÐÃ96_•‡LÁÿMKÐHªÀô &Ï5åGn?ø$I©Á· Aýz¡ƒÐÊO\t¦CÀN +R’u#ºjˆöë«+]ü…Gúƒt¿Ñ1GÖ©ÚżÔÄžjat˜@Ú‚ªÔÑ÷)ÿÐ*DWÁmï6yQ"-9öÀ¼Œßf–fû{„’·+\2TG?žÂÖŽ[@û0·ƒ¶‚lxFÉàüœ^ÇA`ÊFD­¿7C•§@d0ù¶÷Œ–]õ EÓ‘ú‚ Üí;~ÚÏd@OIÍc³‚ç_†;ÐÄRy¨ðB×ðð(ÿ`M;ý§hUéÀ6;ˆÉ†Mú°Ï ŠUâÀÖb„_`µ=†“ +éìÂÞ¿÷š +†KòDª.;ÉþÍ ‹øçð oö;eÚZH, áE¸£E˜'¤3(_ÐXKÁ¤3¾|*‚Éá­ÿ™8ª‰û×ÎÊ®V2\Æ«8G/ªþäMÄ[È=¤*b¡â8mòŒ ÎàûÑ¡™÷ú +*åÙœù.¶Ä2BÍõ‡5n¥˜ZV2ø +îH—(9Ýv6gMõäÇ؈)ÁÀ7- ›óc.]ùˆýZÍY< +}À89AéCôí6]F‹aÆ¿d=ÕÖÞÑ°^(oˆK(̹"ê?yÆT!LŒB…Û˜øÓ1ä:(ää•ßìë©5IsÈÍú#c¿-™öQ#§¬ü°×ynkó$Ë(HêðôQØ0â$¨6rû“»Ã®œa#6JBÙ…(Ý–±Hk~«÷'æ™ðóªÜdÑ&!ªÜ× ÷ø]$:”>ÁeýÒøaì:úÿ|å2gÀX'}šŒ˜äÖàNÖ›¯Ÿîw*9Ú ´O´Ï¨Æ;2´ˆiÀ×h÷b¿Lº](Ç–£‰…ä_ÝOƒ‹(Â6|sÔI™1ië.gü¢».º)vžðbi5d ?EÅéI­*X9”î ïüqys8´¢ÓˆÍq@zÛ»t$¤W‚÷͵Æý´~è2ë¢ô]êãf*‡q:ÄZ;×iãa52ϼÓ¼=:ÉV·k"úì1…ÙÅï´j l+ðWœ† ƒßWQ6âI†ÍvÕ~K1ÑeÙ§Iå–ŸI^à~$R°öÂ_ÕþX×ç 1ælüàs6®᜕C±º.Œ2Ôxœ'Oìú¼(û¸"ÀPmSG¨‡×M‘ç@lK]Š„%"ðš„«=€é~æú4öñµx ~³eítÂïîˈl¤ŸlƒjE]ˆŒÍ²¶]Cþ&ŠX +„jpÓyÔ +Ç™8q¥±šm‚»me3ÝÝ®ßE®ó³Àñ•œ¹F··è5(” Û//dõõ ò«"O.› >&ëêy²¡6i *5>D¶¾ù‰ûÝD—|ÚSÑ÷ëKãsŽùâ+D®Š«›ó¤Z™òùö樒`1“5"®?ÄRk“XÇkëPöÚòDKßΡäQRaDî#±Ë›%Ûäžk‡Í`âµwäsÅ;cwÓ¸Ls¯‹ãá“z&†då£:M;EÃ*(SO¼Ùw6•ë,16´%ÁTÁE1ÈhT´‹Ç‚gÙ-k›8ëx-ÌeÊAÙ.UÎCßr¦§ÞCpÑ+û•>$ÂïLŒè–=I—ñxÕ2IÙûÁÑðh)eÙrÝÚ-Í I0“t‚7 Þ–ê¥÷*•fæ(Çó©'‚™ªK ^%Ô"(–SÚ¸¹foU'¹cÃ^ØaáÛöí¿œ<þÛ8Ç=k©¸þk‚ Hm“¯I^ð²Ò¡?GV!dÙK%àÒãmvªˆe•6¬…~OVª‘IN€4Îíâ)æÂ3½q¼?Z€lVºm'@9¾ö_èÂèáñ›K)C€•ŸÊìVÓß•ï½gÑ’Ÿa0ý]G0‘Û©ô¼‹¤ÐþàvÍ°E%~“)¼Ž# /6µµåêè{Âö~Û'áLãín"õ}ÍWq»©w¸ª\Fkw †3¬Å)^ã2Ù!pm†fÙ.€wvÅËQŠØ—?3‰•(1x$EÒ—ïú4-úŠÍ~°„…\›Z0‹p% 0ÄP³ðvÅF&É÷èTVÌxµ¾4¼/sªüσ¯¨;…e|5¡yÐàî«‘ §ç Ýw!NñZsU.?ÁÊ».òrü-gÞÝ·¬7ù¡×´5ÊJ…¾Æš–øÙgr'Ëšmw3ø—IÈ’õ¡€zÊ_ÎcÁàÇ‚|VUh…{5V^É4©êçü€öà ÔKEó“…åù y””¦ë¢Q‘H#Îõ…p¤GrÎdà8a}}Wno'„¬3—)Í1µ-qÛ”º`°‘¡ÆÁ."ÌðÝa>÷ÀV»Ý¶Í”¾Q6G¢QÉX#Ö½ NGk».ÆQó̽x·èQO^Ð<û6«Ù]Æë^õ»Tõ ùñ.5Ø "Á.ʾ›8àûÀ:™U·wT¿¹„vXä@§)†=ߟ˜*6°áiD8póGà¢d„%ÂÅZ˜Ýªç¬UO +ä,!MªÓk…«íƒh5÷D¸ÁR­ 3>ïê6E>ô>½j^RÓÞ,þ GÕ5Í>¾'½N39ãˆ;Ïí8àH C»>±´zĺîM¹N\k|rVÉwý5/*k‡Hfª d¡NÔû‘avçœUõ£ +·‰a^´Rz¢b{eŸ4ïYƺ?Ã;ÅnFˆ“€ ¸šÔUģZÉ«X©^ÊDi߀ïã +wt¶ ¥›¶pŽ„ 9È9f¿¤ȶUP´ÑÞõ©ø'H)D3Áà•ü×U"bFM<èæ4Íø+ÝðGºÚ'zL#¢™}#ÅÒX྄´6<˜˜D<f¡®ù«Ú\!;6lßÑ{"^607Þ[Œ徚‚…f °ø>)Ï“3IÊ?G³ÍzEõw+‰ç$"9Ý¡/KGºýéD?¡Çv¾Ž~6Zj»#|´‘,/9À×Ú4¯X¸I¨ÔBÍVÂõJš)ίJs6ò‰^a]3ª~”ÊÚYÿ•Vl°ð± › ƒp”oLcGf;Ä;>ö¾³¹ØY¿ñ|¯mÚÆxŠ¹ÇQ¼QŽ¿ú飺å-ŠñóûW-!æM—ˆ„% püh!È­ŠÎRv¼ñŸ2Ít»Ú™ 2-W5à]>äª÷2QKΞ“¬Åþ¶«§€塴ЛMÂDm7'ÈX8 ¹}æ yƶ’±l¹%‚Duš‘VÚ¬iÞW_8QGdé*éu—ecßSvŽø^à¯WÕT+ê—ȨK¼Î[]§Ã›E"ÐöQþûAë*¿÷Rý§UI ÅÇŽ³lDLbÉ,}Ðñì–ƒz¢Àû-…¿¼f-oȾ?¦¿U}@I3Sjªí7”¡€5ÿ¢0I™ÌDÁ‡Ør8»S"ß™Š&r¼»¯*Ò3ð^b•%D§÷w«5'«jýßêbö˜(;/&njv°xçËY¿:^DóZ*ãÁ&­5½x 7w†ªúº ¯ãó2¡ú…³k>]{/ùôý)K]ðICS"Rò¹è¶\S˜îëb²Ûœ‘_Ê×É(c õ|h¿~Àqø·šÿ,-Ëa`.Êâô`+°ÞÌn+`–Š™H»ÂÈÞü3ö걸Ðܽi–Çx6û`&U*…; ˜'HÉî›î'eRÚ˜ Œé³öÆ0tÚù%…ÍÛ+k;áîbýiØd¶´Pƒäð5D©(ÉãF0“,S¬üT Ûs<-Í{§A¹„>)aÉ‹xÐÜ¥ªÊ‚ó7å|Ä~­“ÿÎÑ ©(]]ññ<çA]p¤% +^h­Öèø®=oÜŠõ?@îÍ.×l©>šŠBWLTÜßœx·î˜ZP>’ Ùy¶nÚ&¾û6[ýŠ™­¯k«538¬Ó•pAÁ`…¤…÷§ +lYfè+ªíHeÊ‘l~G÷}1•f€/]8G£ðR YQÀë4²ápMƒ$Ðöp¡6éK 9vú,.¦kÉX9ùßÀ"2úZ}5³TïteY©ß”;{TŽdB˜ØyäS:JnEÌÊïËÚ¿³<8æZX=Z¸ã-“@& GX[žeÖ +¹À÷”xÕî° IÌŸøO@6ƒ«²’I÷-~ÂÈ×ú:™ÄÃð!$l9X½:›é¼°û±e|y¤þ"ZÐ-©Jþ[• ¢~Mõ =+® ½LŠ\×HZ×þW{ñžö›—ü7yˆ`((kð*z×w›óÙ§~„+¶ ·ÁëÄ'SaÉ ßÈúþ {ÏãŽ6ÁYŽ‹8’åe˵„¼äùw*çD±g#Õ™Þ²ÐÓÙg^L@÷(‡TY•<ÍŽ{0PûÃZ1 ÿ,9 *¸ÛÈõE½Olr;5êìšÚâÌ55'pž´Ù‘{ð+ËjD¦¶0ÞÈ@¥„çÜQ«)~’ÕÇÙ,…"w[y ;¬§Y}èá)Ú@JˆÊ‡Lµ¸±ûÕwÂ\Ùâ +¾mŸÅ/¢z¨7¼ˆfud6¦J4ð¬E›ùWp$ãL·(n ×V‚Ö³Fï_m0‚ÚÒÂŽÏÁ‡)¾œÚ,~Ïzß‘ißU^v覶{{C¤5àG1"ôò‰­›$ë²HR}Y:­qú(á ˜z³zË´ucGKóé#œí(ªÑæ!– Vv\Ð2«‚˾¨¨Gm]½ +ǽ«Ûó>߯ȡFØÑƽIˆÙ +åñ€ï·Î´;—äôƒôÌí»ÇBdÏ–ŽLçÞ9ërö‰˜C`A9»õ ŒCÕ×vÉ3Ì@¥4$QßtÕf©š©b^‹­;ü*PÈÈ)±*p»À†7Ží}ô| %ü-€7Åcĵ@™ >Gü$¼k"ž×1Lâyª¦= ë•þgô73Ù©“ðœ[”aV ³¼kÔÐY|ÐŽÖUÕÝ ÅäÓ`!&¶Ï¿×.RŒÖ ‹Ð@Q1lhcs‘3#ìÕšõ + +· ††ú„ï3*)L˜Ü„9“uõ†²µme ÒuÌ7:Gè üýªÙ`–Ä›ÝüÏìÌbØJ¬V&Å06-{sÓ]ò·í*C–3§\“ÞûÆ"^(ßöþ·½ÎÁcLwÿ"Õ”n÷fyžsüp0 +·§`0þ&y +"‹D«ª}Pøû‹½ÉBºJÏÀB:ß>:}"Òý¥8 dÎÏ+ÇšhH~Ý6ÝI¡÷C]áÑ% 5ÎÄQ=x¶»ª–Ìzyk‰0™?¥;c™Š‰Ë§#š†wÅ­gJ¦3­A‡1ý2JŠÕhŽÍ2k6QwÈa&‘Q€æãÛQ@‰£¢ @1Þ³]zÿCŠ[+¿+jœ$‡^a;c9O¤;&NI›¥=ÛÃ`¤½Å‚½5† ƒä•íÜ2vÚ‡èšî°ØÜFJÁÎ,g w8ž9ÿm’ã¾°€NÔÑ(¦MÏ4!Òwÿ~š ž¿ô$£c÷ä^ÚN^›êÔ };•?iÍÀº4l6ŽÈñ:Œ­·R«D-®Å¦rR™³àšç÷ÝG0Þ6\RÇ-ÍîEQ*Y«=÷Ì{«T'='¸¨ïðþ/4ÍÍFÛ‚$|‘§ÏÉz™Õamc›ªTµ¦·]ùhb"–Ыô›üÃjÖì ½8ï‰lÂ+A·_$y¯°„¯d 9Þ}1[GÑ0ƒ¼#ŒºÍ÷,l|xUP|XŠ©~” ¥Qdûi›¤©—Þ +©"GÕ¸³k/ëÕhë%Þä ¿çlª–ãÔÜeéÒÆÁ÷xiÎKHÄ!ve°!¸UCwù” ’ã)ˆûàÛIz$ºdÔð®¥1ï°œpº\tlZÑ6h:ì¿°^ü‡LŠ¡ÒR°}øÞ6f6-æ4°¤´ÛtÁ}ò÷nYFn¨ÃXéwÐæíÓj纸p‹áò3¾6xH¦>€”˜,)[5¾x¸gÇÑÞþᮂÐð¦{OTÖÿ³I{èãjèÖ¤H´ò&R¤[;e¶6êÇÛæ;ÏŸ6qb±M­w-þ›Õ‘Q˜%ôß<÷'c®3äðt· Œ¬€~cë `q ¸×*pà•`,Ù½=/Wh¢‚êFí8V¢chAÃ:YRôZi^>Hþ‰.§ÔùYˆ0Rf•¾§q’8IÙype.,‰þ’Ý|Ìåö’Þ#õ”ê–,6Ä +˜ö£âAÉ‘š ¡Ö3ÒºùPÂ术ŽÌ$3Ý/¦s¡\M­ä¾ž“0Bì/siÙ­¤ëÆ$Ý\Œ‘v"¡ƒfl^»0\«÷zˆÈçBIPœZÖI"ëH‡GÍ„ÓT¯ÝEÝZRï¶~ÀÀ +1 5ÝûXÜ%åÍ2Öy¨‡¡3Cß^Z4A°FmðÌ¢ï‡9Hž1Ïdé]f ©´˜è÷Î ÔAm¬Ãa-¨¸•2Xì$¸¢ÛnTf’ÙD™fÞó®ô ™Øîžå§í©b·¼¥3¸;~<Òˆ cªßGŸmŽ¤BAÉ-’²Vê¶íôX›«`»N)âç¡à¹ †7Óµš8Œå<99wH˜aÆåø^kß:”a8§}æqOÀª¯ FÍDXÊ,<þƒcf­ð%2‡z=#¹sQöӘ갨 Åé‚=#N€ÞÛ6‚ÁlÊ„œLeK½„ÿG GÁÌ ƒ_ÂÏn´š½Ïø)rÏK[¾n öÁ̵ÉáÛ6JK(xßZ[þŠ/œFí¯gÇÖú–9£¥ð,WõÆZõŠKŸ†5Ì}ÿçÖ`l"­%ÉLjO‹5ìM8êŸìãÍ +Å`v€Õœµv@ð¶OÇ¡òUl±`‡ÑdÇ…)Ñþ0þBC¸Ð½¯­MË‘píg :„g5XëØ­­!œž¼¯¨W‹/Ðä’Ñ& k(ìÿMíîJ\“vH; GÍ =å¹È*…ÕƒÉmt¥xàãä~×^6¥aD|nÉsŒ­¥ôÁñšÙÚÜÄG“Aʧq‘ ÌÌ9Îaÿ ?µNÀ!õ²X‘€ ¥œGÜ3ᦺ°ð¯Ë4—½HÉiê¤þq¦Ùrã¿iÉð4Ï¢}îñåxäÍÇE C§! EÖBè?ÁhD Ëq6á_É{%-ZšÄN.«Øµ£*ë¹ÉL;ÀêÍÊ’zvÒtEuƒ>l÷.¦o“=Ðù9ÕÏ‘ÇøDÎK ULá÷…¸›ëÊë3çEî]Žr„¬‘žÞ ÊBþ‘K¬¨Ü“Å&…~á˜Î†ç³ýî#”½Ñ¡8yG4Ñòd¢(Id`1ßë¨À\pѾÁl‘ÙŽò*aTì£3štÄ%~®½!Ý3YìDg|ÄÓÎA¢“7Ĩ¾µ Ý6,‹påª$6ÂÚšA·è“h!!1¶Ðì§;W±ø“»Š÷´¹f£Pè•9³¥äJ¸ˆ‘$N[ +¥NÄòצÚø6­Û‡>XšÚXï ¯¨M@šë å;u&Š»n ):Ô µËN°Ùn#8[>€#"i·¤udž”.¾¯y¼|ʦ•©Ö‘woÁ¿¥¡éµÉMJ‹bkmga±=¯‚âp"ÔMí•jXÁ«­7=0pwëZ`9®1Ù“ó$ øLÙyÍ÷þ%ðMuÁû`w\9áõq¤SAC"ðv1EqjÖatA·´ŒY/^0O,ûí)¿ð4*/+­¥¤ÈÑHq“i'FàâvøÖÉÜðp]oà¸Þì‘eª·¨ÐÞ~9ŽO ˆ7éx8Óå³^òú% ‡ 9’÷\°:´°ȳ‡A¢GèÏZ;\ð!±­M¶ìæqýK9Ù2r”ý¿ ùØ™ +qgûjRÃ9ª[Á[XÏ»7}ÝYõC;ƒC/ïjeÿŒôu¼xÛÑôØTµ1Ó[’¬o>¹ƒúÑöÎæ‹ þDyô6ƒÃD‘ÚVì÷82·—™D†NYzå”Ibi†œ&s´'ýqô<“9²WÏ^{MU¬(‚e|9ôÙŽu/S˜—õ®ºzF¿–àÀ/,ùÕŸ—f$¾ZYPç°@͸¹ô,´ ¢‰Èx¥¼ãøî8W‡‡ø­*4!èD¢€úñåï¼D½jÊ“ç §å«Ä´ˆ +Oô¤ûÀæ[ÜU6‘ŽÎ×O½¤L•cŒ‚• \àmwk4Œq}}Vl«¶j êb…œÒ1nnÎbÕŸ‡ŠY­Tõ¿*Š!ÒaŠÄí©)¬À©Ñf7è¹»C†9–™›Çê‘N8îùeòå/¡~}:F‚ã\æªhwL Fsòα‡ŽŠî + <‚M2æV¢d ³±í·z_VúÂó2-ÐühÇ_~¢„SÌ×Q +€°@çÃýƆ +|fñ°àñÙ³½ð [ "ìË-¶JöiVs„žù +ÚH¸UÁ»Ah0‰›#[¡óUõ —|ü’È` -×Í +AâR±X|G‡2°FEìhÐ"½@–ì3CW*Vß>„ƒ`kÄèÀ”|¡žúdšUó'…°ísŸÕêd3]º ÌÜæ +S +v6՞ɜ€ú\êÊýƒO?¤M•FÕÄÓ¯ø¦n’5Ï9xTŸY2PÝ9î¿„÷!Ü”«qf[Û(sZz@q èy'„Gu4~æ?Ñ£dæN{û-"#}/ÇôW•ÎàšP…Wèî/¯¸›ÝnƒÌâÉOÕ\Ï¿åíÄeˆmü¦‚ÄGÕbá÷OC™Ärk-hÐo’†E"õP ãùMãnUX<´u(þ¬‚¬BVWZš`ì{öÝ |ƒœ)4ØéFv;\ .ÂáÕñ³FËDëçæ­nB.ëüêÙd¿uE¥†—w×ñÚò¹óŠÀÝèÛ±·gÛ^¤òÔ~r ©¦E£J÷\Òe"„z)ÀésR U"`.§‘+Z¦/„Ë%ìKgïªá'pFü…d¨Ì}qgóLÃ@[ü‡†:¸—ëqŸtEà“ J’½ÂJYR†³ßƒ +HèúÃ*z­,pøàœ:0ÙÕû¨å‘—OØÔZ L ŸCp†Au}±ëûe$íz=ˆÝÁn´µ…¦¨>é›^‡ÕuÌGC?°X/Â)“6xý‚)D,WûԤ߸É`ÿ ÁÔY6FnwK"û½Žö÷_½ðS’µJR¤¤‘kè³€˜Ô‰~6»ÿ^Qÿ¤ÓQüo±ö²Ësç í‰èµØ38¥ýÚ±I]MÕˆO)näØ)BE5¢7oÅ2<ª¯énêl #_Äažª~ Z¦Q¡ñuã2Z+ò-ÅQÝÍaå~ßÀÕ¿ñ´×Áƒv¿V–¥Ÿ„[LÁ²}·—GVÍt‡Øob•Å/êM³@ƒÌó¿yÈùâ?jç~)en4lÓÕ€§?¹÷aÕ¾—ˆ­JS«S¯oØââ^¼m»<0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +256 0 obj +<< +/Length1 1534 +/Length2 8105 +/Length3 533 +/Length 10172 +>> +stream +%!PS-AdobeFont-1.1: CMTT9 1.0 +%%CreationDate: 1991 Aug 20 16:46:24 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTT9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +end readonly def +/FontName /BBAFZC+CMTT9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 34 /quotedbl put +dup 40 /parenleft put +dup 41 /parenright put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 61 /equal put +dup 65 /A put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 73 /I put +dup 76 /L put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 95 /underscore put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +/FontBBox{-6 -233 542 698}readonly def +/UniqueID 5000831 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÍÖP +½¥í˜5ö ÏÈð l.×j‡…kPôØ úëPŒ—ø(?ˆ±~M;Àö^Ãyy¬Ü*f˼[âõ:­ç-ѵZ/¿îeŒ¹_[³+ 5{^Ýòd tp¾ñÅ!¶ûÕÇ~¾Ùd¬Z+¾ÉسäŠå»:cÕEwK’+_ö°nÎCdZy°2}m‚3…þUó@-UÓ´Hkäe•›ˆ÷m÷‚LZ³‚Äá ßèV¶óERÊHÂKWÝ„HúÂWÄÙ?±"á!Ók™²×­¸¦fï›çx§¢ÖxàÖœìÃb2®‡¡r¯à•S*Œô ÝJ_϶ÌýsÅr#4à`œgCîey‚ 6|IšÁÔW`ÀÎÁæ~+ër¾m(yT~Kµ$e·YGÒ$™‚#'Z,4 +ÀC(Ì)5Å>âr?æ5z)†?lG{> t+0¤Áï«2MgƒáËǪÿ© s—Sx¹Þ¼Óöª¶&£a¾€hÆÝ +䧻ôï¢Â6¿~%VÁ{Y#×°üm_êt@aG@§|Dky-”VBJ]Uº—ù}ÍÕ¸9ö! RÑZfaÓ¬'džs$íèƒX›9åÑRy0 ËZëg¤MÐaGãCkÛ²‚Î=)£±ßÇ+ÙBøË3v´á,ÿS§“Ù54lë*ü4(Í“Æqì%,Þ4V™š¯tªP…Ú£^çSýÂÇØ>ÂÞÚ«±¸›™äËR‚œ¿´Z(okó«ÞÜËÜë¯i”±à}ð ºGòûöl`(& µ¼<»½·¼»íœ2#6¢òäùT ]HyÓÙvâ„ŠÜ…·cÃTè~¤™˜Å × w"Uƞ呼6På"†æ÷šÖ2Þ9ÿ›@÷%øæà+t‰)Ýy¸ü.{v ªðŸ? +Å”ˆ°ÒÔ©\%΃ +R#Ö¦4ôq÷7»!KÖ±†|ÏÑiN†YZÂÓÅ×ïüÔw=½¸BLtð &SY…qÃõÙq&q èµUüÈù¯Å€œÇîa1æbãÓn= g¡ˆ´&B›DRÓòã?¥4<ÍÔŽ01‰¢WèšÓÑRo³÷²$9g/±-Ì8’;U^Z¸Ð§ðN…–ÉópÂÉÿô³ðìï0À/ËÓ(ÐúkG! xìÁýÆÉz~)°qTg",¿Ìg—öÜ9jÂw®Ñ¯ã$ü±¢Å¾¬§JŸÇ%5g2جµØ™*åε¯V«¹NCšá—G4·¬ÿ]²RtÔV¼)<¤ÙFFüU šbщí_Æ7dŠ'{'ø“3QÒÌu›y4õíOö0²î“–¤(84#>r ~ ä8•G3,Ý] líøÿ=™?VK~vžÍû/¨÷3Z/E1¤úv]ÂöàÉ·ºÞ!ãP¡ +öMw4I"Ou½ýçvºâÉ„ZÖ¨×q®Ó'žK“ÌÂ>C;KX5îA•pÚ:µ[ªí# Q²KÉ|ˆj!8œ S„SÝîü ­ÈRUÙ×r¸?zžû.¢p¹%BW÷oL\Ê© <yU°qõë ®,¯:îÆüc·6ƒ¹s_Úò"º0,U˜éýðîOtÒ”¢è @T]?‘”ýÏ‚é½½Gƒþ¨À­ ÃàÈé€ù"u9P&ƒP€ˆõ–K÷&ˆÈO;}å‘ýÃÑL–5-‚œM“påCû¬êôÚ^FAmî5ÿ¹G§nXN Zù\).[tþ€ãè÷ð@;x}q¥äw ³Aó–˜2"OÍ\Ž†bÛØS:2 ‚f#ò¤OPúO£kÍÐO ¶uSvzÖsáHË'”ΆTÇn™îߘCÑ“ŠÕ¨¬^ ¥5"@àÉDÃßsô8f•OÔ®š¬XdvrŽ˜Ýà»&E%¨YsžM”è»'a0F…×þöeèæ…¼¥¹~ìöD1¸´2aÔ“zü%ÍIGÎh®ºg ˆxô•q\·áÉx5 08Ú_¢ÏŠÒ¼Èt¸HÖŸ5§ôuLæá.Pøø¤™ã°«3«Æ#×^³Û“ºåg©I;ÕŽ£Û‘­h7q]᤽sCñ3´àX4ÞLÂ<êT¬xo‹¬Ãeùuc[eM“g˨Ê)c#F¿vGÜuÃSЬ«ô·gò +@øé1Ðçá«SËïºúè¿ œKËÈÌ1Ä¿¶SÊ6>°cv´ª¤=l_ÆD!S'ŽW“ÝžÿñÏõ†Ò’O4HËþ‡·5:ëåjçhýe¯»9¢¶¸¿Ü’j‘%·RIMÎ2>8b º¾†j’ºªâ)Lh¯ì5ªßÁ‘‘'ã÷8€PÕÂŒcÓö2@ãQŒç’TÀÙÖÓð}/o”‚yÖ¾Ø^?Ëæ² +‚Ôs&Û÷ƒ¬É3¶¡>°.O"išš5|…éîhƒ%ã;“¼ëR6.&HzD‹ú ”ªÓtø×£¿˜.âŽ]x3 ¢óÐ.p®QÎT:q÷ È®Îc«Q*\zG†~u„i,öþ¿> ®`?2nÄþlBÐþ Dé½Z%#-G¥6 "X‰à(>|晵lxŠ|?‘x²Wݾ»ƒ°-WM„‘·>£²' @d¡ž¯~l7!nntΩë\×'v7ß¼UªÜ‘/·%‡¢bºö rL¯ˆÜ/¸˜…_˜@J2þA€v +Ø‘É>&/TÙ'xiù •*«&wäöÍßBb £E -(*ÐÅÛÔTEݾÀû©_Qñ¢ø¬â=LÀŸÓ&i˜‚.Å|ŸM—_D‡ƒ^£¶+Oæðû4CùÖ%6»Gpqwkn>žò.kÌâ\1²ìÄä[J€ô†!çÆÕW@ðW¿o”sW gv75Ÿˆ¿´,ɽ̄¾SyUuÓN¾éëÔG°-Lónv¥p‡MióØŸëØU¾„¥®UàÜŸHĬÌ)p Å$20#F å½Ñp/Y±[=á¦yäãb̧ìaC@÷ +³q°°÷ s-³FÌ<©†þ€[é]'ª[~'˜¨E'l¨§çÁNJng&W!« :}ŒM] <.¡âð§*°Àt¯Ñÿ6:†QßÕNnqtãÖíÜôÇi£Ø¾£À·2੤ƩÔçÈJæãLi:à!:¹0Á)K÷Ð8sø'ß&Œ¡d) .li?4~”÷Gz¶Ó#Pwd°]Sq$Þ=ÚÄrpÔý,/În0ïæŸÁ¿¿¼‘Èúg"*ïõ<Ø(xtà®üh6!]ÔšÇ ŽNã\å¨u1ÅLÿñ6Aȯ$þž 礲†ÚãgŠ¬W9jºRttvf­ I¯¨ ¨èO¦9jf9!Bˆ2ʶ³=Å€Äi˜2õ}µ«Ë1ϪáXuzÑ8—…å¹qu:,ë¿ÃÀiȪó©Ç…(ŧé½÷¥ë¿ÊL~`¶äŒ|± ñÌ<gD0ôkØåxpO=ü"§§~MŽ½þ$;©ûØÁ÷6(C½ÊDЊ%$ÍAê‹ÂYé˲/xCüW)ž…ð%ª ©Ïafüü5ŠvÝ d8ä’7WS×µ2Ö —S‡„CúR]@GéVŸ5}ÖÙfo˜!Ôºnø™fFòÁÀSp w°eÅyíy{Å°¦ÊÄZÒ篱ܿ˻½[q†ˆ^â©9õÄÓÅÍ;,Î`Ô‰ CvJ¸êgÜà(ÕŒÆUÇJ,:еâí0z¥fÊc£‹ðK"n„Éw`ý¹Ÿ)aQCʼnËÒ˱ vƒW>‡HHC‹[ ™ê BlÃáLeã,¬ÏpžŠ›¥o>·*ï/¤Âô¼Kéð 1D3 +kü‡°B ÐzP1‹XÃ’]‰bRH„ùò58õæ0, +¬C[M¨ÝÕåML6V?(e°£iÒáî$?…åjÂì=˜CœœüÑú3Ž¤b²ñ>£í¡Zyàz1Ÿº 7&–ÍRá o‰Ná°usk5“}¡*¯rï!á÷r~õB>‰›ÙI(¦lнñœ™öËËFÒâ„â뮆dŸåOÚÓnû*íÈ#Ê{H¥s‚q± We&*é ²#;Ûi€._^€Xf¿õ~"`]”k Ò¤ rïÕÇx½Ã“ +‹¸í?f‚ìBÿr; ¡•ü™TsOÈ|€ñm}–oÃ}y -aŠm9báÞù¯ÅÌk†qyT¹uk˜rÍÏl 0½°<.Ý3È\Ô¢[•c›ÛUÏ»½ÆþÂɇ¼±Äˆ»oqè$\ëL‡9¦éwa×VÕÈ`Fø»½*ó`¨‡†¼‰à`"?=ÉEÁt–«_íð¾ÛÅzm5C4¹¬{”Lk •ÜÕ¶)ʸÏÁå}VÚD¥¬ $¯\í‚ß^!ˆ—› ¤¨Õ7Ûžrk%€:˜Wâ¨?¢Ÿrùºô„Ú{ $‚Yæg0¦r%÷!xŒœÈ”-ë÷¤k¿©!­ˆ“q”åº: ·Ÿ+Ïúæ<Ý|¾@þ 1h! !S Ó9äa'œûÄ&T*ÞϲWýiõ¯¯%ŠÊp0Ž¯&7€Npƒ •ʬïLû:Ø¿E{1»„oê¯åCÁ¢Ë;PÄQÊ%K!“‰,úøÇ"Ô ÖIðQáαoŽÀ傳T{8ac›±qLë)†3³éê,F7ƒCd6E +=–¥™wO-_§7±3PO«.a%cPMkäÅ0 Œ,,ªXœ«t`¹Æš˜¨çªãà0÷{÷ÌcG71›½ÑHÑÄ»±ççy¡¶À +gOÏÈh«Í{aÏv.ÁÍœ4Ðø›Iã÷|ºã^QlþÙLçÌ;õŒ‡Ü®$+`Âl ¸Ù̦†1s†ß þ[Õ®Ú„?œsš¥z’¯ç§‹ñ7qþî‘´7é½®©‰1U ¹öúÕ=°AÊ©Ž¶îŽâ…@l ¨›VçÎ#þžtëstã!s«.‡ÆóŠf¿àøë¯ïeXuBõ¦Y +BjSÿÆÝŸW~? ƒ=}U·ÎÜïÉÎû5ø­Æ†ôäË5±uw]ýoo¼¿¯îm„öÆykÓÔy¶#E* +’l½wTûÀÑ;ϳJÙÿûÒm’Ð"1¶®ý”‹éö¡ÙaR–Oø$lÖ`LÎh%÷¹þV[•æÊ2Кå´`©¨”næµÝôL×Ë”q¯šý°5øQ Ò!m —ÎÖWɲæaê«O¦Êžî¿úy™M"!&²™¤:ù^¸(PÙíZNjcÅÀ”è9Y©ƒ?Á{*à©]f/ ÎçC“Íc½®~¸&é]ãá_59¯÷¹|†u÷é]Z®ù/:ê!gºrIýÂ1¼Œ•Ñ7›ój p¦„éÔqÖ-¨¥„ˆ6j­w®™”_ÌZe½ 1q>ÄþÞ ucØêv_£I¨gŽ]gžˆ} ËДþÎ,ézÌïV%®Î¦;µùXÁ8ˆá¸6åqr±_%/>þŸ½0Ùó‰ûSWjWÇæÇáªÀ:,Ý{ÏVÎN—B>X„±ÜÄwô…Ìû•3º¢%%¯c Ê¸\ |¯í†+îG~äêÓ¢’‹³´HÏ öø+$|Ñ{µî ! AêŸƒË cŸnçÜóD Ïk¢“<ÑIÄ?¤¥èæßô %Å' /ìq¹LöŒjãÕÄJ8¡xVw7ªLìË"nO£&Á¹:­?q~É5ª·†‡Eäñ##8¥%R +¢ñ03kt´ g;®ö¹Qr Vy¨&„Ù!b$•]“¥zItžŠ9æzÉ%>/I/‡-bRå.OõoÜ TEm%½Ð½¸·Ü9r­ñHÃ^'RäÏAciÛÿ&,Ê™À¢fVÀÖ"œìð–8‚Ïà*u±e ëœáê·ÿ€—]~ÅÙÇñbcë^_Ô€‰M4æîõѨ‘D«™èyû‚‡^\ÿhoꑺaEcKøK¯x>o¬.&PÎòVS.Ù­|ÌZs.5÷ÔxÿâÒl¥ÕŸ@Z …I”sd ƨh±§¹»wû:›tTt*ðÑý»ÞK']–ÆåÐ@)Þ{«•œ áðY5挠(i.~CÀš ð*ß©Ú°…-ÖFæx3jsaÃÈR—´=ÄÝýr·%µÌ-dsÏUјè†TGg â£0èc! ¿¯Í~¢VÁ`~ú[m‚UŸoõ< +@)§œçËf뼕VÁáíå3v1>Ç#º/ ÕZkqTCrûÕ`[hŽØk{N˜éó^÷yz$! \†Ñ”‚jQ§NáÕáh<Â:ÝŠuóù i¦„‰®1¿Ô„ úÍ<ªµ>ÜuîLq ¯‹k¢Þ~óŸÅÙQûuwµÞ_kI†—GZp&\P_êL`›¡aáÿôV[VÛ{´Dà üW,lØ8;6³æSa3z·[”dƒ“^vÔ¶ÏT:+¸B\(á¹Pó†ìåŠGJ°dH¤)ÖÜ~ÐúÕ,¾×õbÿ!ŒÛÑTϦÐ1r<Ìu÷4»ƒ¾°g ‰õ¥IŠÚÁí‚ûTëÆy¹ÏîØíÀ$Þ~%ïO¾ÈÀJ&‰T³åÕd+n5î«Ù––êK¨ßÞmÕ9b*ýd+ ü£…†&åH^ØW0—šµ?%'Ŷ)”ÿa¬·´ï"®tb<ío³ŽU-΢†àœlCh]lN®Ž+P ¡w<¼Í[¹Ð¨C*ƒJS¦{|×ÈM¿«A/:$¨ŸÅUsªg“}ÿ¹6îÉoNÉ*É7WÏ|Ciâíî`  n KÕ;¯³O»;ôu½Ÿ5khŽÑør1rå' S‰þª¡ßׇ[<û± f£ƒ­Ζ™¹µ1Ž´ÜX<ÿÈì@÷]zWPëh.Ô\Ø(^˜îꢃF4[·Vï÷7|:ʸZá¨:@‰ßI@.Ù§cAù‰Ì4’wh%¾GkÓK%©-EŽØ„b¡©>=û”(ÅŒ€?a½þñ`áæáÒÌeìì[šK¹’qŽ +¢¤FxñÅ?ÉYé­nvD, â(ËÓDÎ0g¸ Á‚4/y´âÚ½oB42Æ+nJnuÀxÚägÓ]E2Êzeùª‡u†Wm/:<±5Ÿ7˜Â4N eIS´æ‰#Ê…ÿÙ£ƒífºßÚzfÑ(TýNÖ_"°l˜\þ°ó|º³ÛgOTK"ø¥‰9,[“xöÖ§¸.06Í#weâd˜Â—݃W(‹÷6yápE…À(ÍRè1PvodÓÔÌ?+“¡©OG¢='MfÛûÐÿtä×iâŸ!ñ]±kh¡MŒÀe™; nñÁ¸»@Éæ}áÿ²÷{ÚËXeV96‹ž¡Æ,‚ëBN ¢/—)<0ù£à[˜‚½´WSåñßLª Ü‚Ô<Œ…ð?›¹Ã?*°ZðÓï_i/È,‚£ªµ½š{}66PGýlº™'»ðºþR„J=Úd_E‡ß@çœÚèFÙ¨¿Y!'>…‡oaÀÐ…ªÎõŸþxn’1ê]èúFwÑ—]å/íïðI|ê½RôŽ#ÈSNÔïXË3aM¹ÆÒåºÙq¡É{ö\2+V÷¿l#˹}©S› ©–»>SÉ ’>jÐ¥óªÄÑHÚ¿0Z”ÿb“²H|BÖ>î»ÿødTIû×EëÖÜçâÅwbmRCŠ &éÛïê7ŠÍ^Ž¶½c`I¥#µ \$û +ù®!Éë1rps]È'ôÖþÂ飔u?— @ÞØÙ"Ç¢ój‘®›­Ÿÿèœ ø‘*(Ï\S‚¡9Ù<¯á#K8õ‹ iWpìc’µ–²ÚI/o®t@Ž¡nÅ0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +259 0 obj +<< +/Length1 1886 +/Length2 12514 +/Length3 533 +/Length 14933 +>> +stream +%!PS-AdobeFont-1.1: CMR9 1.0 +%%CreationDate: 1991 Aug 20 16:39:59 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /GSDFLN+CMR9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 12 /fi put +dup 14 /ffi put +dup 34 /quotedblright put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 44 /comma put +dup 46 /period put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 58 /colon put +dup 65 /A put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 91 /bracketleft put +dup 92 /quotedblleft put +dup 93 /bracketright put +dup 96 /quoteleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +readonly def +/FontBBox{-39 -250 1036 750}readonly def +/UniqueID 5000792 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÍÖP +½¥í˜5ö ÏÈð l.×j‡…kPôØ úëPŒ—ø(?ˆ±~M;Àö^Ãyy¬Ü*f˼[âõ:­ç-ѵZ/¿îeŒ¹_[³+ 5{^Ýòd tp¾ñÅ!¶ûÕÇ~¾Ùd¬Z+¾ÉسäŠå»:cÕEwK’+_ö°nÎCdZy°2}m‚3…þUó@-UÓ´Hh[Ý ëÕçÂa2ã:Y§ Üô‡]<žõ}3bÙòפ@»i¿e3d_ôÐð5‚ù¬í=ÌvH›ãúŠD`”Ó8°nÌí¢iòê¹Ñš™Çù9ùT lZEz' +‚Ä; üUsFŽª>zJ2ø(‘Ø^KËË0‘Ò€TÈ}„Îœ­hiµª»¾Gô hy˜“Ò+vR•áæž3ª‹~Ù‹¤€ÎÊ‘óëøï…þš9v–&¹ZÅ” Sù°"ØJDƒ{¢^Ñ\Î PO3PeYO;È$T@u‘ÌËÏÔd]¦ – “ñ‡°Ï{UCÀ·‰¯]&Kln:æF¬ñE•ìs(!ãæÏ+Íâ,ãíöÛ#QdB&U/ôG-t˜òwhPÐÐëãÇŸ™ž™µÀò.®»Ùw‚±½‘²¡ö*vA%H­SÀÝAJÀðqÂÂcÙ­·ZF!€>˄»#[b e‰„²ØàÄc~(¼ l‰5¯ÇAá²ÙÂ;Û%0K3xúø’‹Ð–†ª@û ±ÜHÉ–ï‘Sðxfo­"z5‰õ `Rg!-:eëÁšŽìš9 yGáP\eŒ®2òtýÈÈwK TÄ¡ÑphÜ°ÂW\V/ÜZ!v`›­š,%^BjC%¤ü0Sdz/5÷»ÉªP_0"3`ú/¿’”±Òœ^*¤‰þ†á¨y^©ò Š’ÈE¼P"q«q¦áŒJâñ +,`1 þùêþÊ¥þàü?HòiUõ€ŸŽð¿uÇî6çH(XRÐœ½:…“‡V”ÅQ‚jSsl( jB¥”5’¬"؃{Upéox·†Bx4õ1ÃEò3«ä:ÏSÍƽûõWˆ¼ð‚hê=" +á-@;q…ÃÜÁÒñþ缦°äëÿž¤óˆãjÉhʶý½2!À!ÔUš9mBLº•¾BEGž4÷AmìïÖ£5&ñqVy:Q%n2ôPxR=¹ð¤xnËVÄ:Š6{8’oo·#„œܳ¢~çÀ?ªhwéèð™A©v›¯àû¸÷WµEŠ1ü$–† cÏB'i’bè•Ñ&$¹²ÿ'~üúVM#„V`äçµúÿc´:Î*¤\ê.ƆI›ŸÃ‘6¼£C¢ƒêF†×fçï]ÌlUDÝ°®“’ÿ‹ìÙJµßõç †LÄ#åb%>GRŠíUKÕØz@ç |óÛÜ„Щ|, `’‚nüÙßì²½ŠóÈZÚP°ÖQ¯d. ¼ 1û 'eÊ”0`¾ÔÊjJ&š£§+©‡©¬€ûu'cé4 òßÛ`;Í/:1?¡¼òôYRÈÄ¿i©0²3Ý›é¼ÈÏ|´«µÊø“ Y(7vñ6–)%wŽdżîGƒýQIy³œ 4q(\¶% ›–06;o’ýàv´z’kþ9äð×Øû”ãL!V6Z-Þ’7>}cÕ3,9´uýWJãx¶†¹ôüò'„y‹Ë2ÝPý ´¾ ›%G{·¸çà {x7DÌÖw™}Ü>9JYE‚\<þÎÓýVxÝŸk¨lM|m§6²ÃÑ ¼ßõ(V5)°ýCpBçÑÁˆv퀦ٯ ±à“ÿƒ¾œ…lß63)£ªÐ®rKä ø´—¬´¼uXê¨ý6ßF¾ÄA¹$ëQ¬$ÕH’@Ï/gÒ îºiŽ­ n;HTÛóYN~XPçQÌ4H¸÷lœip†œpàÓç"«ôUóZÁݸ Uõò×Ç¥Œ×æÐî$Zæ¯ +×ÕÓèøòsé´@Tá0;Ð22c-… "’®³>9°“ÜUR™{†˜#>¯€{-e»üWKÈèÄðº|]'æ â­æÕÊÄuªVwYK„?žz?‘ñUÞ–'…]Iâ]—y´õ2vït‡p]ŒÐá<=Üö1Ö¿Ù‚E…T)×@UUºÍ„æ&„.¡·­emKj«'>0Ü –UR…‡÷t7Ü|чÿowE!pÚT@þWžscGn’Q¹|6?²~%"‚`u5Ùç_Añ£—5çh©¨¾(6ÌR7¸¶¤Ê¶Š9û'Íp¹V}¼UŽÚÀNÄ=‰b}„p²íß#Û·6AØo–ùN~á?"°qiómȵÉiÔ7$)5ÝIˆš¦êA¸öŽJ:{¥å{7¹v&þÉ‹´…ž±ôÎgdLü\là‹_ný¸¢?•l…*æIÌ„¥¢y»3êó³#ÓÚ¾ã6ÞSÒ•[ö”ê>Ã'O0“CO:¯à_…­UW¯£û}Y(!Óƒô€{åñ7 s[wŠ M!»¸÷ïb™ê”0!èFYšIIÝ#—ôA’HC°&øWú暇Z¬"£ôLKƒ„>æËI!k¸­Ô¨Xû9†‡¢‡¡/›S³Ú$"KÊË-n¦8ýÓùŠÉðü/ "^Ë2«l5$8Ž¦¦¼‰ÌG€N;AþvÄit AWC72,S@@ÂÛ%ÚhoJ¹õ¾ë·viÇzOãW2êi¾d9+o³éšÓØÇÞØ‚~^JVÛ·)ÆîÎTûÇѯô™agp‚ýNA.€EÉË#_„iOÄÏY°w¾ò6ÉÞ’œK/QT•Bà¤e&‰^˜YåØ7®Œ—tm¿äو̃ŽÆÉXþ)xuÒ:ÈJm‹p3ðMWx¿t\J¼M™ÂQOua,~6K + 8P',têï7áXBûåÊÌw™“ÿç>ê¹x<8»PyŒD ¡ûpc´g4œ¸ðD/˜ÏÉ¡/½'6 £›Ð";Þßüß’NȆÐï+|¸eÚ"|Û³uV@–nŽeâyk½Èc¦B›Ër€’!$¹6ÌKd& ñ‰Æ» D•\Ðöê”sÁRjû¿ë#ZåÑq67+#;$Êæ¼$ÿ4°ü[£ø|eŽ8<1⡽Ô=ŠRe*ÌXmó~;ªïUFôZ1àÎÔ¡žÒœÒåóÂ{‚ÉÜï©?‹ ûh]$2u~z¬ã0 O´*Yù'¬> +jæŸsKJÔËcÞ•C'ëªF‰F"G>¼½ç-.죽õ7h4†3)ÿÆöŸQïüÈÇç!$¹÷@¾ 6-pÕN®öÄcJ¤ b=±—7¢-L+Q\‡½ä—ÎûÅ ©œi1¶»­<†H+Ýþõúå;¡œÍBÝîó bA‹Ó]_”`^ÓÜãÁ­‚Ž¼lOœ­8î?òÎP'#7ºâùFAÐSÆG7¨èô;_,“‹•}:'ùEîC,[À>ùg=³TüI®È«¢×ieO*d"Ÿ7ê¤sõŽØž|:Š¸ABèœÑ{šºÂðn«ñûœÄúˆ©Õò?Æî0Ã_¹®±Bæ‚)Ù™ÚmXG©~)cáxò7tÁ”[±ƒE©:Õ°tÞˆÔϳ%yÝ!‚›âðOSj%µ (…ØÅ)Õè†JW'CÜÅôºhâ>ÌïH, pŒn@3÷J)T¿[ÊS»‰\Hbd¿~÷sàˆƒ±cË2ÝhÉÖ{cåC'7J¢Ü9€¾_±AßcWràwGÅOî®ÆŸª'Õ2?œªªr]3Jˆ½l!˜ê”ú¡Ô˜a“_íu5,ëü³”#?ß™*¹ÉœMé˜ÎMždÑKO½Þ]Žã‘Ž>Ä4®–çÁ YÀÄ1Ÿ¦½Æ—wÉk¯.O ðY%¬+ÈMŠˆdøôHqÖŒç4x¥@ ‹ WìµºÍ¾Ü ³¬ï†î 5ûÉ™V´lÑÝZѾeÄL6b4 Û¢•t:V*ÑrÔ-éAóÒ„)ÎUr¹x7ïûÈP?ð€2þÂÄõ)ÕÉiª׳~j-pu“ß3 ¦ûK®€5η¤Or¨Ùby=áãû?·ó­Z­»øŒesÂúbø26Ä+ødâ‰Ê ª8¼bž‚fûñ{Ú+\´øOÿ;!䆿æ/Øò?yÁõŸPWÎj0™Zž‹¸xL;[?‚+ê­­Œî`ötW ,ý¡þ„EËxä½àå^Æ:DkÄÉ› +1ëð2ó‘ÍD wižÂ ñmÍÿýTàsYö0×í>n¢Hnðt`¦†Â~cÎL«+äæÏã ìí–ñàÿÌÊÁZÚ™^8Þ›n×%È]~°kW„A}& ]âõË0cCΕøÙ/·¿Äão3¸ †Â$GžÙ†éù6§ò³u÷A>dëÆA*Ôv¤±Cáx <Ÿ“ä¨ðâïƒ^Ò€ŸÁ鯠Üy:e4ÑAŸ[ê>àÍçNœ®I6š÷÷‰(‹dÒu<^¥Cë…&ª!È»"¨P¨=HšÛÕnw÷®Ü4¶«¡ÿO¿ucÖò÷|éϸ¤¯˜AxÍøàìƱ¥FÔ¡Ú³úèl’ìb,|¶[!³&ºí†n‡} <=?6~”XâÊTÔY8ùˆÁz'VÑMÊZCrýiãìœgرå¹ñ®™3–ïè“[ õÁŸûúé¥>,ê%–Ëèðm¸2}€«8ówwEµ]4ì÷;Y³„Ѿ£‡%»t©l™ ;‚Ï{û §Z‚c[ ƒFcO(âgð‡N˜2)øQZ½*ÎJ=/…8šG =ìñôЖò[Pšóè1÷ʹ©ùØ9{¾“ZDx‡}ö˜“ÔJìYé]AZn·Ù 6 +@l,¤hÞ¢ýuú©ˆ‹* ñ†j÷–Ùì‡T&•ïXßö*Cù_=£i½°¤”“D:Wª/pô×!8;¹Á +L@–Ë<ÙõO˜Þ`ƒQpèxA¹—ñ&?õ#Ï…¿‘>~ù~§ž žíYÓù‘À-Ú$ÊÓ݆KŽØ‘,ãV´½[©Ê£Üî`Åõ¤™eNÝ‚)ìE鶟†áC´¢ŸU~¥®hÄ›A-±%»âêÅ{"$2§lEìfñ1¯“#ñb°{S8P1G,»¤ÿÏÅ÷DlÆÐH:¯‚ý 1&wfû›šg¢¿N˜½Á¼¯hÃh…,ú·„îî9 úõw2W1x÷·òz4‹^âìê§Lœá5¯´ÅK7Óö«ºÏ÷ Ò);ûqÝðìþ¦ëbÂÞï–£ ¶ˆÝ# XT)‘is€Åñd0:FñZ<0h¨0R¹Æ®£y£õä†A×"MàÄÚ69,ŠA}¹&÷•¡ñ…ím@îÈ._ôßçüØVQí¸€`òyÁòÄÜÍÙ­@e)íðÓõý؆]"÷Ñ@ã“j +Ï5CÚ¿ “øÁå™4îK’˜–£²+<’2œ78üNZðh½ìY¶GaªAbþëÁù²ÐÕù«BKû `eÙ +V>>²ˆ"q¡ž Oâk/ƒÆâPš•š…U‰‰¡¢qŠ» ÄßHï¸ÇÆÔà«0*$HŒǶ`9^êֻŷ;퇬Ùwöâ×—¿Æèäóãúzæ“?î̓f¹èãÓqA¼£Ù¥XÔbg”@º~˜ÃIÒŠ¦Ðg4­ßv†£ŒñÊÈn«’R`£—2xv6ƒœ1g#•ÐǸê$Ò˜HFäûÍy\€áÚ°¡°ý14ößÃ`0Atdu·ägî”ýö ™VÝé‚ßbNTëò"u™:‡£²6Žsf°Å®¡À>ð„¥‡Cc¿ õ–û@œ²¶þ:?5µþ)ûRBœ…« fiú®6Ü‚Æ +#1l.^-T[i>ù"19£93²P5ÓқˡVÉ=¾s^­abÉ­Ï&‰Ò×j¨ŽG” D1x?\=óˆ£ ,gÕ…-Š9ýÝ“3y¤Qcµ_M{=ÇUxQ—âÆ$4DЋž‡ÚEîHÚµ,[tr…uNÖçMõ$«Ï4žÇi•öcv;IÙÒ£D"›¤*mn}Óˆ‰^ƨ‰C9 ¶·õéGȨpä\%Ä®ìåºÕ?øzö=‚„+D§#&©æ"GI]l¿×òÕíB¹- ~@»ÇYÆ–¡Wúä9 &Ngœ~xΫ7fÉiòQÝ^p'bXAú¨ç2±K˜ƒž¸%ïëo´¦½îx;â80‹¸ ¸Sùþà•°óMWó‡cÆ÷¸È@ºY^ ¶AG=–¨)éS™—±0ÛÄa¶µZq9hªo¾Ø+“±ðHókZN²’pqveúØnHû—.0ŠŽ õº¿Ô +„Òz"±€~ð$+ô½9ÝÓO|0lœý[Ñ kÏ:›\B^DM"i`êš(ó2T/øŒ3f8€‘h¯Djd‰2ÍY_‹yHT7ð/ìóŠƒS·Ýùtçù+xÅÀý®f?HÑÔÏ1@b«’ìŸ-U©ƒä,WnêI—+@™•÷¤L¹®éö¸Ð=`>–r_áÌÌ'b)‚Ê °‚ÀAzÄH±3SC‘&KêS—p¸w³ÝH¯»Šl¿ã>üXŠ|lA–%‘>OÂô ügžÎBf;zaXç¡94O‘O7feRz¤Îü±/ƒw«uwt²v•µéÞ…kö4>cŒèÜT±ê3~ÚjÎ+›Ì¥Bü¾Ø‹P©äÔÔÙÕº|(:ReÝüÿ“Á>Çý_DÖB1z-ÔlÎ/ThÇãàVv´8É]¸Ì‘¼tiÏfj#!- Íî.´ +L< /iOg~œð|¢Æ{ù(X,MW ©ªh„ðÑa˜u ‘Në’þ‹~Åÿ˜Ì+r+b *KE»Û¹äŽ*La ò;²J]ºj}Už™ùS¦UU9gÕœ´!,ûeM—ŠAD„­×ñÕˆ½:¬nè§q5'b0LÊøÕ*¬w#_·'±Y2“ÊÑ/Ø}•èÀêh~mâ‹‹…å ˆ,,¬–íglPÖY¬0JÑu7“‰•<ÏW/:Þ;Cíc¤¿«þ¸¥„,ÑÒIHëß?ÝsUÅ<]º´ƒŒ¨éè:‰¼ª¨Yº>êPwsU™ Tp?$Ø×ÇXò¥™”ú ½u­óâ;É5öcûfEÜ¥“}cö–û")òÂá’ á¹°S<ÞÐzÈ#Ë&]p0YÚw!€î +ï> ®ù!àSIiÓVðŠIó%Œ< -PÇŸ³²¶Ä”¶vwï±$`Go}¦n45bŸ•¬L2ßL +àà¶VpÎS6¤WÚzN¹FžÑêÑ-Á¡°pŸ­!æ¸^Á&}˜­|íÊmí”H*Ž>Tõeÿd¯•‹’Xñ®$! u >°ª÷¯6­({¥#f÷®$ÔæŠFŠ˜³ä-:)W»ÛÛΠ[qãBQ +8¢ÔR¸‡À²<ྥŒôp΢k§8LÂæ[^û‡Q)ñ XIJ-Ѳ(Ôùœ‘Y¸"¯Í´Èæy€ô¨Àg »×?cŸ?;¡. +ägì&å·8&’ŒžÚIŽø7½\_ÒGPÁN}ÅÒôܶs½n:ëÚ Ê¤ú½ gÓr Ò„€ Z‚œuØþH[’%; zA/Ž(憫Ì}¿·ÿ½Ó”¥™#ôDÆ 3ÜnƒÊ#$ò²)×UMPLÓµJ°`›‘Ù, äXká;Ôw|I—2NPÎgQù2ÂIT£©‰bGT¡Õ:öö̞|»ý×øßéC +î­xlí3'ؽ6O3øç/÷^D™µ¯NŠÞ Yã-BÁ} <íó~Š7gyì^JHQ3›Fx?\òfN­Ž&óO}w‘F»XàežàÃœ»·¾¯ 7ÃÑYª1ÊO'FC~yÛgøˆTÏ.|Ô%Àà[5ì«ôŒß(×WŒ³ò7}ÂYãÇø7 óÙ!Ú•µ¢NI–Ò“’lï:õ…n7€Èk“ Ã`?+‹ò %éÈ虲Õrnƒãˆ†'C¬£?a¼fžëÃ5OÝ6¹¸ï]‘ê~ièp§£")øíÿG,õÕMôd‘’ÄN. ùq½ÛXæÐäèmçGD¯Q°ØÞ@Ä’”êŠ\·ÎyâÐ Èš„ÈÙ4²‹Å¤ +Ä«÷j,ïéØ°ÿ€•eцóçUZõæø4?æ fL¤ô)¸UGFÕzµ~„“_%åÎxÎìÁŸ½êçœØ'çZXë{ fÂßÂTV+Ç¿JÀœ3\ìF¤ŒƒËfŒŠaö>€N:Ýýv¾wºpÔåNî+žo*$a{HP ¾Öã[6c¶ƒûmöÃy¼œÕ$Jß™€¢h:Ÿy:ÉSÛ™™5Ô7%Ñ :¾Ù_÷nËë£nš} ¶…oï›zvßénÝòTGyõø¥s·ƒ´ëøp–~/ ½5¥oI,þ|>pö‹Æ}v4-ìw»³½Aövú‹À!²QÈ> µ®G­€dÄϯ;.†=a%¡IVl‡Ÿûp™±ïÂV¢¥j\íSÎW•ah£_µö'±¶eš¸wQŒšìiÛì—ô“|p0'¶B+ï[3TDõ¥!7ˆ(K‘~[;bÒÆdúð©&?²¤x£Å“Á +µqDs–òŠW)Õi«案¶±¡›ß,Ë5øhzyû-WþËótÎjXÄe¯uÉ °•~9.¦Œg˵ Šë£Všx°âó½±ñš +®6­æ'Mõ>*&DzM¶#Qü^šJ<Ì¥»QôngOpÇ:syà+fvžM‚µbþeóÚKû +»àÓ`IÉîy`@ô‡úDŒîÇ35 ½ä} 0w¸Mß×Òiëaàܬ¹…©ø%GÊt8UPëè€Ãì89­ÚJ3Ó¼g·´QšŠ +=^2?wð¤¤Îâ«mdì-DêÝŠ\2ø3M\°4-(DêR~ä± +ÀάýaƒU&é…†Pýrzc‘ž„|™ \¼˜³n­²µ{‰š._OÂ/y³ÖôU¡/Y É +½4BÜ·\øSb]@_{)¶dÓOH·ÜÂó#õ =(0$ñxµûŠÚ’Y×@2ÅÊ0} ªHWüij1˜í +׊•§$Þu\º5’`PÌǃ5YÙ¼:ľÅ<ªDÏûÉŽ¸í¾RâîÚ'7¨ËÒØ'EÚk¥ìÂ.áŽ+\T±Çn‹È›˜9²ÞãV½'å…Ê«'ƒÉŒhPËy¢éË`N¿^-ej…B÷î5ªò˜a&è‚×y=õpÂwÚYÑ@SPÄ÷7#Wš‘daâÒün okG(ë•Ìª+âÁf­ãä^ŠQkü÷Ÿ), Ñ9 `ËkË¥s0õ7ãç2åsüáþðé˜|="{¢á¢s.Qþí>}ê‚/¤^pw%¬ëdM÷“Ò hö¬žT®< ™JmœlZ)?cÔ*–†L]ØÉ&µÔÒ‡y™~ªðÖWcº3wIæ¡aj¡2rªº «¶G_=ÔjV%ÌqëI*w‘Lv£zðCÑ2Wm.[6‚´Â‹?®Ž\X X]Ñ®‚µ9œ»·=qíü~baq¡¼á±{uˆ¦"{ï?–_ÿïÝZùö§·í¹#(væÀJÅWäÑùñ䀆ÖêVjP©É¹ËUð~™¢ýáØW_•qјß!EW´!ÝÀ›ZÔ1˜œu¹¸B;÷ü(¢4b@’Úê«bôÍ\î,{L¿§Ì?4šË±쪛Yg¬‘§ÐGû¥—6;Ô$‚G‹¬BÀ=6 /4³.K2óˆB·Œ2§?­?5ø— †ßW:D|œ·®ÃßZˆ\·¢ì/­p6›¦|Â`–=Ïž„¿¦e¦Qe‡HWâ¡\íîE©nÀ}üŸ?U]á&åÂ… xQ©Ô嗔ͣZµLVñß äÞ~Tð?V +x;Çѯ ie¼ÎC|åní»Ù»X×쳑Tg†T›gç5V¬îÖ%ñú!$žÄ»@_KöV›¬Vù´/yΧS…ÍC1ôÛpZ ¯ÿ¹:HS·Ë4Q•¸oÎÿŒ?üJoìlµŠ2‚ +Ø’òµgl·öþ½]`;5Š.iRwËDá)äîz¶%pZTÞÞÈb(ÜŠ'¼CÑîÈùöœ¥Lmß»IfÃîî.¹ÙAÝ}”œÖ`ÄçR4&¿Ÿ„ƒJ¡!‚Eö‹Çw°ìÌm&1û+mˆÅQ3 ïlÏ=Žd•îÒ­o +”dã%W¡Àïª4À"`Ó+µF6zò\7C*¡éìF¢óœ‹gHY M©Ó|¿ê{´a2[QFæýî¢m—¶ãª@L7jñ1 fÖO€3¬7Ÿã·Î¡òwsêò‡q¥‡£ü¾;wƒÿ‹4·@ýI6—&é½¥³†‹®Æ[Á&Îøºä4;u—‹¯,&oÁ?Dþn8¹‚‹! v³:l¨Wó'ÁQPð^•èõé +4m„Û’QH;¢ð H¦È¹ö&‰ö,s×S‹)/XÄ!)ùúx£=2`u¥õ½ ”òQNz¦;ãžð”8z^ÈG»„Ê3û—‡ †åŒú`Ã{ÖÙNÎcLL>­W¿ÜhÀ7æd@a÷rÛ%”,´ûG(Ö¢8»0™¹Ñ•Óû¶fº@¥Ñ"ó%´®¸g* +næ£=OŒ«ÕâR¸/v{Ÿ(4ÆóaKSÅÜ]í¢G|øo€ÈéŒÆñå1PŽÐö0¾ò^†œå2áÞ‘:bô(X$MP›—áËúYâ龯¶íåÏ5‡¿‰zŸÄL€x +~-]z{9â\=î‹ #ŸoòvÇ•vpõÀs(ð¨€Øåò‰Ò·ZV¢]ÐÈ +…üjÞa«,Nò„Á«u4T81Wøxßœ0rÞ»¡Dªºýu‰çG}EWL‡Ä˜Ž}&yƒ +JVc’Wó[ŒŸðò ðÙ'¶G’9>Œ`ÔÈ-AW²Ü)žCj¬k‰Ô§`;¡š\p(0Ï°+>B4‘$ôE«Ct]òR?¾EØ*Œñö…”K—þ×9<.åwîM7 ƒ:¤­ŸªÐ åqÀæÔ7Hãö ™«¨½T.øTaçþ^ƒjã{j~˜Wð#äöûʘ00g«~¤x@qä­F\vÊ¢U2h㻶J©%Èz{ã‹ø’{6O­ÄM äìCã`¶L… ÎÔþÍ]@ä¡(ŠdWªˆ:§”¦ØÈ1”x¶pÅøÜ‹,Ìó’Kt.ñT›9ìQa+@6Nÿ²Œä¿ó“0&‡—!æå.†ÖNLFE·#êŠkl½wÆß~ÒÏRE™ÈI»Pisþð@ÔB2Fï‘Œ’›¦””¾Fû/ÜÈbÙ/ÒzXaÞ{]=÷ó}7v¥ÆØ<ªú€³ö¯­¼°_mñ‡¥¤ó$ôã·ÜŸiƒCý#\²eôõIÎvW™ré+ãÂï•Ó€JŒë_<%åí}Æ «'&·ÕŽqò€ëš‹|¸~@SÕXZÃD®øjîˆLg*„kt¯J Ÿ6™ 3ýRd]¢¢Ó³D„Xp苘 ¥‹œ¡.b ùËø«j4B " ­šö­Cñ€ ˆ¨c®½Ù}i½I3Ǚܗ·Á®Jæó‹$‹ðW9ý|A†ÁÅ—MËl>ÚH¨à?ÿÖl~CTÚÃSÕòÜ*(%ÜCãtöý+×—$O‹<Ù&1[Íþ¿Lx%ûè²~L›®ñåÂw†è°‚Û x±AkÙ7E —±ÜQÝŸ·* +½’ëˆ *>á×q~µ×êò„ŽxGÉêýB”·¢ÑŠ‚Ow·wª®óýâ0`…o ˆëŠvoÙ$4úoÁ¸W›KÀNÅšH„,PP>ö‡$“ÐçílŒ‘µËµ”¡üaÿ/ëtö(^ÄÂIÿD@¼<ÂÑ÷)šTrñîu ±¡ïŠ8ü£y Dì¹V§ŒÈcÇM¬|xûÌp°²Ä^'Rô±² †,÷ÞpÖeΗ~¬Ñ̦ƒñsx²t¸ÛO†.•!$:¯ÀsAR §¡¦V_eMû¡¬{ +ËœºIïA2ç"¨¼ñË­ðå¼²µÚO•kÁá.$Ò~o1™›ùÝ“«¼s‰l^iÑè|éÉè )à˜-È2Æ gGfg†þ2MëÓ‡/0$¤ÕúI¶•rBâô½üç]:6Øeûÿ•L–ò {›v§o²†ibÙ÷ÀÆOÝ ÊñÉm/Û:1‰šü?ýúq²øø/ÞeÃA4‡Ëšî‡‡œ=n¡Éâ'îÇûÀKp`;0gnº;”rmLê$àtÒ‚/:çÉV‘SÐ.GÕ¦§ðB„ø«iE×Ô‡_á’SïvmªjaI{”ñ~nŽð6Šø½ªì­|7oOÞ¬9xó#4ЖK‚7™¶ô–7%3˜nLIä LP(\Æ×ß7„ &+Mié6RIщ˜GðešÄm3Öb8š—aSÆgÍÌYGÚŸ—ð¥©ÔíE ´wÊ««u-ŽXµ”sÏO÷«Æ ?Z&ÐfMH=§¼À} .´¤ÜÒLÒÝ‚ŒBÓû8ˆÜU¯¼Öë~aÛZ-dÎÃéQÀ^tÖ%çså¯7‹à¨ ­€1ulºyºñ†Ó/z¼Áí2d#Ðø]1/N_Õ> S-Ôÿ'ß|‹ÖÃ(bÉ7–°@¹Jxœ3¬ƒäa OKY¿‹ÏLÊ^1”kø·úÜÍyö¾šbª«müiÛIb_ìéŒöEÃÔ.stNìO0¡8oùl§ïšsçZq'¶#\ ×b"™˜]²Â¼Dätd¹)9ì‹6W:æû„iÚ„ œýš™Ç=¢“ +ƒ<Èä‰B—”5óqGÈi"”øÐÞÏé¦Ù¬š<ÖÓ"´ L>[>ÉR¬õ¨¦hÞ2¤}Ù±£O¯Ö{rVu£ÂÚzÞ/}ÞÒ]¼/`=ÛÁ`婸U`VOâCÖ»%ìɧß$ŠU’”rÃ[î:ß ùûØNå¹'§…0‡ÿÎþŠÊ»¬rWäŒç-ªm—ˆ©l·<[ëÏË›¶sQÙ\퉎ù«à}wàÇ¿$C€ò'"ÜlçÔZEUmn,؆O:³!°;‡ÝÑúð97×Æ?—ºä‰mÃÃÐKUAQTWsŒ‚…á†K q¸y6Æ®‹7\…]^Œ*\c +Ö}ÿûì»aÓI +èVÀ@aNñötë‡B©*·CÛYÌuÀ>Óßõ½y—rAÜ"IÖZdHéü²›pøEÁ-£–€€^qÚM5\ÌBÜHðlÞÄøÞ¾,Àz0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +262 0 obj +<< +/Length1 994 +/Length2 4088 +/Length3 533 +/Length 5615 +>> +stream +%!PS-AdobeFont-1.1: CMTI9 1.0 +%%CreationDate: 1991 Aug 18 21:08:07 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTI9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /PFWZRU+CMTI9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 46 /period put +dup 97 /a put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 104 /h put +dup 105 /i put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 112 /p put +dup 114 /r put +dup 116 /t put +dup 118 /v put +dup 119 /w put +dup 120 /x put +readonly def +/FontBBox{-35 -250 1148 750}readonly def +/UniqueID 5000827 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÎ僥É99>'´~ ¤}(Jܤ—×r¼¨ÅC8ŽmÀÑâÄ”G@G ö^û7°…+§©  6Ð}¦¼µ) ¹µžþXw4z<^efªÓ2þo¼ÎÑAx‚*;Öxu&=k½ K¼öä‡î­`ñ»…QAb³»DI:eñµmêñRý¼‹d.`!¯™ŽÜv¶¡’Ÿ»Ÿ¤ýC ýDdµ?u_fÇ&üÂ<ðšü`wØêêyÁâËZj™NZŽ\ÆÖ)‘ßv•ÛX¢ßÏ;É¡xˆÂ•YÎ7Ý5À®5ÞóèÚ¦ØÕtôW°8^ýÀH¹Îv9?¿ ý#×BÏç`5_éS±)¨$ÇyJä~F:ÜBýr¹Ú?«Ãæ]%ŠÉÁì½6T±¤ˆq_žd›Wkxj£™Æÿ9óbc¡à¬ƒ¤È4 tVƒèCö•yì$Ãi5íG–/IL@0;YåÚ¨ÜSýÚ?ÈTå5üÕu³Š¤==\J8Õk¯©&ûžÖ›á¯+P(IP“ÚÝ_³Z‹ ¶O(Ÿ3õñìëÖ”Z"ÐÞòYl¹±‰“… SÙŒ6Î + ãGí¯Nw|0;J=§®Q@ÎúŠ†i°µQinMÕL bêôʇwßÑܬb(ŒÿøIÔ¡BËÅú ®ð9ãÍìnÞU£úë°Óî¹åaýè‰]NÿØa +!±î™ ƒmuÊŠßVÎ8»Eúš”Iû—í3óhi#}o›‹¦çÝÙ²Âå:õn(ÂÜŠä8i§#fz´‡!,0éŒkåÉ*§ÇÊà¨(ñWY¢íÝ“eì,=-¥ÏçZ¶Gî Lï§wf…u?ªÞëöKy£,X"áÊàBýE‰W@7,=R>WÓ÷Gù5 öžÓÏJ,í»¡—U›9ˆÅS÷x3EÙt=ëªr¿JU©=Ño¼:qïŽI ’Í‚¬ùkßNÙ*…v +b\ãOÎvâÌx¶|WžxÈð:D Î|#—óH+‡+BVªÀëÛü²Ó˜nHcsì¶ì™Š¤?$gb—¨¢¸´ÿ­ Àƒ>?Ùö4ê0k$‚&ÇÕF¡tv²&#,n”öÀÌãË°ô¼Ø?7•7äúð¦­Ýø‰&;k×~ïU`m.äH?ËÈÒGà,àÈE9Ñäl¶/9%ƒxÀ¥S ÃÀÈÕï^öSLæ„Ƞn Ô$ÄQäƒ á|š±_ˆ˜øÊg13ò^lµ*Ìý3͆ÿ?b1³1)© m锡Ëg¡/GK×ÄæVHÇ#»V¥v3S'nùÏœww_Ë×›Ð'S}b]ž… +¸ÔF?¥X–_P•Jñœ»A€à(ŽD) +4GpûDû)n6°±cÅ+ÒÀÂëHD©xöáñ d-Üžj!—·lb +?=Š¿häXìÉúü=ÆÑÒmí{B!½“Ñ`Å¢` +^XV‰j?ÊsÙÊ7Wxi@×k©ÕëH1A?þ)©ó“Š‘¯Žˆ«ÍXýD » Ï)vïºu•ÝäÑöV¿S5 ÿÔUcˆjGŸÒ–9ˆyrP<ú 6‚e܆‰V:ì–SŒ ž;\^ì{¾EÅ;o-’|i—"ŠË¤oú^Z³°ÔÚkÆÆ‘—Ð+Ž§Í÷§vÑçZŽDO[ EÌ[oäxM2N¿¡+0cvŽhCþžù3#Â×$}(ÛTTà"ÎOlæªQÔxÆQ^M4·åøLD™TbôNFë¬<e0°hº÷/g÷©®§v—bƒ´ó¼·K+/ ïoKðÈGì'µp~ T µÇ][A…àú.­‚mT´òìX^(5É´C®®_åæ´BòõÒ­@ºyn`NÓ6ƒƒ ùÃßpŠžxbÜƃ¯Ÿ½þ“Ø¥H›“ZpzGM#9¾„=Âg‹Ü‹î¼;V'm‡Kûð%ß®¹.fZJ q•H¤1Ù¿O¤°™Óà[?k4j +˜Ð–ÎŒüuFupÞÃÆÚ¸Fw¼«ÀBj‡;=bÎå‚$îÁ¢ªö|¨I(nSJ߃–&@`õ»NÉñJ‡ì¢Œ%ÕpØ„„ÁäÈqê‡è|é™Ê6|¡ †Å6Ç£s¨GòW‚YÙrö‡×Ê„0Gµ›n x»’ +0®*›&1Áó:HfR ôT½÷Ò#’w#™ýV-/Šjy‡Í0éÃ3—»~õ™X bh+)‰Yr{NÉC²ØíUnss@°å>Ú*¸¬ê ÞQZÕc£ÿ8Ê©¹¬Ïáåà¶(°äÙ¯ `ü o|áê7Ûk¬·ŒcIWRáŽE¦Z6»°ÒH¾ @âPg¢Bw›¬Uµ®û4¹TŸ¿Á€/Ù uW}é*„tã¡ÈQÂX¦KQ™ÒãÀÁ3-Jb+U9Þzo.Ø#‡¥ã¯RãVVRnb):È8â` I)b£Xó6î¡\<^~ÓyZÚ$E[Ñ0?C3§q®K‡@Zéz?×?´c`?Ða§ÁCJsŽRµCy ~ } ~PƒßH¤—ÑúÅdÜsN!’«IIX&©¬†Å6Ç®·”¹'i»Ã´m]@Zº³Ôó.̺ò¾ìÓfg0›™Á¤[ Ã’õô‚OÃ%… /ò7eó°`Ñ3šÊ0c©™¤ÑÄgçÄ~y¦ Π¡!~#¬8Öô™CŒýËYïù—àÄ(rú¶TÛ×öuho¹H9ÀªrO¶¹‰ö‚„Ñ$Æ9ö(Gæ“repô•okE\Ôš +†*÷µgÙ»£ýMÅNà²zÐñ) #•gF缩zÇ•ÝÐ÷2ˆès §ƒ tž Ç~x¥g3Ýèåáò¶4Í—Ô°¿l©:ÎÃ3ë•Vm„º5 ²Ð¸èÒ<ù bÉ·õDICÙKI„×Ò†=(v–!òÌÐx®e @êÜ^L½û§Þ·ºèÀ‘"ªApùòRWc0 +â¡ê b¾L«ì!è‹e;— 9dÒ~B.‚‘Ñ`S¿ ¹šc/ +Ç»¾eëë&/‘@þ*ñÌ5AଖHcø°RP†ÌTôËGQ/œs‘Ë}âÈ9¤Æý¢ààØ%9`—¶Óˆ!¥Ž®Q×=öäJi‡y¿4ªù*¢N6Š’ÃGn4‰ð +ý–¤ÜÄx®AnQ13tY½í†¿ØקÛÈÄ“UºF9ãylu?ÒlŠd!r›ÎáxDå6ñ?ÁÝCäöxDûDA˜@«Åܯª#Û¾3þ×ÅØÉ-w.ªøšÒB+²;_£¤£I{îrG +‘¾.jéTôËæ¥+ĽT]kptq2 *¿S®¢¬Ð>è_‡)­TaSLRl3™Û1Á¥Q´z‰É¤,Vs0Ç–Ÿ³Œ1jï¶]0"ò‹¶Àl)·öù©?šƒu’Žœ±±Nçkî±Â6 +8šÃ­Ó¾‹ÃÁž‡”bÅú›;ÚrBXó¾ùÛˆ«ÃG8˜"Þ¨q„S,c¬j`oñX$V¹ª$fhÙ‚ûYT.4MðÕ—ý¡¡v¯¥œèT©Sf¤·ˆ¹2w0¢eŸoÏ€‡píÐ^Ïd§²¨¥­”öç ¤çbÁˆá^SÏ=yAt£¥™ ¯BMôÞßЇMŽž\Óp–Ä5aÌ£˜úÏm¡Ç…ŸK¶8ÖœØ`å[^iЯN?åÜƳ´+^¤Müj•¡Y—$­Í2q=×—²<§–æàòî¬12Z¡H§r^üÖ˜.Ç&†žÒ|˪yû›.Æ|ý7mÚhŸ©‡ú^¤ÈCÉ[W~LÅó¢æcz‡ðÓ +2ï¾G¹^M&;#­Ô)9 Þ‘ƒFˆ¶Ã¤ýµDØiBÛ«%i Ú=˜ÞÁé Ú!Qç¯+Î)}Ot”xæ>÷ßÆT@1E¡¨F æ-_Aæ 8€KPI×?œ¿‹}Mg,Ñ8<.G/êLÝR V^Õá€rP“µ@åÃi\_1©¸±ƒó×XŽ½\_@9ú¥5’ßÀYî3±GU!x™ìÆX}iz“L‰ˆ’dšF¿¸:ñ×}Õ6R0‹ÏCªeZé±¥Š @¦c•–y^ô#èMî)¬“C#ù„M=y¼ü,kãXûŽ®H.ài]~²s…Äâ))s(q–מžf«³°»ü^¨‘sM—íÜAžcÔIA0ü¯2âß»„Ke`ì‹9|ÒÅgšbnÓn†ü‡$ó9â°‹Ú1Ó÷ý=`”"6ùoYš‰UZÇTêæ‚ôQàûÙò4¨èË›P@)1¸NSÏ—”rFB”Ìù»ŠÑ{rÅ ÷UI©šÑ+Ð%6·šBÖ¼9  +´ƒ‹,›ÇûK:¿ Rj˜8XOÔÌ.Ӊ‘YÒ5ý2¥^ … ãÛ½»ôsùý(> +stream +%!PS-AdobeFont-1.1: CMSL9 1.0 +%%CreationDate: 1991 Aug 20 16:41:23 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSL9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -9.46 def +/isFixedPitch false def +end readonly def +/FontName /HGHLSL+CMSL9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 12 /fi put +dup 45 /hyphen put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +/FontBBox{-61 -250 1150 750}readonly def +/UniqueID 5000797 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÎ僥É99>'´~ ¤}(Jܤ—×r¼¨ÅC8ŽmÀÑâÄ”G@G ö^û7°…+§©  6Ð}¦¼µ) ¹µžþXw4z<^efªÓ2þo¼ÎÑAx‚*;Öxu&=k½ K¼öä‡î­`ñ»©+¼m»ÙlOaŠƒA{FÜÄÂ&ÃS´mÍ=Ü­Íe²ú…ˆ@Ä ±Õî·zÐûý´IVžó±Šü½i}Cn¡¼24½ +îÁªÆ꤇6WV-BôÙÄ-ÒµŸJ®öZŸø:¼ïØöß7HÏ»½©ån®z`‰K³…ºî­ i#ùÁ”Œ¥kƒÊuÑxDƒÏ%"ŽÇ©jIZ!ùŒ Q®IêßËZt.4})½úÂÌ‹/> 1I´ú¡ØaƒŸj±i.Wš#j…¤¢ÞÃ'Nç瓯yFË|ØSý8ÜÀ"fŠóº àtÀçMƒÕ~ZR*~Ñï—t¶¹áCm/;î¦r-.(\éM…0` E\…æiÙÎ1q#áðžqxê™÷°ªE.º¢&:GJxÂV‡Ô$Càqsjk³êxzc'…²RÔø4„c +»jp\¥ƒ£D¬Òé™o,7La‡XÙëÖ‡Ïûy¬qó¦ûQ÷ ¾Ðå9Œöbݯb±Ý€Dö‡Ý@+†7UNe„Pý…Q\sö5):ÞÅMÐmì Y¤››î“ô7mð ï[rg8o"„p,_iؽѣG +ßÄŽ J»àÓúíE1 ¡àmŒ•¬`‰ñ/‚ïã”Òÿ4ýqŠ8'V,B— ³ß„GãNH8ìÌvŠR¬b¶§9LUB¡_¾¥üJ”0B·üé„?Â{&©Ã)­<ºXÿHF‰:5jdU®z+YW”Õ2wÄØdñ·dËú5 [×å’ ð¯LÚq o WÏ(K ÷˜üšÍ@`pU¤j¥&Áÿ]8*Ñ^¹oWü¹ÁÜƯ̫ _GNÓšYÍ¡üi½UÊ7¹²SgÃÉѯ½¤góüÛèÝüÛìÿOà9Aòê2ß:Š:ê…¾µ¡ŸnƒXÆîêêŸóœ˜ƒòú—Ý7óU"“´=£—dZOþøû SZòwg5†þp–-z_^j;8É¿æ$Tíj¯· Î"q9šzpseѵ’¯õ6‘/W2 Å…A ýðã #3ü™3½Nc¿Éþ'å¨#½îMhd[° Q·V|ªb™.Ñ©æz$[mN¾çùçO¾à’Ï@’†›·ÑB¡„¾T±’ZÐ`š% ñ·wÐ`M) \=ý^od‘•5<(˜é–#Ç|œ/èÉH”CL«½R7pÖ0¦Í u¹WH™0K¸¼9¯˜{M2ûš¿àn_¡le½r?œ>'iµüú±tì†Úg6šC L‰clcªôY'¾ÃË29™ŠUp]¬"7tS—“ +è^g2›inÉU¤¤O–N‘Ê.Ö"¯œÅ+?ltwyèÕppêE}G?Èí2:‰]ÈO€Ò^ÌO ÇÒ=¹)*CSC÷âÞð„®—Ñ‡) +l±,{Žt1`½Çdôî†Íï|ÖÖ_¤fTJKtPfüêÍ“«Øôå eHÐïĽ,š” ë_wÁi€¥ LwµIi×ÙÏxº{<ñ0Hõ™úë¼zýÜj”:ÍW!Nìè·®ä!hU”Tn¶Úý÷Ìr‚J·Þûè¿oçp¦‚05f¨Š¿€[©¬¥oE~6–²ãG«=ñéŒÎNM挬8:™AGˆqIEäè•g8çÛ—ÚD½¿ sÁ6ß-æÓ’En.›Ù¼é‚`SÑ“AÓ­ÏÜ!ý÷'>!woW•bÀw«œÝ{%:”CX%3Ô,Nµ¦(”ª¤ØMÃø'g_aG±Bû¬~’ìžX¶Ëïnû‡w¤YÕ/”og®ˆ èCQkêöà0‚ËÙ¿]©¤è©…)e×Ôq»‘µ6ÓXU@0f&Rˆ±Êì +2M +ܽ¸ˆ¡B–0R+º‹£»z~ç Ɔžˆé¹ÿ ¯lkv jª+tªoÞv ûq°h¦8dÝÍ8¿‡Zz`´3¨ï0T þ`âæCÊŒÇC=RÖ»1Ñ™páé=ö¼;"ú™º6¸ žß6«ÜæL`HíØŠ¾\HxIBêÛBù«V>±Jè2몡²Ó˜¶ô==‚rU^-ü Ž~þùAӧ濰erX©Ö»d_éE¡þ[Äxî®Mç¶ú©C;ÈžîÜƆoÏ»1¸hÆ~nÔâsļ-=1F½Öùz{$TY €æÈÓÝ¿É–´C…C“‡èÎ7s÷©zý:¸Ò­ü¶—úØ@MµŸÓ¦TóX¾Ò ÐòÛ*KÅð½±k-c¨n9VÍm¶ç6K‚T™ê Ù):es¸¯à]ÙT¦´$ -wsJÌcy¬|§‡lóÌ+ßèU=*[Œ5‘jŽ¦çþy<¬%š:/·î€Ïs2ôGІ)8do&ÚVßO šÍˆÇˆ®ä +™³Ž¥'DÅ3ˆÇKZaqż6œN䮡*Ã*IšÊ2/$ŽúMTm-1”ë vú¯¼ÏIÑ!›j¨²f”q`€Cý£.ÙG¬M%æÐA|hÓŠ€¬6÷”ŸØ’ƒO¶‹G²Uì6ÖäÔ!›ï†úð9ÐuÇ bš(2 6Ñ8°’ž‚A„v뼡p9ÿ“‚§-r†žñ¸|Aå^–ê³o¤ñx¢¨‚ÇZ¾ +ïº+ÛÝ ïš“ºÿR{9ÍZL¡ç‘¤ÚæìÓ•ÐÓ"hÖÆÿvùa3Ìy.ç‹QÊù©x^‚ˆ²^E‚ÔßÏûûU ¥HðÈVÁì *W`Ô¿=×s¯û«|Ëé ´Õ™Ùé†zJ´ÆcsSx%qÀr¢ ¯zÕªyȇwCŠÇBLÍɈ.9_²3`\Ü>#T“¿£Û˜sè]AÏ»%'›41oI^a7I‰‚£§ùgÖ'‚p‚Ë£_rUhcRq:ø›¸àù“#«™MðòÚÛLæ—Û%dËýàÙæ/ÊÛžŠJŸ›å€$‘tl$%vž¸BrH®xÊù'ÈlùG¤c¬¥kñG—yä–Åc„"w:»²ËÐòôízg4!—ƒbr A’S7?ünù,žh9*i«JЋ©YWqŒw’›&ç …¹Ü ¶<º;`¢cë.lÄ ëgÀáaxH€X`-kqrÎ¥GPƆ+¿4ÓµòÆ8>¦¦¼DÎÁ¦Bã³ÃRÕš³À–¥E¯Ÿ¥" o°=`Îépããj¨¹$«MÍ_\ØÛM²_¢ê@jÛfþOñŠ¡8µøtÞµÁÇ%ä›HŸêU¢Ì Ä-tû)-áÒXé]†KV†…nô–ÿÓxÆ·fåÇ7ŸL°|û-Z/–銅ê±Óû÷xÚ23 ·G¡aïk9­©ôlÙ¬¼h¸ Éü´y#C´óÖIÚPA]1ÜZ¸Kò…{ˆ¤WÂy Ã_'ܾh‘û8?nœÛc5%Š¸âDGöyg¢Ý;fPF‰e!OÌ´¬B¾–ËÇ7×Þlëü0Yû›±¨88¾)ë3>¯š=ÕŽ&º˜¼¤:Ào)Q£òºK{†éápEnºfKnZø]ï0©Ȭn½ºù¤3¿ã ·ž¡H]F²¡Â Þ›ÚæR÷‰¿Pwv$Nþ¸ü´MÃa­{úŒáì!©lÙαdðjЮ…‰šó Y€°0„»ctóÌÛ ‚#%t¤)lþYäCc;$B?Q²8©íÇgò3‘§ÿ­ÇB·@å¾ÃüqHÀ©yCáfã¼oûBÙuy«%·Q1’«Pi:¡NgèY¢ ÖÌmÊýÃsm2½ñ¦õ âdˆZ¤¹T)è~—Œ¶ˆ<ÌgïqÆ[Wƒ³‚Ô} …ü¢mÈnê)ïüÙSº/?jüyÉOçS0ÒCUêJù?áêï™Ùw…?|e3aŽñ=(´[0Б¸ +Ï_Ší[€æú!Á#\ú* f78D?z–¡Þ¶é̳QtwIZ½R¾EU —GQpOšxÖqt•|2:„x³®Óáèõ&0žâ´(¥7åÆTl‡7ìv0F,ð’UöÀŒ^óv$ñ%xQ^ÍÂäK*žþ˜Öú~_YâÅæÙvcX$¯»d<íHªÏ®æµ>šõ+Q «Ô‘*ÑkXÊäN—ƒúç<ö«Ì Ï¬ÞìGX¼×uGù¼U/‚"³|ÞŒ…õ‡‹¾|Sôc$ÐYy»ÔÍiŸ¾&²Ë=(b¯Å;Š‘ÜA;†÷Œ ¢”Qè VÌÁ¥™hxXb.È_«û$&S¸…DE +®Lq:|ÒÁïs1Moõ\N”£Ow<Í{‘Ë ¹+}Û½-ƒ=Ÿ%¯ +Jñ™TÁðÛ™Û€O ÜO˨qЃ #X«¬§uñïç$€µ_¸T$¶árFU¾dåÏv tŸÛ¯c@ô®¢ç0î§/ì!BãL¼^‚Ø8¥ˆ¿Snä^^¿üµ&M €•/¾*aôTЋ,ŽùGIzXtMb«¬šÎ&k'ljÝ“2ÎÉ ±¤BoK^‘± +̽“ÓH¦~þ{]ŽN©Š rèiÁçÊr£5z:“'Â99$TR³Ék#ºeì_„i|œ01dŸi/dEsàáÎÓqïD¢¸¾•Ê† v<8¶;d¨ÿ2q¢°ÔήMZ+äÔ^/URì'—ýîÞãbÖ÷-„A4ðg‚©1  9Tim¼ˆòÿ¯)h–Mb.-­‹Ë÷äÀðQ‰"+¤øÞ„ÛñǪÁVŸz£Ò•kV× +Æ0KkP“ÚÃ>Æ•{Àl|^ÕñÃa¬Pæ/‰S[,#^W ôÐ}$îSrK(Nc?•þ¬}3ì°†F56ää£Ë/È°«ãÒŠÒ÷‰4²ÞØÀisªâcÖÛÛyÞÔA¥€¿-<Í[0þ×ÀQA…hC|rrZ@Öß„%O$æN9î™ÐX=³£‡‚›Awà/}礖=¸d•Ã§Ø»ÕÁ™>ýxû¤{q•sخۧý+ +Iu>÷Uõæˆ~á `.û2‚åÏÖtʼn4¡‘íΚ«\› €<\v¡õÌ3¦ÑrËøNõ±vœHà?V¿‡ƒ^ÍR^¯Á·ìÕýµ ÚEª†5µ»c~Ó àP¸98¨'-,¬¾X!Jfò40»¡„·wØcîÌLÔ>ÌXÕšr8 ìUf#÷Ø/žá6–F¡-£‹+ÖB3ˆA‰˜Yú+Ø+4ž0TbMUƒn¼¤¬-®˜ƒöÒÌCîJä÷¬Rb·‡pã‰Û›¦†!KMv‰l¨Ñx¿Þ.pÚ!î]“~æ8áotÿ㉪=.®²ò´¶ryÌD$ö)N§KG¾¶(“|ƒÇÉPZ’X|+Ž†«½Ï•’sêk¸³u&¯|†YÍ£Û˜=h:ðËy^IĜ鲦EF¦@Ò¥f_‰u"=¹.‡ål¾`Åω7qädˆµjVÏ&å ÏØGã^ÈX%õ¯ëwYÂÇÜ›_vGî‘Úú”‚‰íìÞup·ÏzÔ—…ÚžÓbÑNq¤¼—°")‰ä±YRê`xv\BâJpÀxP‘Í)oàá0Ô³0aE³;‡Ìî ÆTmDUä’ƹ-”&Ã5VÁ5+šzýÞ àè`Ú­_Ò×^†¹øµåV tsl©nH¡A•I‰j9ÿ#ú€01Ud_áóÌù®ÕBÞô@aÆb6Nã×–¯P–½3ÿyŠÔ":×ë›5˜ÈÓ¾rå1¥G×î ©³ )îÐæËë)!ž#mw !KÐ÷~ç–¯.cvþ·a мƊ§©•«¥m¡œBÏVg†E·=M9pWùBüÉ›îÚU‡ÛfsYtü 9 âGs^g¼bY&ÎÁ"1¯Œ«u¯gÜ(k0dñIÝO‡A1KÒ÷Z5¿ ˆ9;;¥i©ëfàu¹*¶ý0-×#×XYêR{˜ÕÙÎýíÃv(7¼eÈ¥?\ÞÏd«Âw7,5À¸›Ø5xÖöÈd²þ”ÝgDË'U0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +292 0 obj +<< +/Length1 778 +/Length2 1052 +/Length3 533 +/Length 2363 +>> +stream +%!PS-AdobeFont-1.1: CMBXTI10 1.0 +%%CreationDate: 1991 Aug 18 17:46:30 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBXTI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /LWIKPI+CMBXTI10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 46 /period put +readonly def +/FontBBox{-29 -250 1274 754}readonly def +/UniqueID 5000771 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÎ僥É99>'´~ ¤}(Jܤ—×r¼¨ÅC8ŽmÀÑâÄ”G@G ö^û7°…+§©  6Ð}¦¼µ) ¹µžþXw4z<^efªÓ2þo¼ÎÑAx‚*;Öxu&=k½ K¼öä‡î­`ñ»›õÀ{ŠY»T€+õ¹ô"Œ‹‹j“õËnLìíóíLEÔ6§«[¥gô¡’PÖ {-µíZQ¢Í5)Ñà4Œ·¤ÉdÔ¤j˜`BF”;4ïóS¦PH¤zg17g› ?UÕAXqž1ÐÔÓûì[¯D¾¹ñwÞ-€<žÿ§¿‰½p>€[£š?ª?­·Ò°¶q^D%5'?¬ÚÀq•€o’ç‰h/ŸfÞ +ÉÌÊsQíiqvjaøÒ¡»¯ãÕéöQ`vv¦æ6}oe8P w ·EÄv +¥9¿µ__hXž!ÿÆZ!V_8Ÿo çø—‡`ÔÀ%d72Ý›r€ æsúÆ­WD|êó°sÐ46FéÞ@¶ŸGU‘Y +H†ñ˜µy¥gêëô(gâša£‘µÜ-rpL.f¦eµV]гi‘‹Ú$p +ÞyßZºÛ+°º%Aí΂bý`p¾\ÐÚN¼ÛtTº³J7ŠMÀUY“ó, (ÜþÆýœ¾ÿf.Zò*'¯pöÜÜ¿ÎBp"ó@<’ï=¾¨YæÞU„.Òɧ~ÆØ›šØ^ÀËïº==Àeº’ËNGÖ°µ964ö<±iVM–(ºLN1twÊ(¶¹ø` +4ø§áJIo·ö ¸^p$ÉEI‡Ù¨ÿà«°’Õ žÅ³7zSÇϾ• B*ª:·r‹Ï}Ä*vIÊ=«=˼C‡ÆËY-Œ““SOæÚvjéÓO4ÕÑFÛÂ}Á;®3R© û}-ÚîsõöG5&íE·ã;šÙ=¶½ÚšµnøÒ` d¿ öòéu±;>_!0]ëÜÑËnC¨ÁØå`DIê¦búz†¸„ º¸]寷~4lA’HÐ-äFXá¿]ûü³®ÝÈGÀZÒl¥ÌÜÓ¯Ëj€þþ´¤{[Å“Ù1-êº3B>‡Éhfæ*ˆåDXýݵÀd:m§$òáÁEž¤ZÕøÌêË|üJ‡8a™fEµˆÔ?"¾Ïî~=¹8Ë;PJë»\Ïd@·÷àHEü&ûõŸÓÕÝÒJ²åVÔ†òÞŽuÃlŽé!¤Ð¥p?®´`¯¦û£ãꉽ0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +1 0 obj +<< +/Creator ( TeX output 1999.09.19:2152) +/Producer (dvipdfm \(null\), Copyright \251 1998, by Mark A. Wicks) +/CreationDate (D:19990919215248+00'00') +>> +endobj +5 0 obj +<< +/Type /Page +/Resources 6 0 R +/Contents [13 0 R 4 0 R 14 0 R 15 0 R] +/Parent 302 0 R +>> +endobj +17 0 obj +<< +/Type /Page +/Resources 18 0 R +/Contents [13 0 R 4 0 R 22 0 R 15 0 R] +/Parent 302 0 R +>> +endobj +24 0 obj +<< +/Type /Page +/Resources 25 0 R +/Contents [13 0 R 4 0 R 32 0 R 15 0 R] +/Parent 302 0 R +>> +endobj +302 0 obj +<< +/Type /Pages +/Count 3 +/Kids [5 0 R 17 0 R 24 0 R] +/Parent 301 0 R +>> +endobj +34 0 obj +<< +/Type /Page +/Resources 35 0 R +/Contents [13 0 R 4 0 R 36 0 R 15 0 R] +/Parent 303 0 R +>> +endobj +38 0 obj +<< +/Type /Page +/Resources 39 0 R +/Contents [13 0 R 4 0 R 40 0 R 15 0 R] +/Parent 303 0 R +>> +endobj +42 0 obj +<< +/Type /Page +/Resources 43 0 R +/Contents [13 0 R 4 0 R 53 0 R 15 0 R] +/Parent 303 0 R +>> +endobj +55 0 obj +<< +/Type /Page +/Resources 56 0 R +/Contents [13 0 R 4 0 R 60 0 R 15 0 R] +/Parent 303 0 R +>> +endobj +303 0 obj +<< +/Type /Pages +/Count 4 +/Kids [34 0 R 38 0 R 42 0 R 55 0 R] +/Parent 301 0 R +>> +endobj +62 0 obj +<< +/Type /Page +/Resources 63 0 R +/Contents [13 0 R 4 0 R 64 0 R 15 0 R] +/Parent 304 0 R +>> +endobj +66 0 obj +<< +/Type /Page +/Resources 67 0 R +/Contents [13 0 R 4 0 R 68 0 R 15 0 R] +/Parent 304 0 R +>> +endobj +70 0 obj +<< +/Type /Page +/Resources 71 0 R +/Contents [13 0 R 4 0 R 72 0 R 15 0 R] +/Parent 304 0 R +>> +endobj +74 0 obj +<< +/Type /Page +/Resources 75 0 R +/Contents [13 0 R 4 0 R 79 0 R 15 0 R] +/Parent 304 0 R +>> +endobj +304 0 obj +<< +/Type /Pages +/Count 4 +/Kids [62 0 R 66 0 R 70 0 R 74 0 R] +/Parent 301 0 R +>> +endobj +81 0 obj +<< +/Type /Page +/Resources 82 0 R +/Contents [13 0 R 4 0 R 83 0 R 15 0 R] +/Parent 305 0 R +>> +endobj +85 0 obj +<< +/Type /Page +/Resources 86 0 R +/Contents [13 0 R 4 0 R 87 0 R 15 0 R] +/Parent 305 0 R +>> +endobj +89 0 obj +<< +/Type /Page +/Resources 90 0 R +/Contents [13 0 R 4 0 R 91 0 R 15 0 R] +/Parent 305 0 R +>> +endobj +93 0 obj +<< +/Type /Page +/Resources 94 0 R +/Contents [13 0 R 4 0 R 101 0 R 15 0 R] +/Parent 305 0 R +>> +endobj +305 0 obj +<< +/Type /Pages +/Count 4 +/Kids [81 0 R 85 0 R 89 0 R 93 0 R] +/Parent 301 0 R +>> +endobj +301 0 obj +<< +/Type /Pages +/Count 15 +/Kids [302 0 R 303 0 R 304 0 R 305 0 R] +/Parent 3 0 R +>> +endobj +103 0 obj +<< +/Type /Page +/Resources 104 0 R +/Contents [13 0 R 4 0 R 105 0 R 15 0 R] +/Parent 307 0 R +>> +endobj +107 0 obj +<< +/Type /Page +/Resources 108 0 R +/Contents [13 0 R 4 0 R 109 0 R 15 0 R] +/Parent 307 0 R +>> +endobj +111 0 obj +<< +/Type /Page +/Resources 112 0 R +/Contents [13 0 R 4 0 R 113 0 R 15 0 R] +/Parent 307 0 R +>> +endobj +307 0 obj +<< +/Type /Pages +/Count 3 +/Kids [103 0 R 107 0 R 111 0 R] +/Parent 306 0 R +>> +endobj +115 0 obj +<< +/Type /Page +/Resources 116 0 R +/Contents [13 0 R 4 0 R 117 0 R 15 0 R] +/Parent 308 0 R +>> +endobj +119 0 obj +<< +/Type /Page +/Resources 120 0 R +/Contents [13 0 R 4 0 R 121 0 R 15 0 R] +/Parent 308 0 R +>> +endobj +123 0 obj +<< +/Type /Page +/Resources 124 0 R +/Contents [13 0 R 4 0 R 125 0 R 15 0 R] +/Parent 308 0 R +>> +endobj +127 0 obj +<< +/Type /Page +/Resources 128 0 R +/Contents [13 0 R 4 0 R 129 0 R 15 0 R] +/Parent 308 0 R +>> +endobj +308 0 obj +<< +/Type /Pages +/Count 4 +/Kids [115 0 R 119 0 R 123 0 R 127 0 R] +/Parent 306 0 R +>> +endobj +131 0 obj +<< +/Type /Page +/Resources 132 0 R +/Contents [13 0 R 4 0 R 133 0 R 15 0 R] +/Parent 309 0 R +>> +endobj +135 0 obj +<< +/Type /Page +/Resources 136 0 R +/Contents [13 0 R 4 0 R 137 0 R 15 0 R] +/Parent 309 0 R +>> +endobj +139 0 obj +<< +/Type /Page +/Resources 140 0 R +/Contents [13 0 R 4 0 R 141 0 R 15 0 R] +/Parent 309 0 R +>> +endobj +143 0 obj +<< +/Type /Page +/Resources 144 0 R +/Contents [13 0 R 4 0 R 145 0 R 15 0 R] +/Parent 309 0 R +>> +endobj +309 0 obj +<< +/Type /Pages +/Count 4 +/Kids [131 0 R 135 0 R 139 0 R 143 0 R] +/Parent 306 0 R +>> +endobj +147 0 obj +<< +/Type /Page +/Resources 148 0 R +/Contents [13 0 R 4 0 R 149 0 R 15 0 R] +/Parent 310 0 R +>> +endobj +151 0 obj +<< +/Type /Page +/Resources 152 0 R +/Contents [13 0 R 4 0 R 153 0 R 15 0 R] +/Parent 310 0 R +>> +endobj +155 0 obj +<< +/Type /Page +/Resources 156 0 R +/Contents [13 0 R 4 0 R 157 0 R 15 0 R] +/Parent 310 0 R +>> +endobj +159 0 obj +<< +/Type /Page +/Resources 160 0 R +/Contents [13 0 R 4 0 R 161 0 R 15 0 R] +/Parent 310 0 R +>> +endobj +310 0 obj +<< +/Type /Pages +/Count 4 +/Kids [147 0 R 151 0 R 155 0 R 159 0 R] +/Parent 306 0 R +>> +endobj +306 0 obj +<< +/Type /Pages +/Count 15 +/Kids [307 0 R 308 0 R 309 0 R 310 0 R] +/Parent 3 0 R +>> +endobj +163 0 obj +<< +/Type /Page +/Resources 164 0 R +/Contents [13 0 R 4 0 R 165 0 R 15 0 R] +/Parent 312 0 R +>> +endobj +167 0 obj +<< +/Type /Page +/Resources 168 0 R +/Contents [13 0 R 4 0 R 169 0 R 15 0 R] +/Parent 312 0 R +>> +endobj +171 0 obj +<< +/Type /Page +/Resources 172 0 R +/Contents [13 0 R 4 0 R 173 0 R 15 0 R] +/Parent 312 0 R +>> +endobj +312 0 obj +<< +/Type /Pages +/Count 3 +/Kids [163 0 R 167 0 R 171 0 R] +/Parent 311 0 R +>> +endobj +175 0 obj +<< +/Type /Page +/Resources 176 0 R +/Contents [13 0 R 4 0 R 180 0 R 15 0 R] +/Parent 313 0 R +>> +endobj +182 0 obj +<< +/Type /Page +/Resources 183 0 R +/Contents [13 0 R 4 0 R 184 0 R 15 0 R] +/Parent 313 0 R +>> +endobj +186 0 obj +<< +/Type /Page +/Resources 187 0 R +/Contents [13 0 R 4 0 R 188 0 R 15 0 R] +/Parent 313 0 R +>> +endobj +190 0 obj +<< +/Type /Page +/Resources 191 0 R +/Contents [13 0 R 4 0 R 192 0 R 15 0 R] +/Parent 313 0 R +>> +endobj +313 0 obj +<< +/Type /Pages +/Count 4 +/Kids [175 0 R 182 0 R 186 0 R 190 0 R] +/Parent 311 0 R +>> +endobj +194 0 obj +<< +/Type /Page +/Resources 195 0 R +/Contents [13 0 R 4 0 R 196 0 R 15 0 R] +/Parent 314 0 R +>> +endobj +198 0 obj +<< +/Type /Page +/Resources 199 0 R +/Contents [13 0 R 4 0 R 200 0 R 15 0 R] +/Parent 314 0 R +>> +endobj +202 0 obj +<< +/Type /Page +/Resources 203 0 R +/Contents [13 0 R 4 0 R 204 0 R 15 0 R] +/Parent 314 0 R +>> +endobj +206 0 obj +<< +/Type /Page +/Resources 207 0 R +/Contents [13 0 R 4 0 R 208 0 R 15 0 R] +/Parent 314 0 R +>> +endobj +314 0 obj +<< +/Type /Pages +/Count 4 +/Kids [194 0 R 198 0 R 202 0 R 206 0 R] +/Parent 311 0 R +>> +endobj +210 0 obj +<< +/Type /Page +/Resources 211 0 R +/Contents [13 0 R 4 0 R 212 0 R 15 0 R] +/Parent 315 0 R +>> +endobj +214 0 obj +<< +/Type /Page +/Resources 215 0 R +/Contents [13 0 R 4 0 R 216 0 R 15 0 R] +/Parent 315 0 R +>> +endobj +218 0 obj +<< +/Type /Page +/Resources 219 0 R +/Contents [13 0 R 4 0 R 220 0 R 15 0 R] +/Parent 315 0 R +>> +endobj +222 0 obj +<< +/Type /Page +/Resources 223 0 R +/Contents [13 0 R 4 0 R 224 0 R 15 0 R] +/Parent 315 0 R +>> +endobj +315 0 obj +<< +/Type /Pages +/Count 4 +/Kids [210 0 R 214 0 R 218 0 R 222 0 R] +/Parent 311 0 R +>> +endobj +311 0 obj +<< +/Type /Pages +/Count 15 +/Kids [312 0 R 313 0 R 314 0 R 315 0 R] +/Parent 3 0 R +>> +endobj +226 0 obj +<< +/Type /Page +/Resources 227 0 R +/Contents [13 0 R 4 0 R 228 0 R 15 0 R] +/Parent 317 0 R +>> +endobj +230 0 obj +<< +/Type /Page +/Resources 231 0 R +/Contents [13 0 R 4 0 R 232 0 R 15 0 R] +/Parent 317 0 R +>> +endobj +234 0 obj +<< +/Type /Page +/Resources 235 0 R +/Contents [13 0 R 4 0 R 236 0 R 15 0 R] +/Parent 317 0 R +>> +endobj +317 0 obj +<< +/Type /Pages +/Count 3 +/Kids [226 0 R 230 0 R 234 0 R] +/Parent 316 0 R +>> +endobj +238 0 obj +<< +/Type /Page +/Resources 239 0 R +/Contents [13 0 R 4 0 R 240 0 R 15 0 R] +/Parent 318 0 R +>> +endobj +242 0 obj +<< +/Type /Page +/Resources 243 0 R +/Contents [13 0 R 4 0 R 244 0 R 15 0 R] +/Parent 318 0 R +>> +endobj +246 0 obj +<< +/Type /Page +/Resources 247 0 R +/Contents [13 0 R 4 0 R 248 0 R 15 0 R] +/Parent 318 0 R +>> +endobj +250 0 obj +<< +/Type /Page +/Resources 251 0 R +/Contents [13 0 R 4 0 R 252 0 R 15 0 R] +/Parent 318 0 R +>> +endobj +318 0 obj +<< +/Type /Pages +/Count 4 +/Kids [238 0 R 242 0 R 246 0 R 250 0 R] +/Parent 316 0 R +>> +endobj +254 0 obj +<< +/Type /Page +/Resources 255 0 R +/Contents [13 0 R 4 0 R 268 0 R 15 0 R] +/Parent 319 0 R +>> +endobj +270 0 obj +<< +/Type /Page +/Resources 271 0 R +/Contents [13 0 R 4 0 R 272 0 R 15 0 R] +/Parent 319 0 R +>> +endobj +274 0 obj +<< +/Type /Page +/Resources 275 0 R +/Contents [13 0 R 4 0 R 276 0 R 15 0 R] +/Parent 319 0 R +>> +endobj +278 0 obj +<< +/Type /Page +/Resources 279 0 R +/Contents [13 0 R 4 0 R 280 0 R 15 0 R] +/Parent 319 0 R +>> +endobj +319 0 obj +<< +/Type /Pages +/Count 4 +/Kids [254 0 R 270 0 R 274 0 R 278 0 R] +/Parent 316 0 R +>> +endobj +282 0 obj +<< +/Type /Page +/Resources 283 0 R +/Contents [13 0 R 4 0 R 284 0 R 15 0 R] +/Parent 320 0 R +>> +endobj +286 0 obj +<< +/Type /Page +/Resources 287 0 R +/Contents [13 0 R 4 0 R 288 0 R 15 0 R] +/Parent 320 0 R +>> +endobj +290 0 obj +<< +/Type /Page +/Resources 291 0 R +/Contents [13 0 R 4 0 R 295 0 R 15 0 R] +/Parent 320 0 R +>> +endobj +297 0 obj +<< +/Type /Page +/Resources 298 0 R +/Contents [13 0 R 4 0 R 299 0 R 15 0 R] +/Parent 320 0 R +>> +endobj +320 0 obj +<< +/Type /Pages +/Count 4 +/Kids [282 0 R 286 0 R 290 0 R 297 0 R] +/Parent 316 0 R +>> +endobj +316 0 obj +<< +/Type /Pages +/Count 15 +/Kids [317 0 R 318 0 R 319 0 R 320 0 R] +/Parent 3 0 R +>> +endobj +3 0 obj +<< +/Type /Pages +/Count 60 +/Kids [301 0 R 306 0 R 311 0 R 316 0 R] +/MediaBox [0 0 612 792] +>> +endobj +13 0 obj +<< +/Length 1 +>> +stream + +endstream +endobj +15 0 obj +<< +/Length 1 +>> +stream + +endstream +endobj +4 0 obj +<< +/Length 18 +>> +stream +1 0 0 1 72 720 cm +endstream +endobj +321 0 obj +<< +>> +endobj +322 0 obj +null +endobj +323 0 obj +<< +>> +endobj +2 0 obj +<< +/Type /Catalog +/Pages 3 0 R +/Outlines 321 0 R +/Threads 322 0 R +/Names 323 0 R +>> +endobj +xref +0 324 +0000000000 65535 f +0000635516 00000 n +0000644549 00000 n +0000644206 00000 n +0000644414 00000 n +0000635684 00000 n +0000002827 00000 n +0000492409 00000 n +0000000009 00000 n +0000000212 00000 n +0000510513 00000 n +0000001127 00000 n +0000001334 00000 n +0000644314 00000 n +0000002253 00000 n +0000644364 00000 n +0000002784 00000 n +0000635789 00000 n +0000005701 00000 n +0000523302 00000 n +0000002891 00000 n +0000003097 00000 n +0000004056 00000 n +0000005658 00000 n +0000635896 00000 n +0000011564 00000 n +0000525453 00000 n +0000005766 00000 n +0000005970 00000 n +0000542683 00000 n +0000006627 00000 n +0000006836 00000 n +0000007757 00000 n +0000011499 00000 n +0000636092 00000 n +0000011828 00000 n +0000011629 00000 n +0000011796 00000 n +0000636199 00000 n +0000016838 00000 n +0000011893 00000 n +0000016784 00000 n +0000636306 00000 n +0000027653 00000 n +0000553613 00000 n +0000016903 00000 n +0000017108 00000 n +0000556540 00000 n +0000018141 00000 n +0000018349 00000 n +0000562220 00000 n +0000019385 00000 n +0000019595 00000 n +0000020607 00000 n +0000027566 00000 n +0000636413 00000 n +0000035295 00000 n +0000573160 00000 n +0000027718 00000 n +0000027921 00000 n +0000028507 00000 n +0000035186 00000 n +0000636617 00000 n +0000044452 00000 n +0000035360 00000 n +0000044354 00000 n +0000636724 00000 n +0000052587 00000 n +0000044517 00000 n +0000052511 00000 n +0000636831 00000 n +0000056512 00000 n +0000052652 00000 n +0000056436 00000 n +0000636938 00000 n +0000065186 00000 n +0000575773 00000 n +0000056577 00000 n +0000056781 00000 n +0000057823 00000 n +0000065109 00000 n +0000637142 00000 n +0000074715 00000 n +0000065251 00000 n +0000074650 00000 n +0000637249 00000 n +0000083844 00000 n +0000074780 00000 n +0000083779 00000 n +0000637356 00000 n +0000092126 00000 n +0000083909 00000 n +0000092061 00000 n +0000637463 00000 n +0000098283 00000 n +0000579648 00000 n +0000092191 00000 n +0000092396 00000 n +0000581866 00000 n +0000093436 00000 n +0000093641 00000 n +0000094669 00000 n +0000098192 00000 n +0000637768 00000 n +0000098551 00000 n +0000098349 00000 n +0000098518 00000 n +0000637878 00000 n +0000107009 00000 n +0000098618 00000 n +0000106942 00000 n +0000637988 00000 n +0000113238 00000 n +0000107076 00000 n +0000113183 00000 n +0000638191 00000 n +0000120696 00000 n +0000113305 00000 n +0000120619 00000 n +0000638301 00000 n +0000126188 00000 n +0000120763 00000 n +0000126111 00000 n +0000638411 00000 n +0000132286 00000 n +0000126255 00000 n +0000132220 00000 n +0000638521 00000 n +0000137583 00000 n +0000132353 00000 n +0000137506 00000 n +0000638732 00000 n +0000145879 00000 n +0000137650 00000 n +0000145802 00000 n +0000638842 00000 n +0000153896 00000 n +0000145946 00000 n +0000153808 00000 n +0000638952 00000 n +0000162854 00000 n +0000153963 00000 n +0000162777 00000 n +0000639062 00000 n +0000171767 00000 n +0000162921 00000 n +0000171712 00000 n +0000639273 00000 n +0000180901 00000 n +0000171834 00000 n +0000180824 00000 n +0000639383 00000 n +0000190157 00000 n +0000180968 00000 n +0000190080 00000 n +0000639493 00000 n +0000199353 00000 n +0000190224 00000 n +0000199276 00000 n +0000639603 00000 n +0000206640 00000 n +0000199420 00000 n +0000206574 00000 n +0000639914 00000 n +0000213584 00000 n +0000206707 00000 n +0000213507 00000 n +0000640024 00000 n +0000220322 00000 n +0000213651 00000 n +0000220256 00000 n +0000640134 00000 n +0000229802 00000 n +0000220389 00000 n +0000229714 00000 n +0000640337 00000 n +0000239919 00000 n +0000585250 00000 n +0000229869 00000 n +0000230077 00000 n +0000231018 00000 n +0000239807 00000 n +0000640447 00000 n +0000248016 00000 n +0000239986 00000 n +0000247937 00000 n +0000640557 00000 n +0000251984 00000 n +0000248083 00000 n +0000251918 00000 n +0000640667 00000 n +0000257810 00000 n +0000252051 00000 n +0000257733 00000 n +0000640878 00000 n +0000263713 00000 n +0000257877 00000 n +0000263613 00000 n +0000640988 00000 n +0000270678 00000 n +0000263780 00000 n +0000270590 00000 n +0000641098 00000 n +0000272990 00000 n +0000270745 00000 n +0000272921 00000 n +0000641208 00000 n +0000279266 00000 n +0000273057 00000 n +0000279200 00000 n +0000641419 00000 n +0000289478 00000 n +0000279333 00000 n +0000289401 00000 n +0000641529 00000 n +0000298821 00000 n +0000289545 00000 n +0000298733 00000 n +0000641639 00000 n +0000302650 00000 n +0000298888 00000 n +0000302562 00000 n +0000641749 00000 n +0000309410 00000 n +0000302717 00000 n +0000309344 00000 n +0000642060 00000 n +0000312761 00000 n +0000309477 00000 n +0000312695 00000 n +0000642170 00000 n +0000316618 00000 n +0000312828 00000 n +0000316552 00000 n +0000642280 00000 n +0000322241 00000 n +0000316685 00000 n +0000322164 00000 n +0000642483 00000 n +0000327635 00000 n +0000322308 00000 n +0000327569 00000 n +0000642593 00000 n +0000334308 00000 n +0000327702 00000 n +0000334253 00000 n +0000642703 00000 n +0000343001 00000 n +0000334375 00000 n +0000342924 00000 n +0000642813 00000 n +0000343270 00000 n +0000343068 00000 n +0000343237 00000 n +0000643024 00000 n +0000371577 00000 n +0000595111 00000 n +0000343337 00000 n +0000343542 00000 n +0000605378 00000 n +0000344585 00000 n +0000344792 00000 n +0000620407 00000 n +0000345833 00000 n +0000346044 00000 n +0000626115 00000 n +0000347056 00000 n +0000347266 00000 n +0000348308 00000 n +0000371481 00000 n +0000643134 00000 n +0000395508 00000 n +0000371644 00000 n +0000395412 00000 n +0000643244 00000 n +0000420030 00000 n +0000395575 00000 n +0000419934 00000 n +0000643354 00000 n +0000442920 00000 n +0000420097 00000 n +0000442824 00000 n +0000643565 00000 n +0000470081 00000 n +0000442987 00000 n +0000469985 00000 n +0000643675 00000 n +0000475830 00000 n +0000470148 00000 n +0000475734 00000 n +0000643785 00000 n +0000489354 00000 n +0000633060 00000 n +0000475897 00000 n +0000476111 00000 n +0000477148 00000 n +0000489263 00000 n +0000643895 00000 n +0000492342 00000 n +0000489421 00000 n +0000492274 00000 n +0000637668 00000 n +0000636003 00000 n +0000636520 00000 n +0000637045 00000 n +0000637571 00000 n +0000639814 00000 n +0000638098 00000 n +0000638631 00000 n +0000639172 00000 n +0000639713 00000 n +0000641960 00000 n +0000640244 00000 n +0000640777 00000 n +0000641318 00000 n +0000641859 00000 n +0000644106 00000 n +0000642390 00000 n +0000642923 00000 n +0000643464 00000 n +0000644005 00000 n +0000644481 00000 n +0000644504 00000 n +0000644526 00000 n +trailer +<< +/Size 324 +/Root 2 0 R +/Info 1 0 R +>> +startxref +644648 +%%EOF diff --git a/contrib/bluegnu2.0.3/doc/dejagnu.ps b/contrib/bluegnu2.0.3/doc/dejagnu.ps new file mode 100644 index 0000000..78471ab --- /dev/null +++ b/contrib/bluegnu2.0.3/doc/dejagnu.ps @@ -0,0 +1,6690 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.85 Copyright 1999 Radical Eye Software +%%Title: dejagnu.dvi +%%Pages: 60 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%DocumentPaperSizes: a4 +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips -f dejagnu.dvi +%DVIPSParameters: dpi=600, compressed +%DVIPSSource: TeX output 1999.09.19:2152 +%%BeginProcSet: texc.pro +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 +1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx +0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx +sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ +rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp +gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B +/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ +/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ +A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy +get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} +ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp +fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 +{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add +chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ +1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} +forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ +/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) +(LaserWriter 16/600)]{A length product length le{A length product exch 0 +exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse +end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask +grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} +imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round +exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto +fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p +delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} +B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ +p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S +rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +TeXDict begin 39158280 55380996 1000 600 600 (dejagnu.dvi) +@start +%DVIPSBitmapFont: Fa cmtt12 14.4 6 +/Fa 6 118 df101 +D110 D114 D<903901FFF00F011F9038FE1F8090B612BF000315FF5A +5A5A393FFE003F01F01307D87FC0130190C8FC5A48157FA47EEE3F00D87FC091C7FC13F0 +EA3FFE381FFFF06CEBFFC06C14FE6C6E7EC615E0013F14F8010780D9003F7F02007F0307 +1380030013C0003EED3FE0007F151F48150F17F06D1407A37FA26D140F6D15E0161F01FC +EC3FC06D14FF9026FFC00F138091B612005E485D013F5C6D14E0D8FC0714802778007FF8 +C7FC2C3677B43E>I<147C14FC497EAD003FB712FC5AB87EA36C5EA2260001FEC9FCB3A6 +173FA2EF7F80A76E14FF6D16006F5A9238C007FE91387FF01F92B55A6E5C6E5C6E5C6E14 +80020149C7FC9138003FF031437DC13E>I<263FFF80EB7FFF4892B5FCB56C4880A36C80 +6C81D8003FEC007FB3AC17FFA25E5E80011F140F6E5B02FE90B612806DB812C06D17E083 +010114FE6DDAF83F13C0023F01E01480020790C9FC3B347FB23E>I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fb cmbxti10 14.4 1 +/Fb 1 47 df<13FCEA03FF000F13804813C05AA25AA2B5FCA31480A214006C5A6C5A6C5A +EA0FE0121271912B>46 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fc cmsl9 9 23 +/Fc 23 122 df12 D<387FFFF8A4B512F015057D921A>45 D97 +D<137EEA1FFE5B123F1201A2120012015BA512035BA50007137F9038E1FFC09038E781F0 +9038FE00FC01F8137E49133E4848133FED1F805BA216C0A2121F5BA4153F003F158090C7 +FCA3ED7F00A24814FE007E5C4A5A007F13035D397B8007C039F1C01F8026E0E07EC7FC38 +C07FF838001FC0223578B32B>II<167EED1FFE16FC153F1501A416F8A41503A216F0A4150714FE903907FFC7 +E090381F81E790387E007749133F4848131F4848130F484814C0120F485AA24848131FA2 +007F158090C7FCA3153F5A481500A3127E5DA2157E6C14FE14016C13036C6C487E2607C0 +0E13F03803E07C3800FFF090393F80FC0027357BB32B>II<163C91387F01FF903901FFE3CF903907C1FF0F90391F80 +FC1F90393F007C0E017EEB3E005B153F485AA35D157E5BA25D6D5B0000495A90387C03E0 +9038FE0FC02601CFFFC7FC380383F80180C8FCA21207A37F90B57E6C14F015FC6C804880 +380F800048C7EA3F80003E141F48140F12FC5AA3151F16006C143E007C5C6C5C6CEB03F0 +3907E01FC00001B5C7FC38003FF028337FA126>103 DII108 D<90260F80FFEB07F82603FF839038 +C01FFE48903A8F03E0781F913B9C01F0E00F8026007FB8D9F9C013C0D93FF0EBFB8002E0 +EBFF0002C05B02805BA202005BA2490103141F017E4A1480A501FE0107143F494A1400A5 +0001020F5C494A137EA40003021F14FE3D7FFFC3FFFE1FFFF0A2B500C75C3C217EA041> +I<90380F80FE3A03FF83FF804890388F07E0EC9C0326007FB813F0EB3FF014E014C01480 +A2140015075B017E14E0A4150F13FE4914C0A4151F1201491480A40003143F3A7FFFC7FF +FCA2B5FC26217EA02B>I<14FF010713C090381F81F090383E00F80178133C4848133E48 +487FA248481480120F4848130FED1FC0123F90C7FCA25AA400FEEC3F80A31600007E5C15 +7EA25D003E5C003F495A6C495A6C6C485A6C6C485A2603F03EC7FC3800FFF8EB3FC02223 +7CA126>I<903803E07F9039FFE1FFC0489038E781F09138FE00FC26000FF8137E6D5A49 +487F17805C161F17C0A2131F5CA4163F013F158091C7FCA2167F17005E495C017E495A5E +017F13034B5A9039FF800FC06E485A9026FCE07EC7FCEC7FF8EC1FC091C9FC1201A25BA4 +1203A25B487EB512C05CA22A3080A02B>I<90383E03E03907FE1FF8143C000FEB71FC38 +007EE1EB7FC1EC81F815F091C7FCA2137EA213FE5BA512015BA512035BA41207B512C0A3 +1E217EA01E>114 D<903807F83890383FFF7890387C07F03801E0013803C00048481370 +A2120F90C712607FA26D130013F0EBFF806C13F86C13FE6C7F6C1480013F13C013019038 +001FE0140F003013071403A2007014C0A21278EC0780127CEC0F0000FE131E38F7807C38 +E1FFF038C07F801D237EA11E>I<13065BA4131CA25BA2137813F812011203485A381FFF +FEB5FCA23803F000A212075BA5120F5BA5121FEB8018A41438003F13301300A214706C13 +60EB80E0380F81C0EBC3803803FF00EA00FC172F7AAD1E>II<3A +7FFF803FFCA2B538007FF8D807F8EB1FC06C48EB0F00150E150C7F00015C153815306D5B +12005D140101FE5BD97E03C7FCA21406137F6D5A141C141814B0131F14E0A25C130F5C91 +C8FCA2130626217A9F29>I<3C7FFF1FFF80FFF0A2B5028113E03C0FF003FC007F800007 +6D48EB3E00171C0003010014185FA24A6C5B13F80001D9037C5BA20206495AA291260C7E +03C7FCD800FC5C9138183E060238130E0230130C9138703F18EB7E604A6C5AA2D97F805B +16E0D93F005B150F013E5CA2013C91C8FC131C0118130634217A9F37>I<3B03FFFC0FFF +C014F85A3B003FE007F800010FEB03E0ED0780010791C7FC903803F00E6E5A01015B6E5A +01005BEC7FC05D6EC8FC81141F4A7E4A7E14E7903801C7F0EB038390380701F8010E7FEB +1C00497F0178137ED801F8137F00074A7E267FFC0113FC00FF5BA22A207F9F29>I<90B5 +EB7FF8A248EDFFF026000FF0EB3F806D48EB1E00161C6E13180103143816305E8001015C +15015E6E48C7FC13001506150EECFE0CEC7E18A25D147F6E5A15E05D5D141F92C8FCA214 +0E140CA25C143814305CA25CEA3C01007C5BD8FC03C9FC5B130EEA701CEA7878EA3FE0EA +0F802D30819F29>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fd cmti9 9 16 +/Fd 16 121 df<121C127F12FFA412FE12380808778718>46 D97 +D<14FCEB07FF90381F078090383E03C0EBFC013801F8033803F0073807E00F13C0120F39 +1F80070091C7FC48C8FCA35A127EA312FE5AA4007C14C0EC01E0A2EC03C06CEB0F80EC1F +006C137C380F81F03803FFC0C648C7FC1B2278A023>99 DII104 DI<133FEA +07FF5A13FEEA007EA3137CA213FCA213F8A21201A213F0A21203A213E0A21207A213C0A2 +120FA21380A2121FA21300A25AA2123EA2127EA2127C1318EAFC1C133CEAF838A2137813 +7012F013F0EAF8E01279EA3FC0EA0F00103579B314>108 D<2703C003F8137F3C0FF00F +FE01FFC03C1E783C1F07C1E03C1C7CF00F8F01F03B3C3DE0079E0026383FC001FC7FD97F +805B007001005B5E137ED8F0FC90380FC00100E05FD860F8148012000001021F13036049 +1400A200034A13076049013E130FF081800007027EEC83C0051F138049017C1403A2000F +02FC1407053E130049495CEF1E0E001F01015D183C010049EB0FF0000E6D48EB03E03A22 +7AA03F>I<3903C007F0390FF01FFC391E787C1E391C7CF01F393C3DE00F26383FC01380 +EB7F8000781300EA707EA2D8F0FC131F00E01500EA60F8120000015C153E5BA20003147E +157C4913FCEDF8180007153C0201133801C013F0A2000F1578EDE070018014F016E0001F +ECE1C015E390C7EAFF00000E143E26227AA02B>I<011E137C90387F81FF9039F3C387C0 +9039E3EF03E03901E1FE01D9C1FC13F0EBC3F8000313F0018314F814E0EA078713070003 +13C01200010F130316F01480A2011F130716E01400A249EB0FC0A2013EEB1F80A2017EEB +3F00017F133E5D5D9038FF81F09038FDC3E09038F8FF80027EC7FC000190C8FCA25BA212 +03A25BA21207A25BB5FCA325307FA027>112 D<3903C00FC0390FF03FF0391E78F07839 +1C7DE03C393C3FC0FC00381380EB7F00007814F8D8707E13701500EAF0FC12E0EA60F812 +001201A25BA21203A25BA21207A25BA2120FA25BA2121FA290C8FC120E1E227AA020> +114 D<1303EB0F80A3131FA21400A25BA2133EA2137EA2137C387FFFF8A2B5FC3800F800 +A21201A25BA21203A25BA21207A25BA2120FA25B1460001F13F014E01300130114C01303 +001E1380EB07005BEA0F1EEA07F8EA01E015307AAE19>116 D<01F01338D803FC13FCEA +0F1E120E121C123C0038147CEA783E0070143CA2137ED8F07C1338EA60FCC65A15780001 +14705BA215F0000314E05BA2EC01C0A2EBC003158014071500EBE00EA26C6C5A3800F878 +EB7FE0EB1F801E227AA023>118 DI<011F137C90387FC1FF3A01E1E787803A03C0F703C0903880FE0FEA07 +004813FC000E1580001E9038F80700001C91C7FC1301003C5B1218120013035CA31307A2 +5C1506010F130F150E14800038141ED87C1F131C00FC143C1538013F5B39F07FC0E03970 +F3C3C0393FE1FF80260F807EC7FC22227CA023>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fe cmr9 9 71 +/Fe 71 123 df<91393FE00FE0903A01FFF83FF8903A07E01EF83C903A1F800FF07E903A +3F001FE0FE017E133F4914C0485A1738484890381F8000ACB812C0A33B03F0001F8000B3 +A7486C497EB50083B5FCA32F357FB42D>11 DI14 D<003C13F0387E01F838FF03FCA2EB83FEA2EA7F81383D +80F600011306A40003130EEB000CA248131C00061318000E1338000C1330001C13704813 +E0387001C00060138017177EB326>34 D<123C127EB4FCA21380A2127F123D1201A41203 +1300A25A1206120E120C121C5A5A126009177AB315>39 D<14C01301EB0380EB0F00130E +5B133C5B5BA2485A485AA212075B120F90C7FC5AA2121E123EA3123C127CA55AB0127CA5 +123C123EA3121E121FA27E7F12077F1203A26C7E6C7EA213787F131C7F130FEB0380EB01 +C01300124A79B71E>I<12C07E1270123C121C7E120F6C7E6C7EA26C7E6C7EA27F137813 +7C133C133EA2131E131FA37F1480A5EB07C0B0EB0F80A514005BA3131E133EA2133C137C +137813F85BA2485A485AA2485A48C7FC120E5A123C12705A5A124A7CB71E>I<123C127E +B4FCA21380A2127F123D1201A412031300A25A1206120E120C121C5A5A126009177A8715 +>44 D<123C127E12FFA4127E123C08087A8715>46 D48 D<13075B5B137FEA07FFB5FC13BFEAF83F1200B3B3A2497E +007FB51280A319327AB126>IIII<000C14C0380FC00F90B5128015005C5C14 +F014C0D80C18C7FC90C8FCA9EB0FC0EB7FF8EBF07C380FC03F9038001F80EC0FC0120E00 +0CEB07E0A2C713F01403A215F8A41218127E12FEA315F0140712F8006014E01270EC0FC0 +6C131F003C14806CEB7F00380F80FE3807FFF8000113E038003F801D347CB126>I<14FE +903807FF80011F13E090383F00F0017C13703901F801F8EBF003EA03E01207EA0FC0EC01 +F04848C7FCA248C8FCA35A127EEB07F0EB1FFC38FE381F9038700F809038E007C039FFC0 +03E0018013F0EC01F8130015FC1400A24814FEA5127EA4127F6C14FCA26C1301018013F8 +000F14F0EBC0030007EB07E03903E00FC03901F81F806CB51200EB3FFCEB0FE01F347DB1 +26>I<1230123C003FB6FCA34814FEA215FC0070C7123800601430157015E04814C01401 +EC0380C7EA07001406140E5C141814385CA25CA2495A1303A3495AA2130FA3131F91C7FC +A25BA55BA9131C20347CB126>III<123C127E12FFA4127E123C1200B0123C127E12FFA412 +7E123C08207A9F15>I<15E0A34A7EA24A7EA34A7EA3EC0DFE140CA2EC187FA34A6C7EA2 +02707FEC601FA202E07FECC00FA2D901807F1507A249486C7EA301066D7EA2010E80010F +B5FCA249800118C77EA24981163FA2496E7EA3496E7EA20001821607487ED81FF04A7ED8 +FFFE49B512E0A333367DB53A>65 D67 +DIIII73 D<017FB5FCA39038003FE0EC1FC0 +B3B1127EB4FCA4EC3F805A0060140000705B6C13FE6C485A380F03F03803FFC0C690C7FC +20357DB227>IIII +IIIII<90381FE00390387FFC0748B5FC3907F01FCF390F8003FF +48C7FC003E80814880A200788000F880A46C80A27E92C7FC127F13C0EA3FF013FF6C13F0 +6C13FF6C14C06C14F0C680013F7F01037F9038003FFF140302001380157F153FED1FC015 +0F12C0A21507A37EA26CEC0F80A26C15006C5C6C143E6C147E01C05B39F1FC03F800E0B5 +12E0011F138026C003FEC7FC22377CB42B>I<007FB712FEA390398007F001D87C00EC00 +3E0078161E0070160EA20060160600E01607A3481603A6C71500B3AB4A7E011FB512FCA3 +30337DB237>I86 +DI<267FFFFC90B512C0A3000101E090381FF8 +0026007F80EB0FC0013F6E5A6E91C7FC6D6C130E010F140C6E5B6D6C133801035C6E1360 +6D6C13E06D6C485A5EDA7F83C8FCEC3FC715C6EC1FECEC0FFC5D14076E7EA26E7E815C6F +7E9138063FC0140E4A6C7E9138180FF0EC380702707F91386003FCECC0010101804A6C7E +49C77E4981010E6E7E010C6E7E131C496E7E01786E7E13FCD807FEEC1FFEB56C90B512F8 +A335337EB23A>I91 +D<0003130C48131C000E133848137000181360003813E0003013C0EA700100601380A2EA +E00300C01300A400DE137800FF13FCEB83FEA2EA7F81A2383F00FC001E1378171774B326 +>II<12035A120E5A121812381230127012 +60A212E05AA412DEB4FC1380A2127FA2EA3F00121E09177BB315>96 +DIII<153FEC0FFFA3EC007F81AEEB07F0EB3FFCEBFC0F3901F003BF3907E001FF48487E +48487F8148C7FCA25A127E12FEAA127E127FA27E6C6C5BA26C6C5B6C6C4813803A03F007 +BFFC3900F81E3FEB3FFCD90FE0130026357DB32B>III<15 +1F90391FC07F809039FFF8E3C03901F07FC73907E03F033A0FC01F83809039800F800000 +1F80EB00074880A66C5CEB800F000F5CEBC01F6C6C48C7FCEBF07C380EFFF8380C1FC000 +1CC9FCA3121EA2121F380FFFFEECFFC06C14F06C14FC4880381F0001003EEB007F4880ED +1F8048140FA56C141F007C15006C143E6C5C390FC001F83903F007E0C6B51280D91FFCC7 +FC22337EA126>IIIIII<2703F01FE013FF00FF90267FF80313C0903BF1E07C0F03E0903BF3803E1C01 +F02807F7003F387FD803FE1470496D486C7EA2495CA2495CB3486C496C487EB53BC7FFFE +3FFFF0A33C217EA041>I<3903F01FC000FFEB7FF09038F1E0FC9038F3807C3907F7007E +EA03FE497FA25BA25BB3486CEB7F80B538C7FFFCA326217EA02B>II<3903F03F8000FFEBFFE09038F3C0F89038F700 +7ED807FE7F6C48EB1F804914C049130F16E0ED07F0A3ED03F8A9150716F0A216E0150F16 +C06D131F6DEB3F80160001FF13FC9038F381F89038F1FFE0D9F07FC7FC91C8FCAA487EB5 +12C0A325307EA02B>I<903807F00390383FFC07EBFC0F3901F8038F3807E001000F14DF +48486CB4FC497F123F90C77E5AA25A5AA9127FA36C6C5B121F6D5B000F5B3907E003BF39 +03F0073F3800F81EEB3FF8EB0FE090C7FCAAED7F8091380FFFFCA326307DA029>I<3803 +E07C38FFE1FF9038E38F809038E71FC0EA07EEEA03ECA29038FC0F8049C7FCA35BB2487E +B512E0A31A217FA01E>II<13 +30A51370A313F0A21201A212031207381FFFFEB5FCA23803F000AF1403A814073801F806 +A23800FC0EEB7E1CEB1FF8EB07E0182F7FAD1E>IIIII<3A7FFF807F +F8A33A07F8001FC00003EC0F800001EC070015066C6C5BA26D131C017E1318A26D5BA2EC +8070011F1360ECC0E0010F5BA2903807E180A214F3010390C7FC14FBEB01FEA26D5AA314 +78A21430A25CA214E05CA2495A1278D8FC03C8FCA21306130EEA701CEA7838EA1FF0EA0F +C025307F9F29>I<003FB512F0A2EB000F003C14E00038EB1FC00030EB3F800070137F15 +00006013FE495A13035CC6485A495AA2495A495A49C7FC153013FE485A12035B48481370 +485A001F14604913E0485A387F000348130F90B5FCA21C207E9F22>I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Ff cmtt9 9 51 +/Ff 51 122 df<00101320007C13F838FE01FCAAEAFC00007C13F8A900381370161778AE +27>34 D40 D<127012F812FE7E6C7E6C7EEA0FE06C7E12 +037F6C7E1200137EA27FA2EB1F80A3EB0FC0A4EB07E0ACEB0FC0A4EB1F80A3EB3F00A213 +7EA25B1201485A5B1207485AEA3FC0485A48C7FC5A12F81270133A7AB327>I<007FB512 +F8B612FCA46C14F81E067C9927>45 D<121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A0A72 +8927>I<1538157C15FCA2140115F8140315F0140715E0140F15C0141F1580143F1500A2 +5C147E14FE5C13015C13035C13075C130F5CA2131F5C133F91C7FC5B137E13FE5B12015B +12035BA212075B120F5B121F5B123F90C8FC5A127E12FE5AA25A12781E3A7CB327>II<007FB512FEB7FCA4003F14FEC9FCA6003FB512FEB7FCA46C14FE20 +127D9F27>61 D65 D<387FFFFC14FFB612C06C80813907E00FF81407EC +01FC6E7EA2157E157F811680151FA316C0150FABED1F80A3153F1600A25D15FEA24A5A4A +5A140F007FB55A5DB65A6C91C7FC14FC222E7FAD27>68 D<007FB61280B712C0A37E3907 +E0000FA6ED078092C7FCA4EC07804A7EA390B5FCA5EBE00FA36E5A91C8FCA4ED03C0ED07 +E0A7007FB6FCB7FCA36C15C0232E7FAD27>I<007FB61280B712C0A37E3907E0000FA6ED +078092C7FCA4EC07804A7EA390B5FCA5EBE00FA36E5A91C8FCAC387FFF80B57EA36C5B22 +2E7EAD27>I<903807F03890381FFC7C90387FFFFC90B5FC5A3803FC1F3807F00F380FE0 +07EBC003001F13011380123F90C7FCA2127EA2157892C7FC5AA8EC1FFF4A1380A3007E6D +1300EC00FCA36C1301A21380121FEBC003120FEBE0073807F00F3803FC1F6CB5FC7EEB7F +FE90381FFC78D907F0C7FC21307DAE27>I<007FB512E0B612F0A36C14E039001F8000B3 +B2007FB512E0B612F0A36C14E01C2E7BAD27>73 D<387FFFC080B5FC7E5CD803F0C8FCB3 +AAED0780ED0FC0A7007FB6FCA2B7FC7E1680222E7FAD27>76 D<3A7FF003FFE0486C4813 +F0A213FC007F6D13E000079038003E0013DEA313CFA3148013C714C0A213C314E0A213C1 +14F0A3EBC0F8A31478147CA2143C143EA2141E141F140FA3EC07BEA3EC03FEEA7FFCEAFF +FE1401A26C486C5A242E7FAD27>78 DI<007FB5FCB612E081816C8039 +07E003FEEC00FF81ED3F80151F16C0150FA6151F1680153FED7F005DEC03FE90B55A5D5D +5D92C7FC01E0C8FCADEA7FFEB5FCA36C5A222E7FAD27>I<387FFFF0B512FE6E7E816C80 +3907E01FF014076E7E1401811400A514015D14034A5A141F90B55A5D5DA281EBE01F6E7E +14076E7EA816F0EDF1F8A4397FFE01FBB5EBFFF08016E06C48EB7FC0C8EA1F00252F7FAD +27>82 D<90387FC0E03901FFF1F0000713FF5A5AEA3FE0EB801F387F000F007E130712FE +5A1403A3EC01E06C90C7FC127E127FEA3FC013F86CB47E6C13F86C13FE6CEBFF80C614C0 +010F13E0010013F0140FEC07F81403140115FC1400127812FCA46CEB01F8A26C13039038 +8007F09038F01FE090B5FC15C0150000F85B38701FF81E307CAE27>I<007FB61280B712 +C0A439FC03F00FA60078EC0780000091C7FCB3AB90B512C04880A36C5C222E7EAD27>I< +3A7FFE01FFF8B54813FCA36C486C13F83A07E0001F80B3AB6D133F00031500A26D5B0001 +147E6D13FE6C6C485A90387F87F814FF6D5B010F13C06D5BD901FEC7FC262F80AD27>I< +3A7FFC03FFE06D5A00FF15F0007F15E0497E3A07E0007E00A46C6C5BA4EBF80100015CA4 +6C6C485AA490387E07E0A56D485AA4011F5B149FA3010F90C7FCA5EB07FEA46D5AA26D5A +242F7FAD27>II<393FFC1FFE387FFE +3F815D383FFC1F3903F00FE001F85B1201EBFC1F00005CEBFE3F017E90C7FCEB7F7FEB3F +7E14FE6D5AA26D5AA26D5AA21303130780130F80131F80EB3F7E147F497E017E7F141F01 +FC7F140FD801F87F14071203496C7E120701E07F3A7FFC0FFF8000FF15C06D5A497E007F +1580222E7EAD27>I<007FB512F8B612FCA46C14F81E067C7E27>95 +D<3803FFC0000F13F04813FC4813FF811380EC1FC0381F000F000480C71207A2EB0FFF13 +7F0003B5FC120F5A383FFC07EA7FC0130012FE5AA46C130F007F131FEBC0FF6CB612806C +15C07E000313F1C69038807F8022207C9F27>97 DIIIII<153F9039 +1FC0FF80D97FF313C048B612E05A4814EF390FF07F873A1FC01FC3C0EDC000EB800F4848 +6C7EA66C6C485AEBC01FA2390FF07F8090B5C7FC5C485BEB7FF0EB1FC090C9FCA27F6CB5 +FC15E015F84814FE4880EB8001007EC7EA3F80007C140F00FC15C0481407A46C140F007C +1580007F143F6C6CEB7F009038F807FF6CB55A000714F86C5CC614C0D90FFCC7FC23337E +A027>II<130F497E49 +7EA46D5A6DC7FC90C8FCA7383FFF80487FA37EEA000FB3A4007FB512F0B6FC15F815F07E +1D2F7BAE27>I<143C147E14FFA4147E143C1400A73801FFFE4813FFA37EC7123FB3B014 +7E1238007C13FE38FE01FC1303B512F814F06C13E06C13803807FE0018407CAE27>II<387FFF80B57E +A37EEA000FB3B2007FB512F8B612FCA36C14F81E2E7CAD27>I<397F07C01F3AFF9FF07F +C09039FFF9FFE091B57E7E3A0FFC7FF1F89038F03FC001E0138001C01300A3EB803EB03A +7FF0FFC3FF486C01E3138001F913E701F813E36C4801C313002920819F27>I<387FE07F +39FFF1FFC001F713F090B5FC6C80000313C1EC01FCEBFE005B5BA25BB03A7FFF83FFE0B5 +00C713F0A36C018313E024207F9F27>II<387FE0FFD8FFF313C090B512F0816C800003EB81FE49C67E49EB3F804913 +1F16C049130FA216E01507A6150F16C07F151F6DEB3F80157F6DEBFF009038FF83FEECFF +FC5D5D01F313C0D9F0FEC7FC91C8FCAC387FFF80B57EA36C5B23317F9F27>I<90380FF0 +3C90383FFE7E90B5FC000314FE5A380FFC1F381FE007EBC003383F800148C7FC127EA200 +FE147E5AA67E007E14FEA2007F1301EA3F80EBC003381FE007380FF81F6CB5FC7E6C147E +38007FFCEB0FF090C7FCAC91381FFFF8A24A13FC6E13F8A226317E9F27>I<397FFC03FC +39FFFE0FFF023F13804A13C0007F90B5FC39007FFE1F14F89138F00F809138E002004AC7 +FC5CA291C8FCA2137EAD007FB57EB67EA36C5C22207E9F27>I<9038FFF3800007EBFFC0 +121F5A5AEB803F38FC000F5AA2EC07806C90C7FCEA7F8013FC383FFFF06C13FC000713FF +00011480D8000F13C09038003FE014070078EB03F000FC1301A27E14036CEB07E0EBE01F +90B512C01580150000FB13FC38707FF01C207B9F27>I<133C137EA8007FB512F0B612F8 +A36C14F0D8007EC7FCAE1518157EA415FE6D13FC1483ECFFF86D13F06D13E0010313C001 +0013001F297EA827>I<397FE01FF8486C487EA3007F131F00031300B21401A21403EBFC +0F6CB612E016F07EEB3FFE90390FF87FE024207F9F27>I<3A7FFC0FFF80486C4813C0A3 +6C486C13803A07C000F800EBE00100035CA2EBF00300015CA2EBF80700005CA390387C0F +80A36D48C7FCA3EB3F3FEB1F3EA214FE6D5AA36D5AA26D5A22207E9F27>I<3A7FFE07FF +E000FF15F06D5A497E007F15E03A0F80001F00A36D5B0007143EA414F0EBC1F83903E3FC +7CA4EBE79EA200011478A301F713F8A2EBFF0F6C5CA3EBFE0790387C03E024207F9F27> +I<393FFC1FFF486C5A168016006C487E3901F807E06C6C485A4A5A017E90C7FC6D5AEB1F +7E5C6D5A13076D5A5C80497E130F497E143EEB3E3FEB7E1F90387C0F8001F87F00016D7E +3803F0033A7FFE1FFF80A2B54813C06C486C1380A222207E9F27>I<3A7FFC0FFF80486C +4813C0A36C486C13803A07E000F800000313015D13F00001130301F85B1200A26D485A13 +7CA290387E0F80133EA2011F90C7FC5CA2130F149E14BE130714FC1303A25C1301A25CA2 +13035CA213075C1208EA3E0F007F5B131FD87E7FC8FCEA7FFE6C5A5B6C5AEA07C022317E +9F27>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fg cmtt12 13.14 5 +/Fg 5 121 df99 D101 +D112 D116 D<3B3FFFE007FFFC486D487FB56C487F +A36C496C5B6C496C5B28007F8000FEC7FC013F495A6D6C485A6D6C485AEB07F04B5A6D6C +485AD901FC5B903800FE3F4BC8FCEC7FFE6E5A141F6E5A5D6E5A814A7E141F4A7E157EEC +7E7F4A7E01016D7E02F87F49486C7E0107130749486C7E02C07F011F6D7E49486C7E49C7 +FC167F277FFFE003B5FCB56C481480A56C496C1400312F7DAE38>120 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fh cmb10 10.95 45 +/Fh 45 121 df<147814F81301EB03F0EB07E0EB0FC0A2EB1F80133FEB7F00A213FEA248 +5A1203A25B1207A2485AA3121F5BA2123FA4485AA612FFB3A2127FA66C7EA4121FA27F12 +0FA36C7EA212037FA212016C7EA2137FA2EB3F80131FEB0FC0A2EB07E0EB03F0EB01F813 +001478155A78C323>40 D<127012F87E127E7E6C7EA26C7E7F6C7EA26C7EA26C7E7FA212 +007FA2EB7F80A314C0133FA214E0A4EB1FF0A614F8B3A214F0A6EB3FE0A414C0A2137F14 +80A3EBFF00A25B1201A25B485AA2485AA2485A5B485AA248C7FC127E5A5A1270155A7BC3 +23>I44 D46 D48 D<143C147CEB01FC1307131FEA03FFB5FCA4EAFC1F +1200B3B3A8007FB6FCA5203C7ABB2D>III<000E1407D80F80133F9038F801FF90B6FC5D5DA25D5D5D158092C7FC14FC +14F00180C8FCA9EB87FE90389FFFC090B512F0819038FC0FFC9038F007FE9038C003FF01 +80148016C0497EC714E0A416F0A21207EA1FC0EA3FE0EA7FF012FF13F8A316E013F0A26C +484813C01380D87E0014806C491300391FC00FFE390FF03FFC6CB55A6C5C6C14C06C91C7 +FCEB1FF8243D7CBB2D>53 DI56 DI65 +DI68 DI73 +D75 D77 D80 D85 DII97 D<13FFB5FCA512077EAF4AB4FC020F13E0023F13F891B57E9138 +FE07FFDAF8011380DAE00013C05C4AEB7FE017F0A3EE3FF8A317FCAC17F8A3EE7FF0A217 +E06E13FF17C06E481380DAF80313009138FE0FFE9039FC7FFFFC496C13F0496C13C0C7D8 +03FEC7FC2E407FBE33>II<16FF92B5FCA5150781AFEB01FF011F13E3017F13FB90B7FC +4813C148EB003F48487F48487F001F805B123FA2485AA312FFAC127FA36C7EA3001F5C6C +6C5B00074A13806D4913FC2603FF83B5FCC690B6FC6D13F7011F13C7903A03FE07FC002E +407DBE33>I<49B47E010F13F0013F7F90B512FE48EBC3FF48010013804848EB7FC04848 +133F001F15E05B003FEC1FF0A2485A150F16F8A212FFA290B6FCA401F0C8FCA5127FA37F +003F15F8A26C6C1301000F15F06D13036C6CEB07E06C9038800FC06C9038F07F806C6CB5 +12006D5B010F13F8010013C0252B7EA92A>III<13FFB5FCA512077EAFED7FE0913801FFF802077F4A7F9138 +1FC3FFDA3E031380147CEC780102F014C014E0A214C0A31480B3A4B5D8FE1F13FFA5303F +7EBE33>III<13FFB5FCA512077EB092B512E0A592380FE0004B5A4B5A4BC7FC15FE4A5A4A5A +4A5A4A5A4A5A143FECFFE0A28181A2ECDFFCEC8FFE140F6E7E6E7FA26E7F6E7FA26F7E6F +7EA26F7E6F7EB539FC7FFFF8A52D3F7FBE30>I<13FFB5FCA512077EB3B3AFB512FCA516 +3F7EBE19>I<01FFD97FE0EB3FF0B52601FFF8EBFFFC0207D9FC037F4A6D487F91281FC3 +FF0FE17FDA3E03D99F017F0007017C14BE6CD97801EBBC0002F002F88002E05CA202C05C +A302805CB3A4B5D8FE1FD9FF0FEBFF80A549297EA84C>I<01FFEB7FE0B53801FFF80207 +7F4A7F91381FC3FFDA3E0313800007137C6CEB780102F014C014E0A214C0A31480B3A4B5 +D8FE1F13FFA530297EA833>I<49B47E010F13F0013F13FC90B6FC48018113803A03FE00 +7FC04848EB3FE0000F15F049131F001F15F8A24848EB0FFCA2007F15FEA400FF15FFAB00 +7F15FEA3003F15FC6D131F001F15F8A26C6CEB3FF0000715E06C6CEB7FC03A01FF81FF80 +6C90B51200013F13FC010F13F001011380282B7EA92D>I<9038FF01FFB5000F13E0023F +13F891B57E9138FE0FFFDAF80313800003D9E00113C014C04A6C13E017F0167FA217F8A2 +163F17FCACEE7FF8A317F016FF17E0804B13C06E481380DAF80713009138FE0FFE91B55A +02BF13F0029F13C0DA83FEC7FC0280C8FCACB512FEA52E3B7FA833>I<3901FE07F800FF +EB0FFE91383FFF804A13C0EC7C7F9138F8FFE03807FFF06C5B5CA2ED7FC09138803F80ED +1F0092C7FCA291C8FCB3A3B6FCA523297FA827>114 D<90387FE1E03803FFFB4813FF5A +381FE07F383F801F387F000F007E130712FE1403A27EA26DC7FC13F013FF6C13F014FC6C +13FF15806C14C07E6C14E0000114F06C7E010313F8EB003F140F0078130712F814037EA3 +6C14F06C1307A29038800FE09038F03FC090B51280150000F813FC38E03FF01D2B7DA924 +>I<131FA65BA55BA25BA25A5A5A001FEBFFC0B6FCA4000790C7FCB3EC03E0A97EEC87C0 +A26CEBCF806C13FF6D1300EB1FFEEB07F81B3B7EB923>II119 +D<3B7FFFFC7FFFE0A5C69039E007E0004B5A90387FF01FD93FF85B4BC7FC90381FFC7EEB +0FFE5D6D6C5A7F5D6D5B7FA26E7E143F814A7E14FF81497FEB03F301078002E17FEB0FC0 +49487F6F7E90383F003F017E806F7EB500E0B512F8A52D287FA730>I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fi cmbx12 13.14 37 +/Fi 37 122 df<923807FFE092B512FC020714FF021F81027F9038007FC0902601FFF0EB +0FE04901C0497E4990C7487ED90FFC147F011F824A14FF495AA2137F5CA2715A715A715A +EF078094C8FCA7EF07FCB9FCA526007FF0C7123F171FB3B3A2003FB5D8E00FB512F8A53D +4D7ECC44>12 D46 D48 D<15F014011407141F147FEB03FF137FB6FCA313FC1380C7FCB3 +B3B2007FB712E0A52B4777C63D>IIIII<121F7F7F13FE90B812E0 +A45A18C0188018005F5FA25F485E90C8EA07E0007E4B5A5F007C151F4CC7FC167E5E485D +15014B5A4B5AC8485A4B5AA24BC8FC157EA25D1401A24A5A1407A24A5AA2141FA24A5AA2 +147FA314FFA3495BA45BA55BAA6D5BA26D90C9FCEB007C334B79C93D>55 +D<93261FFF80EB01C00307B500F81303033F02FE13074AB7EAC00F0207EEE03F021F903A +FE007FF87F027F01E0903807FCFF91B5C70001B5FC010301FC6E7E4901F0151F4901C081 +4949814990C97E494882494882485B48197F4A173F5A4A171F5A5C48190FA2485B1A07A2 +5AA297C7FC91CDFCA2B5FCAD7EA280A2F207C07EA36C7FA26C190F6E18807E6E171F6C1A +006E5F6C193E6C6D177E6D6C5F6D6C4C5A6D6D15036D6D4B5A6D01F04B5A6D01FCED3FC0 +010001FFEDFF806E01E0D903FEC7FC021F01FEEB3FFC020790B612F002015EDA003F92C8 +FC030714FCDB001F13804A4D79CB59>67 D +I70 D73 +D76 DI80 D82 +DI85 DI97 DI<91380FFF8091B512F8010314FF010F15804948 +C613C0D97FF8EB1FE0D9FFE0EB3FF04849137F4849EBFFF84890C7FCA2485A121FA24848 +EC7FF0EE3FE0EE1FC0007F92C7FC5BA212FFAC127FA27FA2123FA26C6C153EA26C6C157E +177C6C6D14FC6C6D14F86C6D13036C6DEB07F0D97FFCEB1FE06DB4EBFFC0010F90B51200 +01035C010014F0020F13802F347CB237>III103 D<13FCEA03FF487F487FA2487FA66C5BA2 +6C5B6C90C7FCEA00FC90C8FCABEB7FC0B5FCA512037EB3B3A2B61280A5194D7BCC22> +105 D108 +D<90287FC001FFC0EC7FF0B5010F01FC0103B5FC033F6D010F804B6D4980DBFE07902680 +3F817F9126C1F801903AC07E007FF00003D9C3E0DAE0F8806C9026C78000D9F1E06D7E02 +CFC7EBF3C002DEEDF780DD7FFF6E7E02FC93C7FC4A5DA24A5DA34A5DB3AAB6D8C03FB5D8 +F00FB512FCA55E327BB167>I<903A7FC001FFC0B5010F13F8033F7F4B13FFDBFE077F91 +38C1F00300039026C3E0017F6CD9C78080ECCF0014DE02DC6D7F14FC5CA25CA35CB3AAB6 +D8C07FEBFFE0A53B327BB144>I<913807FF80027F13F80103B6FC010F15C090261FFE01 +7F903A7FF0003FF849486D7E480180EB07FE4890C76C7E4817804980000F17C048486E13 +E0A2003F17F0A249157F007F17F8A400FF17FCAB007F17F8A46C6CEDFFF0A2001F17E0A2 +6C6C4A13C0A26C6C4A13806C6D4913006C5E6C01E0EB1FFC6D6C495A903A3FFE01FFF001 +0FB612C0010392C7FCD9007F13F80207138036347DB23D>I<90397FC007FFB5017F13E0 +02C1B512FC02C714FF9126CFF80F7F9126DFC0037F000301FFC77F6C496E7E02F8814A6E +7E717E4A81831980A28319C0A37113E0AC19C05FA319805F19005F606E143F6E5D4D5A6E +4A5A02FF495BDBC0075B9126EFF01F5B02E7B548C7FC02E114F8DAE07F13E0DB0FFEC8FC +92CAFCAFB612C0A53B477CB144>I<9039FF803FE0B5EBFFF8028113FE02837FDA87E113 +80EC8F830003D99F0713C06C139E14BCA214F8A24A6C13806F13006F5A4A90C7FCA45CB3 +A8B612E0A52A327CB132>114 D<903907FF8070017FEBF1F048B6FC1207380FFC01391F +E0003F4848130F491307127F90C71203A2481401A27FA27F01F090C7FC13FCEBFFC06C13 +FEECFFE06C14FC6C806CECFF806C15C06C15E06C15F06C7E011F14F8010114FCEB000FEC +007FED1FFE0078140F00F8140715037E1501A27E16FC7E15036D14F86D13076D14F001F8 +EB1FE001FFEBFFC04890B51280486C1400D8F81F13FCD8E00313C027347CB230>I<14F8 +A51301A41303A21307A2130FA2131F133F137F13FF1203000F90B512F0B7FCA426007FF8 +C7FCB3A7167CAA013F14F880A290391FFE01F0010F1303903907FF87E06DEBFFC06D1480 +6D6C1300EC0FFC26467EC430>II<007FB500C090387FFFE0A5C601F0C73803F8006E +5D017F5E6E1407013F5E80170F011F5E6E141F6D93C7FC6F5B6D153E6F137E6D157C6F13 +FCA26D6D5B16016D5DEDF803027F5CEDFC07023F5CEDFE0F021F5C15FF161F6E91C8FC16 +BF6E13BE16FE6E5BA26E5BA36E5BA26F5AA26F5AA26F5AA393C9FC5D153E157E157CD81F +8013FC486C5B387FE001D8FFF05B14035D14074A5A49485A007F133F4948CAFC383F81FE +381FFFF86C5B6C13C0C648CBFC3B477EB041>121 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fj cmr8 8 6 +/Fj 6 100 df45 D67 D69 +D82 +D<007FB712F8A29039000FC003007C150000701638A200601618A200E0161CA248160CA5 +C71500B3A94A7E011FB512E0A22E2D7EAC33>84 D99 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fk cmsy9 9 2 +/Fk 2 106 df104 D<126012F07EA21278127CA27EA2 +121E121FA26C7EA212077FA26C7EA212017FA26C7EA21378137CA27FA2131E131FA2EB0F +80A2130714C0A41480130FA2EB1F00A2131E133EA25BA2137813F8A2485AA25B1203A248 +5AA25B120FA248C7FCA2121E123EA25AA2127812F8A25A1260124A7CB71E>I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fl cmtt12 17.28 6 +/Fl 6 118 df101 D110 D114 D<913A1FFF800F800103B5EA +F81F011F9138FF3FC0017F15FF48B8FC5A5A5A5A48EBE00049C7121FD87FF880491403D8 +FFC080A25B82A37FEF7F806C7E01F892C7FC13FE383FFFC06C13FE6CEBFFF86CECFFE06C +15FC6CEDFF806C6C15F0011F81010315FED9007F8002011580DA000F14C0DB003F13E016 +07040113F0D83F809138007FF8007F163F486CED1FFC170F7F1707A27FA26D150FA27F6D +ED1FF86D157F02C0ECFFF06E130302FC013F13E091B712C0A2188001BF1600019F15FC01 +0F15F0010315C0267E007F49C7FC007C010713E0364176BF4A>II<263FFFF049B57E486D49806E82B55CA36C81A26C81 +D8000F91C7127FB3B118FFA35F5F6E5C5F6E5C6D6D137FDBF003B612F86D90B812FCA26D +18FE7F6E4A7E6E02FC14FC6EECE03F0207DA801F13F89126007FF8C9FC473F7FBD4A>I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fm lcircle10 10 4 +/Fm 4 12 df8 D<1818183CA7187CA21878A418F8A218F01701A218E01703A218C01707 +A2EF0F80171F1800173EA25F17FC5F4C5A16034C5A4C5A4C5A4CC7FC167E5EED03F84B5A +ED1FC0ED7F80DA01FEC8FCEC07FCEC3FF0903803FFC0017F90C9FC387FFFFCB512E049CA +FCEA7FC03636B2B564>I<126012F0A77EA21278A3127CA2123C123EA2121E121FA27E7F +A26C7E7F12036C7EA26C7E7F137E133E7F806D7E6D7E6D7E6D7E6D7E147F6E7EEC0FC0EC +07F0EC03FCEC00FFED7FC0ED1FF8ED07FF030113FC9239007FFFF8040F13FC1601933800 +07F8363680B564>II E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fn cmti10 10.95 37 +/Fn 37 122 df<933807FF80043F13E09338FE00F8DB01F0133EDB07E0130E4B48131F4C +137F031F14FF4BC7FCA218FE157E1878180015FE5DA31401A25DA414030103B712F0A218 +E0903A0003F000070207140F4B14C0A3171F020F15805DA2173F1800141F5D5F177EA214 +3F92C712FE5FA34A1301027EECF81CA3160302FEECF03C4A1538A21878187013014A0101 +13F018E0933800F1C0EF7F804948EC1F0094C7FCA35C1307A2001E5B127F130F00FF5BA2 +49CAFC12FEEAF81EEA703CEA7878EA1FF0EA07C0385383BF33>12 +D44 D<120FEA3FC0127FA212FFA3 +1380EA7F00123C0A0A77891C>46 D<131EEB3F80137FEBFFC05AA214806C13005B133C90 +C7FCB3120FEA3FC0127FA212FFA35B6CC7FC123C122777A61C>58 +D<9339FF8001C0030F13E0033F9038F803809239FF807E07913A03FC001F0FDA0FF0EB07 +1FDA1FC0ECBF00DA7F806DB4FC4AC77E495AD903F86E5A495A130F4948157E4948157C49 +5A13FF91C9FC4848167812035B1207491670120FA2485A95C7FC485AA3127F5BA312FF5B +A490CCFCA2170FA2170EA2171E171C173C173817786C16706D15F04C5A003F5E6D140300 +1F4B5A6D4AC8FC000F151E6C6C5C6C6C14F86C6C495A6C6CEB07C090397FC03F8090261F +FFFEC9FC010713F0010013803A4272BF41>67 D<49B812F8A390260003FEC7121F18074B +14031801F000F014075DA3140F5D19E0A2141F4B1338A2EF7801023F027013C04B91C7FC +A217F0027F5CED80011603160F91B65AA3ED001F49EC07805CA3010392C8FC5CF003804C +13070107020E14005C93C75A180E010F161E4A151C183CA2011F5E5C60A2013F15014A4A +5A1707017F150F4D5A4A147F01FF913807FF80B9FCA295C7FC3D3E7BBD3E>69 +D<49B6FC5BA2D9000313005D5DA314075DA3140F5DA3141F5DA3143F5DA3147F5DA314FF +92C7FCA35B5CA313035CA313075CA3130F5CA3131F5CA3133F5CA2137FA25C497EB67EA3 +283E7BBD23>73 D<49B5933807FFFC496062D90003F0FC00505ADBBF805E1A771AEF1407 +033F923801CFE0A2F1039F020FEE071F020E606F6C140E1A3F021E161C021C04385BA2F1 +707F143C023804E090C7FCF001C0629126780FE0495A02705FF00700F00E0114F002E003 +1C5BA2F03803010116704A6C6C5D18E019070103ED01C00280DA03805BA2943807000F13 +070200020E5C5FDB03F8141F495D010E4B5CA24D133F131E011CDAF9C05CEEFB80197F01 +3C6DB4C7FC013895C8FC5E01784A5C13F8486C4A5CD807FE4C7EB500F04948B512FE16E0 +1500563E7BBD52>77 D79 D<49B77E18F018FC903B0003FE0003FEEF00FF4BEC7F80 +F03FC00207151F19E05DA2020F16F0A25DA2141FF03FE05DA2023F16C0187F4B1580A202 +7FEDFF00604B495A4D5A02FF4A5A4D5A92C7EA3FC04CB4C7FC4990B512FC17E04ACAFCA2 +1303A25CA21307A25CA2130FA25CA2131FA25CA2133FA25CA2137FA25C497EB67EA33C3E +7BBD3E>I<49B612FCEFFF8018F0903B0003FE000FF8EF03FE4BEB00FF8419800207ED3F +C05DA219E0140F5DA3021FED7FC05DA2F0FF80143F4B15004D5A60027F4A5A4B495A4D5A +EF3F8002FF02FEC7FC92380007F892B512E01780499038000FE04A6D7E707E707E010381 +4A130083A213075CA25E130F5C5F1603131F5CA3013F020714404A16E05F017F160119C0 +4A01031303496C1680B6D8800113079438FE0F009338007E1ECAEA3FFCEF07F03B407BBD +42>82 D<92390FF001C0ED7FFE4AB5EA0380913907F80FC791390FC003EF91391F8001FF +4AC71300027E805C495A4948143EA2495AA2010F153C5CA3011F1538A38094C7FC80A214 +FC6DB4FC15F015FE6DEBFFC06D14F06D14FC6D80143F020F7F020180EC001F150303007F +167F163FA2161FA212075A5F120EA2001E153F94C7FCA2163E003E157E167C003F15FC4B +5A486C5C4B5A6D495AD87DE0EB1F80D8F8F849C8FC017F13FE39F03FFFF8D8E00F13E048 +C690C9FC32427ABF33>I<48B9FCA25A903AFE001FF00101F89138E0007FD807E0163E49 +013F141E5B48C75BA2001E147FA2001C4B131C123C003814FFA2007892C7FC12704A153C +00F01738485CC716001403A25DA21407A25DA2140FA25DA2141FA25DA2143FA25DA2147F +A25DA214FFA292C9FCA25BA25CA21303A25CEB0FFE003FB67E5AA2383D71BC41>I<277F +FFFE01B500FC90B512E0B5FCA20003902680000790C7380FFC006C90C701FCEC07F04972 +5A04035EA26350C7FCA20407150EA2040F5D1A3C041F153862163B6216734F5A6D14E303 +014B5A6C15C303034BC8FC1683DB0703140E191E030E151C61031C7F61ED380161157003 +F04A5A15E002014B5A15C0DA03804AC9FC60DA0700140E60140E605C029C5D14B8D97FF8 +5D5C715A5C4A5DA24A92CAFC5F91C7FC705A137E5F137C5F137801705D53406EBD5B>87 +D<147E49B47E903907C1C38090391F80EFC090383F00FF017E137F4914804848133F485A +A248481400120F5B001F5C157E485AA215FE007F5C90C7FCA21401485C5AA21403EDF038 +5AA21407EDE078020F1370127C021F13F0007E013F13E0003E137FECF3E1261F01E313C0 +3A0F8781E3803A03FF00FF00D800FC133E252977A72E>97 DIIII<167C4BB4FC923807C78092380F83 +C0ED1F87161FED3F3FA2157EA21780EE0E004BC7FCA414015DA414035DA30103B512F8A3 +90260007E0C7FCA3140F5DA5141F5DA4143F92C8FCA45C147EA414FE5CA413015CA4495A +A4495AA4495A121E127F5C12FF49C9FCA2EAFE1EEAF83C1270EA7878EA3FE0EA0F802A53 +83BF1C>III<14 +78EB01FCA21303A314F8EB00E01400AD137C48B4FC38038F80EA0707000E13C0121E121C +EA3C0F1238A2EA781F00701380A2EAF03F140012005B137E13FE5BA212015BA212035B14 +38120713E0000F1378EBC070A214F0EB80E0A2EB81C01383148038078700EA03FEEA00F8 +163E79BC1C>I107 DII +II<903903E001F890390FF807FE903A1E7C1E0F80903A +1C3E3C07C0013C137801389038E003E0EB783F017001C013F0ED80019038F07F0001E015 +F8147E1603000113FEA2C75AA20101140717F05CA20103140F17E05CA20107EC1FC0A24A +1480163F010F15005E167E5E131F4B5A6E485A4B5A90393FB80F80DA9C1FC7FCEC0FFCEC +03E049C9FCA2137EA213FEA25BA21201A25BA21203A2387FFFE0B5FCA22D3A80A72E>I< +D801F013FC3A07FC07FF803A0F3E0F03C0260E1F1C13E0001EEB380F001C1370003CEBE0 +1F123814C0D8783F14C00070903880070092C7FC91C8FC12F05BEA007EA313FE5BA31201 +5BA312035BA312075BA3120F5BA3121F5B0007C9FC232979A726>114 +DII<137C48B4141C26038F +80137EEA0707000E7F001E15FE121CD83C0F5C12381501EA781F007001805BA2D8F03F13 +03140000005D5B017E1307A201FE5C5B150F1201495CA2151F0003EDC1C0491481A2153F +1683EE0380A2ED7F07000102FF13005C01F8EBDF0F00009038079F0E90397C0F0F1C9039 +1FFC07F8903907F001F02A2979A731>I<017CEB01C048B4EB07F038038F80EA0707000E +01C013F8121E001C1403EA3C0F0038EC01F0A2D8781F130000705BA2EAF03F91C712E012 +005B017E130116C013FE5B1503000115805BA2ED07001203495B150EA25DA25D15780001 +14706D5B0000495A6D485AD97E0FC7FCEB1FFEEB03F0252979A72A>I<017C167048B491 +387001FC3A038F8001F8EA0707000E01C015FE001E1403001CEDF000EA3C0F0038177C15 +07D8781F4A133C00701380A2D8F03F130F020049133812005B017E011F14784C137013FE +5B033F14F0000192C712E05BA2170100034A14C049137E17031880A2EF070015FE170E00 +010101141E01F86D131C0000D9039F5BD9FC076D5A903A3E0F07C1E0903A1FFC03FFC090 +2703F0007FC7FC372979A73C>I<903903F001F890390FFC07FE90393C1E0E0F9026780F +1C138001F0EBB83FD801E013F89039C007F07FEA0380000714E0D9000F140048151C000E +4AC7FCA2001E131FA2C75BA2143F92C8FCA35C147EA314FE4A131CA30101143C001E1538 +003F491378D87F811470018314F000FF5D9039077801C039FE0F7C033A7C0E3C07802778 +3C1E1EC7FC391FF80FFC3907E003F029297CA72A>I<137C48B4143826038F8013FCEA07 +07000E7F001E1401001C15F8EA3C0F12381503D8781F14F000701380A2D8F03F13070200 +13E012005B017E130F16C013FE5B151F1201491480A2153F000315005BA25D157EA315FE +5D00011301EBF8030000130790387C1FF8EB3FF9EB07E1EB00035DA21407000E5CEA3F80 +007F495AA24A5AD8FF0090C7FC143E007C137E00705B387801F0383803E0381E0FC06CB4 +C8FCEA03F8263B79A72C>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fo cmcsc10 10.95 19 +/Fo 19 121 df71 D78 D85 D97 +DIIIIII105 +D109 +DIII<90383FC00C9038FFF81C00 +03EBFE3C390FE03FFC381F8007EB0003003E1301481300157C5A153CA36C141CA27E6C14 +006C7E13E013FE383FFFE06C13FE6CEBFF806C14E0000114F06C6C13F8010F13FC1300EC +07FE14011400157F153F12E0151FA37EA2151E6C143E6C143C6C147C6C14F89038C001F0 +39FBF807E000F1B512C0D8E07F130038C007FC20317BAF2A>115 +D<007FB712F8A39039801FF0073A7E000FE00000781678A20070163800F0163CA348161C +A5C71500B3A8EC3FF8011FB512F0A32E2E7CAD36>II<3B7FFF +F001FFFEA30003D9C00013E0C649EB7F80017F027EC7FC167C6D6C13786D6C5B6D6C5B15 +016D6C485AD903FC5B15076D6C48C8FC903800FF1EEC7F9C15BCEC3FF86E5AA2140F6E7E +14034A7E4A7EEC1EFF141C91383C7F804A6C7E14709138F01FE049486C7E49486C7E1480 +01076D7E49486C7E130E011E6D7E496E7E017C6E7E13FC000382D80FFEEC7FF8B549B512 +C0A3322F7DAE38>120 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fp cmr7 7 3 +/Fp 3 52 df<13381378EA01F8121F12FE12E01200B3AB487EB512F8A215267BA521>49 +D<13FF000313E0380E03F0381800F848137C48137E00787F12FC6CEB1F80A4127CC7FC15 +005C143E147E147C5C495A495A5C495A010EC7FC5B5B903870018013E0EA018039030003 +0012065A001FB5FC5A485BB5FCA219267DA521>I<13FF000313E0380F01F8381C007C00 +30137E003C133E007E133FA4123CC7123E147E147C5C495AEB07E03801FF8091C7FC3800 +01E06D7E147C80143F801580A21238127C12FEA21500485B0078133E00705B6C5B381F01 +F03807FFC0C690C7FC19277DA521>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fq cmsl10 10.95 42 +/Fq 42 122 df12 +D<007FB5FCA2B512FEA418067C961E>45 D<13F0EA01FC1203EA07FEA313FCA2EA03F8EA +01E0C7FCB3121EEA3F80EA7FC012FFA41380EA7F00123C0F2778A619>58 +D<17E016011603831607A2160FA2161F83163FA2167F167716F7EEE7FCED01E316C31503 +16831507EE03FEED0F01150E151E151C153C03387FED7800157015F05D4A4880177F4A5A +A24AC7FCA2020E81173F5C021FB6FC5CA20270C7EA3FE0171F5CA2495AA2494881170F49 +C8FCA2130EA24982013C1507A2137CD801FE4B7E2607FF80EC3FFEB500F00107B512FC19 +F85E3E417DC044>65 D<013FB7FC18E018FC903B007FE00007FE6E48903801FF80943800 +7FC05DF03FE0F01FF0A3027F16F892C8FCA54A16F04A153F19E0187F19C0F0FF8001014B +13004A4A5A4D5AEF1FF04D5ADC03FFC7FC49B612F8EFFF8002F8C7EA3FE0EF0FF0EF07FC +717E010715014A81711380A319C0130F5CA5011F4B13805C19005F601707013F4B5A4A4A +5A4D5A4D5A017F913801FF8001FF020F90C7FCB812FC17F094C8FC3D3E7DBD40>II<013FB7FC18E018F8903B007FF0000FFE +6E48EB01FF9438007FC04B6E7E180F85727E727E147F4B6E7EA2727EA302FF178092C9FC +A54918C05CA41A8013034A5DA41A0013074A5DA261A24E5A130F4A5E180F61181F61011F +4C5A5C4E5A4EC7FC4D5A4D5A013F4B5A4A4A5AEF3FE0EF7F80017F4A48C8FC01FFEC1FFC +B812F0178004FCC9FC423E7DBD45>I<013FB812F8A39026007FF0C7127F6E48140F1803 +4B14011800A31978147F4B1570A502FF143892C7FCA3190017784915704A14F016011603 +160F91B6FC495DA29138FC001F16071603160101075D5CA2197019F019E0010F4A5A4A90 +C7120119C0A218031980011F16075CF00F00A260181E013F163E4A157E4D5A1703017F15 +0F01FFEDFFF8B9FCA2603D3E7DBD3E>I<013FB812E0A3903A007FF000016E48EB003F18 +0F4B14071803A31801147F4B15C0A514FF92C71270A395C7FC17F0495D5C160116031607 +161F49B65AA39138FC003F160F160701075D4A1303A5010F4AC8FC5C93C9FCA4131F5CA5 +133F5CA3137FEBFFF0B612F8A33B3E7DBD3B>I<4BB46C1370031F01F013F0037F9038FC +01E0913A03FF807E03913A0FF8000F83DA1FE0EB07C7DA7F80EB01EF4AC812FFD903FE16 +C04948157F4948153F495A4948151F495A4948168091C9120F5A485AA2485A000F180049 +82121FA248485EA295C7FC485AA412FF5BA6043FB512E05BA29339001FFC00715AA2607F +127FA2171F123F6D5EA2121F7F000F163F6C7E6C6C4B5A7F6C6C15FF6C6DEB01EFD93FC0 +EB07C7D91FF0EB1F87D907FE9038FE03800101B5EAF8016D6C01E0C8FCDA07FEC9FC3C42 +76BF47>I<011FB512FC5BA29039003FF8006E5AA25DA5143F5DA5147F5DA514FF92C7FC +A55B5CA513035CA513075CA5130F5CA5131F5CA3133F497E007FB512F0A2B6FC263E7EBD +21>73 D<013FB512FEA25E9026007FF8C8FCEC3FE0A25DA5147F5DA514FF92C9FCA55B5C +A513035CA513075CA21838A21870130F5CA218E0A3011F15014A15C01703A21707EF0F80 +013F151F4A143F177FEFFF00017F140301FF143FB9FC5FA2353E7DBD39>76 +D<90263FFFE0023FB5FC6F16FEA29026003FF8020313C0021F030013004A6C157C023B16 +3C6F15381439810238167802787FDA707F157082153F82031F15F002F07FDAE00F5D8215 +078203031401010180DAC0015D82811780047F1303010315C04A013F5C17E0161F17F004 +0F1307010715F891C7000791C7FC17FC160317FE04015B4915FF010E6E130E188E177F18 +CEEF3FDE011E16FE011C6F5AA2170FA21707133C01386F5A133C017C150113FE2607FF80 +1400B512FC18705C483E7DBD44>78 D<923803FF80031F13F09238FE01FE913903F0003F +DA0FC0EB1FC0DA3F80EB07E0027EC76C7E49486E7E49488149486E7E4948157F495A013F +17804948ED3FC049C9FCA24848EE1FE012035B000718F05B120FA2485A19F8123F5BA212 +7FA219F04848163FA5F07FE0A35BF0FFC0A219805F19007F4D5A127F4D5A60003F160F6D +5E001F4C5A4D5A6C6C4B5A95C7FC6C6C15FE00034B5A6C6C4A5A6C6C4A5A017FEC1FC06D +6C495AD90FE001FEC8FC903903F807F80100B512C0DA0FFCC9FC3D4276BF47>I<013FB6 +12F017FF18E0903B007FF0003FF86E48EB07FCEF01FE4B6D7EF07F8019C0183F19E0147F +4B15F0A502FFED7FE092C8FCA219C0F0FF80A2494B13004A5D4D5AEF0FF04D5AEF7F8001 +03DA07FEC7FC91B612F017809139FC0007E0EE03F8EE00FC0107814A147F717EA284A213 +0F5CA484011F157F5CA41902013F17075CA2F0F00F017F170E496C143FB600E0011F131C +94380FF83C4B01071378CA3801FFE09438003F8040407DBD43>82 +D<9239FF8003800207EBF007021F9038FC0F0091387F00FE02FCEB1F1FD903F0EB07BF49 +486DB4FC49487F4A6D5A49C8FC49157E133E137E173E49153CA57F1738A26D92C7FC8080 +80EB7FFEECFFE06D13FEEDFFC06D14F06D14FC010380010080143F020380DA003F7F1503 +1500707E163F161FA2160F121CA31607160F003C5EA35F003E151F94C7FC007E5D007F15 +3E6D5C16FC01E0495AD87DF0495AD8FCFCEB0FC03AF87F803F8027F01FFFFEC8FCD8E007 +13F839C0007FC031427BBF33>I<0007B912F0A33C0FFE000FF8003F01F0160F01C04A13 +034848160190C7FC121EF000E048141F5E1238A212781270153F5E5AA3C81600157F5EA5 +15FF93C9FCA55C5DA514035DA514075DA5140F5DA3141FEC7FFC0003B7FCA33C3D76BC42 +>II87 +D97 +DI +IIII<177C913907F803FE91393FFE0F8F9139FC0F9C3F903901F007F89039 +07E003E0D90FC013F0011F903801F80C02801400133FD97F007FA315035B495CA3017E49 +5A5E150F6D5C6D495A90263F803EC7FCECC0FC903871FFF09038E07F8091C9FC485AA47F +A27F90B512F8EDFF806C15E016F86D8048B6FC3A07E0000FFED80F801300003FC8127F00 +3E815A00FC815AA25E163EA25E6C15FC007C4A5A6C4A5A6CEC0FC0D80FC0013FC7FC3903 +F801FCC6B512F0010F90C8FC303D7FA82D>I<147FEB3FFFA313017FA25CA513015CA513 +035CA4ED07F80107EB1FFF9139F0781FC09138F1E00F9139F38007E0ECF70002FE14F049 +5A5CA25CA24A130F131F4A14E0A4161F133F4A14C0A4163F137F91C71380A4167F5B4915 +00A300015D486C491380B5D8F87F13FCA32E3F7DBE33>I<1478EB01FE130314FFA25B14 +FE130314FCEB00F01400ACEB03F8EA01FF14F0A2EA001F130FA314E0A5131F14C0A5133F +1480A5137F1400A55B5BA4EA03FF007F13F0A2B5FC183E7DBD1A>I<147FEB3FFFA31301 +7FA25CA513015CA513035CA501070103B5FC02F014FEA26F13F06F1380EEFE00010F14F8 +4A485AED03C04B5A031FC7FC153E011F13784A5AECC3E0ECC7F0ECCFF814FF497F14F9EC +E1FE14C04A7E4A7E4980017E133F82151F82150F01FE8049130782A2000181486C49B4FC +B5D8F03F13F04B13E0A2303F7EBE30>107 D<143FEB1FFF5BA213017FA214FEA5130114 +FCA5130314F8A5130714F0A5130F14E0A5131F14C0A5133F1480A5137F1400A55B5BA4EA +03FF007F13F8A2B5FC183F7DBE1A>I<902707F007F8EB03FCD803FFD91FFF90380FFF80 +913CE0781FC03C0FE09126E1E00FEBF0073E001FE38007E1C003F090260FE700EBE38002 +EEDAF70013F802FC14FE02D85C14F84A5CA24A5C011F020F14074A4A14F0A5013F021F14 +0F4A4A14E0A5017F023F141F91C74914C0A549027F143F4992C71380A300014B147F486C +496DEBFFC0B5D8F87FD9FC3F13FEA347287DA74C>I<903907F007F8D803FFEB1FFF9139 +E0781FC09138E1E00F3B001FE38007E090380FE70002EE14F014FC14D814F85CA24A130F +131F4A14E0A4161F133F4A14C0A4163F137F91C71380A4167F5B491500A300015D486C49 +1380B5D8F87F13FCA32E287DA733>II<91387F01FE903A7FFF +0FFFC09139FE3E03F09238F801F8903A01FFE000FE4B137F6D497F4990C713804A15C04A +141FA218E0A20103150F5C18F0A3171F010716E05CA3173F18C0130F4A147F1880A2EFFF +004C5A011F5D16034C5A6E495AEE1FC06E495AD93FDC017EC7FC91388F01F8913883FFE0 +028090C8FC92C9FC137FA291CAFCA45BA25BA31201487EB512F8A3343A81A733>I<9039 +07F01F80D803FFEB7FE09138E1E1F09138E387F839001FE707EB0FE614EE02FC13F002D8 +13E09138F801804AC7FCA25C131FA25CA4133F5CA5137F91C8FCA55B5BA31201487EB512 +FEA325287EA724>114 D<9138FF81C0010713E390381F807F90397C003F8049131F4848 +130F5B00031407A248481400A27FA27F6D90C7FCEBFF8014FC6C13FF6C14C015F06C6C7F +011F7F13079038007FFE1403140100381300157EA2123C153E157E007C147CA2007E1478 +15F8007F495A4A5A486C485A26F9E01FC7FC38E0FFFC38C01FE0222A7DA824>II<01FE147F00FFEC7FFF4914FEA2000714 +0300031401A34914FCA4150312074914F8A41507120F4914F0A4150F121F4914E0A2151F +A3153F4914C0157F15FFEC01DF3A0FC003BFE09138073FFF3803F01E3801FFF826003FE0 +1380282977A733>III<48B539C07FFFC0A33C000FFE00 +3FF8006D48EB1FE0010315800101023EC7FC6E133C01005C027F5B6F5A91383F81C0EDC3 +80DA1FC7C8FC15EFEC0FFE6E5A5D140381A24A7E140FEC1E7F023C7FEC383F02707FECE0 +1F010180903803C00F49486C7ED90F007F491303017E80D801FE80D807FF497EB5D8803F +13F8A332277FA630>I<90B539E007FFF05E18E0902707FE000313006D48EB01FC705A5F +01014A5A5F16036E5C0100140794C7FC160E805E805E1678ED8070023F13F05EED81C015 +C191381FC38015C793C8FC15EF15EEEC0FFCA25DA26E5AA25DA26E5A5DA24AC9FC5C140E +141E141C5C121C003F5B5A485B495A130300FE5B4848CAFCEA701EEA783CEA3FF0EA0FC0 +343A80A630>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fr cmtt10 10.95 88 +/Fr 88 127 df<121C127FEAFF80B3EA7F00B2123EC7FCA8121C127FA2EAFF80A3EA7F00 +A2121C09396DB830>33 D<00101304007C131F00FEEB3F80A26C137FA248133FB2007E14 +00007C7F003C131E00101304191C75B830>I<903907C007C0A2496C487EA8011F131FA2 +02C05BA3007FB7FCA2B81280A36C16006C5D3A007F807F80A2020090C7FCA9495BA2003F +90B512FE4881B81280A36C1600A22701FC01FCC7FCA300031303A201F85BA76C486C5AA2 +29387DB730>I<1438147C14FCA4EB03FF011F13E090B512FC4880000780481580261FFE +FD13C09039F0FC3FE0D83FC0131FD87F80EB0FF001001307007E15F800FE14035A1507A3 +6CEC03F0A2007F91C7FC138013C0EA3FF0EA1FFE13FF6C13FF6C14E0000114F86C6C7F01 +1F7F01037F0100148002FD13C09138FC7FE0151FED0FF015070018EC03F8127E1501B4FC +A35AA26CEC03F07E01801307ED0FE0D83FC0131F01F0EB7FC0D81FFEB512806CB612006C +5C6C5CC614F0013F13C0D907FEC7FCEB00FCA5147C143825477BBE30>I39 D<141E147F14FF5BEB03FEEB07FCEB0F +F0EB1FE0EB3FC0EB7F80EBFF00485A5B12035B485A120F5BA2485AA2123F5BA2127F90C7 +FCA412FEAD127FA47F123FA27F121FA26C7EA27F12076C7E7F12017F6C7EEB7F80EB3FC0 +EB1FE0EB0FF0EB07FCEB03FEEB01FF7F147F141E184771BE30>I<127812FE7E7F6C7E6C +7EEA0FF06C7E6C7E6C7E6C7EEB7F80133F14C0131FEB0FE014F01307A2EB03F8A214FC13 +01A214FE1300A4147FAD14FEA4130114FCA2130314F8A2EB07F0A2130F14E0EB1FC0133F +1480137FEBFF00485A485A485A485AEA3FE0485A485A90C7FC5A1278184778BE30>I<14 +E0497E497EA60038EC0380007EEC0FC0D8FF83EB3FE001C3137F9038F3F9FF267FFBFB13 +C06CB61280000FECFE00000314F86C5C6C6C13C0011F90C7FC017F13C048B512F0488000 +0F14FE003FECFF80267FFBFB13C026FFF3F913E09038C3F87F0183133FD87E03EB0FC000 +38EC0380000091C7FCA66D5A6D5A23277AAE30>I<143EA2147FAF007FB7FCA2B81280A3 +6C1600A2C76CC8FCAF143EA229297DAF30>II<007FB612F0A2B712F8A36C15F0A225077B9E30>I<120FEA3FC0EA7FE0 +A2EAFFF0A4EA7FE0A2EA3FC0EA0F000C0C6E8B30>I<16F01501ED03F8A21507A2ED0FF0 +A2ED1FE0A2ED3FC0A2ED7F80A2EDFF00A24A5AA25D1403A24A5AA24A5AA24A5AA24A5AA2 +4A5AA24AC7FCA2495AA25C1303A2495AA2495AA2495AA2495AA2495AA249C8FCA2485AA2 +5B1203A2485AA2485AA2485AA2485AA2485AA248C9FCA25AA2127CA225477BBE30>I<14 +FE903807FFC0497F013F13F8497F90B57E48EB83FF4848C6138049137F4848EB3FC04848 +EB1FE049130F001F15F0491307A24848EB03F8A290C712014815FCA400FEEC00FEAD6C14 +016C15FCA36D1303003F15F8A26D1307001F15F0A26D130F6C6CEB1FE0A26C6CEB3FC06C +6CEB7F806D13FF2601FF8313006CEBFFFE6D5B6D5B010F13E06D5BD900FEC7FC273A7CB8 +30>IIIII<000FB612804815C05AA31680 +0180C8FCAEEB83FF019F13C090B512F015FC8181D9FE0313809039F0007FC049133F0180 +EB1FE06CC7120F000E15F0C81207A216F81503A31218127EA2B4FC150716F048140F6C15 +E06C141F6DEB3FC06D137F3A3FE001FF80261FFC0F13006CB55A6C5C6C5C6C14E06C6C13 +80D90FFCC7FC25397BB730>II<127CB712FC16FEA416FC48C7EA0FF816F0ED1FE0 +007CEC3FC0C8EA7F80EDFF00A24A5A4A5A5D14075D140F5D4A5AA24A5AA24AC7FCA25C5C +13015CA213035CA213075CA4495AA6131F5CA96D5A6DC8FC273A7CB830>I<49B4FC011F +13F0017F13FC90B57E0003ECFF804815C048010113E03A1FF8003FF049131FD83FC0EB07 +F8A24848EB03FC90C71201A56D1303003F15F86D13076C6CEB0FF06C6CEB1FE0D807FCEB +7FC03A03FF83FF806C90B512006C6C13FC011F13F0497F90B512FE48802607FE0013C0D8 +0FF8EB3FE0D81FE0EB0FF04848EB07F8491303007F15FC90C712014815FE481400A66C14 +016C15FC6D1303003F15F86D1307D81FF0EB1FF06D133F3A0FFF01FFE06C90B512C06C15 +80C6ECFE006D5B011F13F0010190C7FC273A7CB830>I<49B4FC010F13E0013F13F890B5 +7E4880488048010113803A0FFC007FC0D81FF0EB3FE04848131F49EB0FF048481307A290 +C7EA03F85A4815FC1501A416FEA37E7E6D130315076C7E6C6C130F6D133FD80FFC13FF6C +B6FC7E6C14FE6C14F9013FEBE1FC010F138190380060011400ED03F8A2150716F0150F00 +0F15E0486C131F486CEB3FC0157FEDFF804A1300EC07FE391FF01FFC90B55A6C5C6C5C6C +1480C649C7FCEB3FF0273A7CB830>I<120FEA3FC0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0 +EA0F00C7FCAF120FEA3FC0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0EA0F000C276EA630>I< +EA03C0EA0FF0EA1FF8A2EA3FFCA4EA1FF8A2EA0FF0EA03C0C7FCAFEA03C0EA0FF0121F13 +F8123F13FCA3121FA2120F12031200120113F8120313F01207EA1FE0123FEA7FC0EAFF80 +EA7F00127E12380E3470A630>I<16F01503ED07F8151F157FEDFFF014034A13C0021F13 +8091383FFE00ECFFF8495B010713C0495BD93FFEC7FC495A3801FFF0485B000F13804890 +C8FCEA7FFC5BEAFFE05B7FEA7FF87FEA1FFF6C7F000313E06C7F38007FFC6D7E90380FFF +806D7F010113F06D7FEC3FFE91381FFF80020713C06E13F01400ED7FF8151F1507ED03F0 +1500252F7BB230>I<007FB7FCA2B81280A36C16006C5DCBFCA7003FB612FE4881B81280 +A36C1600A229157DA530>I<1278127EB4FC13C07FEA7FF813FEEA1FFF6C13C000037F6C +13F86C6C7EEB1FFF6D7F010313E06D7F9038007FFC6E7E91380FFF806E13C0020113F080 +ED3FF8151F153FEDFFF05C020713C04A138091383FFE004A5A903801FFF0495B010F1380 +4990C7FCEB7FFC48485A4813E0000F5B4890C8FCEA7FFE13F8EAFFE05B90C9FC127E1278 +252F7BB230>III<147F4A7EA2497FA4497F14F7A401077F14E3A3010F7FA314C1A2011F +7FA490383F80FEA590387F007FA4498049133F90B6FCA34881A39038FC001F0003814913 +0FA4000781491307A2D87FFFEB7FFFB56CB51280A46C496C130029397DB830>I<007FB5 +12F0B612FE6F7E82826C813A03F8001FF815076F7E1501A26F7EA615015EA24B5A1507ED +1FF0ED7FE090B65A5E4BC7FC6F7E16E0829039F8000FF8ED03FC6F7E1500167FA3EE3F80 +A6167F1700A25E4B5A1503ED1FFC007FB6FCB75A5E16C05E6C02FCC7FC29387EB730>I< +91387F803C903903FFF03E49EBFC7E011F13FE49EBFFFE5B9038FFE07F48EB801F3903FE +000F484813075B48481303A2484813015B123F491300A2127F90C8FC167C16005A5AAC7E +7EA2167C6D14FE123FA27F121F6D13016C6C14FCA26C6CEB03F86D13076C6CEB0FF03901 +FF801F6C9038E07FE06DB512C06D14806D1400010713FC6D13F09038007FC0273A7CB830 +>I<003FB512E04814FCB67E6F7E6C816C813A03F8007FF0ED1FF8150F6F7E6F7E15016F +7EA2EE7F80A2163F17C0161FA4EE0FE0AC161F17C0A3163F1780A2167F17005E4B5A1503 +4B5A150F4B5AED7FF0003FB65A485DB75A93C7FC6C14FC6C14E02B387FB730>I<007FB7 +FCB81280A47ED803F8C7123FA8EE1F0093C7FCA4157C15FEA490B5FCA6EBF800A4157C92 +C8FCA5EE07C0EE0FE0A9007FB7FCB8FCA46C16C02B387EB730>I<003FB712804816C0B8 +FCA27E7ED801FCC7121FA8EE0F8093C7FCA5153E157FA490B6FCA69038FC007FA4153E92 +C8FCAE383FFFF8487FB5FCA27E6C5B2A387EB730>I<02FF13F00103EBC0F8010F13F101 +3F13FD4913FF90B6FC4813C1EC007F4848133F4848131F49130F485A491307121F5B123F +491303A2127F90C7FC6F5A92C8FC5A5AA892B5FC4A14805CA26C7F6C6D1400ED03F8A27F +003F1407A27F121F6D130F120F7F6C6C131FA2D803FE133F6C6C137FECC1FF6C90B5FC7F +6D13FB010F13F30103EBC1F0010090C8FC293A7DB830>I<3B3FFF800FFFE0486D4813F0 +B56C4813F8A26C496C13F06C496C13E0D803F8C7EAFE00B290B6FCA601F8C7FCB3A23B3F +FF800FFFE0486D4813F0B56C4813F8A26C496C13F06C496C13E02D387FB730>I<007FB6 +FCB71280A46C1500260007F0C7FCB3B3A8007FB6FCB71280A46C1500213879B730>I<49 +B512F04914F85BA27F6D14F090C7EAFE00B3B3123C127EB4FCA24A5A1403EB8007397FF0 +1FF86CB55A5D6C5C00075C000149C7FC38003FF025397AB730>I<383FFFF8487FB57EA2 +6C5B6C5BD801FCC9FCB3B0EE0F80EE1FC0A9003FB7FC5AB8FCA27E6C16802A387EB730> +76 DII<90383FFFE048B512FC000714FF4815804815C04815E0EBF80001E0133FD87F +80EB0FF0A290C71207A44815F8481403B3A96C1407A26C15F0A36D130FA26D131F6C6CEB +3FE001F813FF90B6FC6C15C06C15806C1500000114FCD8003F13E0253A7BB830>I<007F +B512F0B612FE6F7E16E0826C813903F8003FED0FFCED03FE15016F7EA2821780163FA616 +7F17005EA24B5A1503ED0FFCED3FF890B6FC5E5E16804BC7FC15F001F8C9FCB0387FFFC0 +B57EA46C5B29387EB730>I<003FB57E4814F0B612FC15FF6C816C812603F8017F913800 +3FF0151F6F7E15071503821501A515035E1507150F4B5A153F4AB45A90B65A5E93C7FC5D +8182D9F8007FED3FE0151F150F821507A817F8EEF1FCA53A3FFF8003FB4801C0EBFFF8B5 +6C7E17F06C496C13E06C49EB7FC0C9EA1F002E397FB730>82 D<90390FF803C0D97FFF13 +E048B512C74814F74814FF5A381FF80F383FE001497E4848137F90C7123F5A48141FA215 +0FA37EED07C06C91C7FC7F7FEA3FF0EA1FFEEBFFF06C13FF6C14E0000114F86C80011F13 +FF01031480D9003F13C014019138007FE0151FED0FF0A2ED07F8A2007C140312FEA56C14 +0716F07F6DEB0FE06D131F01F8EB3FC001FF13FF91B51280160000FD5CD8FC7F13F8D8F8 +1F5BD878011380253A7BB830>I<003FB712C04816E0B8FCA43AFE003F800FA8007CED07 +C0C791C7FCB3B1011FB5FC4980A46D91C7FC2B387EB730>I<3B7FFFC007FFFCB56C4813 +FEA46C496C13FCD803F8C7EA3F80B3B16D147F00011600A36C6C14FE6D13016D5CEC8003 +90393FE00FF890391FF83FF06DB55A6D5C6D5C6D91C7FC9038007FFCEC1FF02F3980B730 +>II< +D83FFC903801FFE0486C4913F000FF16F8A2007F16F06C486D13E0D81FC09038001FC000 +0F1680A76D143F00071600A7000390380F803E9039F01FC07EEC3FE0A3EC7FF0A2147D00 +01157CA29039F8FDF8FCA314F8A300005D01F913FCA2ECF07CA201FD137DA2017D5CECE0 +3DA3017F133FA2ECC01FA2013F5CA2EC800F6D486C5A2D397FB730>I<3A3FFF01FFF848 +01837F02C77FA202835B6C01015B3A01FC007F806D91C7FC00005C6D5BEB7F01EC81FCEB +3F8314C3011F5B14E7010F5B14FF6D5BA26D5BA26D5BA26D90C8FCA4497FA2497FA2815B +81EB0FE781EB1FC381EB3F8181EB7F0081497F49800001143F49800003141F4980000714 +0FD87FFEEB7FFFB590B5128080A25C6C486D130029387DB730>I<007FB5FCB61280A415 +0048C8FCB3B3B3A5B6FC1580A46C140019476DBE30>91 D<127CA212FEA27EA26C7EA26C +7EA26C7EA26C7EA26C7EA26C7EA212017FA26C7EA26D7EA26D7EA26D7EA26D7EA26D7EA2 +6D7EA2130180A26D7EA26E7EA26E7EA26E7EA26E7EA26E7EA26E7EA2140181A26E7EA2ED +7F80A2ED3FC0A2ED1FE0A2ED0FF0A2ED07F8A21503A2ED01F0150025477BBE30>I<007F +B5FCB61280A47EC7123FB3B3B3A5007FB5FCB6FCA46C140019477DBE30>I<1307EB1FC0 +EB7FF0497E000313FE000FEBFF80003F14E0D87FFD13F039FFF07FF8EBC01FEB800F38FE +0003007CEB01F00010EB00401D0E77B730>I<007FB612F0A2B712F8A36C15F0A225077B +7D30>I<1338137CEA01FE12031207EA0FFC13F0EA1FE013C0EA3F8013005A127EA212FE +5AA5EAFFC013E013F0127FA2123FA2EA1FE0EA07C00F1D70BE30>IIII<913801FFE0 +4A7F5CA28080EC0007AAEB03FE90381FFF874913E790B6FC5A5A481303380FFC00D81FF0 +133F49131F485A150F4848130790C7FCA25AA25AA87E6C140FA27F003F141F6D133F6C7E +6D137F390FF801FF2607FE07EBFFC06CB712E06C16F06C14F76D01C713E0011F010313C0 +D907FCC8FC2C397DB730>I<49B4FC010713E0011F13F8017F7F90B57E48804801811380 +3A07FC007FC04848133FD81FE0EB1FE0150F484814F0491307127F90C7FCED03F85A5AB7 +FCA516F048C9FC7E7EA27F003FEC01F06DEB03F86C7E6C7E6D1307D807FEEB1FF03A03FF +C07FE06C90B5FC6C15C0013F14806DEBFE00010713F8010013C0252A7CA830>IIII<14E0EB03F8A2497EA36D5AA2EB00E091C8FCA9381FFFF8487F5AA27E7EEA0001B3 +A9003FB612C04815E0B7FCA27E6C15C023397AB830>III<387FFFF8B57EA47EEA0001B3B3A8007FB612F0B712F8A46C15F025 +387BB730>I<02FC137E3B7FC3FF01FF80D8FFEF01877F90B500CF7F15DF92B57E6C010F +13872607FE07EB03F801FC13FE9039F803FC01A201F013F8A301E013F0B3A23C7FFE0FFF +07FF80B548018F13C0A46C486C01071380322881A730>II<49B4FC010F13E0013F13F8497F90B57E0003ECFF8014013A07FC007FC04848EB3F +E0D81FE0EB0FF0A24848EB07F8491303007F15FC90C71201A300FEEC00FEA86C14016C15 +FCA26D1303003F15F86D13076D130F6C6CEB1FF06C6CEB3FE06D137F3A07FF01FFC06C90 +B512806C15006C6C13FC6D5B010F13E0010190C7FC272A7CA830>II<49B413F8010FEBC1FC013F13F14913FD48B6FC +5A481381390FFC007F49131F4848130F491307485A491303127F90C7FC15015A5AA77E7E +15037FA26C6C1307150F6C6C131F6C6C133F01FC137F3907FF01FF6C90B5FC6C14FD6C14 +F9013F13F1010F13C1903803FE0190C7FCAD92B512F84A14FCA46E14F82E3C7DA730>I< +ED07F83A3FFF803FFF486DB51280B512C302CF14C06C13DF6C9038FFFC3FD8001F13E092 +38801F809238000F004A90C7FC5C5C5CA25CA45CAF003FB512FC4880B7FCA26C5C6C5C2A +287EA730>I<90381FFC1E48B5129F000714FF5A5A5A387FF007EB800100FEC7FC4880A4 +6C143E007F91C7FC13E06CB4FC6C13FC6CEBFF806C14E0000114F86C6C7F01037F903800 +0FFF02001380007C147F00FEEC1FC0A2150F7EA27F151F6DEB3F806D137F9039FC03FF00 +90B6FC5D5D00FC14F0D8F83F13C026780FFEC7FC222A79A830>II +I<3B3FFFC07FFF80486DB512C0B515E0A26C16C06C496C13803B01F80003F000A26D1307 +00005DA26D130F017E5CA2017F131F6D5CA2EC803F011F91C7FCA26E5A010F137EA2ECE0 +FE01075BA214F101035BA3903801FBF0A314FF6D5BA36E5A6E5A2B277EA630>I<3B3FFF +C01FFFE0486D4813F0B515F8A26C16F06C496C13E0D807E0C7EA3F00A26D5C0003157EA5 +6D14FE00015DEC0F80EC1FC0EC3FE0A33A00FC7FF1F8A2147DA2ECFDF9017C5C14F8A301 +7E13FBA290393FF07FE0A3ECE03FA2011F5C90390F800F802D277FA630>I<3A3FFF81FF +FC4801C37FB580A26C5D6C01815BC648C66CC7FC137FEC80FE90383F81FC90381FC3F8EB +0FE3ECE7F06DB45A6D5B7F6D5B92C8FC147E147F5C497F81903803F7E0EB07E790380FE3 +F0ECC1F890381F81FC90383F80FE90387F007E017E137F01FE6D7E48486D7E267FFF80B5 +FCB500C1148014E3A214C16C0180140029277DA630>I<3B3FFFC07FFF80486DB512C0B5 +15E0A26C16C06C496C13803B01FC0003F000A2000014076D5C137E150F017F5C7F151FD9 +1F805BA214C0010F49C7FCA214E00107137EA2EB03F0157C15FCEB01F85DA2EB00F9ECFD +F0147D147FA26E5AA36E5AA35DA2143F92C8FCA25C147EA2000F13FE486C5AEA3FC1EBC3 +F81387EB8FF0EBFFE06C5B5C6C90C9FC6C5AEA01F02B3C7EA630>I<001FB612FC4815FE +5AA316FC90C7EA0FF8ED1FF0ED3FE0ED7FC0EDFF80003E491300C7485A4A5A4A5A4A5A4A +5A4A5A4A5A4990C7FC495A495A495A495A495A495A4948133E4890C7127F485A485A485A +485A485A48B7FCB8FCA46C15FE28277DA630>II<127CA212FEB3B3B3AD127CA207476CBE30>II<01 +7C133848B4137C48EB80FE4813C14813C348EBEFFC397FEFFFF0D8FF8713E0010713C048 +6C1380D87C0113003838007C1F0C78B730>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fs cmbx12 17.28 40 +/Fs 40 121 df44 +D<16F04B7E1507151F153FEC01FF1407147F010FB5FCB7FCA41487EBF007C7FCB3B3B3B3 +007FB91280A6395E74DD51>49 D<913801FFF8021FEBFFC091B612F8010315FF010F16C0 +013F8290267FFC0114F89027FFE0003F7F4890C7000F7F48486E7FD807F86E148048486E +14C048486E14E048486F13F001FC17F8486C816D17FC6E80B56C16FE8380A219FFA283A3 +6C5BA26C5B6C90C8FCD807FC5DEA01F0CA14FEA34D13FCA219F85F19F04D13E0A294B512 +C019804C14004C5B604C5B4C5B604C13804C90C7FC4C5A4C5A4B13F05F4B13804B90C8FC +4B5AED1FF84B5A4B5A4B48143F4A5B4A48C8FC4A5A4A48157E4A5A4A5AEC7F8092C9FC02 +FE16FE495A495A4948ED01FCD90FC0150749B8FC5B5B90B9FC5A4818F85A5A5A5A5ABAFC +A219F0A4405E78DD51>I<92B5FC020F14F8023F14FF49B712C04916F0010FD9C01F13FC +90271FFC00077FD93FE001017F49486D8049C86C7F484883486C6F7F14C0486D826E806E +82487FA4805CA36C5E4A5E6C5B6C5B6C495E011FC85A90C95CA294B55A614C91C7FC604C +5B4C5B4C5B4C5B047F138092260FFFFEC8FC020FB512F817E094C9FC17F817FF91C7003F +13E0040713F8040113FE707F717F7113E085717FA2717F85A285831A80A31AC0EA03FCEA +0FFF487F487F487FA2B57EA31A80A34D14005C7E4A5E5F6C495E49C8485BD81FF85F000F +5ED807FE92B55A6C6C6C4914806C01F0010791C7FC6C9026FF803F5B6D90B65A011F16F0 +010716C001014BC8FCD9001F14F0020149C9FC426079DD51>II<01C0EE01C0D801F8160F01FF167F02 +F0EC07FFDAFF8090B5FC92B7128019006060606060606095C7FC17FC5F17E0178004FCC8 +FC16E09026FC3FFCC9FC91CBFCADED3FFE0203B512F0020F14FE023F6E7E91B712E001FD +D9E00F7F9027FFFE00037F02F801007F02E06EB4FC02806E138091C8FC496F13C04917E0 +7113F0EA00F090C914F8A219FC83A219FEA419FFA3EA03F0EA0FFC487E487E487FA2B57E +A319FEA35C4D13FC6C90C8FC5B4917F8EA3FF001804B13F06D17E0001F5E6C6C17C06D4B +1380D807FC92B512006C6C4A5B6C6C6C01075B6C01E0011F5BD97FFE90B55A6DB712C001 +0F93C7FC6D15FC010115F0D9003F1480020301F0C8FC406078DD51>III<91380FFF +F849B612C0010F15F8013F15FE496F7E2701FFF80080480180011F13F0D807FCC700077F +D80FF080484882003F8301F880486C827FB5178080A76C90C7FC4C14006C5A6C5AD807F0 +4A5BC95C5E4C5B604C5B4C138093B5C7FC4B13FC5F4B13E05F4B5B4B90C8FC5E5E4B5A5E +4B5AA25E4B5AA293C9FCA215FEA35DAE5D92CAFCABEC01FCEC07FF4A7F023F13E0A24A7F +A291B57EA76E5BA26E5BA2020F13806E90C9FCEC01FC396577E44C>63 +D65 +D<4DB5ED03C0057F02F014070407B600FE140F047FDBFFC0131F4BB800F0133F030F05FC +137F033F9127F8007FFE13FF92B6C73807FF814A02F0020113C3020702C09138007FE74A +91C9001FB5FC023F01FC16074A01F08291B54882490280824991CB7E4949844949844949 +8449865D49498490B5FC484A84A2484A84A24891CD127FA25A4A1A3F5AA348491A1FA448 +99C7FCA25CA3B5FCB07EA380A27EA2F50FC0A26C7FA37E6E1A1F6C1D80A26C801D3F6C6E +1A00A26C6E616D1BFE6D7F6F4E5A7F6D6D4E5A6D6D4E5A6D6D4E5A6D6E171F6D02E04D5A +6E6DEFFF806E01FC4C90C7FC020F01FFEE07FE6E02C0ED1FF8020102F8ED7FF06E02FF91 +3803FFE0033F02F8013F1380030F91B648C8FC030117F86F6C16E004071680DC007F02F8 +C9FC050191CAFC626677E375>67 DI<4D +B5ED03C0057F02F014070407B600FE140F047FDBFFC0131F4BB800F0133F030F05FC137F +033F9127F8007FFE13FF92B6C73807FF814A02F0020113C3020702C09138007FE74A91C9 +001FB5FC023F01FC16074A01F08291B54882490280824991CB7E49498449498449498449 +865D49498490B5FC484A84A2484A84A24891CD127FA25A4A1A3F5AA348491A1FA44899C8 +FCA25CA3B5FCB07E071FB812F880A37EA296C70001ECC000A26C7FA37E807EA26C80A26C +80A26C807F6D7F816D7F7F6D7F6D6D5F6D14C06D6E5E6E7F6E01FC5E020F01FF5E6E02C0 +ED7FEF020102F8EDFFC76E02FF02071383033F02FC013F1301030F91B638FC007F03014D +131F6F6C04E01307040704801301DC007F02F8CAFC050191CBFC6D6677E37F>71 +DI +I78 D83 +D<001FBEFCA64849C79126E0000F148002E0180091C8171F498601F81A0349864986A249 +1B7FA2491B3F007F1DC090C9181FA4007E1C0FA600FE1DE0481C07A5CA95C7FCB3B3B3A3 +021FBAFCA663617AE070>II87 D<913803FFFE027FEBFFF00103B612FE010F6F7E4916E090273FFE001F7FD9 +7FE001077FD9FFF801017F486D6D7F717E486D6E7F85717FA2717FA36C496E7FA26C5B6D +5AEB1FC090C9FCA74BB6FC157F0207B7FC147F49B61207010F14C0013FEBFE004913F048 +B512C04891C7FC485B4813F85A5C485B5A5CA2B55AA45FA25F806C5E806C047D7F6EEB01 +F96C6DD903F1EBFF806C01FED90FE114FF6C9027FFC07FC01580000191B5487E6C6C4B7E +011F02FC130F010302F001011400D9001F90CBFC49437CC14E>97 +D<903807FF80B6FCA6C6FC7F7FB3A8EFFFF8040FEBFF80047F14F00381B612FC038715FF +038F010014C0DBBFF0011F7FDBFFC001077F93C76C7F4B02007F03F8824B6F7E4B6F1380 +4B17C0851BE0A27313F0A21BF8A37313FCA41BFEAE1BFCA44F13F8A31BF0A24F13E0A24F +13C06F17804F1300816F4B5A6F4A5B4AB402075B4A6C6C495B9126F83FE0013F13C09127 +F00FFC03B55A4A6CB648C7FCDAC00115F84A6C15E091C7001F91C8FC90C8000313E04F65 +7BE35A>I100 D<92380FFFC04AB512FC020FECFF80023F15E091B712F80103D9FE037F4990 +39F0007FFF011F01C0011F7F49496D7F4990C76C7F49486E7F48498048844A804884485B +727E5A5C48717EA35A5C721380A2B5FCA391B9FCA41A0002C0CBFCA67EA380A27EA27E6E +160FF11F806C183F6C7FF17F006C7F6C6D16FE6C17016D6C4B5A6D6D4A5A6D01E04A5A6D +6DEC3FE0010301FC49B45A6D9026FFC01F90C7FC6D6C90B55A021F15F8020715E0020092 +C8FC030713F041437CC14A>III<903807FF80B6FCA6C6FC7F7FB3 +A8EF1FFF94B512F0040714FC041F14FF4C8193267FE07F7F922781FE001F7FDB83F86D7F +DB87F07FDB8FC0814C7F039FC78015BE03BC8003FC825DA25DA25DA45DB3B2B7D8F007B7 +1280A651647BE35A>III<903807FF80B6FCA6C6 +FC7F7FB3B3B3B3ADB712E0A623647BE32C>108 D<902607FF80D91FFFEEFFF8B691B500 +F00207EBFF80040702FC023F14E0041F02FF91B612F84C6F488193267FE07F6D4801037F +922781FE001F9027E00FF0007FC6DA83F86D9026F01FC06D7F6DD987F06D4A487F6DD98F +C0DBF87EC7804C6D027C80039FC76E488203BEEEFDF003BC6E4A8003FC04FF834B5FA24B +5FA24B94C8FCA44B5EB3B2B7D8F007B7D8803FB612FCA67E417BC087>I<902607FF80EB +1FFFB691B512F0040714FC041F14FF4C8193267FE07F7F922781FE001F7FC6DA83F86D7F +6DD987F07F6DD98FC0814C7F039FC78015BE03BC8003FC825DA25DA25DA45DB3B2B7D8F0 +07B71280A651417BC05A>I<923807FFE092B6FC020715E0021F15F8027F15FE494848C6 +6C6C7E010701F0010F13E04901C001037F49496D7F4990C87F49486F7E49486F7E48496F +13804819C04A814819E048496F13F0A24819F8A348496F13FCA34819FEA4B518FFAD6C19 +FEA46C6D4B13FCA36C19F8A26C6D4B13F0A26C19E06C6D4B13C0A26C6D4B13806C6D4B13 +006D6C4B5A6D6D495B6D6D495B010701F0010F13E06D01FE017F5B010090B7C7FC023F15 +FC020715E0020092C8FC030713E048437CC151>I<902607FF80EBFFF8B6010FEBFF8004 +7F14F00381B612FC038715FF038F010114C09227BFF0003F7FC6DAFFC0010F7F6D91C76C +7F6D496E7F03F86E7F4B6E7F4B17804B6F13C0A27313E0A27313F0A21BF885A21BFCA385 +1BFEAE4F13FCA41BF861A21BF0611BE0611BC06F92B512801B006F5C6F4A5B6F4A5B03FF +4A5B70495B04E0017F13C09226CFFC03B55A03C7B648C7FC03C115F803C015E0041F91C8 +FC040313E093CBFCB3A3B712F0A64F5D7BC05A>I114 D<913A3FFF8007800107B5EAF81F011FECFE7F017F91B5FC48B8FC48EBE0014890 +C7121FD80FFC1407D81FF0801600485A007F167F49153FA212FF171FA27F7F7F6D92C7FC +13FF14E014FF6C14F8EDFFC06C15FC16FF6C16C06C16F06C826C826C826C82013F168001 +0F16C01303D9007F15E0020315F0EC001F1500041F13F81607007C150100FC81177F6C16 +3FA2171F7EA26D16F0A27F173F6D16E06D157F6D16C001FEEDFF806D0203130002C0EB0F +FE02FCEB7FFC01DFB65A010F5DD8FE0315C026F8007F49C7FC48010F13E035437BC140> +II<902607FF +C0ED3FFEB60207B5FCA6C6EE00076D826D82B3B3A260A360A2607F60183E6D6D147E4E7F +6D6D4948806D6DD907F0ECFF806D01FFEB3FE06D91B55A6E1500021F5C020314F8DA003F +018002F0C7FC51427BC05A>I119 D<007FB600C0017FB512F8A6D8 +001F01F8C70007EBF0006D040190C7FC6D6D5D6D6D4A5A6D6D4A5A70495A6D4C5A6E7F6E +6D495A6E6D495A7049C8FC6E4A5A6E6D485A6E6D485A6E13FFEF8FF06EEC9FE06FEBFFC0 +6F5C6F91C9FC5F6F5B816F7F6F7F8481707F8493B57E4B805D4B80DB0FF37FDB1FE17F04 +C080153F4B486C7F4B486C7F4A486D7F4A486D7F4A5A4B6D7F020F6E7F4A486D7F4A486D +804A5A4AC86C7F49486F7F4A6F7F0107707FEB3FFFB600F049B7FCA650407EBF55>I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Ft cmsy10 10.95 2 +/Ft 2 16 df13 D15 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fu cmbx12 14.4 61 +/Fu 61 123 df12 D44 DII<157815FC14031407141F14FF130F +0007B5FCB6FCA2147F13F0EAF800C7FCB3B3B3A6007FB712FEA52F4E76CD43>49 +DI<91380FFFC091B512FC0107ECFF80011F15E09026 +3FF8077F9026FF800113FC4848C76C7ED803F86E7E491680D807FC8048B416C080486D15 +E0A4805CA36C17C06C5B6C90C75AD801FC1680C9FC4C13005FA24C5A4B5B4B5B4B13C04B +5BDBFFFEC7FC91B512F816E016FCEEFF80DA000713E0030113F89238007FFE707E701380 +7013C018E07013F0A218F8A27013FCA218FEA2EA03E0EA0FF8487E487E487EB57EA318FC +A25E18F891C7FC6C17F0495C6C4816E001F04A13C06C484A1380D80FF84A13006CB44A5A +6CD9F0075BC690B612F06D5D011F1580010302FCC7FCD9001F1380374F7ACD43>I<177C +17FEA2160116031607160FA2161F163F167FA216FF5D5DA25D5DED1FBFED3F3F153E157C +15FCEC01F815F0EC03E01407EC0FC01580EC1F005C147E147C5C1301495A495A5C495A13 +1F49C7FC133E5B13FC485A5B485A1207485A485A90C8FC123E127E5ABA12C0A5C96C48C7 +FCAF020FB712C0A53A4F7CCE43>III<121F7F7FEB +FF8091B81280A45A1900606060A2606060485F0180C86CC7FC007EC95A4C5A007C4B5A5F +4C5A160F4C5A484B5A4C5A94C8FC16FEC812014B5A5E4B5A150F4B5AA24B5AA24B5A15FF +A24A90C9FCA25C5D1407A2140FA25D141FA2143FA4147F5DA314FFA55BAC6D5BA2EC3FC0 +6E5A395279D043>I<91380FFF8091B512F8010314FE010F6E7E4901037F90267FF8007F +4948EB3FF048496D7E484980486F7E484980824817805A91C714C05A7013E0A218F0B5FC +A318F8A618FCA46C5DA37EA25E6C7F6C5DA26C5D6C7F6C6D137B6C6D13F390387FF80301 +1FB512E36D14C30103028313F89039007FFE03EC00401500A218F05EA3D801F816E0487E +486C16C0487E486D491380A218005E5F4C5A91C7FC6C484A5A494A5A49495B6C48495BD8 +03FC010F5B9027FF807FFEC7FC6C90B55A6C6C14F06D14C0010F49C8FC010013F0364F7A +CD43>57 D<91B5FC010F14F8017F14FF90B712C00003D9C00F7F2707FC00017FD80FE06D +7F48486E7E48C87FD87FE06E7E7F7F486C1680A66C5A18006C485C6C5AC9485A5F4B5B4B +5B4B5B4B5B4B90C7FC16FC4B5A4B5A16C04B5A93C8FC4A5A5D14035D5D14075DA25D140F +A25DAB91CAFCAAEC1FC04A7EECFFF8497FA2497FA76D5BA26D5BEC3FE06E5A315479D340 +>63 D<171F4D7E4D7EA24D7EA34C7FA24C7FA34C7FA34C7FA24C7FA34C8083047F80167E +8304FE804C7E03018116F8830303814C7E03078116E083030F814C7E031F81168083033F +8293C77E4B82157E8403FE824B800201835D840203834B800207835D844AB87EA24A83A3 +DA3F80C88092C97E4A84A2027E8202FE844A82010185A24A820103854A82010785A24A82 +010F855C011F717FEBFFFCB600F8020FB712E0A55B547BD366>65 +DI<932601FFFCEC01C0047F +D9FFC013030307B600F81307033F03FE131F92B8EA803F0203DAE003EBC07F020F01FCC7 +383FF0FF023F01E0EC0FF94A01800203B5FC494848C9FC4901F882494982494982494982 +4949824990CA7E494883A2484983485B1B7F485B481A3FA24849181FA3485B1B0FA25AA2 +98C7FC5CA2B5FCAE7EA280A2F307C07EA36C7FA21B0F6C6D1980A26C1A1F6C7F1C006C6D +606C6D187EA26D6C606D6D4C5A6D6D16036D6D4C5A6D6D4C5A6D01FC4C5A6D6DEE7F806D +6C6C6C4BC7FC6E01E0EC07FE020F01FEEC1FF80203903AFFE001FFF0020091B612C0033F +93C8FC030715FCDB007F14E0040101FCC9FC525479D261>IIII<9326 +01FFFCEC01C0047FD9FFC013030307B600F81307033F03FE131F92B8EA803F0203DAE003 +EBC07F020F01FCC7383FF0FF023F01E0EC0FF94A01800203B5FC494848C9FC4901F88249 +49824949824949824949824990CA7E494883A2484983485B1B7F485B481A3FA24849181F +A3485B1B0FA25AA298C8FC5CA2B5FCAE6C057FB712E0A280A36C94C7003FEBC000A36C7F +A36C7FA27E6C7FA26C7F6C7FA26D7E6D7F6D7F6D6D5E6D7F6D01FC93B5FC6D13FF6D6C6D +5C6E01F0EC07FB020F01FEEC1FF10203903AFFF001FFE0020091B6EAC07F033FEE001F03 +0703FC1307DB007F02E01301040149CAFC5B5479D26A>III75 DIII<93380FFFC00303B6FC031F15E092B712FC0203D9FC0013FF +020F01C0010F13C0023F90C7000313F0DA7FFC02007F494848ED7FFE4901E0ED1FFF4949 +6F7F49496F7F4990C96C7F49854948707F4948707FA24849717E48864A83481B804A8348 +1BC0A2481BE04A83A2481BF0A348497113F8A5B51AFCAF6C1BF86E5FA46C1BF0A26E5F6C +1BE0A36C6D4D13C0A26C6D4D1380A26C1B006C6D4D5A6E5E6C626D6C4C5B6D6D4B5B6D6D +4B5B6D6D4B5B6D6D4B5B6D6D4B90C7FC6D6D4B5A6D01FF02035B023F01E0011F13F0020F +01FC90B512C0020390B7C8FC020016FC031F15E0030392C9FCDB001F13E0565479D265> +II<93 +380FFFC00303B6FC031F15E092B712FC0203D9FC0013FF020F01C0010F13C0023F90C700 +0313F0DA7FFC02007F902601FFF0ED3FFE49496F7E49496F7F49496F7F4990C96C7F4948 +707F4948707F01FF854A177F48864849717EA24849711380A2481BC04A83481BE0A24A83 +481BF0A3481BF8A291CB7EA3B51AFCAF6C1BF8A26E5FA36C1BF0A36C6D4D13E0A36C1BC0 +6E5F6C1B806E5F6CDB01FE16006C6D902607FF80495A4C13E06C6D013F6D495A017F9126 +7F03F85C6D6C90277C00FC015B6D6C49D97E035B6D01806E485B6D6D48D91F8F5B6D01E0 +039F90C7FC6D01F06EB45A6DD9FCF85DDA3FFF6E13F0020F6D4913C0020301FF90B5C8FC +020091B512FC031F180C0303181EDB001FEBE3FE93C7EA01FF74133E74137E7413FEF2F8 +077290B5FC1CFCA285A21CF8A2851CF07314E0A27314C0731480731400735B9638007FF8 +F21FE0576A79D265>II<91 +260FFF80130791B500F85B010702FF5B011FEDC03F49EDF07F9026FFFC006D5A4801E0EB +0FFD4801800101B5FC4848C87E48488149150F001F824981123F4981007F82A28412FF84 +A27FA26D82A27F7F6D93C7FC14C06C13F014FF15F86CECFF8016FC6CEDFFC017F06C16FC +6C16FF6C17C06C836C836D826D82010F821303010082021F16801400030F15C0ED007F04 +0714E01600173F050F13F08383A200788200F882A3187FA27EA219E07EA26CEFFFC0A27F +6D4B13806D17006D5D01FC4B5A01FF4B5A02C04A5A02F8EC7FF0903B1FFFC003FFE0486C +90B65AD8FC0393C7FC48C66C14FC48010F14F048D9007F90C8FC3C5479D24B>I<003FBC +1280A59126C0003F9038C0007F49C71607D87FF8060113C001E08449197F49193F90C817 +1FA2007E1A0FA3007C1A07A500FC1BE0481A03A6C994C7FCB3B3AC91B912F0A553517BD0 +5E>IIII<003FB7D88003B7FCA5D8000749C8000701F8C7FC +6D6D9238007F806D6E93C8FC7015FE6D17016E6D5D704A5A6E16076E6D4A5A6E6D5D4F5A +6E6D143F6E6D4A5A7191C9FC6E16FE6EECC00171485A6F5D6F6D485A6FEBF80F71485A6F +5D6F6D485AEFFF7F6F4ACAFC6F5C6F5CA2705B705B8482707F707FA2707F7080855E4C80 +855E4C80DC3FCF7F058F7FEE7F074C6C7FDB01FE814C7E4B486C8003076E7F4B48814C7F +4B486D7F033F824C7F4BC76C7F4B6E7F4A5A4B6E804A486E800207844A48814B6F7F4A48 +83023F824A486F7F92C96C7F02FE840101830103718090263FFFC084B76C0103B712F8A5 +5D527CD166>I +97 DI<913801FFF8021FEBFF8091B612F0010315FC010F9038C00FFE903A1FFE +0001FFD97FFC491380D9FFF05B4817C048495B5C5A485BA2486F138091C7FC486F130070 +5A4892C8FC5BA312FFAD127F7FA27EA2EF03E06C7F17076C6D15C07E6E140F6CEE1F806C +6DEC3F006C6D147ED97FFE5C6D6CEB03F8010F9038E01FF0010390B55A01001580023F49 +C7FC020113E033387CB63C>I<4DB47E0407B5FCA5EE001F1707B3A4913801FFE0021F13 +FC91B6FC010315C7010F9038E03FE74990380007F7D97FFC0101B5FC49487F4849143F48 +4980485B83485B5A91C8FC5AA3485AA412FFAC127FA36C7EA37EA26C7F5F6C6D5C7E6C6D +5C6C6D49B5FC6D6C4914E0D93FFED90FEFEBFF80903A0FFFC07FCF6D90B5128F0101ECFE +0FD9003F13F8020301C049C7FC41547CD24B>I<913803FFC0023F13FC49B6FC010715C0 +4901817F903A3FFC007FF849486D7E49486D7E4849130F48496D7E48178048497F18C048 +8191C7FC4817E0A248815B18F0A212FFA490B8FCA318E049CAFCA6127FA27F7EA218E06C +EE01F06E14037E6C6DEC07E0A26C6DEC0FC06C6D141F6C6DEC3F806D6CECFF00D91FFEEB +03FE903A0FFFC03FF8010390B55A010015C0021F49C7FC020113F034387CB63D>IIII<137F +497E000313E0487FA2487FA76C5BA26C5BC613806DC7FC90C8FCADEB3FF0B5FCA512017E +B3B3A6B612E0A51B547BD325>I<157FEDFF80020313E04A13F0A24A13F8A76E13F0A26E +13E002001380ED7F0092C7FCADED1FF891B5FCA51401EC007FB3B3B1EA0780EA1FE0487E +487E486C13FF16F0A216E05C16C04A13806C4848130049485A003F495A000FB512F06C5C +0001148026001FFCC7FC256C87D329>IIIII<913801FFE0021F13FE91B612C0010315F0010F +9038807FFC903A1FFC000FFED97FF86D6C7E49486D7F48496D7F48496D7F4A147F488348 +90C86C7EA24883A248486F7EA3007F1880A400FF18C0AC007F1880A3003F18006D5DA26C +5FA26C5F6E147F6C5F6C6D4A5A6C6D495B6C6D495B6D6C495BD93FFE011F90C7FC903A0F +FF807FFC6D90B55A010015C0023F91C8FC020113E03A387CB643>I<903A3FF001FFE0B5 +010F13FE033FEBFFC092B612F002F301017F913AF7F8007FFE0003D9FFE0EB1FFFC60280 +6D7F92C76C7F4A824A6E7F4A6E7FA2717FA285187F85A4721380AC1A0060A36118FFA261 +5F616E4A5BA26E4A5B6E4A5B6F495B6F4990C7FC03F0EBFFFC9126FBFE075B02F8B612E0 +6F1480031F01FCC8FC030313C092CBFCB1B612F8A5414D7BB54B>I<90397FE003FEB590 +380FFF80033F13E04B13F09238FE1FF89139E1F83FFC0003D9E3E013FEC6ECC07FECE780 +14EF150014EE02FEEB3FFC5CEE1FF8EE0FF04A90C7FCA55CB3AAB612FCA52F367CB537> +114 D<903903FFF00F013FEBFE1F90B7FC120348EB003FD80FF81307D81FE0130148487F +4980127F90C87EA24881A27FA27F01F091C7FC13FCEBFFC06C13FF15F86C14FF16C06C15 +F06C816C816C81C681013F1580010F15C01300020714E0EC003F030713F015010078EC00 +7F00F8153F161F7E160FA27E17E07E6D141F17C07F6DEC3F8001F8EC7F0001FEEB01FE90 +39FFC00FFC6DB55AD8FC1F14E0D8F807148048C601F8C7FC2C387CB635>I<143EA6147E +A414FEA21301A313031307A2130F131F133F13FF5A000F90B6FCB8FCA426003FFEC8FCB3 +A9EE07C0AB011FEC0F8080A26DEC1F0015806DEBC03E6DEBF0FC6DEBFFF86D6C5B021F5B +020313802A4D7ECB34>IIII<007F +B500F090387FFFFEA5C66C48C7000F90C7FC6D6CEC07F86D6D5C6D6D495A6D4B5A6F495A +6D6D91C8FC6D6D137E6D6D5B91387FFE014C5A6E6C485A6EEB8FE06EEBCFC06EEBFF806E +91C9FCA26E5B6E5B6F7E6F7EA26F7F834B7F4B7F92B5FCDA01FD7F03F87F4A486C7E4A48 +6C7E020F7FDA1FC0804A486C7F4A486C7F02FE6D7F4A6D7F495A49486D7F01076F7E4948 +6E7E49486E7FEBFFF0B500FE49B612C0A542357EB447>II< +001FB8FC1880A3912680007F130001FCC7B5FC01F0495B495D49495B495B4B5B48C75C5D +4B5B5F003E4A90C7FC92B5FC4A5B5E4A5B5CC7485B5E4A5B5C4A5B93C8FC91B5FC495B5D +4949EB0F805B495B5D495B49151F4949140092C7FC495A485E485B5C485E485B4A5C4849 +5B4815074849495A91C712FFB8FCA37E31357CB43C>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fv cmr10 10.95 82 +/Fv 82 125 df<4AB4EB0FE0021F9038E03FFC913A7F00F8FC1ED901FC90383FF03FD907 +F090397FE07F80494801FF13FF4948485BD93F805C137F0200ED7F00EF003E01FE6D91C7 +FC82ADB97EA3C648C76CC8FCB3AE486C4A7E007FD9FC3FEBFF80A339407FBF35>11 +D<4AB4FC021F13C091387F01F0903901FC0078D907F0131C4948133E494813FF49485A13 +7F1400A213FE6F5A163893C7FCAA167FB8FCA33900FE00018182B3AC486CECFF80007FD9 +FC3F13FEA32F407FBF33>I<4AB47E021F13F791387F00FFEB01F8903807F001EB0FE0EB +1FC0EB3F80137F14008101FE80AEB8FCA3C648C77EB3AE486CECFF80007FD9FC3F13FEA3 +2F407FBF33>I<4AB4ECFF80021FD9C00F13E0913B7F01F03F80F8903C01F80078FE003C +D907F0D93FF8130E49484948131F49484948EB7F804948484913FF137F02005CA201FE92 +C7FC6FED7F0070141C96C7FCAAF13F80BBFCA3C648C76CC7FC197F193FB3AC486C4A6CEB +7FC0007FD9FC3FD9FE1FB5FCA348407FBF4C>I<121EEA7F80EAFFC0A9EA7F80ACEA3F00 +AC121EAB120CC7FCA8121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A4179C019>33 +D<001E130F397F803FC000FF137F01C013E0A201E013F0A3007F133F391E600F30000013 +00A401E01370491360A3000114E04913C00003130101001380481303000EEB070048130E +0018130C0038131C003013181C1C7DBE2D>I<121EEA7F8012FF13C0A213E0A3127FEA1E +601200A413E013C0A312011380120313005A120E5A1218123812300B1C79BE19>39 +D<1430147014E0EB01C0EB03801307EB0F00131E133E133C5B13F85B12015B1203A2485A +A2120F5BA2121F90C7FCA25AA3123E127EA6127C12FCB2127C127EA6123E123FA37EA27F +120FA27F1207A26C7EA212017F12007F13787F133E131E7FEB07801303EB01C0EB00E014 +701430145A77C323>I<12C07E12707E7E121E7E6C7E7F12036C7E7F12007F1378137CA2 +7FA2133F7FA21480130FA214C0A3130714E0A6130314F0B214E01307A614C0130FA31480 +A2131F1400A25B133EA25BA2137813F85B12015B485A12075B48C7FC121E121C5A5A5A5A +145A7BC323>I<121EEA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0A3120113 +80120313005A120E5A1218123812300B1C798919>44 DI<121E +EA7F80A2EAFFC0A4EA7F80A2EA1E000A0A798919>IIIIII< +150E151E153EA2157EA215FE1401A21403EC077E1406140E141CA214381470A214E0EB01 +C0A2EB0380EB0700A2130E5BA25B5BA25B5B1201485A90C7FC5A120E120C121C5AA25A5A +B8FCA3C8EAFE00AC4A7E49B6FCA3283E7EBD2D>I<00061403D80780131F01F813FE90B5 +FC5D5D5D15C092C7FC14FCEB3FE090C9FCACEB01FE90380FFF8090383E03E090387001F8 +496C7E49137E497F90C713800006141FC813C0A216E0150FA316F0A3120C127F7F12FFA4 +16E090C7121F12FC007015C012780038EC3F80123C6CEC7F00001F14FE6C6C485A6C6C48 +5A3903F80FE0C6B55A013F90C7FCEB07F8243F7CBC2D>II<1238123C123F90B612FCA316F85A16F016E00078C712010070EC +03C0ED078016005D48141E151C153C5DC8127015F04A5A5D14034A5A92C7FC5C141EA25C +A2147C147814F8A213015C1303A31307A3130F5CA2131FA6133FAA6D5A0107C8FC26407B +BD2D>III<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FC +B3121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A2779A619>I<121EEA7F80A2EAFFC0A4EA +7F80A2EA1E00C7FCB3121E127FEAFF80A213C0A4127F121E1200A412011380A312031300 +5A1206120E120C121C5A1230A20A3979A619>I63 D<15074B7EA34B7EA34B7EA34B +7EA34B7E15E7A2913801C7FC15C3A291380381FEA34AC67EA3020E6D7EA34A6D7EA34A6D +7EA34A6D7EA34A6D7EA349486D7E91B6FCA249819138800001A249C87EA24982010E157F +A2011E82011C153FA2013C820138151FA2017882170F13FC00034C7ED80FFF4B7EB500F0 +010FB512F8A33D417DC044>65 DIIIIIII< +B612F0A3C6EBF000EB3FC0B3B3B2EBFFF0B612F0A31C3E7EBD21>I<011FB512FCA3D900 +0713006E5A1401B3B3A6123FEA7F80EAFFC0A44A5A1380D87F005B007C130700385C003C +495A6C495A6C495A2603E07EC7FC3800FFF8EB3FC026407CBD2F>IIIIIII82 DI<003FB91280 +A3903AF0007FE001018090393FC0003F48C7ED1FC0007E1707127C00781703A300701701 +A548EF00E0A5C81600B3B14B7E4B7E0107B612FEA33B3D7DBC42>III< +B500FE017FB5D88007B5FCA3000301C0010101E0C713F86C90C849EC3FE07148EC0F807E +7215006E143F017F190E84A26D6C60A24D7E6D6C60A2EFE7F86D6C60A2933801C3FC6E18 +F001076104037F6E0281140101036104077F17006D6C4D5AA2040EEB7F806D6C4DC7FCA2 +4CEB3FC0DA7F80160EA24CEB1FE003C0161E023F171C047814F0DBE070010F133C021F17 +3804F014F84C1307DA0FF05EA2DBF1C0EB03FCDA07F95EA2DBFB80EB01FEDA03FF6F5AA2 +93C8FCA26E5FA24B157F020094C8FCA24B81037C153EA20378151E0338151C58407EBD5D +>I<007FB5D8C003B512E0A3C649C7EBFC00D93FF8EC3FE06D48EC1F806D6C92C7FC171E +6D6C141C6D6C143C5F6D6C14706D6D13F04C5ADA7FC05B023F13036F485ADA1FF090C8FC +020F5BEDF81E913807FC1C163C6E6C5A913801FF7016F06E5B6F5AA26F7E6F7EA2828215 +3FED3BFEED71FF15F103E07F913801C07F0203804B6C7EEC07004A6D7E020E6D7E5C023C +6D7E02386D7E14784A6D7E4A6D7F130149486E7E4A6E7E130749C86C7E496F7E497ED9FF +C04A7E00076DEC7FFFB500FC0103B512FEA33F3E7EBD44>II91 +D<486C13C00003130101001380481303000EEB070048130E0018130C0038131C00301318 +0070133800601330A300E01370481360A400CFEB678039FFC07FE001E013F0A3007F133F +A2003F131F01C013E0390F0007801C1C73BE2D>II96 DII<49B4FC010F13E090383F00F801 +7C131E4848131F4848137F0007ECFF80485A5B121FA24848EB7F00151C007F91C7FCA290 +C9FC5AAB6C7EA3003FEC01C07F001F140316806C6C13076C6C14000003140E6C6C131E6C +6C137890383F01F090380FFFC0D901FEC7FC222A7DA828>IIII< +167C903903F801FF903A1FFF078F8090397E0FDE1F9038F803F83803F001A23B07E000FC +0600000F6EC7FC49137E001F147FA8000F147E6D13FE00075C6C6C485AA23901F803E039 +03FE0FC026071FFFC8FCEB03F80006CAFC120EA3120FA27F7F6CB512E015FE6C6E7E6C15 +E06C810003813A0FC0001FFC48C7EA01FE003E140048157E825A82A46C5D007C153E007E +157E6C5D6C6C495A6C6C495AD803F0EB0FC0D800FE017FC7FC90383FFFFC010313C0293D +7EA82D>III<1478EB01FEA2EB03FFA4EB01FEA2EB00781400AC +147FEB7FFFA313017F147FB3B3A5123E127F38FF807E14FEA214FCEB81F8EA7F01387C03 +F0381E07C0380FFF803801FC00185185BD1C>III<2701F801FE14FF00FF902707FFC00313E0913B1E07E00F03F0913B +7803F03C01F80007903BE001F87000FC2603F9C06D487F000101805C01FBD900FF147F91 +C75B13FF4992C7FCA2495CB3A6486C496CECFF80B5D8F87FD9FC3F13FEA347287DA74C> +I<3901F801FE00FF903807FFC091381E07E091387803F000079038E001F82603F9C07F00 +01138001FB6D7E91C7FC13FF5BA25BB3A6486C497EB5D8F87F13FCA32E287DA733>I<14 +FF010713E090381F81F890387E007E01F8131F4848EB0F804848EB07C04848EB03E0000F +15F04848EB01F8A2003F15FCA248C812FEA44815FFA96C15FEA36C6CEB01FCA3001F15F8 +6C6CEB03F0A26C6CEB07E06C6CEB0FC06C6CEB1F80D8007EEB7E0090383F81FC90380FFF +F0010090C7FC282A7EA82D>I<3901FC03FC00FF90381FFF8091387C0FE09039FDE003F0 +3A03FFC001FC6C496C7E91C7127F49EC3F805BEE1FC017E0A2EE0FF0A3EE07F8AAEE0FF0 +A4EE1FE0A2EE3FC06D1580EE7F007F6E13FE9138C001F89039FDE007F09039FC780FC0DA +3FFFC7FCEC07F891C9FCAD487EB512F8A32D3A7EA733>I<02FF131C0107EBC03C90381F +80F090397F00387C01FC131CD803F8130E4848EB0FFC150748481303121F485A1501485A +A448C7FCAA6C7EA36C7EA2001F14036C7E15076C6C130F6C7E6C6C133DD8007E13799038 +3F81F190380FFFC1903801FE0190C7FCAD4B7E92B512F8A32D3A7DA730>I<3901F807E0 +00FFEB1FF8EC787CECE1FE3807F9C100031381EA01FB1401EC00FC01FF1330491300A35B +B3A5487EB512FEA31F287EA724>I<90383FC0603901FFF8E03807C03F381F000F003E13 +07003C1303127C0078130112F81400A27E7E7E6D1300EA7FF8EBFFC06C13F86C13FE6C7F +6C1480000114C0D8003F13E0010313F0EB001FEC0FF800E01303A214017E1400A27E15F0 +7E14016C14E06CEB03C0903880078039F3E01F0038E0FFFC38C01FE01D2A7DA824>I<13 +1CA6133CA4137CA213FCA2120112031207001FB512C0B6FCA2D801FCC7FCB3A215E0A912 +009038FE01C0A2EB7F03013F138090381F8700EB07FEEB01F81B397EB723>IIIIII<001FB61280A2EBE0000180140049485A001E49 +5A121C4A5A003C495A141F00385C4A5A147F5D4AC7FCC6485AA2495A495A130F5C495A90 +393FC00380A2EB7F80EBFF005A5B484813071207491400485A48485BA248485B4848137F +00FF495A90B6FCA221277EA628>III +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fw cmbx12 20.736 19 +/Fw 19 120 df68 D70 D<96267FFFE01670063FB6ED +01F80503B700F01403053F04FC14074CB96C130F040706E0131F043F72133F93BA00FC13 +7F0303DC00076D13FF030F03C09039003FFF814B02FCC8000713C3037F02E0030113F792 +B600806F6CB5FC02034ACA121F4A02F8834A02E0834A4A1701027F4A8391B548CC7E494A +85495C4C854988494A85494A85495C8A4991CDFC90B54886A2484A1B7FA2481E3F5D481E +1F5D5A1F0FA2485CA3481E075DA2795A489BC9FCA45DA2B6FCB27EA26F0403BA12C0A47E +A3816C96C8000302F8C7FCA36C80A36C80A27E817E817E817F6D80827F6D806D806D8082 +6D6E606D806E80021F6E5F6E02F05F6E806E02FE5F0200DAFFC05E6F02F04BB6FC031F02 +FE030713CF6FDAFFE0021F138703039226FF8003B51201030093B6EAFC00043F4E133F04 +0706E0131F04014E1307DC003F4CC71201050304F8EC0070DD003F038092C8FCDE007F01 +F0CCFC827A75F798>I<001FC012F8A7481FFC03F0C76C91C7120F92C8EF007F02F81B1F +02E01B0702801B0191C984491D7F491D3F491D1FA2491D0FA2491D07007F1FFEA2491D03 +A4491D01A700FF1FFF90CA85A6CB1A00B3B3B3AD4ABC12C0A8787479F387>84 +D<92383FFFF80207B612E0027F15FC49B87E010717E0011F83499026F0007F13FC4948C7 +000F7F90B502036D7E486E6D806F6D80727F486E6E7F8486727FA28684A26C5C72806C5C +6D90C8FC6D5AEB0FF8EB03E090CAFCA70507B6FC041FB7FC0303B8FC157F0203B9FC021F +ECFE0391B612800103ECF800010F14C04991C7FC017F13FC90B512F04814C0485C4891C8 +FC485B5A485B5C5A5CA2B5FC5CA360A36E5DA26C5F6E5D187E6C6D846E4A48806C6D4A48 +14FC6C6ED90FF0ECFFFC6C02E090263FE07F14FE00019139FC03FFC06C91B6487E013F4B +487E010F4B1307010303F01301D9003F0280D9003F13FC020101F8CBFC57507ACE5E>97 +D<93387FFF80030FB512FC037FECFF804AB712E0020716F8021F16FE027FD9F8077F49B5 +D8C000804991C7003F13E04901FC020F7F49496E7F49498049496E7F49496E7F90B55A48 +727E92C914804884485B1BC048841BE0485BA27313F05AA25C5AA21BF885A2B5FCA391BA +FCA41BF002F8CCFCA67EA3807EA47E806CF103F0F207F86C7F1A0F6C6E17F06C191F6F17 +E06C6E163F6D6DEE7FC06D6D16FF6D6D4B13806D6D4B13006D6D6CEC0FFE6D02E0EC3FFC +6D02F8ECFFF86D9126FFC00F5B023F91B65A020F178002034CC7FC020016F8031F15E003 +0392C8FCDB000F13E04D507BCE58>101 D103 D<903801FFFCB6FCA8C67E131F7FB3AD95380FFFE095B512FE05036E +7E050F15E0053F15F84D81932701FFF01F7F4CD900077FDC07FC6D80DC0FF06D80DC1FC0 +7F4C48824CC8FC047E6F7F5EEDFDF85E03FF707F5EA25EA25EA293C9FCA45DB3B3A6B8D8 +E003B81280A8617879F76C>III<90 +3801FFFCB6FCA8C67E131F7FB3AE0603B612FEA8DE001F01F8C7FC070713804F90C8FCF1 +3FFE4F5AF1FFF04E5B4E5B4E5B061F90C9FC4E5AF07FF84E5A4D5B05075B4D5B4D48CAFC +4D5A4D5A4D5A04035B4C7F4C7F5E4C7F4C7F03FDB6FC92B7FC858585A204F98004E0804C +804C7E4C6C7F4B6D7F4B824B7F7180718086837180727F8684727F728087847280728087 +84737F737F87854F14C0B8D88007B712F0A85C787AF766>I<902601FFF891260FFFE093 +383FFF80B692B500FE0303B512F805036E6C020F14FE050F03E0023F6E7E053F03F891B7 +12E04D6F4982932701FFF01F6D0107D9C07F7F4CD900076D90270FFC001F7FDC07FC6D91 +26801FF06D7FC66CDA0FF06D9126C03FC06D7F011FDA1FC06D4BC77E6D4A48DCE0FE834C +C8ECE1FC047E6FD9F1F86E804CEFF3F0DBF9F8EFF7E04C6003FB7001FF6F804C6015FF4C +95C9FCA24C5FA293C95CA44B60B3B3A6B8D8E003B8D8800FB712FEA8974E79CDA2>109 +D<902601FFF891380FFFE0B692B512FE05036E7E050F15E0053F15F84D81932701FFF01F +7F4CD900077FDC07FC6D80C66CDA0FF06D80011FDA1FC07F6D4A48824CC8FC047E6F7F5E +EDF9F85E03FB707F5E15FF5EA25EA293C9FCA45DB3B3A6B8D8E003B81280A8614E79CD6C +>I<93381FFFE00303B6FC031F15E092B712FC020316FF020F17C0023FD9FC0014F091B5 +00C0010F13FC4991C700037F4901FC02007F010F496F13C049496F7F49496F7F4B814949 +6F7F90B5C96C7F4886A24849707F481B80A248497014C0A2481BE0A348497113F0A3481B +F8A5B51AFCAE6C1BF8A46C1BF06E94B5FCA36C1BE0A26C6D4C14C0A26C1B806E5E6C1B00 +6C6E4B5BA26C6E4B5B6D6D4B5B6D6D4B5B6D6D4B5B6D6D92B55A6D01FF02035C6D02C001 +0F91C7FC010002FC90B512FC6E90B75A021F17E00207178002014CC8FCDA003F15F00303 +92C9FCDB001F13E056507BCE61>I<902601FFF8EB07FEB691383FFFC094B512F0040380 +4C14FE4C8093261FFC3F138093263FE07F13C0DC7F80B5FCC66C5D011FDAFE0114E06DEB +F9FC16F815FB16F016E015FF16C07114C05E72138095381FFE0093C76C5AF001E095C8FC +A25DA65DB3B3A2B812F8A8434E7ACD4F>114 D<912603FFFCEB0780027F9039FFE00FC0 +0103B6EAF83F010FEDFEFF013F92B5FC49EB000F2601FFF01300480180143F4890C8120F +4848814848814981123F83485A187FA212FF6D163FA37F7F6DEE1F8002C092C7FC14F014 +FEECFFF06CECFF8016FEEEFFE06C16FC6C16FF18C06C836C17F86C836C836C83013F1780 +6D17C0010717E0010117F0EB003F020716F8EC001F030015FC1607EE007F051F13FE1707 +007E82B482836D167FA2183F7F181FA27F19FC7FA26D163F6D17F86D167F19F06D16FF6E +4A13E002E04A13C06E4A138002FE023F1300913AFFC003FFFE01E790B65A01C316F00180 +16C026FE003F92C7FC48010714F80070D9007F90C8FC3F507ACE4C>I<15FFA75CA55CA4 +5CA25CA25CA25CA25C91B5FCA25B5B5B131F5B90B9FC120FBAFCA6D8000791C9FCB3B3A3 +F01FE0AE183F7014C07F187F7014806D16FF826D4B13006E6D485AEEFE0F6E90B55A020F +5D6E5D020115C06E6C5C031F49C7FC030113F03B6E7CEC4B>II +119 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fx cmr10 10 1 +/Fx 1 112 df111 D E +%EndDVIPSBitmapFont +end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%BeginPaperSize: a4 +a4 +%%EndPaperSize + +%%EndSetup +%%Page: 1 1 +1 0 bop 316 83 a Fx(o)150 1112 y Fw(The)64 b(DejaGn)-5 +b(u)65 b(T)-16 b(esting)65 b(F)-16 b(ramew)-5 b(ork)p +150 1212 3600 34 v 2787 1308 a Fv(for)31 b(DejaGn)m(u)g(V)-8 +b(ersion)30 b(1.3)3395 1525 y(Jan)g(1996)150 5068 y Fu(Rob)45 +b(Sa)l(v)l(o)l(y)l(e)p 150 5141 3600 17 v eop +%%Page: 2 2 +2 1 bop 3105 408 a Fv(Cygn)m(us)30 b(Supp)s(ort)150 4480 +y(Cop)m(yrigh)m(t)602 4477 y(c)577 4480 y Ft(\015)g Fv(92,)i(93,)f(94,) +h(95,)f(1996)h(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)-8 +b(oundation,)30 b(Inc.)150 4615 y(P)m(ermission)g(is)i(gran)m(ted)h(to) +f(mak)m(e)i(and)d(distribute)f(v)m(erbatim)i(copies)g(of)g(this)f(man)m +(ual)h(pro)m(vided)f(the)150 4725 y(cop)m(yrigh)m(t)g(notice)f(and)g +(this)f(p)s(ermission)f(notice)i(are)h(preserv)m(ed)f(on)h(all)e +(copies.)150 4859 y(P)m(ermission)36 b(is)i(gran)m(ted)g(to)h(cop)m(y)g +(and)f(distribute)e(mo)s(di\014ed)g(v)m(ersions)h(of)i(this)e(man)m +(ual)g(under)g(the)150 4969 y(conditions)j(for)i(v)m(erbatim)g(cop)m +(ying,)j(pro)m(vided)40 b(also)i(that)h(the)f(en)m(tire)g(resulting)e +(deriv)m(ed)h(w)m(ork)h(is)150 5078 y(distributed)27 +b(under)i(the)i(terms)f(of)h(a)f(p)s(ermission)e(notice)i(iden)m(tical) +f(to)j(this)d(one.)150 5213 y(P)m(ermission)i(is)i(gran)m(ted)g(to)h +(cop)m(y)g(and)f(distribute)d(translations)i(of)i(this)e(man)m(ual)g +(in)m(to)h(another)g(lan-)150 5322 y(guage,)f(under)d(the)h(ab)s(o)m(v) +m(e)i(conditions)d(for)h(mo)s(di\014ed)e(v)m(ersions.)p +eop +%%Page: 1 3 +1 2 bop 150 -116 a Fv(Chapter)30 b(1:)41 b(What)31 b(is)e(DejaGn)m(u?) +2349 b(1)150 100 y Fs(1)80 b(What)54 b(is)g(DejaGn)l(u?)275 +334 y Fv(DejaGn)m(u)35 b(is)e(a)i(framew)m(ork)g(for)f(testing)h(other) +g(programs.)53 b(Its)34 b(purp)s(ose)f(is)g(to)j(pro)m(vide)d(a)i +(single)150 443 y(fron)m(t)30 b(end)g(for)g(all)g(tests.)41 +b(Bey)m(ond)31 b(this,)f(DejaGn)m(u)h(o\013ers)f(sev)m(eral)h(adv)-5 +b(an)m(tages)32 b(for)f(testing:)199 578 y(1.)61 b(The)32 +b(\015exibilit)m(y)e(and)i(consistency)h(of)g(the)g(DejaGn)m(u)g +(framew)m(ork)g(mak)m(e)h(it)e(easy)i(to)f(write)f(tests)330 +687 y(for)e(an)m(y)h(program.)199 822 y(2.)61 b(DejaGn)m(u)21 +b(pro)m(vides)f(a)h(la)m(y)m(er)g(of)g(abstraction)g(whic)m(h)e(allo)m +(ws)h(y)m(ou)h(to)g(write)f(tests)i(that)f(are)g(p)s(ortable)330 +932 y(to)35 b(an)m(y)f(host)g(or)g(target)h(where)f(a)g(program)g(m)m +(ust)g(b)s(e)f(tested.)52 b(F)-8 b(or)35 b(instance,)g(a)f(test)h(for)f +(GDB)330 1041 y(can)26 b(run)e(\(from)i(an)m(y)g(Unix)f(based)g(host\)) +h(on)g(an)m(y)g(target)h(arc)m(hitecture)g(that)f(DejaGn)m(u)h(supp)s +(orts.)330 1151 y(Curren)m(tly)d(DejaGn)m(u)j(runs)d(tests)j(on)f(sev)m +(eral)g(single)f(b)s(oard)g(computers,)i(whose)f(op)s(erating)f(soft-) +330 1260 y(w)m(are)31 b(ranges)f(from)g(just)g(a)h(b)s(o)s(ot)f +(monitor)g(to)h(a)g(full-\015edged,)d(Unix-lik)m(e)h(realtime)h(OS.)199 +1395 y(3.)61 b(All)36 b(tests)j(ha)m(v)m(e)g(the)f(same)g(output)f +(format.)63 b(This)36 b(mak)m(es)j(it)e(easy)i(to)f(in)m(tegrate)h +(testing)f(in)m(to)330 1504 y(other)c(soft)m(w)m(are)i(dev)m(elopmen)m +(t)e(pro)s(cesses.)51 b(DejaGn)m(u's)35 b(output)f(is)f(designed)g(to)h +(b)s(e)g(parsed)f(b)m(y)330 1614 y(other)e(\014ltering)d(script,)i(and) +g(it)f(is)h(also)g(h)m(uman)g(readable.)275 1773 y(DejaGn)m(u)h(is)e +(written)h(in)f Fr(expect)p Fv(,)g(whic)m(h)g(in)g(turn)g(uses)h +Fq(Tcl)p Fv(|T)-8 b(o)s(ol)29 b(command)h(language.)275 +1908 y(Running)21 b(tests)k(requires)d(t)m(w)m(o)k(things:)36 +b(the)24 b(testing)g(framew)m(ork,)i(and)d(the)h(test)h(suites)e +(themselv)m(es.)150 2017 y(T)-8 b(ests)35 b(are)g(usually)d(written)i +(in)f Fr(expect)g Fv(using)g(Tcl,)i(but)f(y)m(ou)h(can)g(also)g(use)f +(a)h(Tcl)f(script)f(to)i(run)f(a)150 2127 y(test)f(suite)f(that)g(is)g +(not)g(based)g(on)g Fr(expect)p Fv(.)44 b(\()p Fr(expect)31 +b Fv(script)g(\014lenames)g(con)m(v)m(en)m(tionally)i(use)f(`)p +Fr(.exp)p Fv(')150 2237 y(as)h(a)g(su\016x;)g(for)g(example,)g(the)g +(main)f(implemen)m(tation)f(of)i(the)g(DejaGn)m(u)h(test)f(driv)m(er)f +(is)f(in)h(the)h(\014le)150 2346 y(`)p Fr(runtest.exp)p +Fv('.\))p eop +%%Page: 2 4 +2 3 bop 150 -116 a Fv(2)2409 b(DejaGn)m(u)32 b(T)-8 b(esting)30 +b(F)-8 b(ramew)m(ork)p eop +%%Page: 3 5 +3 4 bop 150 -116 a Fv(Chapter)30 b(2:)41 b(What)31 b(is)e(new)h(in)f +(this)h(release)g(?)1937 b(3)150 100 y Fs(2)80 b(What)54 +b(is)g(new)f(in)h(this)g(release)f(?)275 334 y Fv(This)39 +b(release)i(has)f(a)h(n)m(um)m(b)s(er)f(of)h(substan)m(tial)f(c)m +(hanges)h(o)m(v)m(er)i(v)m(ersion)d(1.2.)73 b(The)40 +b(most)h(visible)150 443 y(c)m(hange)29 b(is)f(that)h(the)f(v)m(ersion) +g(of)g(exp)s(ect)h(and)f(Tcl)f(included)f(in)h(the)h(release)h(are)f +(up-to-date)i(with)d(the)150 553 y(curren)m(t)j(stable)g(net)h +(releases.)41 b(Other)30 b(c)m(hanges)h(are:)199 687 +y(1.)61 b(The)35 b(con\014g)h(sub-system)f(in)f(DejaGn)m(u)j(has)e(b)s +(een)g(completely)g(redesigned.)55 b(It)36 b(no)m(w)g(supp)s(orts)330 +797 y(testing)30 b(on)h(remote)g(hosts)f(as)h(w)m(ell)e(as)i(remote)g +(targets.)199 932 y(2.)61 b(More)23 b(builtin)c(supp)s(ort)h(for)i +(building)d(target)24 b(binaries)c(with)h(the)h(correct)i(link)m(er)c +(\015ags.)39 b(Curren)m(tly)330 1041 y(this)29 b(only)h(w)m(orks)g +(with)f(GCC,)h(preferably)f(with)g(a)i(target)h(supp)s(ort)d(b)m(y)h +Fr(libgloss)p Fv(.)199 1176 y(3.)61 b(Lots)31 b(of)f(little)f(bug)h +(\014xes)g(from)g(a)h(y)m(ear)g(of)g(hea)m(vy)g(use)f(here)g(at)h(Cygn) +m(us)f(Supp)s(ort.)199 1310 y(4.)61 b(DejaGn)m(u)31 b(no)m(w)g(uses)f +Fr(autoconf)e Fv(for)i(con\014guration.)199 1445 y(5.)61 +b(New)38 b(test)g(cases)h(for)e(DejaGn)m(u)h(ha)m(v)m(e)h(b)s(een)e +(added)g(for)g(the)h(new)f(features,)j(plus)35 b(the)j +Fr(")p Fv({to)s(ol)p Fr(")330 1554 y Fv(option)30 b(bug)g(in)f(the)h +(1.2)i(testsuite)e(has)g(b)s(een)g(\014xed.)199 1689 +y(6.)61 b(The)30 b Fr(--tool)f Fv(option)g(is)h(no)m(w)g(optional.)199 +1823 y(7.)61 b Fr(runtest)26 b Fv(when)g(searc)m(hing)i(for)f(test)i +(driv)m(ers)d(ignores)h(all)f(directories)h(named)g(SCCS,)f(R)m(CS,)i +(and)330 1933 y(CVS.)199 2067 y(8.)61 b(There)30 b(is)f(no)m(w)h(a)h +(generic)f(k)m(eyw)m(ord)h(based)e(test)j(harness)d(that)i(uses)e +(commen)m(ts)i(in)e(source)i(co)s(de)330 2177 y(to)g(con)m(trol)g(ho)m +(w)f(eac)m(h)i(test)f(case)h(gets)f(built)d(and)i(run.)199 +2311 y(9.)61 b(There)30 b(is)f(no)m(w)i(some)f(supp)s(ort)f(for)h +(running)e(a)j(testsuite)f(with)f(m)m(ultiple)f(passes.)150 +2569 y Fu(2.1)68 b(Running)45 b(existing)h(tests)275 +2761 y Fv(T)-8 b(o)25 b(run)e(tests)j(from)e(an)h(existing)e +(collection,)j(\014rst)e(use)h Fr(configure)d Fv(as)j(usual)e(to)j(set) +f(up)f(the)h(source)150 2871 y(directory)30 b(con)m(taining)g(the)g +(tests.)42 b(Then)29 b(try)h(running)390 3000 y Fr(make)47 +b(check)275 3134 y Fv(If)29 b(the)h Fr(check)e Fv(target)j(exists,)f +(it)f(usually)e(sa)m(v)m(es)k(y)m(ou)f(some)g(trouble|for)f(instance,)h +(it)f(can)h(set)g(up)150 3244 y(an)m(y)h(auxiliary)d(programs)i(or)g +(other)h(\014les)e(needed)h(b)m(y)g(the)h(tests.)275 +3378 y(Once)e(y)m(ou)i(ha)m(v)m(e)g(run)e(`)p Fr(make)g(check)p +Fv(')g(to)i(build)c(an)m(y)j(auxiliary)e(\014les,)h(y)m(ou)h(migh)m(t)g +(w)m(an)m(t)h(to)f(call)g(the)150 3488 y(test)e(driv)m(er)d +Fr(runtest)g Fv(directly)h(to)h(rep)s(eat)g(the)g(tests.)40 +b(Y)-8 b(ou)28 b(ma)m(y)f(also)g(ha)m(v)m(e)h(to)f(call)f +Fr(runtest)f Fv(directly)150 3597 y(for)30 b(test)h(collections)f(with) +f(no)i Fr(check)e Fv(target)j(in)d(the)h(`)p Fr(Makefile)p +Fv('.)p eop +%%Page: 4 6 +4 5 bop 150 -116 a Fv(4)2409 b(DejaGn)m(u)32 b(T)-8 b(esting)30 +b(F)-8 b(ramew)m(ork)275 83 y(T)m(ypically)g(,)39 b(y)m(ou)g(m)m(ust)f +(use)h(t)m(w)m(o)h(command-line)d(options:)56 b(`)p Fr(--tool)p +Fv(',)40 b(to)f(sp)s(ecify)e(whic)m(h)h(set)h(of)150 +193 y(tests)31 b(to)g(run)612 160 y Fp(1)648 193 y Fv(,)g(and)e(`)p +Fr(--srcdir)p Fv(',)g(to)i(sp)s(ecify)e(where)h(to)h(\014nd)e(test)j +(directories.)275 327 y(F)-8 b(or)27 b(example,)h(if)d(the)i(directory) +g(`)p Fr(gdb/testsuite)p Fv(')c(con)m(tains)k(a)h(collection)e(of)h +(DejaGn)m(u)h(tests)f(for)150 437 y Fo(gdb)p Fv(,)j(y)m(ou)h(can)g(run) +e(them)h(lik)m(e)g(this:)390 565 y Fr(eg$)47 b(cd)g(gdb/testsuite)390 +669 y(eg$)g(runtest)f(--tool)g(gdb)150 773 y Fn(T)-7 +b(est)33 b(output)g(fol)5 b(lows,)34 b(ending)f(with:)390 +980 y Fr(===)47 b(gdb)g(Summary)f(===)390 1188 y(#)h(of)h(expected)d +(passes)h(508)390 1292 y(#)h(of)h(expected)d(failures)h(103)390 +1396 y(/usr/latest/bin/gdb)d(version)i(4.14.4)h(-nx)275 +1530 y Fv(Y)-8 b(ou)20 b(can)h(use)f(the)h(option)e(`)p +Fr(--srcdir)p Fv(')g(to)i(p)s(oin)m(t)e(to)i(some)g(other)g(directory)f +(con)m(taining)g(a)g(collection)150 1640 y(of)31 b(tests:)390 +1768 y Fr(eg$)47 b(runtest)f(--tool)g(gdb)h(--srcdir)e +(/devo/gdb/testsuite)275 1903 y Fv(These)d(examples)g(assume)h(a)g +Fq(nativ)m(e)48 b Fv(con\014guration,)d(where)d(the)h(same)g(computer)g +(runs)e(b)s(oth)150 2012 y Fr(runtest)31 b Fv(and)h(the)h(tests)h +(themselv)m(es.)48 b(When)33 b(y)m(ou)g(ha)m(v)m(e)h(a)f +Fq(cross)k Fv(con\014guration,)c(the)g(tests)h(run)d(on)150 +2122 y(a)j(di\013eren)m(t)f(computer,)h(con)m(trolled)f(b)m(y)g(the)h +(host)f(running)e Fr(runtest)p Fv(.)47 b(In)33 b(this)f(situation,)h(y) +m(ou)h(need)150 2232 y(the)d(option)e(`)p Fr(--name)p +Fv(')h(to)h(sp)s(ecify)e(the)h(net)m(w)m(ork)h(address)f(for)g(the)h +(other)f(computer:)390 2360 y Fr(eg$)47 b(runtest)f(--tool)g(gdb)h +(--name)f(vx9.munist.com)275 2495 y Fv(If)24 b(y)m(ou)h(alw)m(a)m(ys)g +(use)f(the)h(same)g(option)f(v)-5 b(alues,)25 b(y)m(ou)g(can)g(record)g +(them)g(in)e(a)i(\014le)f(called)f(`)p Fr(site.exp)p +Fv(',)150 2604 y(rather)33 b(than)g(t)m(yping)f(them)h(eac)m(h)h(time.) +48 b(See)34 b(Chapter)e(4)h([Setting)g(defaults)f(for)h +Fr(runtest)e Fv(options],)150 2714 y(page)g(15.)275 2848 +y(By)36 b(default,)g Fr(runtest)e Fv(prin)m(ts)g(only)h(the)h(names)f +(of)h(the)g(tests)h(it)e(runs,)h(output)f(from)g(an)m(y)h(tests)150 +2958 y(that)41 b(ha)m(v)m(e)g(unexp)s(ected)e(results,)j(and)d(a)i +(summary)e(sho)m(wing)g(ho)m(w)h(man)m(y)g(tests)h(passed)e(and)h(ho)m +(w)150 3068 y(man)m(y)26 b(failed.)38 b(T)-8 b(o)26 b(displa)m(y)e +(output)h(from)h(all)e(tests)j(\(whether)e(or)h(not)g(they)g(b)s(eha)m +(v)m(e)g(as)h(exp)s(ected\),)g(use)150 3177 y(the)36 +b(`)p Fr(--all)p Fv(')f(option.)56 b(F)-8 b(or)37 b(more)f(v)m(erb)s +(ose)g(output)f(ab)s(out)g(pro)s(cesses)h(b)s(eing)e(run,)i(comm)m +(unication,)150 3287 y(and)f(so)h(on,)h(use)e(`)p Fr(--verbose)p +Fv('.)55 b(T)-8 b(o)36 b(see)g(ev)m(en)g(more)g(output,)h(use)e(m)m +(ultiple)f(`)p Fr(--verbose)p Fv(')f(options.)150 3396 +y(See)j(Chapter)f(3)i([Using)e Fr(runtest)p Fv(],)h(page)g(9,)i(for)e +(a)g(more)g(detailed)f(explanation)g(of)h(eac)m(h)h Fr(runtest)150 +3506 y Fv(option.)275 3641 y(T)-8 b(est)28 b(output)f(go)s(es)h(in)m +(to)g(t)m(w)m(o)h(\014les)d(in)h(y)m(our)g(curren)m(t)h(directory:)38 +b(summary)27 b(output)g(in)f(`)p Fq(to)s(ol)p Fr(.sum)p +Fv(',)150 3750 y(and)31 b(detailed)g(output)h(in)f(`)p +Fq(to)s(ol)p Fr(.log)p Fv('.)45 b(\()p Fq(to)s(ol)35 +b Fv(refers)d(to)h(the)f(collection)f(of)i(tests;)g(for)f(example,)g +(after)150 3860 y(a)37 b(run)e(with)g(`)p Fr(--tool)29 +b(gdb)p Fv(',)38 b(lo)s(ok)e(for)h(output)f(\014les)f(`)p +Fr(gdb.sum)p Fv(')g(and)h(`)p Fr(gdb.log)p Fv('.\))59 +b(See)36 b(Section)h(5.7)150 3969 y([The)30 b(\014les)f(DejaGn)m(u)j +(writes],)e(page)h(35.)p 150 4070 1200 4 v 192 4136 a +Fp(1)275 4169 y Fv(`)p Fr(--tool)p Fv(')h(selects)j(a)f(particular)f +(suite)g(of)h(tests,)i Fn(not)43 b Fv(the)34 b(name)g(of)h(the)f +(executable)g(program)g(to)275 4279 y(run.)55 b(See)36 +b(Chapter)f(4)h([Con\014guration)f(dep)s(enden)m(t)f(v)-5 +b(alues],)37 b(page)g(15,)h(for)d(information)f(on)i(the)275 +4388 y(v)-5 b(ariables)29 b(that)i(y)m(ou)f(can)h(use)f(to)h(sp)s +(ecify)e(the)i(names)f(of)g(programs)g(to)i(run.)p eop +%%Page: 5 7 +5 6 bop 150 -116 a Fv(Chapter)30 b(2:)41 b(What)31 b(is)e(new)h(in)f +(this)h(release)g(?)1937 b(5)150 83 y Fu(2.2)68 b(What)45 +b(do)t(es)g(a)g(DejaGn)l(u)h(test)f(lo)t(ok)h(lik)l(e?)275 +276 y Fv(Eac)m(h)32 b(DejaGn)m(u)i(test)f(is)e(an)h Fr(expect)f +Fv(script;)h(the)h(tests)g(v)-5 b(ary)32 b(widely)e(in)h(complexit)m(y) +-8 b(,)33 b(dep)s(ending)150 385 y(on)d(the)h(nature)f(of)g(the)h(to)s +(ol)f(and)g(the)h(feature)g(tested.)275 520 y(Here)38 +b(is)e(a)i(v)m(ery)g(simple)d Fo(gdb)i Fv(test|one)i(of)f(the)f +(simplest)f(tests)i(shipp)s(ed)d(with)h(DejaGn)m(u)i(\(ex-)150 +629 y(tracted)31 b(from)f(`)p Fr(gdb.t00/echo.exp)p Fv('\):)1556 +596 y Fp(2)150 713 y Fm(\013)p 200 713 3554 4 v 3553 +w(\010)p 150 1833 4 1072 v 178 866 a Fr(#)48 b(send)e(a)i(string)e(to)h +(the)g(GDB)g(stdin:)178 970 y(send)g("echo)f(Hello)h(world!\\n")178 +1177 y(#)h(inspect)d(the)i(GDB)g(stdout)f(for)h(the)g(correct)f(reply,) +178 1281 y(#)i(and)f(determine)e(whether)h(the)h(test)f(passes)g(or)h +(fails:)178 1385 y(expect)f({)274 1489 y(-re)h("Hello)f(world.*$prompt) +e($")190 b({)47 b(pass)g("Echo)f(test")h(})274 1593 y(-re)g("$prompt)e +($")811 b({)47 b(fail)g("Echo)f(test")h(})274 1696 y(timeout)1191 +b({)47 b(fail)g("\(timeout\))e(Echo)i(test")f(})274 1800 +y(})p 3803 1833 V 150 1885 a Fm(\012)p 200 1885 3554 +4 v 3553 w(\011)275 2029 y Fv(Though)33 b(brief,)g(this)g(example)h(is) +f(a)h(complete)h(test.)53 b(It)34 b(illustrates)e(some)i(of)g(the)h +(main)e(features)150 2139 y(of)e(DejaGn)m(u)g(test)g(scripts:)225 +2274 y Ft(\017)60 b Fv(The)31 b(test)h(case)h(do)s(es)e(not)h(start)g +(the)g(tested)g(program)f(\()p Fo(gdb)h Fv(in)e(this)g(case\);)k(all)c +(test)j(scripts)d(for)330 2383 y(in)m(teractiv)m(e)h(to)s(ols)f(can)h +(assume)f(the)h(corresp)s(onding)d(to)s(ol)i(is)g(running.)225 +2518 y Ft(\017)60 b Fv(Commen)m(ts)31 b(start)f(with)g(`)p +Fr(#)p Fv('.)225 2652 y Ft(\017)60 b Fv(The)20 b(main)f(commands)h(y)m +(ou)h(use)f(to)h(con)m(trol)g(a)f(tested)i(program)e(are)h +Fr(send)e Fv(\(to)i(giv)m(e)g(it)f(commands\))330 2762 +y(and)30 b Fr(expect)e Fv(\(to)k(analyze)f(its)e(resp)s(onses\).)225 +2896 y Ft(\017)60 b Fv(The)33 b Fr(expect)e Fv(command)i(uses)g(a)h +(list)d(of)j(pairs;)f(a)h(pattern)f(\(regular)g(expression)f(if)g(`)p +Fr(-re)p Fv(')h(sp)s(ec-)330 3006 y(i\014ed\),)i(follo)m(w)m(ed)g(b)m +(y)g(an)f(action)i(to)f(run)f(if)g(the)h(pattern)g(matc)m(hes)h(output) +e(from)h(the)g(program.)330 3115 y(Only)29 b(the)h(action)h(for)f(the)h +Fn(\014rst)39 b Fv(matc)m(hing)31 b(pattern)f(will)e(execute.)225 +3250 y Ft(\017)60 b Fv(T)-8 b(est)31 b(cases)g(use)f(the)h(commands)f +Fr(pass)f Fv(and)h Fr(fail)f Fv(to)i(record)g(the)f(test)h(outcome.)150 +3507 y Fu(2.3)68 b(Design)46 b(goals)275 3700 y Fv(DejaGn)m(u)d(grew)f +(out)h(of)f(the)h(in)m(ternal)e(needs)h(of)g(Cygn)m(us)g(Supp)s(ort.)75 +b(Cygn)m(us)41 b(main)m(tains)h(and)150 3809 y(enhances)24 +b(a)g(v)-5 b(ariet)m(y)24 b(of)f(free)h(programs)f(in)g(man)m(y)h +(di\013eren)m(t)f(en)m(vironmen)m(ts,)h(and)f(w)m(e)h(needed)g(a)g +(testing)150 3919 y(to)s(ol)30 b(that:)225 4054 y Ft(\017)60 +b Fv(is)29 b(useful)g(to)i(dev)m(elop)s(ers)f(while)e(\014xing)h(bugs;) +225 4188 y Ft(\017)60 b Fv(automates)32 b(running)c(man)m(y)i(tests)h +(during)d(a)j(soft)m(w)m(are)h(release)f(pro)s(cess;)225 +4323 y Ft(\017)60 b Fv(is)29 b(p)s(ortable)h(among)h(a)f(v)-5 +b(ariet)m(y)31 b(of)g(host)f(computers;)225 4457 y Ft(\017)60 +b Fv(supp)s(orts)28 b(cross-dev)m(elopmen)m(t)k(testing;)225 +4591 y Ft(\017)60 b Fv(p)s(ermits)29 b(testing)h(in)m(teractiv)m(e)h +(programs,)g(lik)m(e)e Fo(gdb)p Fv(;)i(and)225 4726 y +Ft(\017)60 b Fv(p)s(ermits)29 b(testing)h(batc)m(h)h(orien)m(ted)f +(programs,)h(lik)m(e)e Fo(gcc)p Fv(.)p 150 4822 1200 +4 v 192 4888 a Fp(2)275 4921 y Fv(More)42 b(recen)m(t)h +Fo(gdb)f Fv(tests)h(use)e(the)h(`)p Fr(gdb_test)p Fv(')f(pro)s(cedure.) +74 b(An)42 b(equiv)-5 b(alen)m(t)41 b(test)i(using)d(that)275 +5031 y(pro)s(cedure)29 b(is)g(`)i Fr(gdb_test)d("echo)h(Hello)g +(world!")f("Hello)h(world!")f Fv(')p eop +%%Page: 6 8 +6 7 bop 150 -116 a Fv(6)2409 b(DejaGn)m(u)32 b(T)-8 b(esting)30 +b(F)-8 b(ramew)m(ork)275 83 y(Some)28 b(of)g(the)h(requiremen)m(ts)e +(pro)m(v)m(ed)i(c)m(hallenging.)39 b(F)-8 b(or)29 b(example,)f(in)m +(teractiv)m(e)i(programs)d(do)i(not)150 193 y(lend)35 +b(themselv)m(es)h(v)m(ery)h(w)m(ell)e(to)i(automated)h(testing.)58 +b(But)37 b(all)e(the)h(requiremen)m(ts)g(are)h(imp)s(ortan)m(t:)150 +302 y(for)29 b(instance,)g(it)g(is)f(imp)s(erativ)m(e)g(to)h(mak)m(e)h +(sure)f(that)g Fo(gdb)g Fv(w)m(orks)g(as)g(w)m(ell)f(when)g +(cross-debugging)h(as)150 412 y(it)h(do)s(es)g(in)f(a)i(nativ)m(e)g +(con\014guration.)275 546 y(Probably)d(the)i(greatest)i(c)m(hallenge)e +(w)m(as)g(testing)g(in)f(a)h(cross-dev)m(elopmen)m(t)h(en)m(vironmen)m +(t)f(\(whic)m(h)150 656 y(can)38 b(b)s(e)e(a)i(real)f(nigh)m(tmare\).) +62 b(Most)38 b(cross-dev)m(elopmen)m(t)h(en)m(vironmen)m(ts)d(are)i +(customized)f(b)m(y)h(eac)m(h)150 765 y(dev)m(elop)s(er.)60 +b(Ev)m(en)38 b(when)e(buying)f(pac)m(k)-5 b(aged)39 b(b)s(oards)d(from) +g(v)m(endors)h(there)h(are)f(man)m(y)g(di\013erences.)150 +875 y(The)e(comm)m(unication)g(in)m(terfaces)g(v)-5 b(ary)36 +b(from)f(a)g(serial)f(line)g(to)i(ethernet.)56 b(DejaGn)m(u)36 +b(w)m(as)g(designed)150 985 y(with)e(a)j(mo)s(dular)c(comm)m(unication) +i(setup,)i(so)f(that)h(eac)m(h)g(kind)c(of)j(comm)m(unication)g(can)g +(b)s(e)f(added)150 1094 y(as)30 b(required,)e(and)h(supp)s(orted)e +(thereafter.)42 b(Once)29 b(a)h(comm)m(unication)f(pro)s(cedure)f(is)h +(co)s(ded,)g(an)m(y)h(test)150 1204 y(can)h(use)f(it.)41 +b(Curren)m(tly)29 b(DejaGn)m(u)i(can)g(use)f Fr(rsh)p +Fv(,)g Fr(rlogin)p Fv(,)f Fr(telnet)p Fv(,)g Fr(tip)p +Fv(,)h Fr(kermit)p Fv(,)f(and)h Fr(mondfe)f Fv(for)150 +1313 y(remote)i(comm)m(unications.)275 1448 y(Julia)20 +b(Menapace)j(\014rst)f(coined)f(the)i(term)f(\\Deja)i(Gn)m(u")e(to)h +(describ)s(e)d(an)i(earlier)g(testing)g(framew)m(ork)150 +1557 y(at)40 b(Cygn)m(us)e(Supp)s(ort.)64 b(When)38 b(w)m(e)i(replaced) +e(it)g(with)g(the)h(Exp)s(ect-based)g(framew)m(ork,)i(it)d(w)m(as)i +(lik)m(e)150 1667 y(DejaGn)m(u)31 b(all)e(o)m(v)m(er)j(again)6 +b(.)22 b(.)g(.)150 1924 y Fu(2.4)68 b(A)44 b(POSIX)h(conforming)g(test) +h(framew)l(ork)275 2117 y Fv(DejaGn)m(u)31 b(conforms)f(to)h(the)g +Fo(posix)e Fv(standard)h(for)g(test)h(framew)m(orks.)275 +2252 y Fo(posix)j Fv(standard)h(1003.3)j(de\014nes)d(what)g(a)h +(testing)g(framew)m(ork)g(needs)f(to)h(pro)m(vide,)h(in)d(order)h(to) +150 2361 y(p)s(ermit)23 b(the)i(creation)g(of)g Fo(posix)f +Fv(conformance)h(test)h(suites.)38 b(This)23 b(standard)h(is)f +(primarily)f(orien)m(ted)i(to)150 2471 y(running)k Fo(posix)i +Fv(conformance)h(tests,)h(but)d(its)h(requiremen)m(ts)g(also)h(supp)s +(ort)d(testing)j(of)g(features)g(not)150 2580 y(related)22 +b(to)h Fo(posix)f Fv(conformance.)38 b Fo(posix)22 b +Fv(1003.3)j(do)s(es)d(not)g(sp)s(ecify)f(a)i(particular)d(testing)j +(framew)m(ork,)150 2690 y(but)30 b(at)h(this)e(time)h(there)h(is)e +(only)h(one)g(other)h Fo(posix)f Fv(conforming)f(test)i(framew)m(ork:) +41 b Fo(tet)p Fv(.)3320 2657 y Fp(3)275 2824 y Fv(The)26 +b Fo(posix)h Fv(do)s(cumen)m(tation)g(refers)f(to)i Fq(assertions)p +Fv(.)40 b(An)26 b(assertion)h(is)f(a)i(description)d(of)j(b)s(eha)m +(vior.)150 2934 y(F)-8 b(or)41 b(example,)j(if)39 b(a)i(standard)f(sa)m +(ys)h(\\The)g(sun)e(shall)g(shine",)j(a)f(corresp)s(onding)e(assertion) +h(migh)m(t)150 3044 y(b)s(e)c(\\The)h(sun)f(is)g(shining.")58 +b(A)37 b(test)g(based)g(on)g(this)f(assertion)g(w)m(ould)g(pass)g(or)h +(fail)f(dep)s(ending)e(on)150 3153 y(whether)d(it)f(is)g(da)m(ytime)i +(or)f(nigh)m(ttime.)42 b(It)32 b(is)e(imp)s(ortan)m(t)g(to)i(note)g +(that)g(the)f(standard)f(b)s(eing)g(tested)150 3263 y(is)g(nev)m(er)h +(1003.3;)i(the)e(standard)f(b)s(eing)g(tested)h(is)f(some)h(other)g +(standard,)f(for)h(whic)m(h)e(the)i(assertions)150 3372 +y(w)m(ere)g(written.)275 3507 y(As)g(there)g(is)g(no)g(test)h(suite)e +(to)i(test)h Fn(testing)g(fr)-5 b(ameworks)41 b Fv(for)31 +b Fo(posix)g Fv(1003.3)j(conformance,)e(v)m(eri-)150 +3616 y(fying)c(conformance)i(to)h(this)d(standard)h(is)f(done)h(b)m(y)h +(rep)s(eatedly)e(reading)h(the)h(standard)e(and)h(exp)s(eri-)150 +3726 y(men)m(ting.)40 b(One)28 b(of)h(the)g(main)f(things)f(1003.3)32 +b(do)s(es)c(sp)s(ecify)g(is)f(the)i(set)h(of)f(allo)m(w)m(ed)f(output)h +(messages,)150 3836 y(and)39 b(their)g(de\014nitions.)66 +b(F)-8 b(our)41 b(messages)f(are)g(supp)s(orted)e(for)i(a)g(required)e +(feature)i(of)g Fo(posix)f Fv(con-)150 3945 y(forming)g(systems,)k(and) +c(a)i(\014fth)e(for)h(a)h(conditional)d(feature.)71 b(DejaGn)m(u)41 +b(supp)s(orts)d(the)j(use)f(of)g(all)150 4055 y(\014v)m(e)h(output)f +(messages;)46 b(in)40 b(this)f(sense)h(a)h(test)h(suite)d(that)i(uses)f +(exactly)i(these)e(messages)i(can)f(b)s(e)150 4164 y(considered)29 +b Fo(posix)h Fv(conforming.)40 b(These)30 b(de\014nitions)e(sp)s(ecify) +h(the)h(output)g(of)h(a)g(test)g(case:)150 4399 y Fr(PASS)288 +b Fv(A)30 b(test)i(has)e(succeeded.)41 b(That)30 b(is,)g(it)g +(demonstrated)g(that)h(the)g(assertion)f(is)f(true.)150 +4583 y Fr(XFAIL)240 b Fo(posix)41 b Fv(1003.3)k(do)s(es)d(not)g(incorp) +s(orate)g(the)g(notion)g(of)g(exp)s(ected)h(failures,)g(so)g +Fr(PASS)p Fv(,)630 4692 y(instead)32 b(of)h Fr(XPASS)p +Fv(,)g(m)m(ust)f(also)h(b)s(e)g(returned)e(for)i(test)h(cases)g(whic)m +(h)d(w)m(ere)j(exp)s(ected)f(to)630 4802 y(fail)24 b(and)h(did)e(not.) +40 b(This)23 b(means)i(that)h Fr(PASS)e Fv(is)h(in)f(some)i(sense)f +(more)g(am)m(biguous)g(than)g(if)630 4912 y Fr(XPASS)j +Fv(is)g(also)h(used.)40 b(F)-8 b(or)30 b(information)d(on)i +Fr(XPASS)f Fv(and)g Fr(XFAIL)p Fv(,)h(see)g(Chapter)g(3)g([Using)630 +5021 y Fr(runtest)p Fv(],)g(page)i(9.)p 150 5122 1200 +4 v 192 5188 a Fp(3)275 5221 y Fo(tet)d Fv(w)m(as)h(created)h(b)m(y)f +(Unisoft)f(for)h(a)g(consortium)f(comprised)g(of)h(X/Op)s(en,)g(Unix)e +(In)m(ternational,)275 5331 y(and)i(the)i(Op)s(en)e(Soft)m(w)m(are)i(F) +-8 b(oundation.)p eop +%%Page: 7 9 +7 8 bop 150 -116 a Fv(Chapter)30 b(2:)41 b(What)31 b(is)e(new)h(in)f +(this)h(release)g(?)1937 b(7)150 83 y Fr(FAIL)288 b Fv(A)27 +b(test)g Fn(has)35 b Fv(pro)s(duced)25 b(the)h(bug)g(it)g(w)m(as)h(in)m +(tended)e(to)i(capture.)40 b(That)26 b(is,)h(it)f(has)g(demon-)630 +193 y(strated)32 b(that)g(the)g(assertion)g(is)f(false.)44 +b(The)31 b Fr(FAIL)g Fv(message)i(is)d(based)i(on)f(the)h(test)h(case) +630 302 y(only)-8 b(.)40 b(Other)30 b(messages)i(are)e(used)g(to)h +(indicate)e(a)i(failure)e(of)h(the)h(framew)m(ork.)630 +437 y(As)c(with)g Fr(PASS)p Fv(,)g Fo(posix)f Fv(tests)j(m)m(ust)e +(return)f Fr(FAIL)h Fv(rather)g(than)g Fr(XFAIL)f Fv(ev)m(en)i(if)f(a)h +(failure)630 546 y(w)m(as)j(exp)s(ected.)150 731 y Fr(UNRESOLVED)630 +840 y Fv(A)k(test)i(pro)s(duced)c(indeterminate)h(results.)54 +b(Usually)-8 b(,)36 b(this)e(means)h(the)h(test)g(executed)630 +950 y(in)g(an)h(unexp)s(ected)f(fashion;)k(this)c(outcome)j(requires)c +(that)j(a)g(h)m(uman)e(b)s(eing)g(go)i(o)m(v)m(er)630 +1059 y(results,)c(to)h(determine)e(if)g(the)h(test)h(should)d(ha)m(v)m +(e)k(passed)d(or)h(failed.)50 b(This)33 b(message)i(is)630 +1169 y(also)25 b(used)g(for)g(an)m(y)h(test)h(that)f(requires)e(h)m +(uman)g(in)m(terv)m(en)m(tion)i(b)s(ecause)f(it)g(is)g(b)s(ey)m(ond)g +(the)630 1279 y(abilities)h(of)i(the)h(testing)f(framew)m(ork.)40 +b(An)m(y)28 b(unresolv)m(ed)g(test)h(should)d(resolv)m(ed)i(to)h +Fr(PASS)630 1388 y Fv(or)h Fr(FAIL)g Fv(b)s(efore)g(a)g(test)i(run)d +(can)h(b)s(e)g(considered)f(\014nished.)630 1523 y(Note)h(that)f(for)f +Fo(posix)p Fv(,)g(eac)m(h)i(assertion)e(m)m(ust)g(pro)s(duce)f(a)i +(test)g(result)e(co)s(de.)41 b(If)27 b(the)i(test)630 +1632 y(isn't)36 b(actually)g(run,)h(it)f(m)m(ust)g(pro)s(duce)g +Fr(UNRESOLVED)d Fv(rather)k(than)f(just)g(lea)m(ving)g(that)630 +1742 y(test)g(out)f(of)g(the)g(output.)54 b(This)33 b(means)i(that)g(y) +m(ou)h(ha)m(v)m(e)g(to)g(b)s(e)e(careful)g(when)g(writing)630 +1851 y(tests,)g(to)f(not)g(carelessly)f(use)g(tcl)h(statemen)m(ts)h +(lik)m(e)e Fr(return)p Fv(|if)e(y)m(ou)j(alter)f(the)h(\015o)m(w)g(of) +630 1961 y(con)m(trol)25 b(of)g(the)g(tcl)g(co)s(de)g(y)m(ou)h(m)m(ust) +e(insure)f(that)j(ev)m(ery)g(test)f(still)e(pro)s(duces)h(some)h +(result)630 2071 y(co)s(de.)630 2205 y(Here)31 b(are)g(some)f(of)h(the) +g(w)m(a)m(ys)g(a)g(test)g(ma)m(y)g(wind)d(up)h Fr(UNRESOLVED)p +Fv(:)705 2340 y Ft(\017)60 b Fv(A)30 b(test's)i(execution)e(is)g(in)m +(terrupted.)705 2474 y Ft(\017)60 b Fv(A)34 b(test)g(do)s(es)f(not)h +(pro)s(duce)e(a)i(clear)f(result.)49 b(This)32 b(is)g(usually)f(b)s +(ecause)j(there)g(w)m(as)810 2584 y(an)h Fr(ERROR)e Fv(from)i(DejaGn)m +(u)h(while)d(pro)s(cessing)h(the)h(test,)i(or)e(b)s(ecause)g(there)g(w) +m(ere)810 2693 y(three)41 b(or)f(more)h Fr(WARNING)e +Fv(messages.)72 b(An)m(y)41 b Fr(WARNING)d Fv(or)j Fr(ERROR)e +Fv(messages)j(can)810 2803 y(in)m(v)-5 b(alidate)32 b(the)h(output)f +(of)h(the)h(test.)49 b(This)31 b(usually)g(requires)g(a)j(h)m(uman)e(b) +s(eing)f(to)810 2912 y(examine)k(the)g(output)f(to)i(determine)e(what)g +(really)g(happ)s(ened|and)f(to)i(impro)m(v)m(e)810 3022 +y(the)c(test)g(case.)705 3156 y Ft(\017)60 b Fv(A)30 +b(test)i(dep)s(ends)c(on)j(a)f(previous)f(test,)j(whic)m(h)d(fails.)705 +3291 y Ft(\017)60 b Fv(The)30 b(test)h(w)m(as)g(set)g(up)e(incorrectly) +-8 b(.)150 3475 y Fr(UNTESTED)96 b Fv(A)31 b(test)h(w)m(as)g(not)f +(run.)42 b(This)29 b(is)h(a)i(placeholder,)e(used)g(when)h(there)g(is)f +(no)h(real)g(test)h(case)630 3585 y(y)m(et.)150 3744 +y(The)j(only)h(remaining)e(output)h(message)i(left)f(is)f(in)m(tended)g +(to)i(test)g(features)f(that)g(are)h(sp)s(eci\014ed)d(b)m(y)150 +3854 y(the)d(applicable)d Fo(posix)h Fv(standard)h(as)h(conditional:) +150 4038 y Fr(UNSUPPORTED)630 4148 y Fv(There)40 b(is)g(no)g(supp)s +(ort)f(for)h(the)h(tested)g(case.)72 b(This)39 b(ma)m(y)i(mean)g(that)g +(a)g(conditional)630 4257 y(feature)30 b(of)f(an)g(op)s(erating)g +(system,)g(or)h(of)f(a)g(compiler,)g(is)f(not)h(implemen)m(ted.)39 +b(DejaGn)m(u)630 4367 y(also)23 b(uses)g(this)g(message)h(when)e(a)i +(testing)g(en)m(vironmen)m(t)f(\(often)h(a)f(\\bare)h(b)s(oard")f +(target\))630 4477 y(lac)m(ks)31 b(basic)f(supp)s(ort)e(for)i +(compiling)f(or)h(running)e(the)i(test)i(case.)42 b(F)-8 +b(or)31 b(example,)f(a)h(test)630 4586 y(for)38 b(the)h(system)f +(subroutine)e Fr(gethostname)f Fv(w)m(ould)i(nev)m(er)i(w)m(ork)f(on)g +(a)h(target)h(b)s(oard)630 4696 y(running)28 b(only)h(a)i(b)s(o)s(ot)f +(monitor.)275 4855 y(DejaGn)m(u)g(uses)f(the)h(same)h(output)e(pro)s +(cedures)g(to)h(pro)s(duce)f(these)h(messages)h(for)e(all)g(test)i +(suites,)150 4965 y(and)i(these)h(pro)s(cedures)e(are)h(already)g(kno)m +(wn)g(to)h(conform)f(to)h Fo(posix)f Fv(1003.3.)52 b(F)-8 +b(or)34 b(a)g(DejaGn)m(u)g(test)150 5074 y(suite)28 b(to)i(conform)f +(to)h Fo(posix)e Fv(1003.3,)k(y)m(ou)d(m)m(ust)g(a)m(v)m(oid)h(the)f +Fr(setup_xfail)d Fv(pro)s(cedure)i(as)h(describ)s(ed)150 +5184 y(in)21 b(the)i Fr(PASS)e Fv(section)i(ab)s(o)m(v)m(e,)i(and)d(y)m +(ou)h(m)m(ust)g(b)s(e)e(careful)h(to)i(return)d Fr(UNRESOLVED)f +Fv(where)i(appropriate,)150 5293 y(as)31 b(describ)s(ed)d(in)h(the)i +Fr(UNRESOLVED)c Fv(section)k(ab)s(o)m(v)m(e.)p eop +%%Page: 8 10 +8 9 bop 150 -116 a Fv(8)2409 b(DejaGn)m(u)32 b(T)-8 b(esting)30 +b(F)-8 b(ramew)m(ork)150 83 y Fu(2.5)68 b(F)-11 b(uture)44 +b(directions)275 276 y Fv(In)28 b(the)h(near)g(future,)f(there)i(are)f +(t)m(w)m(o)h(parallel)d(directions)h(for)h(DejaGn)m(u)h(dev)m(elopmen)m +(t.)40 b(The)29 b(\014rst)150 385 y(is)g(to)j(add)d(supp)s(ort)g(for)h +(more)h(hosts)f(and)g(targets.)275 520 y(The)d(second)g(w)m(ould)g(p)s +(ermit)f(testing)h(programs)h(with)e(a)i(more)g(complex)f(in)m +(terface,)i(whether)e(text)150 629 y(based)j(or)h(GUI)g(based.)42 +b(Tw)m(o)31 b(comp)s(onen)m(ts)g(already)f(exist:)42 +b(a)31 b(Tcl)f(based)g(X)h(windo)m(w)f(to)s(olkit,)g(and)h(a)150 +739 y(terminal)h(pac)m(k)-5 b(age)36 b(for)e Fr(expect)p +Fv(.)49 b(Both)35 b(of)f(these)g(could)f(b)s(e)g(merged)h(in)m(to)g +(DejaGn)m(u)h(in)d(a)j(w)m(a)m(y)f(that)150 848 y(p)s(ermits)29 +b(testing)h(programs)g(that)h(run)e(in)g(eac)m(h)j(en)m(vironmen)m(t.) +275 983 y(Mean)m(while,)26 b(w)m(e)g(hop)s(e)f(DejaGn)m(u)i(enables)e +(the)h(creation)g(of)g(test)h(suites)e(for)g(conformance)i(to)f +Fo(ansi)150 1093 y Fv(C)33 b(and)g(C)p Fr(++)p Fv(,)h(to)g +Fo(posix)p Fv(,)g(and)g(to)g(other)g(standards.)49 b(W)-8 +b(e)35 b(encourage)g(y)m(ou)f(to)h(mak)m(e)f(an)m(y)g(test)h(suites)150 +1202 y(y)m(ou)c(create)h(freely)d(a)m(v)-5 b(ailable,)30 +b(under)f(the)i(same)g(terms)f(as)g(DejaGn)m(u)i(itself.)150 +1460 y Fu(2.6)68 b(Tcl)45 b(and)f(Exp)t(ect)275 1652 +y Fv(Tcl)25 b(w)m(as)h(in)m(tro)s(duced)e(in)h(a)h(pap)s(er)f(b)m(y)h +(John)f(K.)h(Ousterhout)f(at)i(the)f(1990)i(Win)m(ter)d(Usenix)h +(confer-)150 1762 y(ence,)h Fq(Tcl:)38 b(An)25 b(Em)m(b)s(eddable)f +(Command)g(Language)p Fv(.)40 b(That)26 b(pap)s(er)e(is)g(included)f +(in)h(P)m(ostScript)h(form)150 1871 y(in)32 b(the)i(`)p +Fr(doc)p Fv(')f(sub)s(directory)f(of)h(the)h(Tcl)f(distribution.)46 +b(The)34 b(v)m(ersion)f(of)g(Tcl)g(included)e(in)h(DejaGn)m(u)150 +1981 y(at)f(this)e(time)h(is)g(Tcl)f(7.4p3.)275 2115 +y(Don)h(Lib)s(es)f(in)m(tro)s(duced)f Fr(expect)h Fv(in)g(his)f(pap)s +(er)h Fq(exp)s(ect:)42 b(Curing)28 b(Those)i(Uncon)m(trollable)f(Fits)h +(of)150 2225 y(In)m(teraction)38 b Fv(at)h(the)f(1990)h(Summer)e +(Usenix)f(conference.)64 b(The)37 b(pap)s(er)g(is)g(included)e(in)h(P)m +(ostScript)150 2335 y(form)27 b(in)g(the)h Fr(expect)e +Fv(distribution)f(\(as)j(are)h(sev)m(eral)f(other)g(pap)s(ers)f(ab)s +(out)g Fr(expect)p Fv(\).)39 b(The)27 b(v)m(ersion)h(of)150 +2444 y(exp)s(ect)j(included)d(in)h(DejaGn)m(u)i(at)g(this)e(time)h(is)g +(exp)s(ect)h(5.18.0.)p eop +%%Page: 9 11 +9 10 bop 150 -116 a Fv(Chapter)30 b(3:)41 b(Using)29 +b Fr(runtest)2499 b Fv(9)150 100 y Fs(3)80 b(Using)54 +b Fl(runtest)275 334 y Fr(runtest)28 b Fv(is)i(the)h(executable)g(test) +h(driv)m(er)d(for)i(DejaGn)m(u.)42 b(Y)-8 b(ou)31 b(can)g(sp)s(ecify)e +(t)m(w)m(o)k(kinds)28 b(of)j(things)150 443 y(on)25 b(the)g +Fr(runtest)e Fv(command)i(line:)37 b(command)24 b(line)g(options,)h +(and)g(Tcl)f(v)-5 b(ariables)24 b(for)h(the)g(test)h(scripts.)150 +553 y(The)k(options)g(are)g(listed)f(alphab)s(etically)f(b)s(elo)m(w.) +275 687 y Fr(runtest)g Fv(returns)h(an)i(exit)f(co)s(de)h(of)f +Fr(1)h Fv(if)e(an)m(y)i(test)g(has)f(an)h(unexp)s(ected)f(result;)f +(otherwise)h(\(if)g(all)150 797 y(tests)h(pass)f(or)g(fail)g(as)g(exp)s +(ected\))h(it)f(returns)f Fr(0)h Fv(as)h(the)g(exit)f(co)s(de.)275 +932 y Fr(runtest)25 b Fv(\015ags)i(the)g(outcome)i(of)e(eac)m(h)h(test) +g(as)g(one)f(of)g(these)h(cases.)41 b(\(See)27 b(Section)g(2.4)h([A)g +(POSIX)150 1041 y(conforming)f(test)h(framew)m(ork],)h(page)f(6,)h(for) +e(a)h(discussion)d(of)i(ho)m(w)h Fo(posix)e Fv(sp)s(eci\014es)h(the)g +(meanings)g(of)150 1151 y(these)k(cases.\))150 1310 y +Fr(PASS)288 b Fv(The)29 b(most)g(desirable)f(outcome:)41 +b(the)29 b(test)i(succeeded,)f(and)e(w)m(as)i(exp)s(ected)f(to)h +(succeed.)150 1469 y Fr(XPASS)240 b Fv(A)26 b(pleasan)m(t)h(kind)d(of)j +(failure:)37 b(a)26 b(test)h(w)m(as)g(exp)s(ected)g(to)g(fail,)f(but)f +(succeeded.)40 b(This)24 b(ma)m(y)630 1579 y(indicate)h(progress;)i +(insp)s(ect)e(the)h(test)h(case)g(to)f(determine)f(whether)g(y)m(ou)i +(should)c(amend)630 1689 y(it)30 b(to)h(stop)f(exp)s(ecting)h(failure.) +150 1848 y Fr(FAIL)288 b Fv(A)33 b(test)g(failed,)g(although)f(it)g(w)m +(as)h(exp)s(ected)g(to)g(succeed.)49 b(This)31 b(ma)m(y)i(indicate)f +(regress;)630 1958 y(insp)s(ect)d(the)i(test)g(case)g(and)f(the)h +(failing)d(soft)m(w)m(are)k(to)f(lo)s(cate)g(the)g(bug.)150 +2117 y Fr(XFAIL)240 b Fv(A)38 b(test)g(failed,)h(but)e(it)g(w)m(as)h +(exp)s(ected)g(to)h(fail.)61 b(This)36 b(result)h(indicates)g(no)g(c)m +(hange)i(in)630 2227 y(a)33 b(kno)m(wn)g(bug.)47 b(If)33 +b(a)g(test)h(fails)d(b)s(ecause)i(the)g(op)s(erating)f(system)h(where)g +(the)g(test)h(runs)630 2336 y(lac)m(ks)d(some)g(facilit)m(y)e(required) +g(b)m(y)h(the)g(test,)i(the)e(outcome)i(is)e Fr(UNSUPPORTED)d +Fv(instead.)150 2496 y Fr(UNRESOLVED)630 2605 y Fv(Output)39 +b(from)h(a)h(test)h(requires)d(man)m(ual)h(insp)s(ection;)j(the)e(test) +h(suite)d(could)h(not)h(au-)630 2715 y(tomatically)e(determine)f(the)i +(outcome.)68 b(F)-8 b(or)40 b(example,)i(y)m(our)d(tests)h(can)f(rep)s +(ort)g(this)630 2824 y(outcome)32 b(is)d(when)g(a)i(test)g(do)s(es)g +(not)f(complete)h(as)g(exp)s(ected.)150 2984 y Fr(UNTESTED)96 +b Fv(A)28 b(test)h(case)f(is)f(not)h(y)m(et)h(complete,)g(and)f(in)e +(particular)g(cannot)j(y)m(et)f(pro)s(duce)f(a)h Fr(PASS)f +Fv(or)630 3093 y Fr(FAIL)p Fv(.)39 b(Y)-8 b(ou)28 b(can)h(also)f(use)g +(this)f(outcome)i(in)e(dumm)m(y)g(\\tests")j(that)e(note)h(explicitly)d +(the)630 3203 y(absence)31 b(of)f(a)h(real)f(test)h(case)h(for)e(a)h +(particular)d(prop)s(ert)m(y)-8 b(.)150 3362 y Fr(UNSUPPORTED)630 +3472 y Fv(A)32 b(test)h(dep)s(ends)d(on)i(a)h(conditionally)c(a)m(v)-5 +b(ailable)32 b(feature)g(that)h(do)s(es)f(not)g(exist)g(\(in)f(the)630 +3582 y(con\014gured)40 b(testing)h(en)m(vironmen)m(t\).)71 +b(F)-8 b(or)42 b(example,)h(y)m(ou)e(can)g(use)g(this)e(outcome)j(to) +630 3691 y(rep)s(ort)f(on)h(a)h(test)g(case)g(that)g(do)s(es)e(not)i(w) +m(ork)f(on)g(a)g(particular)f(target)i(b)s(ecause)g(its)630 +3801 y(op)s(erating)30 b(system)g(supp)s(ort)f(do)s(es)h(not)h(include) +d(a)j(required)d(subroutine.)275 3960 y Fr(runtest)g +Fv(ma)m(y)j(also)f(displa)m(y)f(the)h(follo)m(wing)f(messages:)150 +4120 y Fr(ERROR)240 b Fv(Indicates)43 b(a)g(ma)5 b(jor)43 +b(problem)f(\(detected)j(b)m(y)e(the)g(test)h(case)g(itself)7 +b(\))43 b(in)e(running)g(the)630 4229 y(test.)65 b(This)37 +b(is)g(usually)f(an)i(unreco)m(v)m(erable)h(error,)h(suc)m(h)e(as)h(a)f +(missing)e(\014le)i(or)g(loss)g(of)630 4339 y(comm)m(unication)30 +b(to)i(the)f(target.)44 b(\()p Fo(posix)30 b Fv(test)i(suites)e(should) +f(not)i(emit)g(this)f(message;)630 4448 y(use)g Fr(UNSUPPORTED)p +Fv(,)e Fr(UNTESTED)p Fv(,)g(or)i Fr(UNRESOLVED)e Fv(instead,)i(as)g +(appropriate.\))150 4608 y Fr(WARNING)144 b Fv(Indicates)30 +b(a)h(p)s(ossible)e(problem)g(in)g(running)f(the)j(test.)43 +b(Usually)29 b(w)m(arnings)g(corresp)s(ond)630 4717 y(to)24 +b(reco)m(v)m(erable)g(errors,)g(or)f(displa)m(y)e(an)h(imp)s(ortan)m(t) +g(message)i(ab)s(out)f(the)g(follo)m(wing)e(tests.)150 +4877 y Fr(NOTE)288 b Fv(An)30 b(informational)e(message)k(ab)s(out)e +(the)h(test)g(case.)275 5036 y(This)h(is)g(the)i(full)e(set)i(of)g +(command)g(line)e(options)h(that)i Fr(runtest)d Fv(recognizes.)51 +b(Argumen)m(ts)34 b(ma)m(y)150 5146 y(b)s(e)c(abbreviated)f(to)j(the)e +(shortest)h(unique)d(string.)p eop +%%Page: 10 12 +10 11 bop 150 -116 a Fv(10)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)390 83 y Fr(runtest)46 +b(--tool)g Fq(to)s(ol)99 b Fr([)47 b Fq(testsuite)p Fr(.exp)g(...)g(]) +390 187 y([)g Fq(testsuite)p Fr(.exp="testfile1)d(...")j(])390 +291 y([)g Fq(tclv)-5 b(ar)7 b Fr(=)p Fq(v)-5 b(alue)5 +b Fr(...)46 b(])390 394 y([)h(--all)g(])95 b([)47 b(--baud)g +Fq(baud-rate)52 b Fr(])96 b([)47 b(--connect)e Fq(t)m(yp)s(e)53 +b Fr(])390 498 y([)47 b(--debug)f(])95 b([)48 b(--help)e(])95 +b([)48 b(--host)e Fq(string)54 b Fr(])390 602 y([)47 +b(--mail)g(")p Fq(name)52 b Fr(...)o(")c(])95 b([)47 +b(--name)g Fq(string)54 b Fr(])390 706 y([)47 b(--name)g +Fq(name)52 b Fr(])96 b([)47 b(--outdir)f Fq(path)h Fr(])390 +809 y([)g(--objdir)f Fq(path)i Fr(])95 b([)47 b(--reboot)f(])390 +913 y([)h(--srcdir)f Fq(path)i Fr(])95 b([)47 b(--strace)f +Fq(n)h Fr(])390 1017 y([)g(--target)f Fq(string)55 b +Fr(--build)45 b Fq(string)55 b Fr(])390 1121 y([)47 b(-v)h(|)f +(--verbose)e(])96 b([)47 b(-V)g(|)h(--version)d(])95 +b([)48 b(--D)p Fq(n)e Fr(])150 1273 y(--tool)29 b Fq(to)s(ol)630 +1382 y(to)s(ol)39 b Fv(sp)s(eci\014es)c(what)h(set)g(of)g(tests)h(to)f +(run,)g(and)g(what)f(initialization)e(mo)s(dule)h(to)j(use.)630 +1492 y Fq(to)s(ol)c Fv(is)c(used)g Fn(only)38 b Fv(for)30 +b(these)g(t)m(w)m(o)h(purp)s(oses:)39 b(it)29 b(is)f +Fn(not)39 b Fv(used)29 b(to)i(name)e(the)h(executable)630 +1601 y(program)25 b(to)h(test.)40 b(Executable)25 b(to)s(ol)g(names)g +(\(and)g(paths\))g(are)h(recorded)f(in)f(`)p Fr(site.exp)p +Fv(')630 1711 y(\(see)g(Chapter)e(4)i([Con\014guration)d(dep)s(enden)m +(t)h(v)-5 b(alues],)25 b(page)e(15\),)j(and)c(y)m(ou)i(can)f(o)m(v)m +(erride)630 1820 y(them)30 b(b)m(y)h(sp)s(ecifying)d(Tcl)h(v)-5 +b(ariables)29 b(on)i(the)f(command)g(line.)630 1951 y(F)-8 +b(or)33 b(example,)g(including)c(`)p Fr(--tool)g(gcc)p +Fv(')j(on)h(the)f Fr(runtest)f Fv(command)h(line)f(runs)g(tests)630 +2061 y(from)37 b(all)g(test)h(sub)s(directories)d(whose)j(names)f(matc) +m(h)i(`)p Fr(gcc.*)p Fv(',)g(and)e(uses)g(one)h(of)g(the)630 +2170 y(initialization)27 b(mo)s(dules)h(named)i(`)p Fr +(config/*-gcc.exp)p Fv('.)36 b(T)-8 b(o)31 b(sp)s(ecify)d(the)j(name)f +(of)g(the)630 2280 y(compiler)19 b(\(p)s(erhaps)g(as)i(an)g(alternativ) +m(e)g(path)f(to)h(what)g Fr(runtest)d Fv(w)m(ould)h(use)i(b)m(y)f +(default\),)630 2390 y(use)30 b(`)p Fr(GCC=)p Fq(binname)5 +b Fv(')28 b(on)j(the)f Fr(runtest)e Fv(command)j(line.)150 +2541 y Fq(testsuite)p Fr(.exp)f(...)630 2651 y Fv(Sp)s(ecify)j(the)i +(names)f(of)h(testsuites)f(to)i(run.)51 b(By)35 b(default,)g +Fr(runtest)e Fv(runs)f(all)i(tests)h(for)630 2760 y(the)c(to)s(ol,)g +(but)g(y)m(ou)g(can)g(restrict)g(it)f(to)i(particular)d(testsuites)i(b) +m(y)g(giving)f(the)h(names)g(of)630 2870 y(the)g(`)p +Fr(.exp)p Fv(')e Fr(expect)g Fv(scripts)g(that)i(con)m(trol)g(them.)630 +3001 y Fq(testsuite)p Fv(.exp)g(ma)m(y)g(not)f(include)f(path)h +(information;)f(use)h(plain)e(\014lenames.)150 3152 y +Fq(test\014le)p Fr(.exp="testfile1)e(...")630 3262 y +Fv(Sp)s(ecify)38 b(a)j(subset)e(of)i(tests)g(in)d(a)j(suite)e(to)i +(run.)69 b(F)-8 b(or)41 b(compiler)d(or)i(assem)m(bler)g(tests,)630 +3372 y(whic)m(h)31 b(often)i(use)f(a)g(single)f(`)p Fr(.exp)p +Fv(')h(script)f(co)m(v)m(ering)i(man)m(y)g(di\013eren)m(t)f(source)g +(\014les,)g(this)630 3481 y(option)h(allo)m(ws)h(y)m(ou)g(to)h(further) +e(restrict)h(the)g(tests)h(b)m(y)f(listing)d(particular)i(source)h +(\014les)630 3591 y(to)e(compile.)41 b(Some)31 b(to)s(ols)g(ev)m(en)g +(supp)s(ort)e(wildcards)g(here.)42 b(The)30 b(wildcards)f(supp)s(orted) +630 3700 y(dep)s(end)g(up)s(on)f(the)j(to)s(ol,)g(but)e(t)m(ypically)g +(they)i(are)g Fr(?)p Fv(,)f Fr(*)p Fv(,)g(and)g Fr([chars])p +Fv(.)150 3852 y Fq(tclv)-5 b(ar)7 b Fr(=)p Fq(v)-5 b(alue)630 +3962 y Fv(Y)d(ou)30 b(can)g(de\014ne)f(Tcl)g(v)-5 b(ariables)28 +b(for)h(use)h(b)m(y)f(y)m(our)h(test)g(scripts)f(in)f(the)i(same)g(st)m +(yle)g(used)630 4071 y(with)43 b Fr(make)h Fv(for)h(en)m(vironmen)m(t)f +(v)-5 b(ariables.)82 b(F)-8 b(or)46 b(example,)i(`)p +Fr(runtest)29 b(GDB=gdb.old)p Fv(')630 4181 y(de\014nes)39 +b(a)h(v)-5 b(ariable)38 b(called)h(`)p Fr(GDB)p Fv(';)44 +b(when)39 b(y)m(our)h(scripts)e(refer)i(to)g(`)p Fr($GDB)p +Fv(')f(in)g(this)f(run,)630 4290 y(they)31 b(use)f(the)g(v)-5 +b(alue)30 b(`)p Fr(gdb.old)p Fv('.)630 4421 y(The)f(default)g(Tcl)g(v) +-5 b(ariables)28 b(used)h(for)h(most)g(to)s(ols)g(are)g(de\014ned)e(in) +h(the)g(main)g(DejaGn)m(u)630 4531 y Fr(Makefile)p Fv(;)50 +b(their)44 b(v)-5 b(alues)44 b(are)i(captured)e(in)g(the)h(`)p +Fr(site.exp)p Fv(')e(\014le.)83 b(See)45 b(Chapter)g(4)630 +4640 y([Con\014guration)29 b(dep)s(enden)m(t)h(v)-5 b(alues],)30 +b(page)h(15.)150 4792 y Fr(--all)240 b Fv(Displa)m(y)38 +b(all)f(test)j(output.)64 b(By)39 b(default,)h Fr(runtest)d +Fv(sho)m(ws)h(only)g(the)g(output)g(of)h(tests)630 4902 +y(that)33 b(pro)s(duce)f(unexp)s(ected)g(results;)g(that)h(is,)g(tests) +g(with)e(status)i(`)p Fr(FAIL)p Fv(')f(\(unexp)s(ected)630 +5011 y(failure\),)25 b(`)p Fr(XPASS)p Fv(')f(\(unexp)s(ected)h +(success\),)i(or)e(`)p Fr(ERROR)p Fv(')f(\(a)i(sev)m(ere)g(error)f(in)f +(the)h(test)h(case)630 5121 y(itself)7 b(\).)57 b(Sp)s(ecify)34 +b(`)p Fr(--all)p Fv(')h(to)i(see)f(output)g(for)g(tests)g(with)f +(status)h(`)p Fr(PASS)p Fv(')g(\(success,)i(as)630 5230 +y(exp)s(ected\))c(`)p Fr(XFAIL)p Fv(')f(\(failure,)g(as)h(exp)s +(ected\),)i(or)d(`)p Fr(WARNING)p Fv(')f(\(minor)h(error)g(in)f(the)i +(test)630 5340 y(case)d(itself)7 b(\).)p eop +%%Page: 11 13 +11 12 bop 150 -116 a Fv(Chapter)30 b(3:)41 b(Using)29 +b Fr(runtest)2453 b Fv(11)150 83 y Fr(--baud)29 b Fq(baud-rate)150 +193 y Fr(-b)h Fq(baud-rate)630 302 y Fv(Set)g(the)f(default)g(baud)f +(rate)i(to)g(something)f(other)h(than)f(9600.)42 b(\(Some)30 +b(serial)e(in)m(terface)630 412 y(programs,)i(lik)m(e)g +Fr(tip)p Fv(,)g(use)g(a)g(separate)i(initialization)27 +b(\014le)j(instead)f(of)i(this)e(v)-5 b(alue.\))150 571 +y Fr(--connect)28 b Fq(t)m(yp)s(e)630 681 y Fv(Connect)d(to)g(a)g +(target)h(testing)f(en)m(vironmen)m(t)f(as)h(sp)s(eci\014ed)e(b)m(y)h +Fq(t)m(yp)s(e)p Fv(,)j(if)c(the)i(target)h(is)e(not)630 +790 y(the)36 b(computer)g(running)e Fr(runtest)p Fv(.)56 +b(F)-8 b(or)37 b(example,)h(use)d(`)p Fr(--connect)p +Fv(')g(to)h(c)m(hange)i(the)630 900 y(program)27 b(used)g(to)i(connect) +f(to)g(a)g(\\bare)g(b)s(oard")f(b)s(o)s(ot)h(monitor.)39 +b(The)27 b(c)m(hoices)h(for)g Fq(t)m(yp)s(e)630 1010 +y Fv(in)k(the)i(DejaGn)m(u)g(1.0)h(distribution)30 b(are)k(`)p +Fr(rlogin)p Fv(',)f(`)p Fr(telnet)p Fv(',)g(`)p Fr(rsh)p +Fv(',)i(`)p Fr(tip)p Fv(',)f(`)p Fr(kermit)p Fv(',)630 +1119 y(and)c(`)p Fr(mondfe)p Fv('.)630 1254 y(The)j(default)f(for)h +(this)f(option)h(dep)s(ends)e(on)i(the)g(con\014guration)g(\(see)h +(Section)f(5.5)h([Re-)630 1363 y(mote)h(targets)g(supp)s(orted],)e +(page)i(32\).)52 b(The)33 b(default)g(is)f(c)m(hosen)j(to)f(b)s(e)f +(the)h(most)g(con-)630 1473 y(v)m(enien)m(t)e(comm)m(unication)f(metho) +s(d)g(a)m(v)-5 b(ailable,)32 b(but)f(often)h(other)g(alternativ)m(es)g +(w)m(ork)g(as)630 1582 y(w)m(ell;)c(y)m(ou)h(ma)m(y)g(\014nd)d(it)i +(useful)f(to)i(try)f(alternativ)m(e)g(connect)i(metho)s(ds)d(if)g(y)m +(ou)i(susp)s(ect)f(a)630 1692 y(comm)m(unication)i(problem)f(with)g(y)m +(our)h(testing)h(target.)150 1851 y Fr(--debug)144 b +Fv(T)-8 b(urns)23 b(on)i(the)f Fr(expect)f Fv(in)m(ternal)h(debugging)f +(output.)39 b(Debugging)24 b(output)h(is)e(displa)m(y)m(ed)630 +1961 y(as)44 b(part)g(of)g(the)g Fr(runtest)e Fv(output,)47 +b(and)c(logged)i(to)f(a)h(\014le)e(called)g(`)p Fr(dbg.log)p +Fv('.)79 b(The)630 2071 y(extra)25 b(debugging)d(output)i(do)s(es)f +Fn(not)34 b Fv(app)s(ear)23 b(on)h(standard)f(output,)i(unless)d(the)i +(v)m(erb)s(ose)630 2180 y(lev)m(el)33 b(is)g(greater)i(than)e(2)i +(\(for)e(instance,)i(to)f(see)h(debug)d(output)i(immediately)-8 +b(,)33 b(sp)s(ecify)630 2290 y(`)p Fr(--debug)c(-v)g(-v)p +Fv('\).)57 b(The)35 b(debugging)g(output)g(sho)m(ws)g(all)g(attempts)i +(at)f(matc)m(hing)g(the)630 2399 y(test)e(output)f(of)g(the)h(to)s(ol)f +(with)f(the)h(scripted)f(patterns)i(describing)c(exp)s(ected)k(output.) +630 2509 y(The)c(output)g(generated)h(with)e(`)p Fr(--strace)p +Fv(')g(also)h(go)s(es)h(in)m(to)g(`)p Fr(dbg.log)p Fv('.)150 +2668 y Fr(--help)150 2778 y(-he)336 b Fv(Prin)m(ts)25 +b(out)h(a)h(short)e(summary)g(of)h(the)h Fr(runtest)d +Fv(options,)i(then)g(exits)g(\(ev)m(en)h(if)e(y)m(ou)h(also)630 +2888 y(sp)s(ecify)j(other)i(options\).)150 3047 y Fr(--host)e +Fq(string)630 3156 y(string)47 b Fv(is)39 b(a)i(full)d(con\014guration) +i(\\triple")f(name)h(as)h(used)e(b)m(y)i Fr(configure)p +Fv(.)67 b(Use)41 b(this)630 3266 y(option)30 b(to)h(o)m(v)m(erride)g +(the)f(default)g(string)f(recorded)i(b)m(y)f(y)m(our)h +(con\014guration's)e(c)m(hoice)j(of)630 3376 y(host.)40 +b(This)27 b(c)m(hoice)j(do)s(es)f(not)g(c)m(hange)h(ho)m(w)f(an)m +(ything)f(is)g(actually)g(con\014gured)g(unless)g({)630 +3485 y(build)21 b(is)h(also)i(sp)s(eci\014ed;)g(it)f(a\013ects)i +Fn(only)33 b Fv(DejaGn)m(u)24 b(pro)s(cedures)f(that)h(compare)g(the)g +(host)630 3595 y(string)39 b(with)f(particular)g(v)-5 +b(alues.)68 b(The)39 b(pro)s(cedures)f Fr(ishost)p Fv(,)j +Fr(istarget)p Fv(,)f Fr(isnative)p Fv(,)630 3704 y(and)d +Fr(setup_xfail)d Fv(are)k(a\013ected)i(b)m(y)d(`)p Fr(--host)p +Fv('.)61 b(In)37 b(this)g(usage,)j Fr(host)c Fv(refers)h(to)i(the)630 +3814 y(mac)m(hine)f(that)h(the)f(tests)h(are)g(to)g(b)s(e)e(run)g(on,)j +(whic)m(h)d(ma)m(y)i(not)g(b)s(e)e(the)i(same)f(as)h(the)630 +3924 y Fr(build)27 b Fv(mac)m(hine.)39 b(If)28 b Fr(--build)e +Fv(is)i(also)g(sp)s(eci\014ed,)f(then)h Fr(--host)e Fv(refers)i(to)h +(the)f(mac)m(hine)630 4033 y(that)j(the)g(tests)g(wil,)d(b)s(e)i(run)f +(on,)i(not)f(the)h(mac)m(hine)f(DejaGn)m(u)h(is)e(run)g(on.)150 +4193 y Fr(--build)f Fq(string)630 4302 y(string)39 b +Fv(is)32 b(a)h(full)e(con\014guration)h(\\triple")g(name)g(as)h(used)f +(b)m(y)h Fr(configure)p Fv(.)45 b(This)31 b(is)h(the)630 +4412 y(t)m(yp)s(e)c(of)h(mac)m(hine)f(DejaGn)m(u)h(and)e(the)i(to)s +(ols)f(to)g(b)s(e)g(tested)h(are)g(built)d(on.)39 b(F)-8 +b(or)29 b(a)g(normal)630 4521 y(cross)h(this)g(is)f(the)i(same)g(as)f +(the)h(host,)f(but)g(for)g(a)h(canadian)f(cross,)h(they)f(are)h(sep)s +(erate.)150 4681 y Fr(--name)e Fq(name)630 4790 y(name)44 +b Fv(is)37 b(a)i(name)g(for)f(the)h(particular)e(testing)h(target)j +(mac)m(hine)d(\(for)h(cross)f(testing\).)630 4900 y(If)31 +b(the)i(testing)f(target)h(has)f(IP)g(net)m(w)m(ork)g(supp)s(ort)f +(\(for)h(example,)g Fr(RPC)f Fv(or)h Fr(NFS)p Fv(\),)g(this)f(is)630 +5010 y(the)38 b(net)m(w)m(ork)g(name)g(for)f(the)h(target)h(itself.)61 +b(\()p Fq(name)43 b Fv(is)37 b Fn(not)i(the)h(c)-5 b(on\014gur)g(ation) +41 b(string)630 5119 y Fv(y)m(ou)26 b(sp)s(ecify)f(as)h(a)h(target)h +(with)c Fr(configure)p Fv(;)i(the)g(`)p Fr(--name)p Fv(')f(option)g +(names)h(a)h(particular)630 5229 y(target,)38 b(rather)e(than)f +(describing)e(a)j(class)f(of)g(targets.\))58 b(F)-8 b(or)36 +b(targets)h(that)f(connect)g(in)p eop +%%Page: 12 14 +12 13 bop 150 -116 a Fv(12)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)630 83 y(other)25 b(w)m(a)m(ys,)i(the) +e(meaning)g(of)g(the)g Fq(name)30 b Fv(string)24 b(dep)s(ends)f(on)i +(the)g(connection)g(metho)s(d.)630 193 y(See)31 b(Section)f(5.5)h +([Remote)h(targets)g(supp)s(orted],)d(page)i(32.)150 +352 y Fr(--name)e Fq(string)630 462 y Fv(Sp)s(ecify)24 +b(a)j(net)m(w)m(ork)g(name)f(of)g(testing)h(target)g(or)f(its)g(host.) +39 b(The)26 b(particular)e(names)i(that)630 571 y(are)f(meaningful)e +(with)g(`)p Fr(--name)p Fv(')h(will)e(dep)s(end)h(on)h(y)m(our)h(site)g +(con\014guration,)g(and)f(on)h(the)630 681 y(connection)31 +b(proto)s(col:)42 b(for)31 b(example,)g Fr(tip)f Fv(connections)h +(require)e(names)i(from)g(a)g(serial)630 790 y(line)24 +b(con\014guration)i(\014le)f(\(usually)f(called)h(`)p +Fr(/etc/remote)p Fv('\),)g(while)g Fr(telnet)f Fv(connections)630 +900 y(use)30 b(IP)g(hostnames.)150 1059 y Fr(--objdir)e +Fq(path)630 1169 y Fv(Use)45 b Fq(path)g Fv(as)g(the)g(top)g(directory) +f(con)m(taining)g(an)m(y)h(auxiliary)e(compiled)g(test)i(co)s(de.)630 +1279 y(This)28 b(defaults)i(to)h(`)p Fr(.)p Fv('.)41 +b(Use)30 b(this)f(option)h(to)h(lo)s(cate)g(pre-compiled)e(test)i(co)s +(de.)41 b(Y)-8 b(ou)31 b(can)630 1388 y(normally)e(prepare)g(an)m(y)i +(auxiliary)d(\014les)h(needed)h(with)g Fr(make)p Fv(.)150 +1548 y Fr(--outdir)e Fq(path)630 1657 y Fv(W)-8 b(rite)28 +b(output)e(logs)h(in)f(directory)h Fq(path)p Fv(.)39 +b(The)27 b(default)f(is)h(`)p Fr(.)p Fv(',)h(the)f(directory)g(where)g +(y)m(ou)630 1767 y(start)k Fr(runtest)p Fv(.)39 b(This)29 +b(option)h(a\013ects)i(only)e(the)h(summary)e(and)h(the)h(detailed)e +(log)i(\014les)630 1876 y(`)p Fq(to)s(ol)p Fr(.sum)p +Fv(')k(and)g(`)p Fq(to)s(ol)p Fr(.log)p Fv('.)57 b(The)35 +b(DejaGn)m(u)i(debug)e(log)h(`)p Fr(dbg.log)p Fv(')e(alw)m(a)m(ys)j +(app)s(ears)630 1986 y(\(when)30 b(requested\))g(in)f(the)i(lo)s(cal)f +(directory)-8 b(.)150 2145 y Fr(--reboot)96 b Fv(Reb)s(o)s(ot)27 +b(the)g(target)i(b)s(oard)d(when)g Fr(runtest)f Fv(initializes.)36 +b(Usually)-8 b(,)27 b(when)f(running)e(tests)630 2255 +y(on)33 b(a)h(separate)g(target)g(b)s(oard,)g(it)e(is)h(safer)g(to)h +(reb)s(o)s(ot)f(the)g(target)i(to)f(b)s(e)e(certain)h(of)h(its)630 +2364 y(state.)42 b(Ho)m(w)m(ev)m(er,)33 b(when)c(dev)m(eloping)h(test)h +(scripts,)e(reb)s(o)s(oting)h(tak)m(es)h(a)g(lot)g(of)f(time.)150 +2524 y Fr(--srcdir)e Fq(path)630 2633 y Fv(Use)40 b Fq(path)f +Fv(as)h(the)g(top)g(directory)f(for)g(test)i(scripts)d(to)i(run.)67 +b Fr(runtest)38 b Fv(lo)s(oks)h(in)f(this)630 2743 y(directory)27 +b(for)h(an)m(y)g(sub)s(directory)d(whose)j(name)f(b)s(egins)f(with)h +(the)h(to)s(olname)f(\(sp)s(eci\014ed)630 2853 y(with)32 +b(`)p Fr(--tool)p Fv('\).)49 b(F)-8 b(or)34 b(instance,)g(with)e(`)p +Fr(--tool)d(gdb)p Fv(',)34 b Fr(runtest)d Fv(uses)i(tests)h(in)f(sub)s +(di-)630 2962 y(rectories)i(`)p Fr(gdb.*)p Fv(')e(\(with)h(the)g(usual) +f(shell-lik)m(e)g(\014lename)g(expansion\).)53 b(If)34 +b(y)m(ou)g(do)h(not)630 3072 y(use)j(`)p Fr(--srcdir)p +Fv(',)g Fr(runtest)e Fv(lo)s(oks)h(for)h(test)h(directories)e(under)f +(the)i(curren)m(t)g(w)m(orking)630 3181 y(directory)-8 +b(.)150 3341 y Fr(--strace)28 b Fq(n)630 3450 y Fv(T)-8 +b(urn)21 b(on)g(in)m(ternal)g(tracing)h(for)g Fr(expect)p +Fv(,)g(to)h Fq(n)e Fv(lev)m(els)g(deep.)38 b(By)22 b(adjusting)f(the)h +(lev)m(el,)i(y)m(ou)630 3560 y(can)g(con)m(trol)g(the)f(exten)m(t)i(to) +f(whic)m(h)e(y)m(our)i(output)f(expands)f(m)m(ulti-lev)m(el)g(Tcl)h +(statemen)m(ts.)630 3670 y(This)h(allo)m(ws)h(y)m(ou)h(to)g(ignore)g +(some)g(lev)m(els)f(of)h Fr(case)e Fv(or)i Fr(if)f Fv(statemen)m(ts.)41 +b(Eac)m(h)26 b(pro)s(cedure)630 3779 y(call)k(or)g(con)m(trol)h +(structure)f(coun)m(ts)h(as)f(one)h(\\lev)m(el".)630 +3914 y(The)49 b(output)h(is)f(recorded)g(in)g(the)h(same)g(\014le,)k(`) +p Fr(dbg.log)p Fv(',)f(used)c(for)h(output)f(from)630 +4023 y(`)p Fr(--debug)p Fv('.)150 4183 y Fr(--target)28 +b Fq(string)630 4292 y Fv(Use)j(this)f(option)h(to)h(o)m(v)m(erride)f +(the)g(default)f(setting)h(\(running)e(nativ)m(e)i(tests\).)44 +b Fq(string)38 b Fv(is)630 4402 y(a)29 b(full)e(con\014guration)h +(\\triple")g(name)1955 4369 y Fp(1)2021 4402 y Fv(as)h(used)f(b)m(y)h +Fr(configure)p Fv(.)38 b(This)27 b(option)h(c)m(hanges)630 +4511 y(the)43 b(con\014guration)f Fr(runtest)f Fv(uses)h(for)h(the)g +(default)f(to)s(ol)g(names,)k(and)c(other)h(setup)630 +4621 y(information.)59 b(See)37 b(section)g(\\Using)g +Fr(configure)p Fv(")e(in)g Fq(Cygn)m(us)h(con\014gure)5 +b Fv(,)39 b(for)e(details)630 4731 y(ab)s(out)30 b Fr(configure)e +Fv(names.)p 150 4829 1200 4 v 192 4895 a Fp(1)275 4928 +y Fv(Con\014guration)h(triples)f(ha)m(v)m(e)k(the)e(form)g(`)p +Fq(cpu)p Fr(-)p Fq(v)m(endor)p Fr(-)p Fq(os)t Fv('.)p +eop +%%Page: 13 15 +13 14 bop 150 -116 a Fv(Chapter)30 b(3:)41 b(Using)29 +b Fr(runtest)2453 b Fv(13)150 83 y Fr(--verbose)150 193 +y(-v)384 b Fv(T)-8 b(urns)32 b(on)h(more)h(output.)50 +b(Rep)s(eating)33 b(this)f(option)h(increases)g(the)h(amoun)m(t)g(of)f +(output)630 302 y(displa)m(y)m(ed.)65 b(Lev)m(el)39 b(one)g(\(`)p +Fr(-v)p Fv('\))h(is)e(simply)e(test)k(output.)66 b(Lev)m(el)40 +b(t)m(w)m(o)g(\(`)p Fr(-v)30 b(-v)p Fv('\))39 b(sho)m(ws)630 +412 y(messages)46 b(on)f(options,)k(con\014guration,)g(and)c(pro)s +(cess)f(con)m(trol.)86 b(V)-8 b(erb)s(ose)46 b(messages)630 +521 y(app)s(ear)31 b(in)e(the)j(detailed)e(\(`)p Fr(*.log)p +Fv('\))h(log)g(\014le,)g(but)f(not)i(in)e(the)h(summary)f(\(`)p +Fr(*.sum)p Fv('\))h(log)630 631 y(\014le.)150 790 y Fr(--version)150 +900 y(-V)384 b Fv(Prin)m(ts)26 b(out)h(the)g(v)m(ersion)g(n)m(um)m(b)s +(ers)f(of)h(DejaGn)m(u,)i Fr(expect)c Fv(and)h(Tcl,)i(and)e(exits)h +(without)630 1010 y(running)h(an)m(y)i(tests.)150 1169 +y Fr(-D0)150 1279 y(-D1)336 b Fv(Start)26 b(the)g(in)m(ternal)e(Tcl)h +(debugger.)39 b(The)25 b(Tcl)g(debugger)h(supp)s(orts)e(breakp)s(oin)m +(ts,)h(single)630 1388 y(stepping,)42 b(and)e(other)g(common)h +(debugging)e(activities.)70 b(\(See)41 b Fq(A)g(Debugger)g(for)f(Tcl) +630 1498 y(Applications)32 b Fv(b)m(y)e(Don)h(Lib)s(es.)1722 +1465 y Fp(2)1758 1498 y Fv(\))630 1632 y(If)c(y)m(ou)h(sp)s(ecify)e(`)p +Fr(-D1)p Fv(',)j(the)e Fr(expect)f Fv(shell)g(stops)i(at)g(a)g(breakp)s +(oin)m(t)f(as)h(so)s(on)f(as)h(DejaGn)m(u)630 1742 y(in)m(v)m(ok)m(es)j +(it.)630 1876 y(If)i(y)m(ou)h(sp)s(ecify)f(`)p Fr(-D0)p +Fv(',)h(DejaGn)m(u)h(starts)f(as)g(usual,)f(but)g(y)m(ou)h(can)g(en)m +(ter)g(the)g(debugger)630 1986 y(b)m(y)c(sending)f(an)h(in)m(terrupt)f +(\(e.g.)42 b(b)m(y)31 b(t)m(yping)2219 1983 y Fk(h)p +2244 1930 106 4 v 2244 1986 a Fj(C-c)p 2244 2001 V 2345 +1983 a Fk(i)2375 1986 y Fv(\).)p 150 5099 1200 4 v 192 +5165 a Fp(2)275 5198 y Fv(Distributed)d(in)h(P)m(ostScript)h(form)g +(with)f Fr(expect)g Fv(as)h(the)h(\014le)275 5308 y(`)p +Fr(expect/tcl-debug.ps)p Fv('.)p eop +%%Page: 14 16 +14 15 bop 150 -116 a Fv(14)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)p eop +%%Page: 15 17 +15 16 bop 150 -116 a Fv(Chapter)30 b(4:)41 b(Setting)30 +b Fr(runtest)e Fv(defaults)2055 b(15)150 100 y Fs(4)80 +b(Setting)53 b Fl(runtest)g Fs(defaults)275 334 y Fv(The)46 +b(site)g(con\014guration)h(\014le,)j(`)p Fr(site.exp)p +Fv(',)f(captures)e(con\014guration-dep)s(enden)m(t)e(v)-5 +b(alues)47 b(and)150 443 y(propagates)36 b(them)f(to)h(the)g(DejaGn)m +(u)g(test)g(en)m(vironmen)m(t)f(using)f(Tcl)g(v)-5 b(ariables.)54 +b(This)33 b(ties)i(the)h(De-)150 553 y(jaGn)m(u)30 b(test)i(scripts)d +(in)m(to)h(the)h Fr(configure)d Fv(and)h Fr(make)h Fv(programs.)275 +687 y(DejaGn)m(u)h(supp)s(orts)d(more)j(than)f(one)h(`)p +Fr(site.exp)p Fv(')d(\014le.)40 b(The)30 b(m)m(ultiple)e(instances)i +(of)h(`)p Fr(site.exp)p Fv(')150 797 y(are)f(loaded)f(in)g(a)h(\014xed) +f(order)g(built)f(in)m(to)h(DejaGn)m(u)i(\(the)f(more)g(lo)s(cal)f +(last\).)41 b(The)29 b(\014rst)g(\014le)g(loaded)g(is)150 +907 y(the)i(optional)e Fr(~/.dejagnurc)p Fv(,)e(then)j(the)h(lo)s(cal)f +(\014les,)f(and)h(\014nally)e(the)j(global)f(\014le.)199 +1041 y(1.)61 b(There)23 b(is)f(am)i(optional)e(\\master")j(`)p +Fr(site.exp)p Fv(',)e(capturing)g(con\014guration)f(v)-5 +b(alues)23 b(that)h(apply)e(to)330 1151 y(DejaGn)m(u)32 +b(across)g(the)f(b)s(oard,)g(in)f(eac)m(h)i(con\014guration-sp)s +(eci\014c)e(sub)s(directory)f(of)j(the)f(DejaGn)m(u)330 +1260 y(library)g(directory)-8 b(.)49 b Fr(runtest)31 +b Fv(loads)i(these)g(v)-5 b(alues)33 b(\014rst.)48 b(See)34 +b(App)s(endix)c(A)j([Con\014guring)f(and)330 1370 y(Installing)h +(DejaGn)m(u],)38 b(page)f(49.)57 b(The)35 b(master)h(`)p +Fr(site.exp)p Fv(')e(con)m(tains)i(the)f(default)g(v)-5 +b(alues)35 b(for)330 1479 y(all)f(targets)j(and)d(hosts)h(supp)s(orted) +f(b)m(y)h(DejaGn)m(u.)56 b(This)33 b(master)j(\014le)e(is)g(iden)m +(ti\014ed)g(b)m(y)h(setting)330 1589 y(the)27 b(en)m(vironmen)m(t)g(v) +-5 b(ariable)26 b Fr(DEJAGNU)f Fv(to)j(the)g(name)f(of)g(the)h(\014le.) +39 b(This)25 b(is)h(also)h(refered)g(to)h(as)g(the)330 +1699 y(\\global")j(con\014g)f(\014le.)199 1833 y(2.)61 +b(An)m(y)31 b(directory)f(con)m(taining)g(a)h(con\014gured)f(test)h +(suite)f(also)g(has)h(a)g(`)p Fr(site.exp)p Fv(',)e(capturing)g(con-) +330 1943 y(\014guration)g(v)-5 b(alues)29 b(sp)s(eci\014c)f(to)i(the)g +(to)s(ol)g(under)e(test.)41 b(Since)29 b Fr(runtest)f +Fv(loads)h(these)h(v)-5 b(alues)29 b(last,)330 2052 y(the)40 +b(individual)35 b(test)40 b(con\014guration)g(can)f(either)h(rely)e(on) +i(and)f(use,)j(or)e(o)m(v)m(erride,)i(an)m(y)e(of)g(the)330 +2162 y(global)30 b(v)-5 b(alues)29 b(from)h(the)h(\\master")g(`)p +Fr(site.exp)p Fv('.)330 2296 y(Y)-8 b(ou)24 b(can)g(usually)e(generate) +j(or)f(up)s(date)f(the)h(testsuite)g(`)p Fr(site.exp)p +Fv(')e(b)m(y)i(t)m(yping)f(`)p Fr(make)30 b(site.exp)p +Fv(')330 2406 y(in)f(the)i(test)g(suite)f(directory)-8 +b(,)30 b(after)h(the)g(test)g(suite)f(is)f(con\014gured.)199 +2540 y(3.)61 b(Y)-8 b(ou)34 b(can)h(also)e(ha)m(v)m(e)j(a)e(\014le)f +(in)g(y)m(our)g(home)h(directory)g(called)f Fr(.dejagnurc)p +Fv(.)48 b(This)33 b(gets)h(loaded)330 2650 y(\014rst)j(b)s(efore)g(the) +g(other)h(con\014g)f(\014les.)61 b(Usually)36 b(this)g(is)h(used)f(for) +h(p)s(ersonal)f(stu\013,)j(lik)m(e)e(setting)330 2760 +y Fr(all_flag)28 b Fv(so)j(all)e(the)i(output)f(gets)h(prin)m(ted,)e +(or)h(v)m(erb)s(osit)m(y)h(lev)m(els.)275 2919 y(Y)-8 +b(ou)29 b(can)g(further)f(o)m(v)m(erride)h(the)g(default)g(v)-5 +b(alues)28 b(in)g(a)h(user-editable)f(section)h(of)g(an)m(y)g(`)p +Fr(site.exp)p Fv(',)150 3029 y(or)h(b)m(y)h(setting)f(v)-5 +b(ariables)29 b(on)h(the)h Fr(runtest)d Fv(command)i(line.)150 +3253 y Fi(4.0.1)63 b(Con\014g)41 b(V)-10 b(ariables)275 +3445 y Fv(DejaGn)m(u)35 b(uses)f(a)h(named)g(arra)m(y)g(in)e(Tcl)h(to)i +(hold)d(all)h(the)h(info)e(for)i(eac)m(h)h(mac)m(hine.)53 +b(In)34 b(the)h(case)150 3555 y(of)30 b(a)g(canadian)f(cross,)h(this)e +(means)i(host)f(information)f(as)i(w)m(ell)f(as)g(target)j +(information.)38 b(The)29 b(named)150 3665 y(arra)m(y)38 +b(is)e(called)g Fr(target_info)p Fv(,)g(and)g(it)h(has)g(t)m(w)m(o)h +(indices.)59 b(The)36 b(follo)m(wing)g(\014elds)f(are)j(part)f(of)g +(the)150 3774 y(arra)m(y)-8 b(.)150 3934 y Fr(name)288 +b Fv(The)36 b(name)g(of)g(the)g(target.)59 b(\(mostly)36 +b(for)g(error)g(messages\))h(This)d(should)g(also)i(b)s(e)g(the)630 +4043 y(string)24 b(used)g(for)h(this)e(target's)k(arra)m(y)-8 +b(.)40 b(It)25 b(should)e(also)i(b)s(e)f(the)h(same)g(as)h(the)f(link)m +(er)e(script)630 4153 y(so)38 b(w)m(e)g(can)g(\014nd)e(them)h +(dynamically)-8 b(.)60 b(This)36 b(should)g(b)s(e)g(the)i(same)g(as)g +(the)f(argumen)m(t)630 4262 y(used)30 b(for)g Fr(push_target{})p +Fv(.)150 4422 y Fr(ldflags)144 b Fv(This)45 b(is)g(the)i(link)m(er)d +(\015ags)j(required)e(to)i(pro)s(duce)e(a)i(fully)d(link)m(ed)h +(executable.)89 b(F)-8 b(or)630 4531 y Fr(libgloss)28 +b Fv(supp)s(orted)h(targets)i(this)f(is)f(usually)f(just)i(the)h(name)f +(of)h(the)f(link)m(er)f(script.)150 4691 y Fr(config)192 +b Fv(The)37 b(target)j(canonical)d(for)h(this)e(target.)65 +b(This)36 b(is)h(used)g(b)m(y)g(some)i(init)d(\014les)g(to)j(mak)m(e) +630 4800 y(sure)30 b(the)g(target)i(is)e(supp)s(orted.)150 +4960 y Fr(cflags)192 b Fv(The)30 b(\015ags)g(required)f(to)i(pro)s +(duce)e(an)i(ob)5 b(ject)31 b(\014le)e(from)h(a)h(source)g(\014le.)150 +5119 y Fr(connect)144 b Fv(This)29 b(is)h(the)h(connectmo)s(de)g(for)g +(this)e(target.)44 b(This)29 b(is)g(for)i(b)s(oth)f(IP)g(and)h(serial)e +(connec-)630 5229 y(tions.)40 b(T)m(ypically)29 b(this)g(is)g(either)h +Fr(telnet)p Fv(,)f Fr(rlogin)p Fv(,)g(or)h Fr(rsh)p Fv(.)p +eop +%%Page: 16 18 +16 17 bop 150 -116 a Fv(16)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 83 y Fr(target)192 +b Fv(This)26 b(is)i(the)g(hostname)h(of)f(the)h(target.)41 +b(This)27 b(is)g(for)h(TCP/IP)g(based)g(connections,)h(and)630 +193 y(is)g(also)i(used)e(for)h(v)m(ersion)g(of)h(tip)e(that)i(use)f +(/etc/remote.)150 352 y Fr(serial)192 b Fv(This)29 b(is)g(the)i(serial) +e(p)s(ort.)40 b(This)28 b(is)i(t)m(ypically)f(/dev/tt)m(y?)42 +b(or)31 b(com?:.)150 511 y Fr(netport)144 b Fv(This)29 +b(is)g(the)i(IP)f(p)s(ort.)40 b(This)29 b(is)g(commonly)h(used)g(for)g +(telneting)g(to)h(target)h(b)s(oards)d(that)630 621 y(are)g(connected)g +(to)g(a)f(terminal)f(serv)m(er.)40 b(In)28 b(that)h(case)g(the)f(IP)g +(p)s(ort)g(sp)s(eci\014es)f(the)h(whic)m(h)630 731 y(serial)h(p)s(ort)h +(to)h(use.)150 890 y Fr(baud)288 b Fv(This)29 b(is)g(the)i(baud)e(rate) +i(for)f(a)h(serial)e(p)s(ort)h(connection.)150 1049 y +Fr(x10)336 b Fv(This)29 b(is)h(the)h(parameters)h(for)f(an)f(x10)i(con) +m(troller.)43 b(These)30 b(are)i(simple)d(devices)h(that)i(let)630 +1159 y(us)e(p)s(o)m(w)m(er)g(cycle)h(or)f(reset)h(a)g(target)h(b)s +(oard)d(remotely)-8 b(.)150 1318 y Fr(fileid)192 b Fv(This)29 +b(is)g(the)i(\014leid)d(or)i(spa)m(wn)g(id)f(of)h(of)h(the)g +(connection.)150 1478 y Fr(prompt)192 b Fv(a)31 b(glob)f(st)m(yle)g +(pattern)h(to)g(recognize)g(the)g(prompt.)150 1637 y +Fr(abbrev)192 b Fv(abbreviation)29 b(for)h(to)s(ol)h(init)d(\014les.) +150 1797 y Fr(ioport)192 b Fv(This)30 b(is)h(the)h(p)s(ort)f(for)h(I/O) +g(on)g(dual)e(p)s(ort)i(systems.)45 b(In)31 b(this)g(con\014guration,)h +(the)g(main)630 1906 y(serial)f(p)s(ort)g Fr(0)h Fv(is)f(usually)f +(used)h(for)h(stdin)e(and)i(stdout,)h(whic)m(h)d(the)j(second)f(serial) +f(p)s(ort)630 2016 y(can)g(b)s(e)e(used)h(for)g(debugging.)275 +2175 y(The)d(\014rst)f(index)h(in)m(to)g(the)h(arra)m(y)g(is)f(the)g +(same)h(v)-5 b(alue)27 b(as)h(used)f(in)f(the)i Fr(name)e +Fv(\014eld.)39 b(This)26 b(is)g(usually)150 2285 y(a)33 +b(short)g(v)m(ersion)f(of)h(the)g(name)g(of)g(the)g(target)h(b)s(oard.) +47 b(F)-8 b(or)33 b(an)g(example,)g(here's)g(the)g(settings)g(I)f(use) +150 2394 y(for)f(m)m(y)h Fr(Motorola's)d(IDP)i Fv(b)s(oard)g(and)g(m)m +(y)h Fr(Motorola)d Fv(6U)j(VME)g Fr(MVME135-1)d Fv(b)s(oard.)44 +b(\(b)s(oth)31 b(m68k)150 2504 y(targets\))150 2588 y +Fm(\013)p 200 2588 3554 4 v 3553 w(\010)p 150 4758 4 +2123 v 178 2741 a Fr(#)48 b(IDP)f(board)178 2845 y(set)g +(target_info\(idp,name\))328 b("idp")178 2948 y(set)47 +b(target_info\(idp,ldflags\))184 b("-Tidp.ld")178 3052 +y(set)47 b(target_info\(idp,config\))232 b(m68k-unknown-aout)178 +3156 y(set)47 b(target_info\(idp,cflags\))232 b("")178 +3260 y(set)47 b(target_info\(idp,connect\))184 b(telnet)178 +3363 y(set)47 b(target_info\(idp,target\))232 b("s7")178 +3467 y(set)47 b(target_info\(idp,serial\))232 b("tstty7")178 +3571 y(set)47 b(target_info\(idp,netport\))184 b("wharfrat:1007")178 +3675 y(set)47 b(target_info\(idp,baud\))328 b("9600")178 +3779 y(#)48 b(MVME)e(135)h(board)178 3882 y(set)g +(target_info\(idp,name\))328 b("mvme")178 3986 y(set)47 +b(target_info\(idp,ldflags\))184 b("-Tmvme.ld")178 4090 +y(set)47 b(target_info\(idp,config\))232 b(m68k-unknown-aout)178 +4194 y(set)47 b(target_info\(idp,cflags\))232 b("")178 +4297 y(set)47 b(target_info\(idp,connect\))184 b(telnet)178 +4401 y(set)47 b(target_info\(idp,target\))232 b("s8")178 +4505 y(set)47 b(target_info\(idp,serial\))232 b("tstty8")178 +4609 y(set)47 b(target_info\(idp,netport\))184 b("wharfrat:1008")178 +4713 y(set)47 b(target_info\(idp,baud\))328 b("9600")p +3803 4758 V 150 4810 a Fm(\012)p 200 4810 3554 4 v 3553 +w(\011)275 4954 y Fv(DejaGn)m(u)37 b(can)g(use)g(this)f(information)f +(to)i(switc)m(h)g(b)s(et)m(w)m(een)g(m)m(ultiple)e(targets)j(in)d(one)i +(test)h(run.)150 5064 y(This)29 b(is)g(done)h(through)g(the)g(use)g(of) +h(the)g Fr(push_target)c Fv(pro)s(cedure,)i(whic)m(h)g(is)h(discussed)e +(elsewhere.)275 5199 y(This)35 b(arra)m(y)j(can)f(also)h(hold)d +(information)h(for)h(a)h(remote)g(host,)h(whic)m(h)d(is)g(used)h(when)f +(testing)i(a)150 5308 y(candain)d(cross.)59 b(In)35 b(this)g(case,)k +(the)e(only)e(thing)g(di\013eren)m(t)h(is)f(the)i(index)e(is)g(just)h +Fr(host)p Fv(.)57 b(Here's)37 b(the)p eop +%%Page: 17 19 +17 18 bop 150 -116 a Fv(Chapter)30 b(4:)41 b(Setting)30 +b Fr(runtest)e Fv(defaults)2055 b(17)150 83 y(settings)32 +b(I)f(use)h(to)g(run)e(tests)j(on)f(m)m(y)f(NT)h(mac)m(hine)f(while)f +(running)f(DejaGn)m(u)k(on)e(a)h(Unix)f(mac)m(hine.)150 +193 y(\(in)e(this)h(case)h(a)g(Lin)m(ux)e(b)s(o)m(x\))150 +276 y Fm(\013)p 200 276 3554 4 v 3553 w(\010)p 150 793 +4 470 v 178 437 a Fr(set)47 b(target_info\(host,name\))280 +b("nt-host")178 541 y(set)47 b(target_info\(host,config\))184 +b("386-unknown-winnt")178 645 y(set)47 b(target_info\(host,connect\)) +136 b("telnet")178 748 y(set)47 b(target_info\(host,target\))184 +b("ripple")p 3803 793 V 150 845 a Fm(\012)p 200 845 3554 +4 v 3553 w(\011)275 990 y Fv(There)31 b(is)f(more)i(info)f(on)g(ho)m(w) +h(to)g(use)g(these)g(v)-5 b(ariables)30 b(in)g(the)i(sections)g(on)f +(the)h(con\014g)g(\014les.)44 b(See)150 1100 y(Chapter)30 +b(4)h([Con\014guration)e(Files],)h(page)h(18.)275 1234 +y(In)37 b(the)h(user)g(editable)f(second)h(section)h(of)f(`)p +Fr(site.exp)p Fv(',)h(y)m(ou)f(can)h(not)f(only)g(o)m(v)m(erride)g(the) +g(con-)150 1344 y(\014guration)32 b(v)-5 b(ariables)31 +b(captured)h(in)g(the)h(\014rst)e(section,)j(but)e(also)h(sp)s(ecify)e +(default)h(v)-5 b(alues)32 b(for)g(all)g(the)150 1454 +y Fr(runtest)d Fv(command)h(line)f(options.)42 b(Sa)m(v)m(e)32 +b(for)e(`)p Fr(--debug)p Fv(',)g(`)p Fr(--help)p Fv(',)g(and)g(`)p +Fr(--version)p Fv(',)f(eac)m(h)j(com-)150 1563 y(mand)j(line)f(option)i +(has)g(an)g(asso)s(ciated)g(Tcl)f(v)-5 b(ariable.)57 +b(Use)36 b(the)g(Tcl)f Fr(set)g Fv(command)h(to)h(sp)s(ecify)e(a)150 +1673 y(new)j(default)h(v)-5 b(alue)38 b(\(as)h(for)g(the)g +(con\014guration)g(v)-5 b(ariables\).)65 b(The)38 b(follo)m(wing)g +(table)h(describ)s(es)e(the)150 1782 y(corresp)s(ondence)j(b)s(et)m(w)m +(een)h(command)g(line)d(options)i(and)g(v)-5 b(ariables)39 +b(y)m(ou)i(can)g(set)g(in)e(`)p Fr(site.exp)p Fv('.)150 +1892 y(See)31 b(Chapter)e(3)i([Running)d(the)j(T)-8 b(ests],)31 +b(page)g(9,)g(for)g(explanations)e(of)h(the)h(command-line)e(options.) +350 2033 y Fn(runtest)187 b(Tcl)379 2143 y(option)h(variable)395 +b(description)p 150 2178 3600 4 v 341 2288 a Fr(--all)233 +b(all)p 964 2288 29 4 v 33 w(flag)333 b Fv(displa)m(y)29 +b(all)g(test)i(results)e(if)h(set)293 2397 y Fr(--baud)233 +b(baud)510 b Fv(set)31 b(the)g(default)e(baud)g(rate)j(to)f(something) +1516 2507 y(other)g(than)f(9600.)150 2611 y Fr(--connect)232 +b(connectmode)174 b Fv(`)p Fr(rlogin)p Fv(',)30 b(`)p +Fr(telnet)p Fv(',)f(`)p Fr(rsh)p Fv(',)h(`)p Fr(kermit)p +Fv(',)g(`)p Fr(tip)p Fv(',)1516 2721 y(or)h(`)p Fr(mondfe)p +Fv(')293 2840 y Fr(--mail)233 b(mailing)p 1156 2840 V +32 w(list)142 b Fv(address)30 b(list)f(for)h(mailing)e(test)j(output) +293 2949 y Fr(--name)233 b(targetname)222 b Fv(net)m(w)m(ork)31 +b(name)g(of)f(testing)h(target)h(or)e(its)1516 3059 y(host)198 +3177 y Fr(--outdir)232 b(outdir)414 b Fv(directory)30 +b(for)g(`)p Fq(to)s(ol)p Fr(.sum)p Fv(')g(and)g(`)p Fq(to)s(ol)p +Fr(.log)p Fv(')198 3287 y Fr(--objdir)232 b(objdir)414 +b Fv(directory)30 b(for)g(compiled)f(binaries)198 3397 +y Fr(--reboot)232 b(reboot)414 b Fv(reb)s(o)s(ot)30 b(the)h(target)h +(if)d(set)i(to)g Fr("1")p Fv(;)f(do)g(not)1516 3506 y(reb)s(o)s(ot)g +(if)g(set)h(to)g Fr("0")e Fv(\(the)i(default\))198 3625 +y Fr(--srcdir)232 b(srcdir)414 b Fv(directory)30 b(of)h(test)g(sub)s +(directories)198 3734 y Fr(--strace)232 b(tracelevel)222 +b Fv(a)31 b(n)m(um)m(b)s(er:)44 b(Tcl)30 b(trace)i(depth)293 +3844 y Fr(--tool)233 b(tool)510 b Fv(name)31 b(of)f(to)s(ol)g(to)i +(test;)f(iden)m(ti\014es)e(init,)g(test)1516 3954 y(sub)s(dir)150 +4058 y Fr(--verbose)232 b(verbose)366 b Fv(v)m(erb)s(osit)m(y)30 +b(lev)m(el.)46 b(As)30 b(option,)g(use)g(m)m(ultiple)1516 +4167 y(times;)g(as)h(v)-5 b(ariable,)29 b(set)i(a)g(n)m(um)m(b)s(er,)e +(0)i(or)1516 4277 y(greater)198 4381 y Fr(--target)232 +b(target)p 1108 4381 V 32 w(triplet)46 b Fv(The)30 b(canonical)g +(con\014guration)g(string)f(for)1516 4491 y(the)i(target.)293 +4595 y Fr(--host)233 b(host)p 1012 4595 V 33 w(triplet)141 +b Fv(The)30 b(canonical)g(con\014guration)g(string)f(for)1516 +4705 y(the)i(host.)245 4809 y Fr(--build)233 b(build)p +1060 4809 V 33 w(triplet)93 b Fv(The)30 b(canonical)g(con\014guration)g +(string)f(for)1516 4919 y(the)i(build)c(host.)p eop +%%Page: 18 20 +18 19 bop 150 -116 a Fv(18)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 83 y Fi(4.0.2)63 +b(Master)41 b(Con\014g)h(File)275 276 y Fv(The)28 b(master)i(con\014g)g +(\014le)e(is)h(where)g(all)f(the)i(target)g(sp)s(eci\014c)f(con\014g)g +(v)-5 b(ariables)28 b(get)j(set)f(for)f(a)h(whole)150 +385 y(site)39 b(get)h(set.)67 b(The)38 b(idea)g(is)g(that)i(for)f(a)g +(cen)m(tralized)g(testing)g(lab)f(where)g(p)s(eople)g(ha)m(v)m(e)i(to)g +(share)f(a)150 495 y(target)31 b(b)s(et)m(w)m(een)f(m)m(ultiple)d(dev)m +(elop)s(ers.)39 b(There)29 b(are)h(settings)f(for)g(b)s(oth)g(remote)h +(targets)g(and)f(remote)150 604 y(hosts.)51 b(Here's)35 +b(an)f(example)g(of)g(a)g(Master)h(Con\014g)e(File)g(\(also)i(called)e +(the)h(Global)f(con\014g)h(\014le\))g(for)g(a)150 714 +y Fn(c)-5 b(anadian)32 b(cr)-5 b(oss)p Fv(.)42 b(A)28 +b(canadian)f(cross)h(is)f(when)g(y)m(ou)i(build)c(and)i(test)i(a)f +(cross)g(compiler)f(on)h(a)g(mac)m(hine)150 824 y(other)j(than)f(the)g +(one)h(it's)f(to)h(b)s(e)f(hosted)g(on.)275 958 y(Here)f(w)m(e)g(ha)m +(v)m(e)h(the)f(con\014g)f(settings)h(for)f(our)h(California)d(o\016ce.) +41 b(Note)30 b(that)f(all)f(con\014g)h(v)-5 b(alues)28 +b(are)150 1068 y(site)36 b(dep)s(endan)m(t.)58 b(Here)36 +b(w)m(e)h(ha)m(v)m(e)h(t)m(w)m(o)f(sets)g(of)f(v)-5 b(alues)36 +b(that)h(w)m(e)g(use)e(for)i(testing)f(m68k-aout)i(cross)150 +1177 y(compilers.)56 b(As)36 b(b)s(oth)f(of)h(these)h(target)g(b)s +(oards)e(has)h(a)g(di\013eren)m(t)f(debugging)g(proto)s(col,)j(w)m(e)e +(test)h(on)150 1287 y(b)s(oth)30 b(of)g(them)h(in)e(sequence.)150 +1366 y Fm(\013)p 200 1366 3554 4 v 3553 w(\010)p 150 +4664 4 3252 v 178 1519 a Fr(global)46 b(CFLAGS)178 1622 +y(global)g(CXXFLAGS)178 1830 y(case)h("$target_triplet")c(in)k({)369 +1934 y({)h("native")d(})j({)560 2038 y(set)f(target_abbrev)d(unix)369 +2141 y(})369 2245 y({)k("m68*-unknown-aout")42 b(})48 +b({)560 2349 y(set)f(target_abbrev)712 b("rom68k")560 +2453 y(#)47 b(IDP)g(target)953 b(#)48 b(IDP)f(board)f(with)h(rom68k)f +(monitor)560 2556 y(set)h(target_info\(idp,name\))328 +b("idp")560 2660 y(set)47 b(target_info\(idp,ldflags\))184 +b("-Tidp.ld")560 2764 y(set)47 b(target_info\(idp,config\))232 +b(m68k-unknown-aout)560 2868 y(set)47 b(target_info\(idp,cflags\))232 +b("")560 2972 y(set)47 b(target_info\(idp,connect\))184 +b(telnet)560 3075 y(set)47 b(target_info\(idp,target\))232 +b("s7")560 3179 y(set)47 b(target_info\(idp,serial\))232 +b("tstty12")560 3283 y(set)47 b(target_info\(idp,netport\))184 +b("truckin:1007")560 3387 y(set)47 b(target_info\(idp,baud\))328 +b("9600")560 3490 y(#)47 b(MVME)g(target)905 b(#)48 b(Motorola)d(MVME)i +(135)g(with)f(BUG)h(monitor)560 3594 y(set)g(target_info\(mvme,name\)) +280 b("mvme")560 3698 y(set)47 b(target_info\(mvme,ldflags)o(\))137 +b("-Tmvme.ld")560 3802 y(set)47 b(target_info\(mvme,config\))184 +b(m68k-unknown-aout)560 3906 y(set)47 b(target_info\(mvme,cflags\))184 +b("")560 4009 y(set)47 b(target_info\(mvme,connect)o(\))137 +b(telnet)560 4113 y(set)47 b(target_info\(mvme,target\))184 +b("s4")560 4217 y(set)47 b(target_info\(mvme,serial\))184 +b("tstty8")560 4321 y(set)47 b(target_info\(mvme,netport)o(\))137 +b("truckin:1004")560 4424 y(set)47 b(target_info\(mvme,baud\))280 +b("9600")417 4528 y(})178 4632 y(})p 3803 4664 V 150 +4716 a Fm(\012)p 200 4716 3554 4 v 3553 w(\011)275 4861 +y Fv(In)27 b(this)g(case,)j(w)m(e)f(ha)m(v)m(e)h(supp)s(ort)c(for)i +(sev)m(eral)h(remote)g(hosts)g(for)f(our)g(m68k-aout)i(cross)e +(compiler.)150 4971 y(T)m(ypically)h(the)j(remote)g(Unix)e(hosts)h(run) +f(DejaGn)m(u)i(lo)s(cally)-8 b(,)31 b(but)f(w)m(e)i(also)f(use)g(them)g +(for)g(debugging)150 5080 y(the)c(testsuites)f(when)g(w)m(e)h(\014nd)e +(problems)g(in)g(running)f(on)j(remote)g(hosts.)40 b(Exp)s(ect)26 +b(w)m(on't)h(run)e(on)i(NT,)150 5190 y(so)j(DejaGn)m(u)h(is)e(run)f(on) +i(the)g(lo)s(cal)f(build)d(mac)m(hine,)k(and)g(it'll)e(connect)i(to)h +(the)f(NT)g(host)f(and)h(run)e(all)150 5300 y(the)j(tests)g(for)f(this) +f(cross)i(compiler)e(on)h(that)h(host.)p eop +%%Page: 19 21 +19 20 bop 150 -116 a Fv(Chapter)30 b(4:)41 b(Setting)30 +b Fr(runtest)e Fv(defaults)2055 b(19)390 52 y Fm(\013)p +440 52 3314 4 v 3313 w(\010)p 390 3063 4 2964 v 418 228 +a Fr(case)47 b("$host_triplet")c(in)48 b({)609 332 y("native")e({)609 +436 y(})609 540 y("i?86-*-linux*")e({)906 b(#)48 b(Linux)e(host)800 +643 y(set)h(target_info\(host,name\))280 b("linux-host")800 +747 y(set)47 b(target_info\(host,config\))184 b($host_triplet)800 +851 y(set)47 b(target_info\(host,connect)o(\))137 b(rlogin)800 +955 y(set)47 b(target_info\(host,target\))184 b(chinadoll)609 +1059 y(})609 1162 y("i?86-*-winnt)1094 b(#)48 b(NT)f(host)800 +1266 y(set)g(target_info\(host,name\))280 b("nt-host")800 +1370 y(set)47 b(target_info\(host,config\))184 b(i386-unknown-winnt)800 +1474 y(set)47 b(target_info\(host,connect)o(\))137 b(telnet)800 +1577 y(set)47 b(target_info\(host,target\))184 b(ripple)609 +1681 y(})609 1785 y("hppa*-hp-hpux*")43 b({)859 b(#)48 +b(HP-UX)e(host)800 1889 y(set)h(target_info\(host,name\))280 +b("hpux-host")800 1993 y(set)47 b(target_info\(host,config\))184 +b($host_triplet)800 2096 y(set)47 b(target_info\(host,connect)o(\))137 +b(rlogin)800 2200 y(set)47 b(target_info\(host,target\))184 +b(slipknot)800 2304 y(})609 2408 y("sparc-sun-sunos*")43 +b({)763 b(#)48 b(SunOS)e(\(sun4\))800 2511 y(set)h +(target_info\(host,name\))280 b("sunos-host")800 2615 +y(set)47 b(target_info\(host,config\))184 b($host_triplet)800 +2719 y(set)47 b(target_info\(host,connect)o(\))137 b(rlogin)800 +2823 y(set)47 b(target_info\(host,target\))184 b(darkstar)609 +2927 y(})418 3030 y(})p 3803 3063 V 390 3115 a Fm(\012)p +440 3115 3314 4 v 3313 w(\011)150 3339 y Fi(4.0.3)63 +b(Lo)s(cal)40 b(Con\014g)i(File)275 3531 y Fv(It)33 b(is)g(usually)e +(more)j(con)m(v)m(enien)m(t)h(to)f(k)m(eep)h(these)f(\\man)m(ual)f(o)m +(v)m(errides")i(in)d(the)i(`)p Fr(site.exp)p Fv(')e(lo)s(cal)150 +3641 y(to)f(eac)m(h)h(test)f(directory)-8 b(,)30 b(rather)h(than)f(in)f +(the)h(\\master")i(`)p Fr(site.exp)p Fv(')d(in)g(the)h(DejaGn)m(u)i +(library)-8 b(.)275 3776 y(All)36 b(lo)s(cal)g(`)p Fr(site.exp)p +Fv(')g(usually)f(\014les)i(ha)m(v)m(e)h(t)m(w)m(o)h(sections,)h +(separated)e(b)m(y)f(commen)m(t)h(text.)63 b(The)150 +3885 y(\014rst)23 b(section)i(is)e(the)h(part)g(that)g(is)g(generated)h +(b)m(y)f Fr(make)p Fv(.)37 b(It)24 b(is)f(essen)m(tially)g(a)i +(collection)f(of)g(Tcl)f(v)-5 b(ariable)150 3995 y(de\014nitions)30 +b(based)j(on)g(`)p Fr(Makefile)p Fv(')e(en)m(vironmen)m(t)h(v)-5 +b(ariables.)47 b(Since)32 b(they)h(are)g(generated)h(b)m(y)f +Fr(make)p Fv(,)150 4104 y(they)27 b(con)m(tain)h(the)f(v)-5 +b(alues)27 b(as)g(sp)s(eci\014ed)f(b)m(y)h Fr(configure)p +Fv(.)37 b(\(Y)-8 b(ou)28 b(can)f(also)g(customize)h(these)g(v)-5 +b(alues)26 b(b)m(y)150 4214 y(using)d(the)h(`)p Fr(--site)p +Fv(')e(option)i(to)h Fr(configure)p Fv(.\))36 b(In)23 +b(particular,)h(this)f(section)h(con)m(tains)g(the)h(`)p +Fr(Makefile)p Fv(')150 4323 y(v)-5 b(ariables)34 b(for)h(host)h(and)f +(target)i(con\014guration)e(data.)57 b(Do)36 b(not)g(edit)f(this)f +(\014rst)h(section;)j(if)d(y)m(ou)h(do,)150 4433 y(y)m(our)30 +b(c)m(hanges)i(are)e(replaced)g(next)h(time)f(y)m(ou)h(run)e +Fr(make)p Fv(.)275 4568 y(The)g(\014rst)h(section)h(starts)f(with:)150 +4629 y Fm(\013)p 200 4629 3554 4 v 3553 w(\010)p 150 +5014 4 338 v 178 4782 a Fr(##)47 b(these)g(variables)e(are)i +(automatically)d(generated)h(by)j(make)e(##)178 4885 +y(#)i(Do)f(not)g(edit)f(here.)h(If)g(you)g(wish)f(to)i(override)d +(these)i(values)178 4989 y(#)h(add)f(them)f(to)h(the)g(last)g(section)p +3803 5014 V 150 5066 a Fm(\012)p 200 5066 3554 4 v 3553 +w(\011)275 5216 y Fv(In)23 b(the)h(second)g(section,)i(y)m(ou)e(can)g +(o)m(v)m(erride)g(an)m(y)h(default)e(v)-5 b(alues)23 +b(\(lo)s(cally)g(to)i(DejaGn)m(u\))g(for)f(all)f(the)150 +5326 y(v)-5 b(ariables.)39 b(The)29 b(second)h(section)g(can)g(also)g +(con)m(tain)g(y)m(our)g(preferred)e(defaults)h(for)h(all)e(the)i +(command)p eop +%%Page: 20 22 +20 21 bop 150 -116 a Fv(20)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 83 y(line)30 b(options)h(to)h +Fr(runtest)p Fv(.)43 b(This)30 b(allo)m(ws)h(y)m(ou)g(to)i(easily)e +(customize)h Fr(runtest)d Fv(for)j(y)m(our)f(preferences)150 +193 y(in)41 b(eac)m(h)j(con\014gured)e(test-suite)h(tree,)j(so)d(that)g +(y)m(ou)g(need)f(not)h(t)m(yp)s(e)g(options)e(rep)s(eatedly)h(on)h(the) +150 302 y(command)31 b(line.)41 b(\(The)31 b(second)g(section)g(ma)m(y) +g(also)g(b)s(e)g(empt)m(y)-8 b(,)32 b(if)e(y)m(ou)h(do)g(not)h(wish)d +(to)i(o)m(v)m(erride)h(an)m(y)150 412 y(defaults.\))275 +546 y(The)d(\014rst)h(section)h(ends)e(with)g(this)g(line:)150 +607 y Fm(\013)p 200 607 3554 4 v 3553 w(\010)p 150 806 +4 151 v 178 760 a Fr(##)47 b(All)g(variables)f(above)g(are)h(generated) +e(by)i(configure.)e(Do)i(Not)g(Edit)g(##)p 3803 806 V +150 857 a Fm(\012)p 200 857 3554 4 v 3553 w(\011)275 +1002 y Fv(Y)-8 b(ou)31 b(can)f(mak)m(e)i(an)m(y)f(c)m(hanges)g(under)e +(this)h(line.)40 b(If)30 b(y)m(ou)h(wish)d(to)k(rede\014ne)d(a)i(v)-5 +b(ariable)30 b(in)f(the)i(top)150 1112 y(section,)k(then)f(just)f(put)h +(a)g(duplicate)f(v)-5 b(alue)33 b(in)g(this)g(second)h(section.)51 +b(Usually)33 b(the)h(v)-5 b(alues)33 b(de\014ned)150 +1221 y(in)c(this)h(con\014g)h(\014le)f(are)h(related)g(to)h(the)f +(con\014guration)f(of)h(the)g(test)g(run.)41 b(This)29 +b(is)h(the)h(ideal)e(place)i(to)150 1331 y(set)g(the)g(v)-5 +b(ariables)29 b Fr(host_triplet)p Fv(,)e Fr(build_triplet)p +Fv(,)g Fr(target_triplet)p Fv(.)38 b(All)29 b(other)h(v)-5 +b(ariables)30 b(are)150 1441 y(to)s(ol)i(dep)s(endan)m(t.)46 +b(ie)32 b(for)g(testing)h(a)g(compiler,)e(the)i(v)-5 +b(alue)32 b(for)g Fq(CC)40 b Fv(migh)m(t)32 b(b)s(e)g(set)g(to)i(a)e +(freshly)f(built)150 1550 y(binary)-8 b(,)29 b(as)i(opp)s(osed)e(to)j +(one)e(in)f(the)i(user's)f(path.)150 1774 y Fi(4.0.4)63 +b(P)m(ersonal)41 b(Con\014g)g(File)275 1967 y Fv(The)j(p)s(ersonal)g +(con\014g)h(\014le)f(is)g(used)g(to)i(customize)g Fr(runtest's)c +Fv(b)s(eha)m(viour)i(for)h(eac)m(h)h(p)s(erson.)150 2077 +y(It's)33 b(t)m(ypically)f(used)g(to)i(set)g(the)f(user)f(prefered)g +(setting)h(for)g(v)m(erb)s(osit)m(y)-8 b(,)34 b(and)f(an)m(y)g(exp)s +(erimen)m(tal)f(Tcl)150 2186 y(pro)s(cedures.)39 b(My)31 +b(p)s(ersonal)e(`)p Fr(~/.dejagnurc)p Fv(')e(\014le)j(lo)s(oks)g(lik)m +(e:)150 2267 y Fm(\013)p 200 2267 V 3553 w(\010)p 150 +2661 4 346 v 178 2421 a Fr(set)47 b(all_flag)f(1)178 +2524 y(set)h(RLOGIN)f(/usr/ucb/rlogin)178 2628 y(set)h(RSH)g +(/usr/ucb/rsh)p 3803 2661 V 150 2712 a Fm(\012)p 200 +2712 3554 4 v 3553 w(\011)275 2857 y Fv(Here)27 b(I)g(set)h +Fr(all_flag)d Fv(so)j(I)f(see)h(all)e(the)h(test)i(cases)f(that)g(P)-8 +b(ASS)26 b(along)i(with)e(the)h(ones)h(that)g(F)-10 b(AIL.)150 +2967 y(I)36 b(also)g(set)h Fq(RLOGIN)46 b Fv(and)36 b +Fr(RSH)f Fv(to)i(the)f(BSD)h(v)m(ersion.)58 b(I)36 b(ha)m(v)m(e)h +Fr(kerberos)d Fv(installed,)i(and)g(when)f(I)150 3077 +y(rlogin)25 b(to)h(a)h(target)g(b)s(oard,)f(it)g(usually)e(isn't)h +(supp)s(orted.)38 b(So)25 b(I)h(use)g(the)g(non)g(secure)g(v)m(ersions) +f(of)h(these)150 3186 y(programs)k(rather)g(than)g(the)h(default)e +(that's)j(in)d(m)m(y)h(path.)p eop +%%Page: 21 23 +21 22 bop 150 -116 a Fv(Chapter)30 b(5:)41 b(The)30 b(DejaGn)m(u)h +(Implemen)m(tation)1847 b(21)150 100 y Fs(5)80 b(The)54 +b(DejaGn)l(u)e(Implemen)l(tation)275 334 y Fv(DejaGn)m(u)30 +b(is)e(en)m(tirely)h(written)g(in)f Fr(expect)p Fv(,)g(whic)m(h)g(uses) +h(Tcl)g(as)h(a)g(command)f(language.)41 b Fr(expect)150 +443 y Fv(serv)m(es)26 b(as)f(a)h(v)m(ery)g(programmable)e(shell;)h(y)m +(ou)h(can)g(run)d(an)m(y)j(program,)g(as)g(with)e(the)h(usual)f(Unix)g +(com-)150 553 y(mand)30 b(shells|but)e(once)k(the)f(program)f(is)g +(started,)i(y)m(our)f Fr(expect)e Fv(script)h(has)g(fully)f +(programmable)150 663 y(con)m(trol)24 b(of)f(its)g(input)e(and)i +(output.)38 b(This)21 b(do)s(es)i(not)g(just)g(apply)f(to)i(the)f +(programs)g(under)f(test;)27 b Fr(expect)150 772 y Fv(can)h(also)g(run) +f(an)m(y)h(auxiliary)e(program,)j(suc)m(h)e(as)i Fr(diff)d +Fv(or)i Fr(sh)p Fv(,)h(with)d(full)g(con)m(trol)j(o)m(v)m(er)g(its)e +(input)g(and)150 882 y(output.)275 1016 y(DejaGn)m(u)40 +b(itself)f(is)g(merely)g(a)h(framew)m(ork)g(for)f(the)h(set)g(of)g +(test)h(suites)e(distributed)e(separately)150 1126 y(for)i(eac)m(h)h +Fo(gnu)f Fv(to)s(ol.)66 b(F)-8 b(uture)39 b(releases)g(of)g +Fo(gnu)g Fv(to)s(ols)g(will)d(include)h(ev)m(en)i(more)g(tests,)k(dev)m +(elop)s(ed)150 1235 y(throughout)30 b(the)h(free)f(soft)m(w)m(are)i +(comm)m(unit)m(y)-8 b(.)275 1370 y Fr(runtest)29 b Fv(is)h(the)i(glue)f +(to)h(tie)f(together)i(and)e(manage)h(the)g(test)g(scripts.)43 +b(The)31 b Fr(runtest)e Fv(program)150 1479 y(is)36 b(actually)g(a)h +(simple)e(Bourne)h(shell)f(script)h(that)h(lo)s(cates)h(a)f(cop)m(y)g +(of)g(the)g Fr(expect)e Fv(shell)g(and)h(then)150 1589 +y(starts)31 b(the)f(main)g(Tcl)f(co)s(de,)i Fr(runtest.exp)p +Fv(.)38 b Fr(runtest.exp)27 b Fv(itself)i(has)h(these)h(essen)m(tial)f +(functions:)199 1724 y(1.)61 b(P)m(arse)21 b(the)f(command)h(line)d +(options,)k(load)e(the)g(library)e(\014les,)k(and)e(load)g(the)g +(default)g(con\014guration)330 1833 y(\014les.)199 1968 +y(2.)61 b(Lo)s(cating)41 b(the)g(individual)c(test)42 +b(scripts.)71 b Fr(runtest.exp)38 b Fv(lo)s(cates)j(the)h(tests)f(b)m +(y)g(exploiting)f(a)330 2077 y(straigh)m(tforw)m(ard)33 +b(naming)g(con)m(v)m(en)m(tion)h(based)g(on)f(the)h(string)e(y)m(ou)i +(sp)s(ecify)e(with)g(the)i(`)p Fr(--tool)p Fv(')330 2187 +y(option.)199 2321 y(3.)61 b(Pro)m(viding)25 b(an)h(extended)h(test)g +(en)m(vironmen)m(t,)g(b)m(y)g(de\014ning)d(additional)h(Tcl)g(pro)s +(cedures)h(b)s(ey)m(ond)330 2431 y(those)31 b(already)f(in)f +Fr(expect)p Fv(.)199 2565 y(4.)61 b(Lo)s(cating)24 b(target-dep)s +(enden)m(t)h(functions,)f(to)h(standardize)e(the)i(test)g(en)m +(vironmen)m(t)e(across)i(a)f(wide)330 2675 y(v)-5 b(ariet)m(y)31 +b(of)f(test)i(platforms.)150 2932 y Fu(5.1)68 b(Con)l(v)l(en)l(tions)47 +b(for)e(using)g(to)t(ol)g(names)275 3125 y Fv(DejaGn)m(u)26 +b(uses)f(`)p Fr($tool)p Fv(',)h(the)g(name)g(of)g(the)g(to)s(ol)f +(under)g(test,)i(to)g(tie)e(together)j(the)e(testing)f(con\014g-)150 +3235 y(uration)31 b(in)f(a)i(straigh)m(tforw)m(ard)f(but)g(\015exible)f +(w)m(a)m(y)-8 b(.)45 b(If)32 b(there)f(is)g(only)g(one)g(testsuite)h +(for)g(a)g(particular)150 3344 y(application,)d(then)h(`)p +Fr($tool)p Fv(')f(is)h(optional.)275 3479 y(`)p Fr($tool)p +Fv(')38 b(is)g Fn(not)49 b Fv(used)38 b(to)i(in)m(v)m(ok)m(e)h(the)e +(to)s(ol,)j(since)d(sites)f(that)i(run)e(m)m(ultiple)f +(con\014gurations)i(of)150 3588 y(a)47 b(particular)e(to)s(ol)i(often)g +(call)f(eac)m(h)i(con\014guration)e(b)m(y)h(a)g(di\013eren)m(t)g(name.) +90 b Fr(runtest)44 b Fv(uses)j(the)150 3698 y(con\014guration-dep)s +(enden)m(t)40 b(v)-5 b(ariables)40 b(captured)h(in)f(`)p +Fr(site.exp)p Fv(')f(to)j(determine)e(ho)m(w)h(to)h(call)f(eac)m(h)150 +3807 y(to)s(ol.)275 3942 y Fr(runtest)30 b Fv(uses)h(to)s(ol)h(names)g +(to)h(\014nd)e(directories)g(con)m(taining)h(tests.)46 +b Fr(runtest)30 b Fv(scans)i(the)h(source)150 4051 y(directory)22 +b(\(sp)s(eci\014ed)g(with)f Fr(--srcdir)p Fv(\))g(for)i(all)e +(directories)h(whose)h(names)f(start)h(with)f(the)h(to)s(ol)g(name.)150 +4161 y(It)40 b(is)g(a)g(common)h(practice)f(to)h(put)f(a)g(p)s(erio)s +(d)e(after)j(the)g(to)s(ol)f(part)g(of)g(the)h(name.)70 +b(F)-8 b(or)41 b(instance,)150 4271 y(directories)32 +b(that)i(start)f(with)f(`)p Fr(g++.)p Fv(')h(con)m(tain)g +Fo(g)p Fr(++)g Fv(tests.)49 b(T)-8 b(o)34 b(add)e(a)i(new)e(test,)j +(just)e(put)f(it)h(in)f(an)m(y)150 4380 y(directory)24 +b(\(create)j(an)e(en)m(tirely)f(new)g(directory)-8 b(,)27 +b(if)c(y)m(ou)j(wish\))d(whose)i(name)g(follo)m(ws)f(this)g(con)m(v)m +(en)m(tion.)275 4515 y(A)h(test)g(is)f(an)m(y)h(\014le)f(in)g(an)h +(appropriately)e(named)h(sub)s(directory)f(whose)i(name)g(ends)f(in)f +(`)p Fr(.exp)p Fv(')h(\(the)150 4624 y(con)m(v)m(en)m(tional)32 +b(w)m(a)m(y)h(of)f(naming)e Fr(expect)g Fv(scripts\).)44 +b(These)31 b(simple)f(naming)g(con)m(v)m(en)m(tions)j(mak)m(e)g(it)e +(as)150 4734 y(simple)25 b(as)j(p)s(ossible)c(to)k(install)e(new)g +(tests:)40 b(all)26 b(y)m(ou)i(m)m(ust)f(do)g(is)f(put)h(the)g(test)i +(in)d(the)h(righ)m(t)g(directory)-8 b(.)275 4868 y Fr(runtest)31 +b Fv(sorts)i(the)h(tests)g(in)e(eac)m(h)i(sub)s(directory)d(b)m(y)i +(name)h(\(using)e(the)h(Tcl)g Fr(lsort)f Fv(command\))150 +4978 y(and)e(runs)f(them)h(in)f(the)h(resulting)f(order.)p +eop +%%Page: 22 24 +22 23 bop 150 -116 a Fv(22)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 83 y Fu(5.2)68 b(Initialization)48 +b(mo)t(dule)275 276 y Fv(The)35 b(initialization)d(mo)s(dule)i(\(or)i +(\\init)e(\014le"\))h(has)g(t)m(w)m(o)i(purp)s(oses:)49 +b(to)36 b(pro)m(vide)f(to)s(ol)h(and)e(target)150 385 +y(dep)s(enden)m(t)29 b(pro)s(cedures,)h(and)g(to)h(start)g(up)e(an)i +(in)m(teractiv)m(e)g(to)s(ol)f(to)h(the)g(p)s(oin)m(t)e(where)h(it)g +(is)g(ready)g(to)150 495 y(op)s(erate.)41 b(The)30 b(latter)g(includes) +d(establishing)h(comm)m(unications)h(with)g(the)h(target.)42 +b(All)28 b(the)j(tests)f(for)150 604 y(in)m(teractiv)m(e)24 +b(programs)e(assume)h(that)g(the)g(to)s(ol)g(is)f(already)h(running)d +(and)i(comm)m(unicating.)38 b(Initializa-)150 714 y(tion)30 +b(mo)s(dules)e(for)j(non-in)m(teractiv)m(e)g(programs)f(ma)m(y)h(only)e +(need)h(to)h(supply)d(the)j(supp)s(ort)d(functions.)275 +848 y(Eac)m(h)33 b(test)g(suite)f(directory)g(m)m(ust)h(con)m(tain)g +(\(in)e(its)h(`)p Fr(config)p Fv(')g(sub)s(directory\))f(a)i(separate)g +(initial-)150 958 y(ization)27 b(mo)s(dule)f(for)h(eac)m(h)h(target.)41 +b(The)27 b(appropriate)g(init)e(\014le)i(is)f(can)i(b)s(e)e(named)h +(sev)m(eral)h(w)m(a)m(ys.)40 b(The)150 1068 y(prefered)33 +b(name)h(is)f(the)i Fn(os)42 b Fv(part)34 b(of)g(the)g(canonical)g +(con\014guration)f(name)h(with)f Fr(.exp)g Fv(as)h(the)h(su\016x.)150 +1177 y(An)e(example)f(w)m(ould)g(b)s(e)h(that)g(for)g(an)g +Fr(m68k-coff)e Fv(system,)j(the)f Fr(target_os)e Fv(part)i(w)m(ould)e +(b)s(e)i Fr(coff)p Fv(.)150 1287 y(The)27 b(next)h(w)m(a)m(y)h(is)d +(for)i(system)g(where)f(there)h(are)g(short)f(\014lenames,)h(or)f(a)h +(shortcut)g(is)f(desired)f(to)i(refer)150 1396 y(to)j(the)g(OS)f(name)g +(for)g(that)h(target.)43 b(This)29 b(is)g(uses)h(the)h(v)-5 +b(alue)30 b(of)h Fr($target_abbrev)26 b Fv(rather)31 +b(than)f(the)150 1506 y Fr(target_os)p Fv(.)275 1641 +y(The)h(\014nal)h(\014le)f(lo)s(ok)m(ed)i(for)f(is)f(simply)f(`)p +Fr(default.exp)p Fv('.)45 b(If)31 b(there)i(is)f(only)f(one)i(op)s +(erating)f(system)150 1750 y(to)26 b(supp)s(ort,)f(then)f(this)g +(\014le)h(can)g(b)s(e)g(used.)38 b(It's)25 b(main)f(purp)s(ose)g(is)g +(to)i(o\013er)f(some)h(supp)s(ort)d(for)i(new)g(op-)150 +1860 y(erating)i(systems,)i(or)e(for)h(unsupp)s(orted)c(cross)k +(targets.)41 b(The)27 b(last)g(\014le)g(lo)s(ok)m(ed)g(for)h(is)e(`)p +Fr(unknown.exp)p Fv('.)150 1969 y(This)37 b(is)h(usually)f(limited)g +(to)j(error)e(handling)f(for)h(unsupp)s(orted)f(targets.)68 +b(It's)39 b(whole)f(con)m(ten)m(ts)j(is)150 2079 y(t)m(ypically)-8 +b(.)150 2158 y Fm(\013)p 200 2158 3554 4 v 3553 w(\010)p +150 2439 4 235 v 178 2311 a Fr(perror)46 b("Sorry,)g(there)g(is)i(no)f +(support)f(for)h(this)f(target")178 2414 y(exit)h(1)p +3803 2439 V 150 2491 a Fm(\012)p 200 2491 3554 4 v 3553 +w(\011)275 2636 y Fv(A)m(t)35 b(the)f(b)s(eginning)e(of)j(the)f(init)f +(\014le,)h(y)m(ou)h(m)m(ust)f(\014rst)g(determine)f(the)i(prop)s(er)e +(executable)i(name)150 2746 y(of)c(the)g(to)s(ol)g(to)h(execute,)h +(since)d(the)h(actual)h(name)f(of)g(the)g(to)s(ol)g(to)h(b)s(e)e +(tested)i(m)m(y)f(v)-5 b(ary)31 b(from)g(system)150 2855 +y(to)g(system.)41 b(Here's)31 b(an)f(example)g(for)g(the)h +Fo(GNU)g Fv(C)f(compiler.)150 2934 y Fm(\013)p 200 2934 +V 3553 w(\010)p 150 4365 4 1384 v 178 3087 a Fr(global)46 +b(AR)178 3191 y(#)i(look)e(for)h(the)g(archiver)f(ar)178 +3295 y(if)h(![info)f(exists)h(AR])f({)369 3398 y(set)h(AR)g([findfile)e +($base_dir/../../binutils/a)o(r)d($base_dir/../../binutils)o(/ar)f([tr) +178 3502 y(ansform)46 b(ar]])369 3606 y(verbose)g("AR)h(defaulting)e +(to)i($AR")g(2)178 3710 y(})178 3814 y(})178 4021 y(global)f(CFLAGS)178 +4125 y(if)h(![info)f(exists)h(CFLAGS])e(then)i({)369 +4229 y(set)g(CFLAGS)f("")178 4332 y(})p 3803 4365 V 150 +4417 a Fm(\012)p 200 4417 3554 4 v 3553 w(\011)275 4562 +y Fv(It)30 b(is)f(alw)m(a)m(ys)i(a)f(go)s(o)s(d)g(idea)g(to)h(\014rst)e +(c)m(hec)m(k)j(the)e(v)-5 b(ariable,)29 b(and)h(only)f(set)i(it)e(if)g +(it)h(has)g(not)g(y)m(et)i(b)s(een)150 4671 y(de\014ned.)39 +b(Often)31 b(the)f(prop)s(er)f(v)-5 b(alue)30 b(of)g +Fr(AR)g Fv(is)g(set)g(on)h(the)f(command)g(line)f(that)i(in)m(v)m(ok)m +(es)g(`)p Fr(runtest)p Fv('.)275 4806 y(The)c Fr(findfile)f +Fv(pro)s(cedure)h(tak)m(es)i(as)f(it's)g(\014rst)f(argumen)m(t)i(a)f +(\014le)f(name)h(to)h(lo)s(ok)f(for.)39 b(The)28 b(second)150 +4915 y(argumen)m(t)f(is)f(returned)g(if)g(the)h(\014le)f(is)f(found,)i +(and)f(the)h(third)e(argumen)m(t)i(is)f(returned)g(if)g(the)h(\014le)f +(is)g(not)150 5025 y(found.)39 b Fr(base_dir)29 b Fv(is)g(set)i(in)m +(ternally)d(b)m(y)i(DejaGn)m(u)i(to)f(the)f(top)h(lev)m(el)f(directory) +g(of)g(the)h(ob)5 b(ject)31 b(tree.)275 5160 y(The)42 +b Fr(transform)e Fv(pro)s(cedure)h(tak)m(es)j(as)f(its)f(argumen)m(t)h +(the)g(nativ)m(e)g(name)g(of)f(a)h(to)s(ol)g(\(suc)m(h)g(as)150 +5269 y(`)p Fr(gcc)p Fv(')c(for)h(the)f(compiler\),)i(and)e(returns)g +(the)h(name)f(as)h(con\014gured)f(for)g(that)i(to)s(ol)e(in)f(the)i +(curren)m(t)p eop +%%Page: 23 25 +23 24 bop 150 -116 a Fv(Chapter)30 b(5:)41 b(The)30 b(DejaGn)m(u)h +(Implemen)m(tation)1847 b(23)150 83 y(installation.)38 +b(\(F)-8 b(or)31 b(example,)e(a)h(cross-compiling)d(v)m(ersion)i(of)g +Fo(gnu)g Fv(CC)g(that)g(generates)i(MIPS)e(co)s(de)150 +193 y(ma)m(y)i(b)s(e)f(installed)e(with)h(a)i(name)f(lik)m(e)g +Fr(mips-idt-ecoff-gcc)p Fv(.\))275 327 y(In)j(a)h(test)h(running)c +(nativ)m(e,)36 b(writing)c(the)i(Tcl)f(co)s(de)h(for)g(initialization)d +(is)i(usually)e(quite)j(simple.)150 437 y(F)-8 b(or)23 +b(cross)e(con\014gurations,)i(ho)m(w)m(ev)m(er,)i(more)d(elab)s(orate)g +(instructions)e(are)i(usually)e(needed)h(to)i(describ)s(e)150 +546 y(ho)m(w)30 b(to)i(talk)e(to)h(a)g(remote)g(target.)275 +681 y(Eac)m(h)g(initialization)c(mo)s(dule)i(de\014nes)g(up)h(to)h +(four)f(pro)s(cedures)f(with)g(standard)h(names)g(and)g(pur-)150 +790 y(p)s(oses.)58 b(The)36 b(names)g(of)h(these)g(pro)s(cedures)e(b)s +(egin)f(with)h(`)p Fr($tool)p Fv(',)j(the)e(string)f(that)i(iden)m +(ti\014es)e(tests)150 900 y(for)j(a)h(particular)e(to)s(ol:)57 +b Fr($tool_start)p Fv(,)38 b Fr($tool_load)p Fv(,)g Fr($tool_exit)p +Fv(,)g(and)g Fr($tool_version)p Fv(.)61 b(F)-8 b(or)150 +1010 y(example,)28 b(the)f(start)h(pro)s(cedure)e(for)h +Fo(gdb)g Fv(is)g(called)f Fr(gdb_start)p Fv(.)37 b(\(Since)27 +b(start)h(pro)s(cedures)e(are)i(used)150 1119 y(di\013eren)m(tly)f(for) +g(batc)m(h)i(and)e(in)m(teractiv)m(e)i(to)s(ols,)f(ho)m(w)m(ev)m(er,)j +Fr(runtest)25 b Fv(itself)i(nev)m(er)h(calls)g(the)g(start)g(pro-)150 +1229 y(cedure.)40 b(Init)30 b(\014les)f(for)h(in)m(teractiv)m(e)h(to)s +(ols)g(are)f(exp)s(ected)h(to)g(end)f(b)m(y)g(running)e(the)i(start)h +(pro)s(cedure.\))275 1363 y(The)37 b(initialization)d(mo)s(dule)i(is)g +(also)i(a)g(go)s(o)s(d)f(place)g(to)i(call)d Fr(load_lib)g +Fv(to)i(get)h(an)m(y)e(collections)150 1473 y(of)c(utilit)m(y)f(pro)s +(cedures)f(mean)m(t)j(for)f(a)g(family)f(of)h(test)h(cases,)h(and)d(to) +i(set)f(up)f(default)g(v)-5 b(alues)33 b(for)g(an)m(y)150 +1582 y(additional)28 b(Tcl)i(v)-5 b(ariables)29 b(needed)h(for)g(a)h +(sp)s(eci\014c)e(set)i(of)f(tests.)275 1717 y(See)40 +b(Section)g(5.4)h([T)-8 b(arget)41 b(dep)s(enden)m(t)f(pro)s(cedures],) +h(page)g(31,)j(for)c(full)d(descriptions)h(of)i(these)150 +1826 y(pro)s(cedures.)150 2084 y Fu(5.3)68 b(DejaGn)l(u)45 +b(pro)t(cedures)275 2276 y Fv(DejaGn)m(u)40 b(pro)m(vides)e(these)i +(Tcl)e(pro)s(cedures)g(for)h(use)g(in)f(test)i(scripts.)66 +b(Y)-8 b(ou)40 b(can)f(also)h(use)f(an)m(y)150 2386 y(standard)29 +b Fr(expect)g Fv(or)h(Tcl)g(function.)39 b(These)30 b(pro)s(cedures)f +(are)i(stored)f(in)f(libraries,)f(whic)m(h)h(DejaGn)m(u)150 +2496 y(loads)i(at)h(run)m(time.)42 b(Here's)32 b(explanation)e(of)i +(the)f(library)e(pro)s(cedures)h(that)i(get)g(loaded)f(at)h(run)m +(time.)150 2605 y(All)d(other)i(librarys)c(are)k(optional,)f(and)g +(need)g(to)h(b)s(e)f(loaded)g(b)m(y)g(the)g(testsuite.)150 +2829 y Fi(5.3.1)63 b(Core)41 b(In)m(ternal)f(Pro)s(cedures)275 +3022 y Fv(See)30 b(Section)g(2.4)i([A)f(POSIX)e(conforming)g(test)j +(framew)m(ork],)f(page)g(6,)g(for)f(more)h(detailed)e(expla-)150 +3132 y(nations)h(of)g(the)h(test)g(outcomes)h(\(`)p Fr(FAIL)p +Fv(',)e(`)p Fr(PASS)p Fv(',)g(`)p Fr(UNTESTED)p Fv(',)f(`)p +Fr(UNRESOLVED)p Fv(',)f(`)p Fr(UNSUPPORTED)p Fv('\).)150 +3316 y Fr(perror)h(")p Fq(string)37 b(n)m(um)m(b)s(er)7 +b Fr(")630 3425 y Fv(Declares)28 b(a)g(sev)m(ere)g(error)f(in)f(the)h +(testing)h(framew)m(ork)f(itself.)39 b Fr(perror)25 b +Fv(writes)h(in)g(the)i(log)630 3535 y(\014les)j(a)i(message)h(b)s +(eginning)c(with)h(`)p Fr(ERROR)p Fv(',)h(app)s(ending)e(the)j(argumen) +m(t)g Fq(string)p Fv(.)46 b(If)32 b(the)630 3645 y(optional)25 +b Fq(n)m(um)m(b)s(er)32 b Fv(is)25 b(supplied,)f(then)i(this)f(is)g +(used)g(to)i(set)g(the)f(in)m(ternal)f(coun)m(t)i(of)f(errors)630 +3754 y(to)31 b(that)g(v)-5 b(alue.)630 3889 y(As)32 b(a)g(side)e +(e\013ect,)k Fr(perror)c Fv(also)i(c)m(hanges)h(the)e(e\013ect)j(of)e +(the)f(next)h Fr(pass)f Fv(or)h Fr(fail)e Fv(com-)630 +3998 y(mand:)50 b(the)36 b(test)h(outcome)f(b)s(ecomes)g(`)p +Fr(UNRESOLVED)p Fv(',)f(since)g(an)h(automatic)g(`)p +Fr(PASS)p Fv(')f(or)630 4108 y(`)p Fr(FAIL)p Fv(')d(cannot)h(b)s(e)f +(trusted)g(after)h(a)g(sev)m(ere)g(error)f(in)g(the)g(test)i(framew)m +(ork.)47 b(If)32 b(the)h(op-)630 4218 y(tional)d(n)m(umeric)g(v)-5 +b(alue)30 b(is)g(`)p Fr(0)p Fv(',)i(then)f(there)g(are)g(no)g(further)f +(side)g(e\013ects)i(to)g(calling)d(this)630 4327 y(function,)37 +b(and)f(the)g(follo)m(wing)f(test)i(outcome)h(do)s(esn't)e(b)s(ecome)h +(`)p Fr(UNRESOLVED)p Fv('.)57 b(This)630 4437 y(can)31 +b(b)s(e)e(used)h(for)g(errors)g(with)f(no)h(kno)m(wn)g(side)f +(e\013ects.)150 4621 y Fr(warning)f(")p Fq(string)37 +b(n)m(um)m(b)s(er)7 b Fr(")630 4731 y Fv(Declares)27 +b(detection)g(of)f(a)h(minor)e(error)g(in)g(the)i(test)g(case)g +(itself.)38 b Fr(warning)25 b Fv(writes)g(in)g(the)630 +4840 y(log)35 b(\014les)e(a)i(message)h(b)s(eginning)c(with)h(`)p +Fr(WARNING)p Fv(',)i(app)s(ending)d(the)j(argumen)m(t)g +Fq(string)p Fv(.)630 4950 y(Use)41 b Fr(warning)d Fv(rather)j(than)f +Fr(error)f Fv(for)i(cases)g(\(suc)m(h)g(as)f(comm)m(unication)g +(failure)f(to)630 5059 y(b)s(e)44 b(follo)m(w)m(ed)g(b)m(y)g(a)h +(retry\))g(where)f(the)g(test)i(case)f(can)g(reco)m(v)m(er)h(from)e +(the)h(error.)82 b(If)630 5169 y(the)34 b(optional)e +Fq(n)m(um)m(b)s(er)39 b Fv(is)33 b(supplied,)e(then)i(this)f(is)h(used) +g(to)h(set)g(the)f(in)m(ternal)g(coun)m(t)h(of)630 5279 +y(w)m(arnings)29 b(to)i(that)g(v)-5 b(alue.)p eop +%%Page: 24 26 +24 25 bop 150 -116 a Fv(24)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)630 83 y(As)32 b(a)g(side)f(e\013ect,) +k Fr(warning_threshold)27 b Fv(or)32 b(more)g(calls)f(to)i +Fr(warning)d Fv(in)h(a)h(single)f(test)630 193 y(case)k(also)e(c)m +(hanges)i(the)f(e\013ect)h(of)f(the)g(next)f Fr(pass)g +Fv(or)g Fr(fail)g Fv(command:)47 b(the)34 b(test)g(out-)630 +302 y(come)39 b(b)s(ecomes)f(`)p Fr(UNRESOLVED)p Fv(')e(since)h(an)h +(automatic)h(`)p Fr(PASS)p Fv(')e(or)h(`)p Fr(FAIL)p +Fv(')f(ma)m(y)h(not)h(b)s(e)630 412 y(trust)m(w)m(orth)m(y)j(after)f +(man)m(y)g(w)m(arnings.)71 b(If)41 b(the)g(optional)f(n)m(umeric)g(v)-5 +b(alue)40 b(is)g(`)p Fr(0)p Fv(',)k(then)630 521 y(there)32 +b(are)h(no)f(further)f(side)g(e\013ects)i(to)g(calling)e(this)g +(function,)h(and)f(the)h(follo)m(wing)f(test)630 631 +y(outcome)40 b(do)s(esn't)f(b)s(ecome)h(`)p Fr(UNRESOLVED)p +Fv('.)65 b(This)37 b(can)j(b)s(e)e(used)h(for)g(errors)f(with)g(no)630 +741 y(kno)m(wn)30 b(side)f(e\013ects.)150 923 y Fr(note)g(")p +Fq(string)8 b Fr(")630 1032 y Fv(App)s(ends)32 b(an)i(informational)e +(message)j(to)g(the)f(log)g(\014le.)51 b Fr(note)33 b +Fv(writes)g(in)g(the)h(log)g(\014les)630 1142 y(a)40 +b(message)g(b)s(eginning)d(with)h(`)p Fr(NOTE)p Fv(',)j(app)s(ending)c +(the)i(argumen)m(t)h Fq(string)p Fv(.)66 b(Use)40 b Fr(note)630 +1252 y Fv(sparingly)-8 b(.)40 b Fr(verbose)29 b Fv(should)f(b)s(e)j +(used)e(for)i(most)g(suc)m(h)f(messages,)i(but)e(in)g(cases)h(where)630 +1361 y(a)g(message)g(is)f(needed)g(in)f(the)h(log)h(\014le)e +(regardless)h(of)g(the)h(v)m(erb)s(osit)m(y)f(lev)m(el)g(use)g +Fr(note)p Fv(.)150 1543 y Fr(pass)f(")p Fq(string)8 b +Fr(")630 1653 y Fv(Declares)29 b(a)f(test)h(to)f(ha)m(v)m(e)h(passed.) +40 b Fr(pass)26 b Fv(writes)h(in)g(the)h(log)g(\014les)e(a)j(message)g +(b)s(eginning)630 1763 y(with)d(`)p Fr(PASS)p Fv(')g(\(or)h +Fr(XPASS)p Fv(,)g(if)f(failure)f(w)m(as)i(exp)s(ected\),)i(app)s +(ending)24 b(the)j(argumen)m(t)h Fq(string)p Fv(.)150 +1945 y Fr(fail)h(")p Fq(string)8 b Fr(")630 2055 y Fv(Declares)32 +b(a)f(test)h(to)g(ha)m(v)m(e)g(failed.)41 b Fr(fail)30 +b Fv(writes)g(in)g(the)h(log)g(\014les)f(a)i(message)g(b)s(eginning)630 +2164 y(with)26 b(`)p Fr(FAIL)p Fv(')g(\(or)h Fr(XFAIL)p +Fv(,)g(if)f(failure)f(w)m(as)i(exp)s(ected\),)i(app)s(ending)24 +b(the)j(argumen)m(t)h Fq(string)p Fv(.)150 2346 y Fr(unresolved)g(")p +Fq(string)8 b Fr(")630 2456 y Fv(Declares)35 b(a)f(test)h(to)g(ha)m(v)m +(e)h(an)e(unresolv)m(ed)f(outcome.)53 b Fr(unresolved)31 +b Fv(writes)j(in)e(the)j(log)630 2566 y(\014le)j(a)i(message)h(b)s +(eginning)36 b(with)i(`)p Fr(UNRESOLVED)p Fv(',)i(app)s(ending)c(the)k +(argumen)m(t)g Fq(string)p Fv(.)630 2675 y(This)33 b(usually)g(means)i +(the)g(test)h(did)d(not)j(execute)g(as)f(exp)s(ected,)i(and)e(a)g(h)m +(uman)f(b)s(eing)630 2785 y(m)m(ust)28 b(go)g(o)m(v)m(er)h(results)e +(to)i(determine)e(if)f(it)i(passed)f(or)h(failed)e(\(and)i(to)g(impro)m +(v)m(e)g(the)g(test)630 2894 y(case\).)150 3077 y Fr(untested)g(")p +Fq(string)8 b Fr(")630 3186 y Fv(Declares)25 b(a)g(test)g(w)m(as)f(not) +h(run.)37 b Fr(untested)22 b Fv(writes)h(in)g(the)h(log)g(\014le)g(a)g +(message)i(b)s(eginning)630 3296 y(with)31 b(`)p Fr(UNTESTED)p +Fv(',)g(app)s(ending)f(the)i(argumen)m(t)h Fq(string)p +Fv(.)45 b(F)-8 b(or)33 b(example,)g(y)m(ou)f(migh)m(t)g(use)630 +3405 y(this)c(in)g(a)h(dumm)m(y)f(test)i(whose)f(only)f(role)g(is)g(to) +i(record)f(that)h(a)f(test)h(do)s(es)f(not)g(y)m(et)h(exist)630 +3515 y(for)g(some)h(feature.)150 3697 y Fr(unsupported)c(")p +Fq(string)8 b Fr(")630 3807 y Fv(Declares)38 b(that)g(a)g(test)g(case)g +(dep)s(ends)e(on)h(some)h(facilit)m(y)e(that)i(do)s(es)f(not)h(exist)f +(in)f(the)630 3916 y(testing)h(en)m(vironmen)m(t.)58 +b Fr(unsupported)33 b Fv(writes)j(in)f(the)h(log)h(\014le)e(a)i +(message)h(b)s(eginning)630 4026 y(with)29 b(`)p Fr(UNSUPPORTED)p +Fv(',)f(app)s(ending)g(the)j(argumen)m(t)f Fq(string)p +Fv(.)150 4208 y Fr(get_warning_threshold)630 4318 y Fv(Returns)f(the)i +(curren)m(t)f(v)-5 b(alue)30 b(of)h Fr(warning_threshold)p +Fv(.)36 b(The)29 b(default)h(v)-5 b(alue)30 b(is)f(3.)150 +4500 y Fr(set_warning_threshold)c Fq(threshold)630 4610 +y Fv(Sets)f(the)h(v)-5 b(alue)23 b(of)i Fr(warning_threshold)p +Fv(.)34 b(A)24 b(v)-5 b(alue)24 b(of)g Fr(0)g Fv(disables)e(it:)38 +b(calls)23 b(to)i Fr(warning)630 4719 y Fv(will)j(not)i(turn)g(a)g(`)p +Fr(PASS)p Fv(')g(or)g(`)p Fr(FAIL)p Fv(')g(in)m(to)h(an)f(`)p +Fr(UNRESOLVED)p Fv('.)150 4902 y Fr(transform)e(")p Fq(to)s(olname)5 +b Fr(")630 5011 y Fv(Generates)39 b(a)f(string)f(for)h(the)g(name)g(of) +g(a)h(to)s(ol)e(as)i(it)e(w)m(as)h(con\014gured)g(and)f(installed,)630 +5121 y(giv)m(en)27 b(its)g(nativ)m(e)h(name)g(\(as)g(the)g(argumen)m(t) +f Fq(to)s(olname)5 b Fv(\).)41 b(This)25 b(mak)m(es)k(the)e(assumption) +630 5230 y(that)49 b(all)e(to)s(ols)h(are)g(installed)e(using)h(the)h +(same)h(naming)d(con)m(v)m(en)m(tions:)78 b(it)47 b(extrap-)630 +5340 y(olates)52 b(from)g(the)g(in)m(v)m(o)s(cation)f(name)h(for)g(`)p +Fr(runtest)p Fv('.)103 b(F)-8 b(or)53 b(example,)k(if)51 +b(y)m(ou)h(call)p eop +%%Page: 25 27 +25 26 bop 150 -116 a Fv(Chapter)30 b(5:)41 b(The)30 b(DejaGn)m(u)h +(Implemen)m(tation)1847 b(25)630 83 y Fr(runtest)52 b +Fv(as)i(`)p Fr(m68k-vxworks-runtest)p Fv(',)g(the)g(result)f(of)h(`)30 +b Fr(transform)e("gcc")h Fv(')54 b(is)630 193 y(`)p Fr +(m68k-vxworks-gcc)p Fv('.)150 377 y Fr(ishost)29 b(")p +Fq(host)r Fr(")630 487 y Fv(T)-8 b(ests)21 b(for)f(a)h(particular)d +Fn(host)31 b Fv(en)m(vironmen)m(t.)37 b(If)20 b(the)g(curren)m(tly)g +(con\014gured)f(host)i(matc)m(hes)630 596 y(the)34 b(argumen)m(t)g +(string,)f(the)h(result)e(is)h Fr(1)p Fv(;)i(otherwise)d(the)i(result)f +(is)f Fr(0)p Fv(.)50 b Fq(host)35 b Fv(m)m(ust)f(b)s(e)f(a)630 +706 y(full)22 b(three-part)j Fr(configure)d Fv(host)j(name;)h(in)e +(particular,)g(y)m(ou)h(ma)m(y)g(not)f(use)h(the)f(shorter)630 +815 y(nic)m(knames)f(supp)s(orted)f(b)m(y)i Fr(configure)d +Fv(\(but)i(y)m(ou)h(can)g(use)f(wildcard)f(c)m(haracters,)k(using)630 +925 y(shell)j(syn)m(tax,)i(to)g(sp)s(ecify)e(sets)i(of)f(names\).)150 +1109 y Fr(istarget)e(")p Fq(target)r Fr(")630 1219 y +Fv(T)-8 b(ests)40 b(for)g(a)g(particular)e Fn(tar)-5 +b(get)50 b Fv(en)m(vironmen)m(t.)69 b(If)39 b(the)h(curren)m(tly)f +(con\014gured)g(target)630 1328 y(matc)m(hes)c(the)g(argumen)m(t)f +(string,)h(the)f(result)f(is)g Fr(1)p Fv(;)j(otherwise)e(the)g(result)f +(is)h Fr(0)p Fv(.)51 b Fq(target)630 1438 y Fv(m)m(ust)35 +b(b)s(e)f(a)i(full)d(three-part)i Fr(configure)e Fv(target)j(name;)i +(in)c(particular,)h(y)m(ou)g(ma)m(y)h(not)630 1548 y(use)31 +b(the)g(shorter)g(nic)m(knames)f(supp)s(orted)g(b)m(y)h +Fr(configure)d Fv(\(but)j(y)m(ou)g(can)h(use)e(wildcard)630 +1657 y(c)m(haracters,)k(using)d(shell)f(syn)m(tax,)k(to)f(sp)s(ecify)d +(sets)j(of)f(names\).)46 b(If)32 b(it)g(is)f(passed)h(a)g +Fr(NULL)630 1767 y Fv(string,)e(then)g(it)g(returns)f(the)h(name)h(of)f +(the)h(build)c(canonical)j(con\014guration.)150 1951 +y Fr(isbuild)e(")p Fq(host)r Fr(")630 2061 y Fv(T)-8 +b(ests)33 b(for)f(a)h(particular)e Fn(build)k(host)42 +b Fv(en)m(vironmen)m(t.)47 b(If)32 b(the)h(curren)m(tly)e(con\014gured) +h(host)630 2170 y(matc)m(hes)40 b(the)f(argumen)m(t)g(string,)h(the)f +(result)e(is)h Fr(1)p Fv(;)k(otherwise)d(the)f(result)g(is)g +Fr(0)p Fv(.)65 b Fq(host)630 2280 y Fv(m)m(ust)40 b(b)s(e)g(a)h(full)e +(three-part)i Fr(configure)d Fv(host)j(name;)46 b(in)39 +b(particular,)j(y)m(ou)e(ma)m(y)i(not)630 2389 y(use)31 +b(the)g(shorter)g(nic)m(knames)f(supp)s(orted)g(b)m(y)h +Fr(configure)d Fv(\(but)j(y)m(ou)g(can)h(use)e(wildcard)630 +2499 y(c)m(haracters,)k(using)d(shell)f(syn)m(tax,)k(to)f(sp)s(ecify)d +(sets)j(of)f(names\).)46 b(If)32 b(it)g(is)f(passed)h(a)g +Fr(NULL)630 2609 y Fv(string,)e(then)g(it)g(returns)f(the)h(name)h(of)f +(the)h(build)c(canonical)j(con\014guration.)630 2743 +y(item)k(is3w)m(a)m(y)h Fr(")p Fq(host)r Fr(")f Fv(T)-8 +b(ests)34 b(for)g(a)h(canadian)f(cross.)52 b(This)33 +b(is)g(when)g(the)i(tests)g(will)d(b)s(e)630 2853 y(run)24 +b(on)h(a)h(remotly)f(hosted)h(cross)f(compiler.)38 b(If)25 +b(it)g(is)g(a)g(canadian)g(cross,)i(then)e(the)h(result)630 +2962 y(is)j Fr(1)p Fv(;)i(otherwise)e(the)i(result)e(is)h +Fr(0)p Fv(.)150 3147 y Fr(isnative)96 b Fv(T)-8 b(ests)28 +b(whether)e(the)h(curren)m(t)g(con\014guration)f(has)h(the)g(same)h +(host)f(and)f(target.)42 b(When)26 b(it)630 3256 y(runs)32 +b(in)g(a)h Fn(native)41 b Fv(con\014guration)32 b(this)g(pro)s(cedure)g +(returns)g(a)i Fr(1)p Fv(;)h(otherwise)d(it)h(returns)630 +3366 y(a)e Fr(0)p Fv(.)150 3550 y Fr(load_lib)d(")p Fq(library-\014le)5 +b Fr(")630 3660 y Fv(Loads)46 b(the)f(\014le)g Fq(library-\014le)j +Fv(b)m(y)d(searc)m(hing)g(a)h(\014xed)f(path)g(built)f(in)m(to)h +Fr(runtest)p Fv(.)84 b(If)630 3769 y(DejaGn)m(u)25 b(has)f(b)s(een)f +(installed,)h(it)f(lo)s(oks)h(in)f(a)h(path)g(starting)g(with)f(the)h +(installed)e(library)630 3879 y(directory)-8 b(.)39 b(If)26 +b(y)m(ou)g(are)h(running)c(DejaGn)m(u)k(directly)e(from)g(a)i(source)f +(directory)-8 b(,)27 b(without)630 3988 y(\014rst)39 +b(running)f(`)p Fr(make)29 b(install)p Fv(',)41 b(this)e(path)h +(defaults)g(to)g(the)h(curren)m(t)f(directory)-8 b(.)70 +b(In)630 4098 y(either)31 b(case,)i(it)e(then)h(lo)s(oks)f(in)f(the)i +(curren)m(t)f(directory)g(for)g(a)h(directory)f(called)g +Fr(lib)p Fv(.)43 b(If)630 4208 y(there)38 b(are)f(duplicate)g +(de\014nitions,)g(the)g(last)g(one)h(loaded)f(tak)m(es)i(precedence)f +(o)m(v)m(er)h(the)630 4317 y(earlier)29 b(ones.)150 4501 +y Fr(setup_xfail)e(")p Fq(con\014g)38 b Fv([)p Fq(bugid)t +Fv(])p Fr(")630 4611 y Fv(Declares)c(that)h(the)e(test)i(is)d(exp)s +(ected)j(to)f(fail)e(on)i(a)g(particular)e(set)i(of)f +(con\014gurations.)630 4721 y(The)f Fq(con\014g)40 b +Fv(argumen)m(t)32 b(m)m(ust)h(b)s(e)e(a)i(list)d(of)j(full)d +(three-part)i Fr(configure)e Fv(target)k(name;)630 4830 +y(in)28 b(particular,)h(y)m(ou)h(ma)m(y)g(not)g(use)f(the)h(shorter)g +(nic)m(knames)f(supp)s(orted)f(b)m(y)h Fr(configure)630 +4940 y Fv(\(but)22 b(y)m(ou)g(can)g(use)g(the)g(common)g(shell)f +(wildcard)e(c)m(haracters)24 b(to)e(sp)s(ecify)f(sets)h(of)g(names\).) +630 5049 y(The)33 b Fq(bugid)i Fv(argumen)m(t)f(is)f(optional,)h(and)f +(used)g(only)f(in)g(the)i(logging)g(\014le)e(output;)j(use)630 +5159 y(it)29 b(as)g(a)h(link)d(to)j(a)f(bug-trac)m(king)h(system)f(suc) +m(h)g(as)g Fo(gna)-6 b(ts)28 b Fv(\(see)i(section)g(\\Ov)m(erview")f +(in)630 5269 y Fq(T)-8 b(rac)m(king)31 b(Bugs)f(With)g(GNA)-8 +b(TS)5 b Fv(\).)p eop +%%Page: 26 28 +26 27 bop 150 -116 a Fv(26)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)630 83 y(Once)36 b(y)m(ou)g(use)f +Fr(setup_xfail)p Fv(,)f(the)i Fr(fail)e Fv(and)h Fr(pass)g +Fv(pro)s(cedures)f(pro)s(duce)h(the)h(mes-)630 193 y(sages)43 +b(`)p Fr(XFAIL)p Fv(')e(and)h(`)p Fr(XPASS)p Fv(')f(resp)s(ectiv)m(ely) +-8 b(,)46 b(allo)m(wing)41 b(y)m(ou)h(to)h(distinguish)c(exp)s(ected) +630 302 y(failures)28 b(\(and)j(unexp)s(ected)e(success!\))42 +b(from)30 b(other)g(test)h(outcomes.)630 437 y Fn(Warning:)43 +b Fv(y)m(ou)25 b(m)m(ust)f(clear)h(the)f(exp)s(ected)h(failure)e(after) +i(using)e Fr(setup_xfail)e Fv(in)i(a)i(test)630 546 y(case.)41 +b(An)m(y)29 b(call)f(to)h Fr(pass)f Fv(or)h Fr(fail)e +Fv(clears)i(the)g(exp)s(ected)g(failure)e(implicitly;)e(if)j(the)h +(test)630 656 y(has)k(some)g(other)g(outcome,)i(e.g.)49 +b(an)32 b(error,)h(y)m(ou)h(can)f(call)f Fr(clear_xfail)d +Fv(to)34 b(clear)f(the)630 765 y(exp)s(ected)g(failure)f(explicitly)-8 +b(.)46 b(Otherwise,)33 b(the)g(exp)s(ected-failure)f(declaration)h +(applies)630 875 y(to)e(whatev)m(er)g(test)h(runs)c(next,)j(leading)e +(to)i(surprising)c(results.)150 1059 y Fr(clear_xfail)g +Fq(con\014g)630 1169 y Fv(Cancel)c(an)h(exp)s(ected)g(failure)d +(\(previously)h(declared)h(with)f Fr(setup_xfail)p Fv(\))f(for)i(a)h +(partic-)630 1279 y(ular)k(set)i(of)g(con\014gurations.)40 +b(The)29 b Fq(con\014g)37 b Fv(argumen)m(t)30 b(is)f(a)h(list)e(of)h +(con\014guration)g(target)630 1388 y(names.)68 b(It)40 +b(is)e(only)h(necessary)h(to)g(call)f Fr(clear_xfail)d +Fv(if)i(a)i(test)h(case)f(ends)f(without)630 1498 y(calling)29 +b(either)h Fr(pass)f Fv(or)h Fr(fail)p Fv(,)g(after)h(calling)e +Fr(setup_xfail)p Fv(.)150 1682 y Fr(verbose)f Fv([)p +Fr(-log)p Fv(])i([)p Fr(-n)p Fv(])g([)p Fr(--)p Fv(])h +Fr(")p Fq(string)8 b Fr(")28 b Fq(n)m(um)m(b)s(er)630 +1792 y Fv(T)-8 b(est)42 b(cases)g(can)f(use)g(this)g(function)e(to)j +(issue)e(helpful)f(messages)j(dep)s(ending)d(on)i(the)630 +1901 y(n)m(um)m(b)s(er)29 b(of)i(`)p Fr(--verbose)p Fv(')d(options)i +(on)g(the)h Fr(runtest)d Fv(command)i(line.)40 b(It)30 +b(prin)m(ts)f Fq(string)630 2011 y Fv(if)40 b(the)i(v)-5 +b(alue)41 b(of)h(the)g(v)-5 b(ariable)40 b Fr(verbose)f +Fv(is)i(higher)f(than)h(or)h(equal)f(to)h(the)g(optional)630 +2120 y Fq(n)m(um)m(b)s(er)p Fv(.)g(The)31 b(default)f(v)-5 +b(alue)31 b(for)g Fq(n)m(um)m(b)s(er)36 b Fv(is)31 b(1.)43 +b(Use)32 b(the)f(optional)g(`)p Fr(-log)p Fv(')f(argumen)m(t)630 +2230 y(to)k(cause)h Fq(string)40 b Fv(to)35 b(alw)m(a)m(ys)f(b)s(e)f +(added)g(to)i(the)f(log)f(\014le,)h(ev)m(en)h(if)d(it)i(w)m(on't)g(b)s +(e)f(prin)m(ted.)630 2340 y(Use)e(the)h(optional)e(`)p +Fr(-n)p Fv(')h(argumen)m(t)g(to)h(prin)m(t)e Fq(string)37 +b Fv(without)30 b(a)i(trailing)d(newline.)41 b(Use)630 +2449 y(the)31 b(optional)e(`)p Fr(--)p Fv(')h(argumen)m(t)h(if)f +Fq(string)37 b Fv(b)s(egins)28 b(with)i Fr(")p Fv(-)p +Fr(")p Fv(.)150 2698 y Fi(5.3.2)63 b(Remote)39 b(Comm)m(unication)h +(Pro)s(cedures)275 2891 y Fv(`)p Fr(lib/remote.exp)p +Fv(')c(de\014nes)i(these)i(functions,)g(for)g(establishing)d(and)i +(managing)g(comm)m(unica-)150 3000 y(tions:)275 3135 +y Fn(Pr)-5 b(o)g(c)g(e)g(dur)g(es)45 b(to)e(establish)h(a)f(c)-5 +b(onne)g(ction:)70 b Fv(Eac)m(h)42 b(of)g(these)f(pro)s(cedures)g +(tries)g(to)h(establish)e(the)150 3244 y(connection)31 +b(up)f(to)h(three)g(times)g(b)s(efore)f(returning.)40 +b(W)-8 b(arnings)31 b(\(if)f(retries)g(will)e(con)m(tin)m(ue\))k(or)e +(errors)150 3354 y(\(if)42 b(the)g(attempt)h(is)f(abandoned\))f(rep)s +(ort)h(on)g(comm)m(unication)g(failures.)74 b(The)42 +b(result)f(for)h(an)m(y)h(of)150 3464 y(these)31 b(pro)s(cedures)e(is)h +(either)g Fr(-1)p Fv(,)g(when)f(the)i(connection)g(cannot)g(b)s(e)f +(established,)f(or)h(the)h(spa)m(wn)f(ID)150 3573 y(returned)f(b)m(y)h +(the)h Fr(expect)e Fv(command)h Fr(spawn)p Fv(.)275 3708 +y(It)d(use)f(the)h(v)-5 b(alue)27 b(of)g(the)g Fr(connect)e +Fv(\014eld)g(in)h(the)h Fr(target_info)d Fv(arra)m(y)j(\(w)m(as)h +Fr(connectmode)c Fv(as)j(the)150 3817 y(t)m(yp)s(e)38 +b(of)g(connection)f(to)i(mak)m(e.)63 b(Curren)m(t)37 +b(supp)s(orted)f(connection)i(t)m(yp)s(es)f(are)h(tip,)h(k)m(ermit,)g +(telnet,)150 3927 y(rsh,)e(rlogin,)f(and)f(netdata.)59 +b(If)36 b(the)g Fr(--reboot)e Fv(option)h(w)m(as)i(used)e(on)h(the)g +(run)m(test)g(command)g(line,)150 4037 y(then)30 b(the)h(target)h(is)d +(reb)s(o)s(oted)h(b)s(efore)g(the)h(connection)f(is)g(made.)150 +4221 y Fr(remote_open)d Fq(t)m(yp)s(e)630 4330 y Fn(R)-5 +b(emote)40 b(Conne)-5 b(ction)41 b(Pr)-5 b(o)g(c)g(e)g(dur)g(e.)64 +b Fv(This)36 b(is)h(passed)g Fn(host)47 b Fv(or)38 b +Fn(tar)-5 b(get)p Fv(.)63 b(Host)39 b(or)e(target)630 +4440 y(refers)31 b(to)h(whether)f(it)g(is)f(a)i(connection)g(to)g(a)g +(remote)g(target,)h(or)f(a)g(remote)g(host.)44 b(This)630 +4550 y(op)s(ens)34 b(the)g(connection)h(to)g(the)g(desired)e(target)j +(or)e(host)h(using)e(the)i(default)e(v)-5 b(alues)34 +b(in)630 4659 y(the)25 b(con\014guration)f(system.)39 +b(It)25 b(returns)e(that)i Fr(spawn_id)e Fv(of)i(the)g(pro)s(cess)f +(that)h(manages)630 4769 y(the)32 b(connection.)46 b(This)30 +b(v)-5 b(alue)31 b(can)i(b)s(e)e(used)g(in)g Fr(expect)f +Fv(or)i Fr(exp_send)e Fv(statemen)m(ts,)k(or)630 4878 +y(passed)25 b(to)i(other)f(pro)s(cedures)e(that)i(need)g(the)g +(connection)g(pro)s(cess's)f(id.)38 b(This)24 b(also)i(sets)630 +4988 y(the)31 b Fr(fileid)d Fv(\014eld)h(in)g(the)i Fr(target_info)c +Fv(arra)m(y)-8 b(.)p eop +%%Page: 27 29 +27 28 bop 150 -116 a Fv(Chapter)30 b(5:)41 b(The)30 b(DejaGn)m(u)h +(Implemen)m(tation)1847 b(27)150 83 y Fr(remote_close)27 +b Fq(shellid)630 193 y Fn(shel)5 b(lid)42 b Fv(is)31 +b(v)-5 b(alue)31 b(returned)g(b)m(y)h(a)g(call)g(to)g +Fr(remote_open)p Fv(.)42 b(This)31 b(closes)h(the)g(connection)630 +302 y(to)c(the)g(target)h(so)f(resources)f(can)h(b)s(e)f(used)g(b)m(y)g +(others.)40 b(This)26 b(parameter)i(can)f(b)s(e)g(left)h(o\013)630 +412 y(if)h(the)i Fr(fileid)e Fv(\014eld)g(in)g(the)h +Fr(target_info)d Fv(arra)m(y)k(is)f(set.)150 596 y Fr(telnet)f +Fq(hostname)35 b(p)s(ort)150 706 y Fr(rlogin)29 b Fq(hostname)150 +815 y Fr(rsh)g Fq(hostname)630 925 y Fn(IP)d(network)g(pr)-5 +b(o)g(c)g(e)g(dur)g(es.)42 b Fq(hostname)28 b Fv(refers)23 +b(to)g(the)h(IP)e(address)h(or)g(name)g(\(for)g(example,)630 +1034 y(an)h(en)m(try)g(in)f(`)p Fr(/etc/hosts)p Fv('\))f(for)i(this)f +(target.)40 b(The)23 b(pro)s(cedure)g(names)h(re\015ect)h(the)f(Unix) +630 1144 y(utilit)m(y)29 b(used)h(to)i(establish)d(a)j(connection.)42 +b(The)31 b(optional)f Fq(p)s(ort)i Fv(is)e(used)g(to)i(sp)s(ecify)e +(the)630 1254 y(IP)35 b(p)s(ort)f(n)m(um)m(b)s(er.)53 +b(The)35 b(v)-5 b(alue)34 b(of)h(the)g Fr(netport)e Fv(\014eld)h(in)f +(the)j Fr(target_info)31 b Fv(arra)m(y)36 b(is)630 1363 +y(used.)64 b(\(w)m(as)40 b Fr($netport)p Fv(\))c(This)h(v)-5 +b(alue)38 b(has)g(t)m(w)m(o)i(parts,)h(the)d(hostname)h(and)f(the)h(p)s +(ort)630 1473 y(n)m(um)m(b)s(er,)26 b(sep)s(erated)g(b)m(y)g(a)h +Fn(:)p Fv(.)39 b(If)26 b Fr(host)f Fv(or)h Fr(target)f +Fv(is)g(used)h(in)f(the)h Fr(hostname)e Fv(\014eld,)i(than)630 +1582 y(the)31 b(con\014g)f(arra)m(y)h(is)e(used)h(for)g(all)f +(information.)150 1767 y Fr(tip)g Fq(p)s(ort)137 b Fn(Serial)29 +b(line)g(pr)-5 b(o)g(c)g(e)g(dur)g(e.)42 b Fv(Connect)26 +b(using)f(the)h(Unix)f(utilit)m(y)g Fr(tip)p Fv(.)38 +b Fq(p)s(ort)28 b Fv(m)m(ust)e(b)s(e)f(a)i(name)630 1876 +y(from)g(the)g Fr(tip)g Fv(con\014guration)g(\014le)f(`)p +Fr(/etc/remote)p Fv('.)37 b(Often,)28 b(this)e(is)h(called)f(`)p +Fr(hardwire)p Fv(',)630 1986 y(or)h(something)g(lik)m(e)g(`)p +Fr(ttya)p Fv('.)39 b(This)26 b(\014le)g(holds)g(all)h(the)g +(con\014guration)g(data)h(for)g(the)f(serial)630 2095 +y(p)s(ort.)61 b(The)37 b(v)-5 b(alue)37 b(of)h(the)f +Fr(serial)f Fv(\014eld)g(in)g(the)i Fr(target_info)c +Fv(arra)m(y)k(is)e(used.)61 b(\(w)m(as)630 2205 y Fr($serialport)p +Fv(\))24 b(If)i Fr(host)f Fv(or)h Fr(target)f Fv(is)g(used)h(in)f(the)i +Fr(port)e Fv(\014eld,)h(than)g(the)h(con\014g)f(arra)m(y)630 +2315 y(is)j(used)h(for)g(all)f(information.)150 2499 +y Fr(kermit)g Fq(p)s(ort)i(bps)630 2609 y Fn(Serial)39 +b(line)e(pr)-5 b(o)g(c)g(e)g(dur)g(e.)60 b Fv(Connect)36 +b(using)f(the)h(program)g Fr(kermit)p Fv(.)56 b Fq(p)s(ort)37 +b Fv(is)e(the)h(device)630 2718 y(name,)28 b(e.g.)40 +b(`)p Fr(/dev/ttyb)p Fv('.)e Fq(bps)29 b Fv(is)c(the)i(line)e(sp)s(eed) +g(to)j(use)e(\(in)g(bits)f(p)s(er)g(second\))i(for)g(the)630 +2828 y(connection.)59 b(The)36 b(v)-5 b(alue)36 b(of)h(the)f +Fr(serial)f Fv(\014eld)g(in)g(the)i Fr(target_info)c +Fv(arra)m(y)k(is)e(used.)630 2937 y(\(w)m(as)29 b Fr($serialport)p +Fv(\))d(If)i Fr(host)f Fv(or)h Fr(target)f Fv(is)h(used)f(in)g(the)i +Fr(port)e Fv(\014eld,)h(than)g(the)h(con\014g)630 3047 +y(arra)m(y)i(is)e(used)h(for)g(all)f(information.)150 +3206 y Fn(Pr)-5 b(o)g(c)g(e)g(dur)g(es)35 b(to)e(manage)h(a)f(c)-5 +b(onne)g(ction:)150 3391 y Fr(tip_download)27 b Fq(spa)m(wnid)32 +b(\014le)630 3500 y Fv(Do)m(wnload)25 b(`)p Fq(\014le)5 +b Fv(')24 b(to)i(the)f(pro)s(cess)f Fq(spa)m(wnid)j Fv(\(the)e(v)-5 +b(alue)24 b(returned)g(when)g(the)h(connection)630 3610 +y(w)m(as)42 b(established\),)h(using)d(the)h Fr(~put)g +Fv(command)g(under)f Fr(tip)p Fv(.)72 b(Most)43 b(often)f(used)e(for) +630 3719 y(single)29 b(b)s(oard)h(computers)g(that)h(require)e(do)m +(wnloading)g(programs)h(in)g Fo(asci)r(i)g Fv(S-records.)630 +3829 y(Returns)f Fr(1)h Fv(if)g(an)g(error)g(o)s(ccurs,)g +Fr(0)g Fv(otherwise.)150 4013 y Fr(exit_remote_shell)c +Fq(spa)m(wnid)630 4123 y Fv(Exits)34 b(a)g(remote)h(pro)s(cess)f +(started)h(b)m(y)f(an)m(y)h(of)g(the)f(connection)h(pro)s(cedures.)51 +b Fq(spa)m(wnid)630 4232 y Fv(is)29 b(the)i(result)e(of)i(the)f +(connection)h(pro)s(cedure)e(that)i(started)g(the)g(remote)g(pro)s +(cess.)150 4417 y Fr(download)d Fq(\014le)35 b Fv([)30 +b Fq(spa)m(wnid)i Fv(])630 4526 y(After)c(y)m(ou)h(establish)d(a)j +(connection)f(to)h(a)f(target,)j(y)m(ou)d(can)g(do)m(wnload)g(programs) +f(using)630 4636 y(this)39 b(command.)68 b Fr(download)38 +b Fv(reads)i(in)e Fq(\014le)44 b Fv(\(ob)5 b(ject)41 +b(co)s(de)f(in)f(S-record)g(format\))i(and)630 4746 y(writes)29 +b(it)g(to)h(the)g(device)g(con)m(trolling)e(this)h Fq(spa)m(wnid)p +Fv(.)38 b(\(F)-8 b(rom)31 b(the)f(p)s(oin)m(t)e(of)i(view)f(of)h(the) +630 4855 y(target,)i(the)f(S-record)f(\014le)f(comes)i(in)f(via)g +(standard)f(input.\))630 4990 y(If)38 b(y)m(ou)g(ha)m(v)m(e)i(more)e +(than)g(one)g(target)i(activ)m(e,)i(y)m(ou)c(can)h(use)f(the)g +(optional)f(argumen)m(t)630 5099 y Fq(spa)m(wnid)28 b +Fv(to)g(sp)s(ecify)d(an)h(alternativ)m(e)h(target)h(\(the)f(default)f +(is)g(the)g(most)h(recen)m(tly)g(estab-)630 5209 y(lished)h +Fq(spa)m(wnid)p Fv(.\))p eop +%%Page: 28 30 +28 29 bop 150 -116 a Fv(28)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 83 y Fi(5.3.3)63 +b(Utilit)m(y)40 b(Pro)s(cedures)275 276 y Fv(`)p Fr(lib/utils.exp)p +Fv(')27 b(de\014nes)i(these)i(utilit)m(y)e(pro)s(cedures:)150 +460 y Fr(getdirs)f Fq(dir)150 570 y Fr(getdirs)g Fq(dir)36 +b(pattern)630 679 y Fv(Returns)21 b(a)h(list)e(of)i(all)f(the)h +(directories)e(in)h(the)h(single)e(directory)h Fq(dir)27 +b Fv(that)22 b(matc)m(h)h Fq(pattern)p Fv(.)630 789 y(If)31 +b(y)m(ou)g(do)g(not)g(sp)s(ecify)f Fq(pattern)p Fv(,)i +Fr(getdirs)d Fv(assumes)h(`)p Fr(*)p Fv('.)43 b(Y)-8 +b(ou)32 b(ma)m(y)g(use)e(the)i(common)630 898 y(shell)f(wildcard)f(c)m +(haracters)k(in)e Fq(pattern)p Fv(.)48 b(If)32 b(no)g(directories)g +(matc)m(h)i(the)f(pattern,)g(then)630 1008 y(a)e Fr(NULL)e +Fv(string)g(is)h(returned.)150 1192 y Fr(find)f Fq(dir)35 +b(pattern)630 1302 y Fv(Searc)m(h)42 b(for)f(\014les)f(whose)h(names)h +(matc)m(h)g Fq(pattern)g Fv(\(using)e(shell)f(wildcard)g(c)m(haracters) +630 1411 y(for)30 b(\014lename)g(expansion\).)41 b(Searc)m(h)31 +b(sub)s(directories)d(recursiv)m(ely)-8 b(,)31 b(starting)f(at)h +Fq(dir)p Fv(.)40 b(The)630 1521 y(result)g(is)g(the)i(list)e(of)h +(\014les)f(whose)h(names)g(matc)m(h;)48 b(if)40 b(no)h(\014les)f(matc)m +(h,)45 b(the)d(result)e(is)630 1631 y(empt)m(y)-8 b(.)54 +b(Filenames)34 b(in)f(the)h(result)g(include)e(all)h(in)m(terv)m(ening) +h(sub)s(directory)e(names.)53 b(If)630 1740 y(no)30 b(\014les)g(matc)m +(h)h(the)f(pattern,)h(then)f(a)h Fr(NULL)e Fv(string)h(is)f(returned.) +150 1924 y Fr(which)g Fq(binary)630 2034 y Fv(Searc)m(hes)43 +b(the)f(execution)g(path)g(for)g(an)g(executable)h(\014le)e +Fq(binary)p Fv(,)j(lik)m(e)d(the)h(the)h(BSD)630 2144 +y Fr(which)38 b Fv(utilit)m(y)-8 b(.)66 b(This)37 b(pro)s(cedure)i +(uses)f(the)i(shell)d(en)m(vironmen)m(t)i(v)-5 b(ariable)38 +b(`)p Fr(PATH)p Fv('.)67 b(It)630 2253 y(returns)32 b +Fr(0)g Fv(if)g(the)h(binary)e(is)h(not)h(in)e(the)i(path,)h(or)f(if)f +(there)h(is)e(no)i(`)p Fr(PATH)p Fv(')f(en)m(vironmen)m(t)630 +2363 y(v)-5 b(ariable.)40 b(If)29 b Fq(binary)37 b Fv(is)29 +b(in)g(the)i(path,)f(it)g(returns)f(the)i(full)d(path)i(to)h +Fq(binary)p Fv(.)150 2547 y Fr(grep)e Fq(\014lename)35 +b(regexp)150 2707 y Fr(grep)29 b Fq(\014lename)35 b(regexp)e +Fr(line)630 2816 y Fv(Searc)m(h)i(the)h(\014le)e(called)h +Fq(\014lename)k Fv(\(a)d(fully)d(sp)s(eci\014ed)g(path\))j(for)f(lines) +e(that)j(con)m(tain)g(a)630 2926 y(matc)m(h)i(for)g(regular)e +(expression)g Fq(regexp)p Fv(.)63 b(The)36 b(result)h(is)f(a)i(list)e +(of)i(all)e(the)i(lines)d(that)630 3035 y(matc)m(h.)54 +b(If)33 b(no)i(lines)d(matc)m(h,)37 b(the)d(result)f(is)h(an)g(empt)m +(y)h(string.)51 b(Sp)s(ecify)33 b Fq(regexp)k Fv(using)630 +3145 y(the)31 b(standard)e(regular)h(expression)f(st)m(yle)h(used)g(b)m +(y)g(the)h(Unix)e(utilit)m(y)g(program)h Fr(grep)p Fv(.)630 +3279 y(Use)f(the)f(optional)g(third)e(argumen)m(t)j(`)p +Fr(line)p Fv(')f(to)h(start)g(lines)d(in)h(the)i(result)e(with)g(the)i +(line)630 3389 y(n)m(um)m(b)s(er)35 b(in)g Fq(\014lename)p +Fv(.)58 b(\(This)35 b(argumen)m(t)i(is)f(simply)e(an)i(option)g +(\015ag;)k(t)m(yp)s(e)d(it)f(just)g(as)630 3499 y(sho)m(wn|`)p +Fr(line)p Fv('.\))150 3683 y Fr(diff)29 b Fq(\014lename)35 +b(\014lename)630 3792 y Fv(Compares)f(the)g(t)m(w)m(o)h(\014les)e(and)g +(returns)g(a)i(1)f(if)f(they)h(matc)m(h,)i(or)e(a)g(0)h(if)e(they)h +(don't.)51 b(If)630 3902 y Fr(verbose)28 b Fv(is)i(set,)h(then)f(it'll) +f(prin)m(t)g(the)h(di\013erences)g(to)h(the)g(screen.)150 +4086 y Fr(slay)e Fq(name)630 4196 y Fv(This)h(lo)s(ok)h(in)g(the)h(pro) +s(cess)f(tab)s(el)g(for)g Fq(name)37 b Fv(and)31 b(send)g(it)h(a)g +(unix)e Fr(SIGINT)p Fv(,)g(killing)f(the)630 4306 y(pro)s(cess.)150 +4490 y Fr(absolute)f Fq(path)630 4599 y Fv(This)h(pro)s(cedure)g(tak)m +(es)j(the)e(relativ)m(e)h Fq(path)p Fv(,)f(and)g(con)m(v)m(erts)i(it)e +(to)h(an)f(absolute)g(path.)150 4784 y Fr(psource)e Fq(\014lename)630 +4893 y Fv(This)23 b(sources)j(the)f(\014le)f Fq(\014lename)p +Fv(,)i(and)f(traps)g(all)f(errors.)38 b(It)26 b(also)f(ignores)f(all)g +(extraneous)630 5003 y(output.)40 b(If)30 b(there)h(w)m(as)g(an)f +(error)g(it)g(returns)f(a)i(1,)g(otherwise)e(it)h(returns)f(a)i(0.)p +eop +%%Page: 29 31 +29 30 bop 150 -116 a Fv(Chapter)30 b(5:)41 b(The)30 b(DejaGn)m(u)h +(Implemen)m(tation)1847 b(29)150 83 y Fr(prune)29 b Fq(list)i(pattern) +630 193 y Fv(Remo)m(v)m(e)37 b(elemen)m(ts)f(of)f(the)g(Tcl)g(list)f +Fq(list)p Fv(.)54 b(Elemen)m(ts)35 b(are)h(\014elds)d(delimited)g(b)m +(y)i(spaces.)630 302 y(The)29 b(result)f(is)g(a)h(cop)m(y)h(of)g +Fq(list)p Fv(,)e(without)g(an)m(y)h(elemen)m(ts)h(that)g(matc)m(h)g +Fq(pattern)p Fv(.)40 b(Y)-8 b(ou)30 b(can)630 412 y(use)g(the)h(common) +f(shell)f(wildcard)f(c)m(haracters)k(to)f(sp)s(ecify)e +Fq(pattern)p Fv(.)150 595 y Fr(setenv)g Fq(v)-5 b(ar)36 +b(v)-5 b(al)630 705 y Fv(Sets)30 b(the)h(v)-5 b(ariable)29 +b Fq(v)-5 b(ar)37 b Fv(to)31 b(the)g(v)-5 b(alue)29 b +Fq(v)-5 b(al)p Fv(.)150 888 y Fr(unsetenv)28 b Fq(v)-5 +b(ar)630 998 y Fv(Unsets)30 b(the)h(en)m(vironmen)m(t)f(v)-5 +b(ariable)29 b Fq(v)-5 b(ar)150 1181 y Fr(getenv)29 b +Fq(v)-5 b(ar)630 1291 y Fv(returns)39 b(the)i(v)-5 b(alue)40 +b(of)h Fq(v)-5 b(ar)47 b Fv(in)39 b(the)i(en)m(vironmen)m(t)f(if)f(it)h +(exists,)j(otherwise)d(it)g(returns)630 1400 y Fr(NULL)p +Fv(.)150 1584 y Fr(runtest_file_p)26 b Fq(run)m(tests)34 +b(testcase)630 1693 y Fv(Searc)m(h)d Fq(run)m(tests)j +Fv(for)c Fq(testcase)37 b Fv(and)30 b(return)g(1)g(if)g(found,)f(0)i +(if)e(not.)41 b Fq(run)m(tests)34 b Fv(is)c(a)h(list)e(of)630 +1803 y(t)m(w)m(o)i(elemen)m(ts.)41 b(The)30 b(\014rst)f(is)g(the)h +(pathname)g(of)g(the)g(testsuite)g(exp)s(ect)h(script)d(running.)630 +1912 y(The)g(second)h(is)f(a)i(cop)m(y)g(of)f(what)f(w)m(as)i(on)f(the) +g(righ)m(t)f(side)g(of)h(the)h Fr(=)e Fv(if)g(`)p Fr(foo.exp="...)m(")p +Fv(')630 2022 y(w)m(as)33 b(sp)s(eci\014ed,)f(or)h(an)f(empt)m(y)i +(string)d(if)h(no)h(suc)m(h)f(argumen)m(t)h(is)f(presen)m(t.)48 +b(This)31 b(is)h(used)630 2131 y(b)m(y)e(to)s(ols)g(lik)m(e)g +(compilers)f(where)h(eac)m(h)h(testcase)i(is)c(a)i(\014le.)150 +2315 y Fr(prune_system_crud)26 b Fq(system)k(text)630 +2424 y Fv(F)-8 b(or)30 b(system)f Fq(system)p Fv(,)h(delete)g(text)g +(the)g(host)f(or)g(target)i(op)s(erating)e(system)g(migh)m(t)g(issue) +630 2534 y(that)22 b(will)c(in)m(terfere)j(with)e(pattern)j(matc)m +(hing)f(of)g(program)g(output)f(in)g Fq(text)p Fv(.)39 +b(An)20 b(example)630 2644 y(is)29 b(the)i(message)g(that)g(is)f(prin)m +(ted)f(if)g(a)i(shared)e(library)f(is)i(out)g(of)h(date.)150 +2891 y Fi(5.3.4)63 b(Cross)41 b(target)g(pro)s(cedure)275 +3084 y Fv(`)p Fr(lib/target.exp)p Fv(')27 b(de\014nes)i(these)i(utilit) +m(y)e(pro)s(cedures:)150 3267 y Fr(push_target)e Fn(name)630 +3377 y Fv(This)22 b(mak)m(es)j(the)f(target)h(named)e +Fn(name)31 b Fv(b)s(e)24 b(the)g(curren)m(t)f(target)i(connection.)39 +b(The)23 b(v)-5 b(alue)630 3486 y(of)30 b Fn(name)38 +b Fv(is)29 b(an)h(index)f(in)m(to)h(the)g Fr(target_info)d +Fv(arra)m(y)k(and)e(is)g(set)i(in)e(the)h(global)g(con\014g)630 +3596 y(\014le.)150 3779 y Fr(pop_target)630 3889 y Fv(This)f(unsets)g +(the)i(curren)m(t)f(target)i(connection.)150 4072 y Fr(list_targets)630 +4182 y Fv(This)d(lists)f(all)i(the)g(supp)s(orted)f(targets)j(for)e +(this)f(arc)m(hitecture.)150 4365 y Fr(push_host)f Fn(name)630 +4475 y Fv(This)g(mak)m(es)j(the)g(host)f(named)g Fn(name)37 +b Fv(b)s(e)30 b(the)g(curren)m(t)g(remote)h(host)g(connection.)40 +b(The)630 4584 y(v)-5 b(alue)31 b(of)i Fn(name)39 b Fv(is)31 +b(an)h(index)e(in)m(to)i(the)h Fr(target_info)28 b Fv(arra)m(y)33 +b(and)e(is)g(set)i(in)d(the)j(global)630 4694 y(con\014g)e(\014le.)150 +4877 y Fr(pop_host)96 b Fv(This)29 b(unsets)g(the)i(curren)m(t)f(host)h +(connection.)630 5011 y(This)f(in)m(v)m(ok)m(es)i(the)f(compiler)f(as)i +(set)g(b)m(y)f Fr(CC)g Fv(to)h(compile)e(the)i(\014le)e +Fn(\014le)p Fv(.)44 b(The)31 b(default)g(op-)630 5121 +y(tions)24 b(for)h(man)m(y)g(cross)g(compilation)f(targets)i(are)f +Fn(guesse)-5 b(d)35 b Fv(b)m(y)25 b(DejaGn)m(u,)i(and)d(these)i(op-)630 +5230 y(tions)g(can)h(b)s(e)f(added)h(to)g(b)m(y)g(passing)e(in)h(more)h +(parameters)g(as)g(argumen)m(ts)g(to)h Fr(compile)p Fv(.)630 +5340 y(Optionally)-8 b(,)32 b(this)f(will)f(also)j(use)g(the)g(v)-5 +b(alue)32 b(of)h(the)g Fr(cflags)e Fv(\014eld)g(in)g(the)i(target)i +(con\014g)p eop +%%Page: 30 32 +30 31 bop 150 -116 a Fv(30)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)630 83 y(arra)m(y)g(.)43 +b(If)31 b(the)g(host)g(is)f(not)h(the)g(same)h(as)f(the)g(build)d(mac)m +(hines,)j(then)g(then)f(compiler)g(is)630 193 y(run)f(on)h(the)h +(remote)g(host)g(using)d Fr(execute_anywhere)p Fv(.)630 +324 y(This)k(pro)s(duces)g(an)i(arc)m(hiv)m(e)g(\014le.)50 +b(An)m(y)34 b(parameters)g(passed)f(to)h Fr(archive)e +Fv(are)i(used)f(in)630 434 y(addition)39 b(to)j(the)g(default)e +(\015ags.)74 b(Optionally)-8 b(,)42 b(this)e(will)f(also)i(use)g(the)h +(v)-5 b(alue)40 b(of)i(the)630 544 y Fr(arflags)d Fv(\014eld)g(in)h +(the)h(target)i(con\014g)e(arra)m(y)-8 b(.)73 b(If)41 +b(the)g(host)g(is)f(not)h(the)g(same)h(as)f(the)630 653 +y(build)31 b(mac)m(hines,)k(then)f(then)g(arc)m(hiv)m(er)h(is)e(run)g +(on)h(the)h(remote)g(host)f(using)f Fr(execute_)630 763 +y(anywhere)p Fv(.)630 895 y(This)28 b(generates)j(an)f(index)e(for)h +(the)h(arc)m(hiv)m(e)g(\014le)f(for)h(systems)f(that)i(aren't)f(POSIX)f +(y)m(et.)630 1004 y(An)m(y)h(parameters)h(passed)f(to)h +Fr(ranlib)e Fv(are)i(used)e(in)g(for)h(the)h(\015ags.)150 +1180 y Fr(execute_anywhere)26 b Fn(cmd)5 b(line)630 1290 +y Fv(This)36 b(executes)j(the)f Fn(cmd)5 b(line)45 b +Fv(on)37 b(the)h(prop)s(er)f(host.)63 b(This)36 b(should)f(b)s(e)j +(used)f(as)h(a)g(re-)630 1399 y(placemen)m(t)c(for)e(the)i(Tcl)e +(command)h Fr(exec)f Fv(as)h(this)f(v)m(ersion)h(utilizes)e(the)i +(target)i(con\014g)630 1509 y(info)25 b(to)h(execute)h(this)d(command)i +(on)f(the)h(build)d(mac)m(hine)i(or)h(a)g(remote)g(host.)39 +b(All)25 b(con\014g)630 1619 y(information)k(for)i(the)g(remote)h(host) +f(m)m(ust)g(b)s(e)f(setup)h(to)g(ha)m(v)m(e)h(this)e(command)h(w)m +(ork.)42 b(If)630 1728 y(this)25 b(is)g(a)h(canadian)g(cross,)h +(\(where)f(w)m(e)g(test)h(a)g(cross)f(compiler)e(that)j(runs)d(on)i(a)g +(di\013eren)m(t)630 1838 y(host)k(then)f(where)h(DejaGn)m(u)g(is)f +(running\))e(then)j(a)g(connection)g(is)f(made)h(to)g(the)g(remote)630 +1947 y(host)39 b(and)e(the)i(command)f(is)g(executed)h(there.)65 +b(It)39 b(returns)e(either)h Fn(REMOTERR)n(OR)630 2057 +y Fv(\(for)32 b(an)h(error\))f(or)g(the)h(output)e(pro)s(duced)g(when)g +(the)i(command)f(w)m(as)g(executed.)48 b(This)630 2167 +y(is)29 b(used)h(for)g(running)e(the)i(to)s(ol)h(to)g(b)s(e)f(tested,)h +(not)g(a)f(test)i(case.)150 2383 y Fi(5.3.5)63 b(Debugging)42 +b(Pro)s(cedures)275 2573 y Fv(`)p Fr(lib/debugger.exp)p +Fv(')26 b(de\014nes)j(these)i(utilit)m(y)e(pro)s(cedures:)150 +2749 y Fr(dumpvars)f Fn(expr)630 2858 y Fv(This)33 b(tak)m(es)k(a)f +(csh)f(st)m(yle)g(regular)g(expression)f(\(glob)h(rules\))f(and)h(prin) +m(ts)f(the)h(v)-5 b(alues)35 b(of)630 2968 y(the)c(global)e(v)-5 +b(ariable)29 b(names)i(that)g(matc)m(h.)41 b(It)31 b(is)e(abbreviated)h +(as)h Fr(dv)150 3144 y(dumplocals)d Fn(expr)630 3254 +y Fv(This)33 b(tak)m(es)k(a)f(csh)f(st)m(yle)g(regular)g(expression)f +(\(glob)h(rules\))f(and)h(prin)m(ts)f(the)h(v)-5 b(alues)35 +b(of)630 3363 y(the)c(lo)s(cal)e(v)-5 b(ariable)29 b(names)i(that)g +(matc)m(h.)41 b(It)31 b(is)e(abbreviated)h(as)g Fr(dl)p +Fv(.)150 3539 y Fr(dumprocs)e Fn(expr)630 3649 y Fv(This)f(tak)m(es)j +(a)g(csh)e(st)m(yle)h(regular)f(expression)g(\(glob)h(rules\))e(and)h +(prin)m(ts)g(the)h(b)s(o)s(dy)e(of)i(all)630 3759 y(pro)s(cs)h(that)h +(matc)m(h.)41 b(It)31 b(is)e(abbreviated)h(as)g Fr(dp)150 +3935 y(dumpwatch)e Fn(expr)630 4044 y Fv(This)i(tak)m(es)j(a)f(csh)g +(st)m(yle)g(regular)f(expression)g(\(glob)g(rules\))g(and)g(prin)m(ts)g +(all)f(the)i(w)m(atc)m(h-)630 4154 y(p)s(oin)m(ts.)40 +b(It)30 b(is)f(abbreviated)h(as)h Fr(dw)p Fv(.)150 4330 +y Fr(watchunset)d Fn(var)630 4440 y Fv(This)22 b(breaks)i(program)f +(execution)i(when)d(the)j(v)-5 b(ariable)22 b Fn(var)35 +b Fv(is)22 b(unset.)39 b(It)24 b(is)f(abbreviated)630 +4549 y(as)31 b Fr(wu)p Fv(.)150 4725 y Fr(watchwrite)d +Fn(var)630 4835 y Fv(This)g(breaks)h(program)h(execution)g(when)f(the)g +(v)-5 b(ariable)29 b Fn(var)40 b Fv(is)29 b(written.)39 +b(It)30 b(is)f(abbrevi-)630 4945 y(ated)i(as)g Fr(ww)p +Fv(.)150 5121 y Fr(watchread)d Fn(var)630 5230 y Fv(This)e(breaks)h +(program)g(execution)h(when)e(the)i(v)-5 b(ariable)26 +b Fn(var)38 b Fv(is)27 b(read.)39 b(It)28 b(is)f(abbreviated)630 +5340 y(as)k Fr(wr)p Fv(.)p eop +%%Page: 31 33 +31 32 bop 150 -116 a Fv(Chapter)30 b(5:)h(The)f(DejaGn)m(u)h(Implemen)m +(tation)1857 b(31)150 83 y Fr(watchdel)28 b Fn(watch)630 +193 y Fv(This)h(deletes)h(a)h(the)f(w)m(atc)m(hp)s(oin)m(t)h(for)f +Fn(watch)p Fv(.)42 b(It)31 b(is)e(abbreviated)h(as)g +Fr(wd)p Fv(.)150 372 y Fr(print)f Fn(var)85 b Fv(This)29 +b(prin)m(ts)f(the)j(v)-5 b(alue)30 b(of)g(the)h(v)-5 +b(ariable)29 b Fn(var)p Fv(.)41 b(It)31 b(is)e(abbreviated)h(as)h +Fr(p)p Fv(.)150 552 y Fr(quit)288 b Fv(This)29 b(mak)m(es)i(run)m(test) +f(exit.)41 b(It)30 b(is)g(abbreviated)f(as)i Fr(q)p Fv(.)150 +732 y Fr(bt)384 b Fv(This)29 b(prin)m(ts)f(a)j(bac)m(ktrace)i(of)d(the) +h(executed)g(Tcl)f(commands.)150 985 y Fu(5.4)68 b(T)-11 +b(arget)45 b(dep)t(enden)l(t)g(pro)t(cedures)275 1176 +y Fv(Eac)m(h)37 b(com)m(bination)e(of)i(target)h(and)e(to)s(ol)g +(requires)f(some)i(target-dep)s(enden)m(t)g(pro)s(cedures.)57 +b(The)150 1286 y(names)24 b(of)f(these)h(pro)s(cedures)f(ha)m(v)m(e)h +(a)g(common)g(form:)37 b(the)24 b(to)s(ol)f(name,)j(follo)m(w)m(ed)d(b) +m(y)g(an)h(underbar)e(`)p Fr(_)p Fv(',)150 1396 y(and)k(\014nally)e(a)j +(su\016x)e(describing)f(the)i(pro)s(cedure's)g(purp)s(ose.)37 +b(F)-8 b(or)27 b(example,)h(a)e(pro)s(cedure)f(to)i(extract)150 +1505 y(the)45 b(v)m(ersion)g(from)g Fo(gdb)g Fv(is)f(called)h(`)p +Fr(gdb_version)p Fv('.)83 b(See)45 b(Section)g(5.2)h([Initialization)e +(Mo)s(dule],)150 1615 y(page)39 b(22,)i(for)d(a)h(discussion)c(of)k(ho) +m(w)f(DejaGn)m(u)h(arranges)f(to)h(\014nd)e(the)h(righ)m(t)g(pro)s +(cedures)f(for)h(eac)m(h)150 1724 y(target.)275 1857 +y Fr(runtest)e Fv(itself)i(calls)f(only)h(t)m(w)m(o)i(of)f(these)g(pro) +s(cedures,)g Fq(to)s(ol)t Fr(_exit)e Fv(and)h Fq(to)s(ol)t +Fr(_version)p Fv(;)i(these)150 1967 y(pro)s(cedures)29 +b(use)h(no)g(argumen)m(ts.)275 2100 y(The)f(other)i(t)m(w)m(o)h(pro)s +(cedures,)d Fq(to)s(ol)t Fr(_start)g Fv(and)h Fq(to)s(ol)t +Fr(_load)p Fv(,)e(are)j(only)f(called)f(b)m(y)i(the)f(test)i(suites)150 +2209 y(themselv)m(es)38 b(\(or)f(b)m(y)h(testsuite-sp)s(eci\014c)f +(initialization)d(co)s(de\);)42 b(they)37 b(ma)m(y)h(tak)m(e)h(argumen) +m(ts)f(or)f(not,)150 2319 y(dep)s(ending)28 b(on)i(the)h(con)m(v)m(en)m +(tions)g(used)f(within)e(eac)m(h)j(test)g(suite.)150 +2499 y Fq(to)s(ol)t Fr(_start)630 2609 y Fv(Starts)22 +b(a)g(particular)e(to)s(ol.)37 b(F)-8 b(or)23 b(an)e(in)m(teractiv)m(e) +i(to)s(ol,)g Fq(to)s(ol)t Fr(_start)d Fv(starts)i(and)f(initializes)630 +2718 y(the)28 b(to)s(ol,)h(lea)m(ving)f(the)g(to)s(ol)g(up)f(and)h +(running)d(for)j(the)g(test)h(cases;)h(an)e(example)g(is)f +Fr(gdb_)630 2828 y(start)p Fv(,)41 b(the)f(start)h(function)d(for)i +Fo(gdb)p Fv(.)69 b(F)-8 b(or)40 b(a)g(batc)m(h)h(orien)m(ted)f(to)s +(ol,)i Fq(to)s(ol)t Fr(_start)c Fv(is)630 2937 y(optional;)26 +b(the)e(recommended)g(con)m(v)m(en)m(tion)h(is)e(to)i(let)f +Fq(to)s(ol)t Fr(_start)f Fv(run)f(the)j(to)s(ol,)g(lea)m(ving)630 +3047 y(the)41 b(output)f(in)g(a)h(v)-5 b(ariable)40 b(called)g +Fr(comp_output)p Fv(.)69 b(T)-8 b(est)41 b(scripts)f(can)h(then)g +(analyze)630 3156 y(`)p Fr($comp_output)p Fv(')29 b(to)k(determine)e +(the)h(test)g(results.)44 b(An)32 b(example)f(of)h(this)f(second)h +(kind)630 3266 y(of)f(start)f(function)g(is)f Fr(gcc_start)p +Fv(,)f(the)j(start)g(function)e(for)h Fo(gcc)p Fv(.)630 +3399 y Fr(runtest)18 b Fv(itself)h Fn(do)-5 b(es)25 b(not)f(c)-5 +b(al)5 b(l)30 b Fq(to)s(ol)t Fr(_start)p Fv(.)36 b(The)19 +b(initialization)e(mo)s(dule)i(`)p Fq(to)s(ol)t Fr(_init.exp)p +Fv(')630 3509 y(m)m(ust)35 b(call)f Fq(to)s(ol)t Fr(_start)f +Fv(for)i(in)m(teractiv)m(e)h(to)s(ols;)h(for)e(batc)m(h-orien)m(ted)h +(to)s(ols,)g(eac)m(h)g(indi-)630 3618 y(vidual)i(test)k(script)d(calls) +h Fq(to)s(ol)t Fr(_start)e Fv(\(or)j(mak)m(es)g(other)g(arrangemen)m +(ts)g(to)h(run)d(the)630 3728 y(to)s(ol\).)150 3908 y +Fq(to)s(ol)t Fr(_load)82 b Fv(Loads)25 b(something)f(in)m(to)h(a)g(to)s +(ol.)39 b(F)-8 b(or)26 b(an)e(in)m(teractiv)m(e)i(to)s(ol,)g(this)e +(conditions)f(the)i(to)s(ol)g(for)630 4017 y(a)35 b(particular)e(test)i +(case;)j(for)d(example,)g Fr(gdb_load)e Fv(loads)h(a)h(new)f +(executable)h(\014le)f(in)m(to)630 4127 y(the)24 b(debugger.)39 +b(F)-8 b(or)24 b(batc)m(h)h(orien)m(ted)f(to)s(ols,)h +Fq(to)s(ol)t Fr(_load)d Fv(ma)m(y)j(do)f(nothing|though,)g(for)630 +4237 y(example,)h(the)f Fo(gcc)g Fv(supp)s(ort)e(uses)h +Fr(gcc_load)f Fv(to)j(load)e(and)h(run)e(a)i(binary)e(on)i(the)g +(target)630 4346 y(en)m(vironmen)m(t.)61 b(Con)m(v)m(en)m(tionally)-8 +b(,)39 b Fq(to)s(ol)t Fr(_load)d Fv(lea)m(v)m(es)j(the)e(output)g(of)h +(an)m(y)f(program)g(it)630 4456 y(runs)f(in)h(a)h(v)-5 +b(ariable)36 b(called)h(`)p Fr(exec_output)p Fv('.)61 +b(W)-8 b(riting)37 b Fq(to)s(ol)t Fr(_load)e Fv(can)k(b)s(e)e(the)h +(most)630 4565 y(complex)27 b(part)g(of)g(extending)g(DejaGn)m(u)h(to)f +(a)h(new)f(to)s(ol)g(or)g(a)g(new)g(target,)j(if)c(it)g(requires)630 +4675 y(m)m(uc)m(h)k(comm)m(unication)g(co)s(ding)g(or)g(\014le)f(do)m +(wnloading.)630 4808 y(T)-8 b(est)31 b(scripts)e(call)h +Fq(to)s(ol)t Fr(_load)p Fv(.)150 4988 y Fq(to)s(ol)t +Fr(_exit)82 b Fv(Cleans)33 b(up)g(\(if)h(necessary\))h(b)s(efore)f +Fr(runtest)e Fv(exits.)52 b(F)-8 b(or)35 b(in)m(teractiv)m(e)g(to)s +(ols,)g(this)e(usu-)630 5097 y(ally)38 b(ends)f(the)i(in)m(teractiv)m +(e)h(session.)65 b(Y)-8 b(ou)39 b(can)g(also)g(use)f +Fq(to)s(ol)t Fr(_exit)f Fv(to)i(remo)m(v)m(e)i(an)m(y)630 +5207 y(temp)s(orary)30 b(\014les)f(left)h(o)m(v)m(er)i(from)e(the)h +(tests.)630 5340 y Fr(runtest)d Fv(calls)i Fq(to)s(ol)t +Fr(_exit)p Fv(.)p eop +%%Page: 32 34 +32 33 bop 150 -116 a Fv(32)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 83 y Fq(to)s(ol)t +Fr(_version)630 193 y Fv(Prin)m(ts)36 b(the)i(v)m(ersion)e(lab)s(el)g +(and)h(n)m(um)m(b)s(er)f(for)h Fq(to)s(ol)p Fv(.)61 b(This)36 +b(is)g(called)g(b)m(y)i(the)f(DejaGn)m(u)630 302 y(pro)s(cedure)31 +b(that)i(prin)m(ts)e(the)i(\014nal)e(summary)h(rep)s(ort.)46 +b(The)32 b(output)g(should)f(consist)h(of)630 412 y(the)f(full)d(path)i +(name)g(used)g(for)g(the)g(tested)i(to)s(ol,)e(and)g(its)g(v)m(ersion)g +(n)m(um)m(b)s(er.)630 546 y Fr(runtest)e Fv(calls)i Fq(to)s(ol)t +Fr(_version)p Fv(.)275 706 y(The)h(usual)g(con)m(v)m(en)m(tion)i(for)f +(return)f(co)s(des)h(from)g(an)m(y)g(of)h(these)f(pro)s(cedures)f +(\(although)h(it)g(is)f(not)150 815 y(required)25 b(b)m(y)i +Fr(runtest)p Fv(\))f(is)g(to)h(return)f Fr(0)h Fv(if)f(the)h(pro)s +(cedure)f(succeeded,)i Fr(1)f Fv(if)f(it)g(failed,)h(and)f +Fr(-1)h Fv(if)f(there)150 925 y(w)m(as)31 b(a)g(comm)m(unication)e +(error.)150 1182 y Fu(5.5)68 b(Remote)47 b(targets)f(supp)t(orted)275 +1375 y Fv(The)35 b(DejaGn)m(u)j(distribution)33 b(includes)h(supp)s +(ort)g(for)i(the)h(follo)m(wing)e(remote)i(targets.)61 +b(Y)-8 b(ou)37 b(can)150 1484 y(set)f(the)f(target)h(name)f(and)g(the)g +(connect)h(mo)s(de)f(in)e(the)j(`)p Fr(site.exp)p Fv(')d(\014le)h +(\(using)g(the)h(Tcl)f(v)-5 b(ariables)150 1594 y(`)p +Fr(targetname)p Fv(')37 b(and)h(`)p Fr(connectmode)p +Fv(',)h(resp)s(ectiv)m(ely\),)i(or)e(on)g(the)g Fr(runtest)e +Fv(command)i(line)e(\(using)150 1704 y(`)p Fr(--name)p +Fv(')29 b(and)h(`)p Fr(--connect)p Fv('\).)150 1863 y +Fo(amd)g Fh(29000,)j(with)d(UDI)g(proto)s(col)630 1973 +y Fv(Con\014gure)e(DejaGn)m(u)h(for)g(target)h(`)p Fr(a29k-amd-udi)p +Fv('.)37 b(\(Cygn)m(us)29 b Fr(configure)d Fv(also)i(recog-)630 +2082 y(nizes)36 b(the)g(abbreviation)f(`)p Fr(udi29k)p +Fv('.\))58 b(Then,)37 b(to)g(run)e(tests,)k(use)d(the)g +Fr(runtest)e Fv(target)630 2192 y(name)29 b(to)g(sp)s(ecify)e(whether)h +(y)m(ou)h(w)m(an)m(t)h(to)f(use)g(a)g(sim)m(ulator,)f(or)g(a)h +(particular)e(hardw)m(are)630 2301 y(b)s(oard.)67 b(The)38 +b(particular)g(string)g(to)i(use)g(with)e(`)p Fr(--name)p +Fv(')g(will)e(dep)s(end)i(on)h(y)m(our)h(UDI)630 2411 +y(setup)d(\014le,)j(`)p Fr(udi_soc)p Fv(')c(\(if)h(`)p +Fr(udi_soc)p Fv(')f(is)h(not)i(in)d(y)m(our)i(w)m(orking)f(directory)-8 +b(,)40 b(the)e(en)m(vi-)630 2521 y(ronmen)m(t)31 b(v)-5 +b(ariable)29 b(`)p Fr(UDICONF)p Fv(')g(should)g(con)m(tain)h(a)h(path)g +(to)g(this)e(\014le\).)41 b(F)-8 b(or)31 b(example,)g(if)630 +2630 y(y)m(our)f(UDI)h(setup)f(\014le)f(includes)f(these)j(lines:)150 +2734 y Fm(\013)p 200 2734 3554 4 v 3553 w(\010)p 150 +3043 4 262 v 178 2894 a Fr(iss)143 b(AF_UNIX)93 b(*)143 +b(isstip)46 b(-r)h(/home/gnu/29k/src/osboot/)o(sim/)o(osbo)o(ot)178 +2998 y(mon)143 b(AF_UNIX)93 b(*)143 b(montip)46 b(-t)h(serial)f(-baud)h +(9600)f(-com)h(/dev/ttyb)p 3803 3043 V 150 3095 a Fm(\012)p +200 3095 3554 4 v 3553 w(\011)630 3265 y Fv(Y)-8 b(ou)37 +b(can)f(use)g(`)p Fr(--name)28 b(iss)p Fv(')36 b(to)h(run)d(tests)j(on) +f(the)g(sim)m(ulator,)h(and)e(`)p Fr(--name)29 b(mon)p +Fv(')35 b(to)630 3375 y(run)e(tests)j(on)f(the)g(29K)g(hardw)m(are.)54 +b(See)35 b(the)g(man)m(ufacturer's)g(man)m(uals)f(for)h(more)g(in-)630 +3484 y(formation)30 b(on)g(UDI)h(and)f(`)p Fr(udi_soc)p +Fv('.)630 3619 y(The)k(default)g(connect)i(proto)s(col)e(is)g(`)p +Fr(mondfe)p Fv(')g(with)f(either)h(bac)m(k)i(end.)53 +b Fr(mondfe)33 b Fv(is)h(the)630 3728 y(only)21 b(shell)f(DejaGn)m(u)j +(supp)s(orts)d(for)h(UDI)i(targets.)39 b Fr(mondfe)20 +b Fv(is)h(an)h Fo(amd)f Fv(sp)s(eci\014c)g(monitor)630 +3838 y(program)30 b(freely)g(a)m(v)-5 b(ailable)30 b(from)g +Fo(amd)p Fv(.)630 3972 y Fn(Warning:)49 b Fv(This)30 +b(target)j(requires)d Fo(gdb)i Fv(v)m(ersion)f(4.7.2)i(\(or)f +(greater\).)47 b(Earlier)30 b(v)m(ersions)630 4082 y(of)e +Fo(gdb)g Fv(do)h(not)f(fully)e(supp)s(ort)h(the)h Fr(load)f +Fv(command)i(on)f(this)f(target,)j(so)f(DejaGn)m(u)g(has)630 +4192 y(no)h(w)m(a)m(y)i(to)f(load)f(executable)h(\014les)e(from)h(the)g +(debugger.)150 4351 y Fh(Motorola)j(680x0)f(b)s(oards,)d(a.out)j(or)e +Fo(coff)f Fh(ob)5 b(ject)32 b(format)630 4461 y Fv(Con\014gure)d +(DejaGn)m(u)j(for)e(an)m(y)g(remote)i(target)g(matc)m(hing)e(`)p +Fr(m68k-*)p Fv('.)630 4595 y Fn(Warning:)70 b Fv(Most)43 +b(`)p Fr(m68k-*)p Fv(')d(con\014gurations)i(run)e(all)h(tests)i(only)f +(for)f(nativ)m(e)i(testing)630 4705 y(\(when)c(the)g(target)i(is)e(the) +g(same)h(as)g(the)f(host\).)68 b(When)39 b(y)m(ou)h(sp)s(ecify)e(most)i +(of)f(these)630 4814 y(targets)i(for)e(a)h(cross)f(con\014guration,)i +(y)m(ou)f(will)d(only)h(b)s(e)h(able)g(to)h(use)f(tests)h(that)g(run) +630 4924 y(completely)25 b(within)e(the)j(host)g(\(for)g(example,)g +(tests)h(of)f(the)g(binary)d(utilities)g(suc)m(h)j(as)g(the)630 +5033 y(arc)m(hiv)m(er;)31 b(or)f(compiler)f(tests)i(that)g(only)f +(generate)i(co)s(de)e(rather)g(than)g(running)e(it\).)630 +5168 y(T)-8 b(o)27 b(run)e(a.out)j(or)f Fo(coff)e Fv(binaries)g(on)h(a) +i(remote)f(M68K,)h(y)m(ou)f(m)m(ust)g(con\014gure)f(DejaGn)m(u)630 +5277 y(for)37 b(a)g(particular)e(target)k(b)s(oard.)59 +b(`)p Fr(m68k-abug)p Fv(')35 b(is)h(an)h(example.)60 +b(\(In)36 b(general)h(for)g(an)p eop +%%Page: 33 35 +33 34 bop 150 -116 a Fv(Chapter)30 b(5:)41 b(The)30 b(DejaGn)m(u)h +(Implemen)m(tation)1847 b(33)630 83 y(em)m(b)s(edded)35 +b(en)m(vironmen)m(t,)i(b)s(ecause)g(it)e(do)s(es)h(not)g(ha)m(v)m(e)i +(absolute)e(addresses,)h(a.out)g(is)630 193 y(not)25 +b(a)g(go)s(o)s(d)g(c)m(hoice)h(for)f(output)f(format)h(in)f(an)m(y)h +(case;)j(most)e(often)f(S-records)f(or)h(Hex-32)630 302 +y(are)31 b(used)e(instead.\))150 462 y Fh(Motorola)k(68K)e(MVME)g(135)g +(b)s(oard)f(running)f(ABug)g(b)s(o)s(ot)h(monitor)630 +571 y Fv(Con\014gure)g(for)h(`)p Fr(m68k-abug-aout)p +Fv(')c(or)k(`)p Fr(m68k-abug-coff)p Fv(')d(\(as)j(a)h(target\).)44 +b(This)29 b(b)s(o)s(ot)630 681 y(monitor)42 b(can)i(only)e(do)m(wnload) +h(S-records;)49 b(therefore,)e(the)c(DejaGn)m(u)h(tests)g(for)f(this) +630 790 y(en)m(vironmen)m(t)34 b(require)f(a)i(link)m(er)e(command)i +(script)e(to)i(con)m(v)m(ert)h(either)e(output)h(format)630 +900 y(to)c(S-records,)f(setting)h(the)f(default)g(addresses)g(for)g +Fr(.text)p Fv(,)f Fr(.bss)p Fv(,)g(and)h Fr(.data)p Fv(.)630 +1034 y(With)i(this)f(con\014guration,)i(the)f(default)g(for)g(`)p +Fr(--connect)p Fv(')e(is)i(`)p Fr(tip)p Fv('.)46 b(`)p +Fr(tip)p Fv(')32 b(is)f(the)i(only)630 1144 y(comm)m(unications)38 +b(proto)s(col)g(supp)s(orted)f(for)h(connecting)h(to)g(`)p +Fr(m68k-abug-*)p Fv(')d(targets.)630 1254 y(`)p Fr(tip)p +Fv(')28 b(uses)h(an)f Fo(asci)r(i)h Fv(do)m(wnloader)f(\(the)h +Fr(~put)e Fv(command\))i(to)h(load)e(S-records)g(in)m(to)h(the)630 +1363 y(target)39 b(b)s(oard.)59 b(The)37 b(`)p Fr(--name)p +Fv(')e(string)h(m)m(ust)h(b)s(e)f(a)i(mac)m(hine)e(name)i(that)f +Fr(tip)f Fv(under-)630 1473 y(stands)g(\(for)h(example,)i(on)e(some)g +Fr(tip)f Fv(implemen)m(tations)f(it)i(m)m(ust)f(b)s(e)h(an)f(en)m(try)h +(from)630 1582 y(the)31 b(initialization)c(\014le)i(for)h +Fr(tip)p Fv(;)g(this)f(\014le)h(is)f(sometimes)i(called)e(`)p +Fr(/etc/remote)p Fv('\).)630 1717 y(See)d(y)m(our)g(system)g(do)s +(cumen)m(tation)g(for)g(information)f(on)g(ho)m(w)h(to)h(create)h(new)d +(en)m(tries)h(in)630 1826 y(`)p Fr(/etc/remote)p Fv('.)50 +b(\(Some)35 b Fo(unix)f Fv(systems)h(are)g(distributed)c(with)i(at)i +(least)g(one)g(default)630 1936 y(en)m(try)29 b(with)f(a)h(name)g +(resem)m(bling)e(`)p Fr(hardwire)p Fv(';)h(if)f(y)m(our)i(system)g(has) +g(one,)g(y)m(ou)g(can)g(edit)630 2046 y(it,)44 b(or)d(mak)m(e)h(a)g(mo) +s(di\014ed)d(cop)m(y)j(with)e(a)i(new)f(name.\))74 b(When)41 +b(y)m(ou)g(ha)m(v)m(e)i(a)f(w)m(orking)630 2155 y(`)p +Fr(/etc/remote)p Fv(')30 b(en)m(try)j Fq(abugtarget)p +Fv(,)h(y)m(ou)f(should)e(b)s(e)g(able)h(to)i(t)m(yp)s(e)e(`)p +Fr(tip)e Fq(abugtarget)r Fv(',)630 2265 y(and)24 b(get)h(the)g(prompt)f +(`)p Fr(135ABUG>)p Fv(')e(from)i(the)h(b)s(oard.)38 b(Use)25 +b(the)f(same)h Fq(abugtarget)j Fv(string)630 2374 y(with)h(`)p +Fr(runtest)g(--name)p Fv('.)150 2534 y Fh(Motorola)k(IDP)d(b)s(oard)f +(running)g(the)i(rom68k)g(b)s(o)s(ot)g(monitor)630 2643 +y Fv(This)36 b(is)g(the)i(same)g(in)e(functionalit)m(y)g(as)h(the)h +(MVME)g(b)s(oard)e(running)f(the)j Fr(BUG)e Fv(b)s(o)s(ot)630 +2753 y(monitor.)k(Only)29 b(the)h(monitor)g(commands)g(and)g(the)g +(addresses)g(are)h(di\013eren)m(t.)150 2912 y Fh(VxW)-8 +b(orks)31 b(\(Motorola)i(68K)e(or)g(In)m(tel)g(960\))630 +3022 y Fv(Con\014gure)k(DejaGn)m(u)h(for)g(either)f(`)p +Fr(m68k-wrs-vxworks)p Fv(')d(\(abbreviated)k(`)p Fr(vxworks68)p +Fv('\))630 3132 y(or)21 b(`)p Fr(i960-wrs-vxworks)p Fv(')c +(\(abbreviated)k(`)p Fr(vxworks960)p Fv('\).)35 b(Since)20 +b(b)s(oth)g(targets)j(supp)s(ort)630 3241 y(IP)42 b(addressing,)i(sp)s +(ecify)d(the)i(net)m(w)m(ork)h(address)d(\(for)i(example,)i(a)e(host)g +(name)f(from)630 3351 y(`)p Fr(/etc/hosts)p Fv('\))28 +b(with)i(`)p Fr(--name)p Fv('.)630 3485 y(The)35 b(default)g(connect)h +(proto)s(col)f(is)g(`)p Fr(rlogin)p Fv(',)h(but)e(y)m(ou)i(can)g(use)f +(an)m(y)h(of)f(`)p Fr(--connect)630 3595 y(rlogin)p Fv(',)29 +b(`)p Fr(--connect)f(telnet)p Fv(',)h(or)i(`)p Fr(--connect)d(rsh)p +Fv('.)630 3729 y(T)-8 b(est)42 b(scripts)f(need)g(no)g(sp)s(ecial)g(co) +s(de)g(to)i(load)e(programs)g(in)m(to)h(these)g(targets;)49 +b(since)630 3839 y(VxW)-8 b(orks)42 b(supp)s(orts)d(NFS,)j(all)e(y)m +(ou)h(m)m(ust)h(do)f(is)f(ensure)g(test)i(programs)f(are)h(on)f(an)630 +3949 y(exp)s(orted)30 b(\014lesystem.)630 4083 y(When)j(y)m(ou)g +(compile)f(for)h(VxW)-8 b(orks,)35 b(use)d(the)i(link)m(er)d(`)p +Fr(-r)p Fv(')i(option)g(to)g(mak)m(e)h(the)g(link)m(er)630 +4193 y(output)25 b(relo)s(catable|at)g(least)h(if)e(y)m(ou)h(w)m(an)m +(t)h(to)g(use)f(library)d(routines.)38 b(Man)m(y)26 b(standard)630 +4302 y(C)34 b(routines)f(are)i(included)d(in)h(VxW)-8 +b(orks;)37 b(often)e(no)f(additional)f(libraries)e(are)k(needed.)630 +4412 y(See)c(y)m(our)f(VxW)-8 b(orks)31 b(system)g(do)s(cumen)m(tation) +f(for)g(additional)e(details.)p eop +%%Page: 34 36 +34 35 bop 150 -116 a Fv(34)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 83 y Fu(5.6)68 b(The)45 +b(\014les)g(DejaGn)l(u)g(reads)275 276 y Fv(The)28 b +Fr(runtest)g Fv(program)h(used)f(to)i(in)m(v)m(ok)m(e)h(DejaGn)m(u)f +(is)e(a)i(short)f(shell)e(script)i(generated)h(b)m(y)f +Fr(make)150 385 y Fv(during)h(the)i(con\014guration)f(pro)s(cess.)45 +b(Its)32 b(main)e(task)j(is)e(to)h(read)g(the)g(main)f(test)i(framew)m +(ork)f(driv)m(er,)150 495 y(`)p Fr(runtest.exp)p Fv('.)275 +629 y(`)p Fr(runtest.exp)p Fv(',)c(in)h(turn,)g(reads)h +Fr(expect)f Fv(co)s(de)i(from)e(certain)i(other)f(\014les,)g(in)f(this) +g(order:)199 764 y(1.)61 b(Eac)m(h)31 b(of)f(the)g(`)p +Fr(site.exp)p Fv(')f(lo)s(cal)g(de\014nition)f(\014les)h(a)m(v)-5 +b(ailable.)40 b(See)31 b(Chapter)e(4)i([Setting)f Fr(runtest)330 +873 y Fv(defaults],)g(page)h(15,)h(for)e(details.)199 +1008 y(2.)61 b(`)p Fr(lib/utils.exp)p Fv(',)23 b(a)i(collection)f(of)h +(utilit)m(y)d(pro)s(cedures.)38 b(See)25 b(Section)f(5.3)i([DejaGn)m(u) +f(Builtins],)330 1117 y(page)31 b(23,)h(for)e(descriptions)e(of)j +(these)f(pro)s(cedures.)199 1252 y(3.)61 b(`)p Fr(lib/framework.exp)p +Fv(',)37 b(a)j(\014le)e(of)h(subroutines)e(mean)m(t)j(for)f +Fr(runtest)e Fv(itself)g(rather)i(than)g(for)330 1362 +y(general-purp)s(ose)29 b(use)h(in)f(b)s(oth)h Fr(runtest)e +Fv(and)i(test)h(suites.)199 1496 y(4.)61 b(`)p Fr(debugger.exp)p +Fv(',)45 b(Don)g(Lib)s(es')e(Tcl)g(Debugger.)84 b(\(See)45 +b Fq(A)f(Debugger)h(for)f(Tcl)g(Applications)330 1606 +y Fv(b)m(y)38 b(Don)h(Lib)s(es.)63 b(This)37 b(pap)s(er)g(is)g +(distributed)f(with)h Fr(expect)g Fv(in)g(P)m(ostScript)h(form)g(as)g +(the)h(\014le)330 1715 y(`)p Fr(expect/tcl-debug.ps)p +Fv('.\))199 1850 y(5.)61 b(`)p Fr(lib/remote.exp)p Fv(',)20 +b(a)h(collection)f(of)h(subroutines)e(mean)m(t)i(for)g(connecting)g(to) +g(remote)h(mac)m(hines.)199 1984 y(6.)61 b(`)p Fr(lib/target.exp)p +Fv(',)41 b(a)g(collection)g(of)g(subroutines)e(used)h(for)h(the)g +(con\014guration)f(systems)h(in)330 2094 y(DejaGn)m(u.)h(These)30 +b(pro)s(cedures)f(t)m(ypically)g(manipulate)g(or)h(utilize)f(the)h +(con\014guration)g(system.)199 2228 y(7.)61 b(An)34 b(initialization)e +(\014le)i Fq(to)s(ol)t Fr(_init.exp)p Fv(.)50 b(See)35 +b(Section)g(5.2)g([Initialization)e(mo)s(dule],)h(page)i(22,)330 +2338 y(for)30 b(more)h(discussion)c(of)k(init)e(\014les.)p +eop +%%Page: 35 37 +35 36 bop 150 -116 a Fv(Chapter)30 b(5:)41 b(The)30 b(DejaGn)m(u)h +(Implemen)m(tation)1847 b(35)150 83 y Fu(5.7)68 b(The)45 +b(\014les)g(DejaGn)l(u)g(writes)275 276 y Fr(runtest)31 +b Fv(alw)m(a)m(ys)j(writes)e(t)m(w)m(o)j(kinds)c(of)i(output)g +(\014les:)46 b(summary)32 b(logs)h(and)g(detailed)f(logs.)49 +b(The)150 385 y(con)m(ten)m(ts)32 b(of)f(b)s(oth)e(of)i(these)g(are)f +(determined)f(b)m(y)i(y)m(our)f(tests.)275 520 y(F)-8 +b(or)37 b(troublesho)s(oting,)g(a)g(third)e(kind)g(of)i(output)g +(\014le)f(is)g(useful:)52 b(use)36 b(`)p Fr(--debug)p +Fv(')g(to)h(request)g(an)150 629 y(output)30 b(\014le)f(sho)m(wing)h +(details)f(of)i(what)f Fr(expect)f Fv(is)g(doing)h(in)m(ternally)-8 +b(.)150 853 y Fi(5.7.1)63 b(Summary)39 b(log)275 1046 +y Fr(runtest)33 b Fv(alw)m(a)m(ys)j(pro)s(duces)e(a)i(summary)f(output) +g(\014le)g(`)p Fq(to)s(ol)p Fr(.sum)p Fv('.)55 b(This)34 +b(summary)g(sho)m(ws)i(the)150 1156 y(names)f(of)g(all)f(test)i +(\014les)e(run;)i(for)f(eac)m(h)h(test)g(\014le,)g(one)f(line)f(of)h +(output)f(from)h(eac)m(h)h Fr(pass)e Fv(command)150 1265 +y(\(sho)m(wing)39 b(status)g(`)p Fr(PASS)p Fv(')g(or)g(`)p +Fr(XPASS)p Fv('\))f(or)h Fr(fail)f Fv(command)h(\(status)h(`)p +Fr(FAIL)p Fv(')f(or)g(`)p Fr(XFAIL)p Fv('\);)k(trailing)150 +1375 y(summary)26 b(statistics)g(that)h(coun)m(t)h(passing)d(and)h +(failing)f(tests)i(\(exp)s(ected)h(and)e(unexp)s(ected\);)i(and)e(the) +150 1484 y(full)e(pathname)i(and)f(v)m(ersion)h(n)m(um)m(b)s(er)f(of)h +(the)g(to)s(ol)g(tested.)41 b(\(All)25 b(p)s(ossible)e(outcomes,)29 +b(and)c(all)g(errors,)150 1594 y(are)36 b(alw)m(a)m(ys)g(re\015ected)g +(in)f(the)h(summary)e(output)h(\014le,)i(regardless)e(of)h(whether)f +(or)g(not)h(y)m(ou)g(sp)s(ecify)150 1704 y(`)p Fr(--all)p +Fv('.\))275 1838 y(If)k(an)m(y)g(of)h(y)m(our)f(tests)i(use)e(the)g +(pro)s(cedures)g Fr(unresolved)p Fv(,)g Fr(unsupported)p +Fv(,)g(or)h Fr(untested)p Fv(,)g(the)150 1948 y(summary)29 +b(output)h(also)h(tabulates)f(the)h(corresp)s(onding)d(outcomes.)275 +2082 y(F)-8 b(or)21 b(example,)h(after)f(`)p Fr(runtest)28 +b(--tool)h(binutils)p Fv(',)20 b(lo)s(ok)g(for)g(a)h(summary)e(log)h +(in)f(`)p Fr(binutils.sum)p Fv('.)150 2192 y(Normally)-8 +b(,)39 b Fr(runtest)d Fv(writes)h(this)g(\014le)g(in)f(y)m(our)i +(curren)m(t)g(w)m(orking)f(directory;)k(use)d(the)g(`)p +Fr(--outdir)p Fv(')150 2301 y(option)30 b(to)h(select)g(a)g(di\013eren) +m(t)f(directory)-8 b(.)150 2416 y(Here)31 b(is)e(a)i(short)f(sample)g +(summary)f(log:)150 2495 y Fm(\013)p 200 2495 3554 4 +v 3553 w(\010)p 150 4457 4 1915 v 178 2648 a Fr(Test)47 +b(Run)g(By)g(rob)g(on)g(Mon)g(May)g(25)g(21:40:57)f(PDT)g(1992)942 +2752 y(===)h(gdb)g(tests)f(===)178 2856 y(Running)g(./gdb.t00/echo.exp) +d(...)178 2959 y(PASS:)142 b(Echo)47 b(test)178 3063 +y(Running)f(./gdb.all/help.exp)d(...)178 3167 y(PASS:)142 +b(help)47 b(add-symbol-file)178 3271 y(PASS:)142 b(help)47 +b(aliases)178 3374 y(PASS:)142 b(help)47 b(breakpoint)e("bre")h +(abbreviation)178 3478 y(FAIL:)142 b(help)47 b(run)g("r")f +(abbreviation)178 3582 y(Running)g(./gdb.t10/crossload.exp)41 +b(...)178 3686 y(PASS:)142 b(m68k-elf)46 b(\(elf-big\))f(explicit)g +(format;)h(loaded)178 3790 y(XFAIL:)94 b(mips-ecoff)45 +b(\(ecoff-bigmips\))f("ptype)i(v_signed_char")e(signed)178 +3893 y(C)k(types)942 3997 y(===)f(gdb)g(Summary)e(===)178 +4101 y(#)j(of)f(expected)e(passes)h(5)178 4205 y(#)i(of)f(expected)e +(failures)h(1)178 4308 y(#)i(of)f(unexpected)e(failures)g(1)178 +4412 y(/usr/latest/bin/gdb)e(version)j(4.6.5)g(-q)p 3803 +4457 V 150 4509 a Fm(\012)p 200 4509 3554 4 v 3553 w(\011)p +eop +%%Page: 36 38 +36 37 bop 150 -116 a Fv(36)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 83 y Fi(5.7.2)63 +b(Detailed)40 b(log)275 270 y Fr(runtest)28 b Fv(also)h(sa)m(v)m(es)j +(a)e(detailed)f(log)h(\014le)g(`)p Fq(to)s(ol)p Fr(.log)p +Fv(',)f(sho)m(wing)g(an)m(y)i(output)e(generated)i(b)m(y)f(tests)150 +380 y(as)g(w)m(ell)f(as)h(the)g(summary)f(output.)40 +b(F)-8 b(or)31 b(example,)f(after)h(`)p Fr(runtest)d(--tool)h(binutils) +p Fv(',)f(lo)s(ok)i(for)g(a)150 489 y(detailed)f(log)i(in)e(`)p +Fr(binutils.log)p Fv('.)37 b(Normally)-8 b(,)30 b Fr(runtest)f +Fv(writes)g(this)g(\014le)g(in)g(y)m(our)i(curren)m(t)f(w)m(orking)150 +599 y(directory;)g(use)g(the)h(`)p Fr(--outdir)p Fv(')d(option)i(to)h +(select)g(a)g(di\013eren)m(t)f(directory)-8 b(.)150 708 +y(Here)31 b(is)e(a)i(brief)e(example)h(sho)m(wing)f(a)i(detailed)f(log) +g(for)g Fo(g)p Fr(++)g Fv(tests:)150 787 y Fm(\013)p +200 787 3554 4 v 3553 w(\010)p 150 4306 4 3472 v 178 +940 a Fr(Test)47 b(Run)g(By)g(rob)g(on)g(Mon)g(May)g(25)g(21:40:43)f +(PDT)g(1992)942 1148 y(===)h(g++)g(tests)f(===)178 1355 +y(---)h(Running)f(./g++.other/t01-1.exp)c(---)560 1459 +y(PASS:)142 b(operate)46 b(delete)178 1667 y(---)h(Running)f +(./g++.other/t01-2.exp)c(---)560 1770 y(FAIL:)142 b(i960)46 +b(bug)h(EOF)178 1874 y(p0000646.C:)e(In)i(function)f(`int)94 +b(warn_return_1)44 b(\(\)':)178 1978 y(p0000646.C:109:)g(warning:)h +(control)h(reaches)g(end)h(of)g(non-void)f(function)178 +2082 y(p0000646.C:)f(In)i(function)f(`int)94 b(warn_return_arg)44 +b(\(int\)':)178 2186 y(p0000646.C:117:)g(warning:)h(control)h(reaches)g +(end)h(of)g(non-void)f(function)178 2289 y(p0000646.C:)f(In)i(function) +f(`int)94 b(warn_return_sum)44 b(\(int,)i(int\)':)178 +2393 y(p0000646.C:125:)e(warning:)h(control)h(reaches)g(end)h(of)g +(non-void)f(function)178 2497 y(p0000646.C:)f(In)i(function)f(`struct)f +(foo)i(warn_return_foo)d(\(\)':)178 2601 y(p0000646.C:132:)g(warning:)h +(control)h(reaches)g(end)h(of)g(non-void)f(function)178 +2808 y(---)h(Running)f(./g++.other/t01-4.exp)c(---)560 +2912 y(FAIL:)142 b(abort)178 3016 y(900403_04.C:8:)44 +b(zero)j(width)f(for)h(bit-field)e(`foo')178 3120 y(---)i(Running)f +(./g++.other/t01-3.exp)c(---)560 3223 y(FAIL:)142 b(segment)46 +b(violation)178 3327 y(900519_12.C:9:)e(parse)i(error)h(before)f(`;') +178 3431 y(900519_12.C:12:)e(Segmentation)g(violation)178 +3535 y(/usr/latest/bin/gcc:)e(Internal)k(compiler)g(error:)g(program)f +(cc1plus)h(got)178 3638 y(fatal)h(signal)942 3846 y(===)g(g++)g +(Summary)e(===)178 4054 y(#)j(of)f(expected)e(passes)h(1)178 +4157 y(#)i(of)f(expected)e(failures)h(3)178 4261 y(/usr/ps/bin/g++)e +(version)i(cygnus-2.0.1)p 3803 4306 V 150 4358 a Fm(\012)p +200 4358 3554 4 v 3553 w(\011)150 4566 y Fi(5.7.3)63 +b(Logging)42 b Fg(expect)g Fi(in)m(ternal)e(actions)275 +4753 y Fv(With)32 b(the)h(`)p Fr(--debug)p Fv(')e(option,)i(y)m(ou)h +(can)f(request)g(a)g(log)g(\014le)f(sho)m(wing)g(the)h(output)f(from)h +Fr(expect)150 4863 y Fv(itself,)k(running)d(in)h(debugging)g(mo)s(de.) +59 b(This)34 b(\014le)i(\(`)p Fr(dbg.log)p Fv(',)h(in)e(the)i +(directory)f(where)g(y)m(ou)g(start)150 4972 y Fr(runtest)p +Fv(\))29 b(sho)m(ws)h(eac)m(h)h(pattern)g Fr(expect)e +Fv(considers)g(in)g(analyzing)g(test)j(output.)275 5101 +y(This)26 b(\014le)h(re\015ects)h(eac)m(h)h Fr(send)e +Fv(command,)h(sho)m(wing)f(the)h(string)f(sen)m(t)h(as)g(input)e(to)j +(the)f(to)s(ol)f(under)150 5211 y(test;)32 b(and)d(eac)m(h)j +Fr(expect)d Fv(command,)h(sho)m(wing)f(eac)m(h)j(pattern)e(it)g +(compares)h(with)e(the)i(to)s(ol)f(output.)275 5340 y(The)f(log)i +(messages)g(for)f Fr(expect)f Fv(b)s(egin)g(with)g(a)i(message)g(of)g +(the)f(form)p eop +%%Page: 37 39 +37 38 bop 150 -116 a Fv(Chapter)30 b(5:)41 b(The)30 b(DejaGn)m(u)h +(Implemen)m(tation)1847 b(37)390 83 y Fr(expect:)46 b(does)g({)p +Fq(to)s(ol)31 b(output)r Fr(})47 b(\(spawn_id)e Fq(n)p +Fr(\))i(match)f(pattern)390 187 y({)p Fq(exp)s(ected)31 +b(pattern)p Fr(}?)150 321 y Fv(F)-8 b(or)30 b(ev)m(ery)h(unsuccessful)c +(matc)m(h,)k Fr(expect)d Fv(issues)h(a)h(`)p Fr(no)p +Fv(')f(after)h(this)f(message;)i(if)e(other)h(patterns)g(are)150 +431 y(sp)s(eci\014ed)f(for)i(the)g(same)h Fr(expect)d +Fv(command,)i(they)h(are)f(re\015ected)h(also,)f(but)f(without)h(the)g +(\014rst)f(part)150 540 y(of)h(the)f(message)i(\(`)p +Fr(expect...)n(match)d(pattern)p Fv('\).)275 675 y(When)j +Fr(expect)e Fv(\014nds)h(a)i(matc)m(h,)g(the)g(log)f(for)g(the)h +(successful)e(matc)m(h)i(ends)f(with)f(`)p Fr(yes)p Fv(',)h(follo)m(w)m +(ed)150 785 y(b)m(y)g(a)h(record)g(of)f(the)h Fr(expect)e +Fv(v)-5 b(ariables)31 b(set)i(to)g(describ)s(e)e(a)i(successful)e(matc) +m(h.)48 b(Here)33 b(is)f(an)g(excerpt)150 894 y(from)e(the)g(debugging) +g(log)g(for)g(a)h Fo(gdb)f Fv(test:)150 973 y Fm(\013)p +200 973 3554 4 v 3553 w(\010)p 150 3669 4 2649 v 178 +1134 a Fr(send:)47 b(sent)f({break)g(gdbme.c:34\\n})e(to)k(spawn)e(id)h +(6)178 1237 y(expect:)f(does)h({})g(\(spawn_id)e(6\))i(match)g(pattern) +e({Breakpoint.*at.*)f(file)226 1341 y(gdbme.c,)h(line)i +(34.*\\\(gdb\\\))e($}?)i(no)178 1445 y({.*\\\(gdb\\\))e($}?)i(no)178 +1549 y(expect:)f(does)h({})g(\(spawn_id)e(0\))i(match)g(pattern)e +({}?)g(no)178 1652 y({\\\(y)i(or)g(n\\\))g(}?)g(no)178 +1756 y({buffer_full}?)d(no)178 1860 y({virtual}?)h(no)178 +1964 y({memory}?)g(no)178 2068 y({exhausted}?)g(no)178 +2171 y({Undefined}?)g(no)178 2275 y({command}?)g(no)178 +2379 y(break)i(gdbme.c:34)178 2483 y(Breakpoint)e(8)j(at)f(0x23d8:)f +(file)g(gdbme.c,)g(line)g(34.)178 2586 y(\(gdb\))h(expect:)e(does)i +({break)f(gdbme.c:34\\r\\nBreakpoint)41 b(8)48 b(at)f(0x23d8:)178 +2690 y(file)g(gdbme.c,)e(line)i(34.\\r\\n\(gdb\))d(})k(\(spawn_id)d +(6\))i(match)g(pattern)178 2794 y({Breakpoint.*at.*)c(file)k(gdbme.c,)e +(line)i(34.*\\\(gdb\\\))e($}?)i(yes)178 2898 y(expect:)f(set)h +(expect_out\(0,start\))42 b({18})178 3002 y(expect:)k(set)h +(expect_out\(0,end\))c({71})178 3105 y(expect:)j(set)h +(expect_out\(0,string\))42 b({Breakpoint)j(8)i(at)h(0x23d8:)d(file)178 +3209 y(gdbme.c,)h(line)g(34.\\r\\n\(gdb\))f(})178 3313 +y(expect:)h(set)h(expect_out\(spawn_id\))42 b({6})178 +3417 y(expect:)k(set)h(expect_out\(buffer\))c({break)j +(gdbme.c:34\\r\\nBreakpoint)41 b(8)178 3520 y(at)47 b(0x23d8:)f(file)h +(gdbme.c,)e(line)i(34.\\r\\n\(gdb\))d(})560 3624 y(PASS:)142 +b(70)286 b(0)333 b(breakpoint)45 b(line)i(number)f(in)h(file)p +3803 3669 V 150 3721 a Fm(\012)p 200 3721 3554 4 v 3553 +w(\011)150 3866 y Fv(This)26 b(example)i(exhibits)f(three)h(prop)s +(erties)f(of)h Fr(expect)f Fv(and)g(DejaGn)m(u)i(that)g(migh)m(t)f(b)s +(e)g(surprising)c(at)150 3976 y(\014rst)30 b(glance:)225 +4110 y Ft(\017)60 b Fv(Empt)m(y)25 b(output)f(for)h(the)g(\014rst)f +(attempted)i(matc)m(h.)40 b(The)25 b(\014rst)f(set)h(of)g(attempted)h +(matc)m(hes)h(sho)m(wn)330 4220 y(ran)34 b(against)g(the)h(output)f(`)p +Fr({})p Fv('|that)h(is,)f(no)h(output.)52 b Fr(expect)33 +b Fv(b)s(egins)f(attempting)j(to)g(matc)m(h)330 4329 +y(the)i(patterns)f(supplied)e(immediately;)k(often,)g(the)f(\014rst)f +(pass)g(is)g(against)h(incomplete)e(output)330 4439 y(\(or)c +(completely)f(b)s(efore)g(all)f(output,)h(as)h(in)e(this)g(case\).)225 +4573 y Ft(\017)60 b Fv(In)m(tersp)s(ersed)39 b(to)s(ol)i(output.)71 +b(The)40 b(b)s(eginning)d(of)k(the)g(log)g(en)m(try)f(for)h(the)f +(second)h(attempted)330 4683 y(matc)m(h)32 b(ma)m(y)g(b)s(e)e(hard)h +(to)h(sp)s(ot:)42 b(this)30 b(is)g(b)s(ecause)h(the)h(prompt)e(`)p +Fr(\(gdb\))f Fv(')j(app)s(ears)e(on)h(the)h(same)330 +4793 y(line,)d(just)h(b)s(efore)g(the)g(`)p Fr(expect:)p +Fv(')f(that)i(marks)f(the)h(b)s(eginning)c(of)k(the)f(log)h(en)m(try)-8 +b(.)225 4927 y Ft(\017)60 b Fv(F)-8 b(ail-safe)32 b(patterns.)43 +b(Man)m(y)32 b(of)f(the)h(patterns)f(tested)h(are)f(fail-safe)g +(patterns)g(pro)m(vided)f(b)m(y)h Fo(gdb)330 5037 y Fv(testing)43 +b(utilities,)h(to)f(reduce)g(p)s(ossible)e(indeterminacy)-8 +b(.)77 b(It)43 b(is)f(useful)f(to)j(an)m(ticipate)f(p)s(oten-)330 +5146 y(tial)g(v)-5 b(ariations)44 b(caused)g(b)m(y)g(extreme)h(system)f +(conditions)f(\()p Fo(gdb)h Fv(migh)m(t)g(issue)e(the)j(message)p +eop +%%Page: 38 40 +38 39 bop 150 -116 a Fv(38)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)330 83 y(`)p Fr(virtual)29 +b(memory)f(exhausted)p Fv(')j(in)h(rare)g(circumstances\),)i(or)f(b)m +(y)g(c)m(hanges)h(in)d(the)i(tested)h(pro-)330 193 y(gram)f(\(`)p +Fr(Undefined)28 b(command)p Fv(')j(is)g(the)h(lik)m(eliest)f(outcome)j +(if)d(the)h(name)h(of)f(a)h(tested)g(command)330 302 +y(c)m(hanges\).)330 437 y(The)f(pattern)g(`)p Fr({})p +Fv(')f(is)g(a)i(particularly)d(in)m(teresting)h(fail-safe)h(to)h +(notice;)h(it)e(c)m(hec)m(ks)i(for)330 546 y(an)k(unexp)s(ected)952 +543 y Fk(h)p 976 490 151 4 v 976 546 a Fj(RET)p 976 562 +V 1123 543 a Fk(i)1191 546 y Fv(prompt.)64 b(This)37 +b(ma)m(y)i(happ)s(en,)g(for)f(example,)i(if)d(the)i(tested)g(to)s(ol)g +(can)330 656 y(\014lter)29 b(output)h(through)g(a)h(pager.)330 +790 y(These)e(fail-safe)f(patterns)h(\(lik)m(e)g(the)g(debugging)f(log) +h(itself)7 b(\))28 b(are)h(primarily)d(useful)h(while)g(dev)m(el-)330 +900 y(oping)32 b(test)h(scripts.)46 b(Use)33 b(the)g +Fr(error)e Fv(pro)s(cedure)g(to)j(mak)m(e)f(the)g(actions)g(for)f +(fail-safe)g(patterns)330 1010 y(pro)s(duce)i(messages)j(starting)e +(with)g(`)p Fr(ERROR)p Fv(')f(on)i(the)f Fr(runtest)f +Fv(standard)h(output,)i(and)d(in)h(the)330 1119 y(detailed)29 +b(log)i(\014le.)p eop +%%Page: 39 41 +39 40 bop 150 -116 a Fv(Chapter)30 b(6:)41 b(Ho)m(w)31 +b(T)-8 b(o)31 b(W)-8 b(rite)31 b(a)f(T)-8 b(est)31 b(Case)1988 +b(39)150 100 y Fs(6)80 b(Ho)l(w)53 b(T)-13 b(o)53 b(W)-13 +b(rite)54 b(a)g(T)-13 b(est)53 b(Case)150 457 y Fu(6.1)68 +b(W)-11 b(riting)46 b(a)f(test)h(case)275 649 y Fv(The)30 +b(easiest)h(w)m(a)m(y)h(to)f(prepare)g(a)g(new)f(test)i(case)g(is)e(to) +h(base)g(it)f(on)h(an)g(existing)f(one)h(for)f(a)i(similar)150 +759 y(situation.)63 b(There)38 b(are)g(t)m(w)m(o)i(ma)5 +b(jor)38 b(categories)i(of)e(tests:)57 b(batc)m(h)39 +b(or)f(in)m(teractiv)m(e.)65 b(Batc)m(h)40 b(orien)m(ted)150 +868 y(tests)31 b(are)g(usually)d(easier)i(to)h(write.)275 +1003 y(The)22 b Fo(gcc)h Fv(tests)h(are)f(a)h(go)s(o)s(d)f(example)g +(of)g(batc)m(h)h(orien)m(ted)f(tests.)39 b(All)22 b Fo(gcc)h +Fv(tests)h(consist)e(primarily)150 1112 y(of)35 b(a)h(call)f(to)h(a)g +(single)e(common)h(pro)s(cedure,)h(since)f(all)f(the)h(tests)h(either)f +(ha)m(v)m(e)i(no)e(output,)h(or)g(only)150 1222 y(ha)m(v)m(e)k(a)g(few) +f(w)m(arning)f(messages)i(when)e(successfully)g(compiled.)65 +b(An)m(y)40 b(non-w)m(arning)d(output)i(is)g(a)150 1332 +y(test)31 b(failure.)39 b(All)29 b(the)h(C)g(co)s(de)h(needed)e(is)h(k) +m(ept)h(in)e(the)h(test)h(directory)-8 b(.)41 b(The)30 +b(test)h(driv)m(er,)e(written)g(in)150 1441 y Fr(expect)p +Fv(,)d(need)h(only)f(get)i(a)f(listing)e(of)i(all)e(the)i(C)g(\014les)f +(in)f(the)i(directory)-8 b(,)28 b(and)e(compile)g(them)h(all)e(using) +150 1551 y(a)j(generic)g(pro)s(cedure.)39 b(This)26 b(pro)s(cedure)h +(and)h(a)g(few)g(others)g(supp)s(orting)d(for)j(these)g(tests)h(are)g +(k)m(ept)f(in)150 1660 y(the)i(library)d(mo)s(dule)h(`)p +Fr(lib/c-torture.exp)p Fv(')d(in)k(the)h Fo(gcc)f Fv(test)h(suite.)40 +b(Most)31 b(tests)f(of)g(this)e(kind)g(use)150 1770 y(v)m(ery)j(few)f +Fr(expect)f Fv(features,)h(and)g(are)h(co)s(ded)f(almost)h(purely)d(in) +h(Tcl.)150 1905 y(W)-8 b(riting)30 b(the)g(complete)h(suite)f(of)g(C)g +(tests,)i(then,)e(consisted)g(of)g(these)h(steps:)199 +2039 y(1.)61 b(Cop)m(ying)26 b(all)f(the)i(C)f(co)s(de)g(in)m(to)h(the) +g(test)g(directory)-8 b(.)39 b(These)26 b(tests)i(w)m(ere)f(based)f(on) +g(the)h(C-torture)330 2149 y(test)e(created)g(b)m(y)f(T)-8 +b(orb)5 b(jorn)23 b(Granlund)f(\(on)i(b)s(ehalf)e(of)j(the)f(F)-8 +b(ree)25 b(Soft)m(w)m(are)g(F)-8 b(oundation\))24 b(for)g +Fo(gcc)330 2258 y Fv(dev)m(elopmen)m(t.)199 2393 y(2.)61 +b(W)-8 b(riting)30 b(\(and)g(debugging\))f(the)i(generic)f +Fr(expect)f Fv(pro)s(cedures)g(for)h(compilation.)199 +2527 y(3.)61 b(W)-8 b(riting)32 b(the)h(simple)e(test)i(driv)m(er:)45 +b(its)32 b(main)g(task)h(is)f(to)h(searc)m(h)h(the)f(directory)f +(\(using)g(the)h(Tcl)330 2637 y(pro)s(cedure)f Fr(glob)f +Fv(for)i(\014lename)f(expansion)g(with)f(wildcards\))g(and)h(call)g(a)h +(Tcl)g(pro)s(cedure)e(with)330 2746 y(eac)m(h)h(\014lename.)39 +b(It)31 b(also)f(c)m(hec)m(ks)i(for)e(a)h(few)f(errors)g(from)g(the)g +(testing)h(pro)s(cedure.)275 2906 y(T)-8 b(esting)37 +b(in)m(teractiv)m(e)h(programs)g(is)e(in)m(trinsically)e(more)k +(complex.)62 b(T)-8 b(ests)38 b(for)f(most)h(in)m(teractiv)m(e)150 +3015 y(programs)30 b(require)f(some)i(trial)e(and)h(error)g(b)s(efore)g +(they)g(are)h(complete.)275 3150 y(Ho)m(w)m(ev)m(er,)44 +b(some)d(in)m(teractiv)m(e)f(programs)g(can)g(b)s(e)g(tested)g(in)f(a)h +(simple)e(fashion)h(reminiscen)m(t)g(of)150 3259 y(batc)m(h)c(tests.)54 +b(F)-8 b(or)36 b(example,)f(prior)e(to)i(the)g(creation)g(of)g(DejaGn)m +(u,)h(the)f Fo(gdb)f Fv(distribution)d(already)150 3369 +y(included)j(a)k(wide-ranging)d(testing)j(pro)s(cedure.)59 +b(This)36 b(pro)s(cedure)g(w)m(as)h(v)m(ery)h(robust,)g(and)e(had)h +(al-)150 3479 y(ready)29 b(undergone)f(m)m(uc)m(h)g(more)h(debugging)f +(and)g(error)g(c)m(hec)m(king)i(than)e(man)m(y)h(recen)m(t)h(DejaGn)m +(u)f(test)150 3588 y(cases.)64 b(Accordingly)-8 b(,)39 +b(the)e(b)s(est)h(approac)m(h)g(w)m(as)g(simply)d(to)j(encapsulate)g +(the)g(existing)f Fo(gdb)g Fv(tests,)150 3698 y(for)32 +b(rep)s(orting)f(purp)s(oses.)45 b(Thereafter,)33 b(new)f +Fo(gdb)g Fv(tests)h(built)d(up)i(a)g(family)f(of)i Fr(expect)d +Fv(pro)s(cedures)150 3807 y(sp)s(ecialized)f(for)h Fo(gdb)g +Fv(testing.)275 3942 y(`)p Fr(gdb.t10/crossload.exp)p +Fv(')25 b(is)k(a)i(go)s(o)s(d)f(example)g(of)h(an)f(in)m(teractiv)m(e)h +(test.)p eop +%%Page: 40 42 +40 41 bop 150 -116 a Fv(40)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 83 y Fu(6.2)68 b(Debugging)46 +b(a)f(test)h(case)150 276 y Fv(These)30 b(are)h(the)f(kinds)f(of)h +(debugging)g(information)e(a)m(v)-5 b(ailable)30 b(from)g(DejaGn)m(u:) +199 410 y(1.)61 b(Output)29 b(con)m(trolled)h(b)m(y)g(test)h(scripts)e +(themselv)m(es,)h(explicitly)e(allo)m(w)m(ed)i(for)g(b)m(y)g(the)g +(test)h(author.)330 520 y(This)21 b(kind)g(of)j(debugging)d(output)i +(app)s(ears)f(in)g(the)h(detailed)f(output)h(recorded)g(in)e(the)j(`)p +Fq(to)s(ol)p Fr(.log)p Fv(')330 629 y(\014le.)41 b(T)-8 +b(o)31 b(do)g(the)f(same)i(for)e(new)g(tests,)i(use)e(the)h +Fr(verbose)e Fv(pro)s(cedure)h(\(whic)m(h)f(in)h(turn)f(uses)i(the)330 +739 y(v)-5 b(ariable)29 b(also)h(called)f Fr(verbose)p +Fv(\))f(to)j(con)m(trol)g(ho)m(w)f(m)m(uc)m(h)g(output)f(to)i +(generate.)42 b(This)29 b(will)e(mak)m(e)330 848 y(it)i(easier)h(for)g +(other)g(p)s(eople)f(running)e(the)j(test)h(to)g(debug)e(it)g(if)g +(necessary)-8 b(.)42 b(Whenev)m(er)30 b(p)s(ossible,)330 +958 y(if)h(`)p Fr($verbose)p Fv(')g(is)g Fr(0)p Fv(,)h(there)h(should)d +(b)s(e)i(no)g(output)g(other)g(than)g(the)h(output)e(from)h +Fr(pass)p Fv(,)g Fr(fail)p Fv(,)330 1068 y Fr(error)p +Fv(,)h(and)f Fr(warning)p Fv(.)47 b(Then,)33 b(to)h(whatev)m(er)g +(exten)m(t)g(is)e(appropriate)g(for)h(the)g(particular)f(test,)330 +1177 y(allo)m(w)h(successiv)m(ely)f(higher)g(v)-5 b(alues)33 +b(of)g(`)p Fr($verbose)p Fv(')e(to)j(generate)h(more)e(information.)48 +b(Be)34 b(kind)330 1287 y(to)d(other)g(programmers)f(who)f(use)h(y)m +(our)h(tests:)41 b(pro)m(vide)30 b(for)g(a)h(lot)f(of)h(debugging)e +(information.)199 1421 y(2.)61 b(Output)26 b(from)g(the)h(in)m(ternal)e +(debugging)h(functions)f(of)i(Tcl)f(and)g Fr(expect)p +Fv(.)38 b(There)26 b(is)g(a)h(command)330 1531 y(line)h(options)i(for)g +(eac)m(h;)h(b)s(oth)e(forms)h(of)g(debugging)f(output)h(are)g(recorded) +g(in)f(the)h(\014le)f Fr(dbg.log)330 1641 y Fv(in)g(the)i(curren)m(t)f +(directory)-8 b(.)330 1775 y(Use)23 b(`)p Fr(--debug)p +Fv(')d(for)i(information)f(from)h(the)g Fr(expect)e Fv(lev)m(el;)25 +b(it)d(generates)i(displa)m(ys)c(of)i(the)h Fr(expect)330 +1885 y Fv(attempts)i(to)g(matc)m(h)h(the)e(to)s(ol)g(output)g(with)f +(the)i(patterns)f(sp)s(eci\014ed)f(\(see)i(Section)f(5.7.3)i([Debug)330 +1994 y(Log],)34 b(page)f(36\).)47 b(This)30 b(output)i(can)g(b)s(e)g(v) +m(ery)h(helpful)c(while)h(dev)m(eloping)h(test)i(scripts,)f(since)f(it) +330 2104 y(sho)m(ws)e(precisely)f(the)i(c)m(haracters)h(receiv)m(ed.)41 +b(Iterating)29 b(b)s(et)m(w)m(een)h(the)g(latest)g(attempt)g(at)h(a)e +(new)330 2213 y(test)k(script)d(and)h(the)h(corresp)s(onding)e(`)p +Fr(dbg.log)p Fv(')g(can)i(allo)m(w)f(y)m(ou)h(to)h(create)g(the)f +(\014nal)e(patterns)330 2323 y(b)m(y)g(\\cut)h(and)f(paste".)42 +b(This)28 b(is)i(sometimes)g(the)h(b)s(est)f(w)m(a)m(y)h(to)g(write)f +(a)g(test)i(case.)330 2457 y(Use)45 b(`)p Fr(--strace)p +Fv(')d(to)j(see)g(more)f(detail)g(at)h(the)f(Tcl)g(lev)m(el;)51 +b(this)43 b(sho)m(ws)h(ho)m(w)h(Tcl)e(pro)s(cedure)330 +2567 y(de\014nitions)f(expand,)47 b(as)d(they)g(execute.)84 +b(The)43 b(asso)s(ciated)i(n)m(um)m(b)s(er)e(con)m(trols)h(the)g(depth) +g(of)330 2677 y(de\014nitions)20 b(expanded;)25 b(see)e(the)g +(discussion)d(of)j(`)p Fr(--strace)p Fv(')d(in)i(Chapter)g(3)h +([Running)d(the)j(T)-8 b(ests],)330 2786 y(page)31 b(9.)199 +2921 y(3.)61 b(Finally)-8 b(,)24 b(if)e(the)i(v)-5 b(alue)23 +b(of)h(`)p Fr(verbose)p Fv(')e(is)h(3)h(or)f(greater,)k +Fr(runtest)22 b Fv(turns)g(on)h(the)h Fr(expect)e Fv(command)330 +3030 y Fr(log_user)p Fv(.)38 b(This)26 b(command)h(prin)m(ts)f(all)h +Fr(expect)f Fv(actions)i(to)g(the)g Fr(expect)e Fv(standard)h(output,)h +(to)330 3140 y(the)j(detailed)e(log)h(\014le,)g(and)g(\(if)g(`)p +Fr(--debug)p Fv(')f(is)g(on\))i(to)g(`)p Fr(dbg.log)p +Fv('.)150 3397 y Fu(6.3)68 b(Adding)44 b(a)h(test)h(case)g(to)f(a)g +(test)h(suite)275 3590 y Fv(There)32 b(are)h(t)m(w)m(o)h(sligh)m(tly)c +(di\013eren)m(t)j(w)m(a)m(ys)g(to)g(add)f(a)h(test)h(case.)48 +b(One)32 b(is)g(to)h(add)f(the)h(test)h(case)f(to)150 +3699 y(an)27 b(existing)f(directory)-8 b(.)40 b(The)26 +b(other)i(is)e(to)i(create)g(a)g(new)e(directory)h(to)h(hold)e(y)m(our) +h(test.)40 b(The)27 b(existing)150 3809 y(test)g(directories)e +(represen)m(t)h(sev)m(eral)g(st)m(yles)g(of)g(testing,)i(all)d(of)h +(whic)m(h)e(are)j(sligh)m(tly)d(di\013eren)m(t;)j(examine)150 +3919 y(the)k(directories)e(for)h(the)h(to)s(ol)f(of)h(in)m(terest)f(to) +h(see)g(whic)m(h)e(\(if)h(an)m(y\))h(is)e(most)i(suitable.)275 +4053 y(Adding)f(a)i Fo(gcc)f Fv(test)i(can)e(b)s(e)h(v)m(ery)g(simple:) +41 b(just)31 b(add)g(the)h(C)f(co)s(de)h(to)g(an)m(y)g(directory)g(b)s +(eginning)150 4163 y(with)d(`)p Fr(gcc.)p Fv(')h(and)g(it)f(runs)g(on)i +(the)f(next)h(`)p Fr(runtest)d(--tool)h(gcc)p Fv('.)275 +4297 y(T)-8 b(o)26 b(add)g(a)h(test)g(to)g Fo(gdb)p Fv(,)g(\014rst)f +(add)g(an)m(y)g(source)h(co)s(de)f(y)m(ou)h(will)d(need)i(to)h(the)f +(test)i(directory)-8 b(.)39 b(Then)150 4407 y(y)m(ou)29 +b(can)g(either)f(create)i(a)f(new)f Fr(expect)f Fv(\014le,)h(or)g(add)g +(y)m(our)h(test)g(to)h(an)e(existing)g(one)g(\(an)m(y)i(\014le)d(with)h +(a)150 4516 y(`)p Fr(.exp)p Fv(')g(su\016x\).)39 b(Creating)28 +b(a)g(new)g(`)p Fr(.exp)p Fv(')g(\014le)f(is)g(probably)g(a)i(b)s +(etter)f(idea)g(if)f(the)h(test)h(is)f(signi\014can)m(tly)150 +4626 y(di\013eren)m(t)36 b(from)f(existing)g(tests.)59 +b(Adding)34 b(it)i(as)g(a)g(separate)h(\014le)f(also)g(mak)m(es)g +(upgrading)f(easier.)57 b(If)150 4736 y(the)33 b(C)g(co)s(de)h(has)f +(to)h(b)s(e)e(already)h(compiled)f(b)s(efore)h(the)g(test)i(will)30 +b(run,)j(then)g(y)m(ou'll)f(ha)m(v)m(e)j(to)f(add)e(it)150 +4845 y(to)f(the)g(`)p Fr(Makefile.in)p Fv(')c(\014le)j(for)g(that)h +(test)g(directory)-8 b(,)31 b(then)f(run)f Fr(configure)f +Fv(and)h Fr(make)p Fv(.)275 4980 y(Adding)f(a)j(test)g(b)m(y)g +(creating)f(a)h(new)f(directory)g(is)f(v)m(ery)i(similar:)199 +5114 y(1.)61 b(Create)34 b(the)f(new)f(directory)-8 b(.)48 +b(All)31 b(sub)s(directory)g(names)i(b)s(egin)e(with)h(the)h(name)f(of) +h(the)g(to)s(ol)g(to)330 5224 y(test;)f(e.g.)43 b Fo(g)p +Fr(++)31 b Fv(tests)h(migh)m(t)e(b)s(e)g(in)g(a)h(directory)f(called)g +(`)p Fr(g++.other)p Fv('.)41 b(There)30 b(can)h(b)s(e)f(m)m(ultiple)330 +5333 y(test)h(directories)f(that)h(start)g(with)e(the)h(same)h(to)s(ol) +f(name)h(\(suc)m(h)f(as)h(`)p Fr(g++)p Fv('\).)p eop +%%Page: 41 43 +41 42 bop 150 -116 a Fv(Chapter)30 b(6:)41 b(Ho)m(w)31 +b(T)-8 b(o)31 b(W)-8 b(rite)31 b(a)f(T)-8 b(est)31 b(Case)1988 +b(41)199 83 y(2.)61 b(Add)28 b(the)i(new)e(directory)h(name)g(to)h(the) +g(`)p Fr(configdirs)p Fv(')c(de\014nition)h(in)h(the)i(`)p +Fr(configure.in)p Fv(')c(\014le)330 193 y(for)g(the)g(test)h(suite)e +(directory)-8 b(.)40 b(This)24 b(w)m(a)m(y)j(when)e Fr(make)g +Fv(and)g Fr(configure)f Fv(next)i(run,)g(they)g(include)330 +302 y(the)31 b(new)e(directory)-8 b(.)199 437 y(3.)61 +b(Add)29 b(the)i(new)f(test)h(case)h(to)f(the)f(directory)-8 +b(,)31 b(as)f(ab)s(o)m(v)m(e.)199 571 y(4.)61 b(T)-8 +b(o)36 b(add)f(supp)s(ort)e(in)h(the)i(new)f(directory)g(for)g +(con\014gure)g(and)g(mak)m(e,)i(y)m(ou)f(m)m(ust)f(also)h(create)h(a) +330 681 y Fr(Makefile.in)h Fv(and)i(a)h Fr(configure.in)p +Fv(.)69 b(See)41 b(section)g(\\What)g(Con\014gure)f(Do)s(es")i(in)e +Fq(Cygn)m(us)330 790 y(Con\014gure)5 b Fv(.)150 1048 +y Fu(6.4)68 b(Hin)l(ts)46 b(on)f(writing)g(a)h(test)g(case)275 +1240 y Fv(There)27 b(ma)m(y)h(b)s(e)g(useful)e(existing)g(pro)s +(cedures)h(already)g(written)g(for)h(y)m(our)g(test)g(in)f(the)h(`)p +Fr(lib)p Fv(')g(direc-)150 1350 y(tory)j(of)f(the)h(DejaGn)m(u)g +(distribution.)37 b(See)31 b(Section)f(5.3)h([DejaGn)m(u)h(Builtins],)c +(page)j(23.)275 1484 y(It)26 b(is)g(safest)h(to)g(write)f(patterns)h +(that)g(matc)m(h)g Fn(al)5 b(l)37 b Fv(the)27 b(output)f(generated)h(b) +m(y)g(the)g(tested)g(program;)150 1594 y(this)22 b(is)g(called)h +Fq(closure)p Fv(.)38 b(If)22 b(a)i(pattern)f(do)s(es)g(not)h(matc)m(h)g +(the)f(en)m(tire)g(output,)i(an)m(y)e(output)g(that)h(remains)150 +1704 y(will)35 b(b)s(e)j(examined)f(b)m(y)g(the)i Fn(next)46 +b Fr(expect)37 b Fv(command.)63 b(In)37 b(this)g(situation,)i(the)f +(precise)f(b)s(oundary)150 1813 y(that)32 b(determines)e(whic)m(h)g +Fr(expect)f Fv(command)i(sees)g(what)g(is)g(v)m(ery)g(sensitiv)m(e)g +(to)g(timing)f(b)s(et)m(w)m(een)i(the)150 1923 y Fr(expect)37 +b Fv(task)j(and)e(the)h(task)h(running)c(the)j(tested)h(to)s(ol.)66 +b(As)39 b(a)g(result,)h(the)g(test)f(ma)m(y)h(sometimes)150 +2032 y(app)s(ear)35 b(to)h(w)m(ork,)h(but)d(is)h(lik)m(ely)f(to)i(ha)m +(v)m(e)g(unpredictable)d(results.)54 b(\(This)34 b(problem)g(is)g +(particularly)150 2142 y(lik)m(ely)d(for)i(in)m(teractiv)m(e)h(to)s +(ols,)f(but)g(can)g(also)f(a\013ect)j(batc)m(h)e(to)s(ols|esp)s +(ecially)e(for)i(tests)h(that)f(tak)m(e)i(a)150 2252 +y(long)24 b(time)h(to)g(\014nish.\))37 b(The)24 b(b)s(est)g(w)m(a)m(y)i +(to)f(ensure)f(closure)g(is)g(to)i(use)e(the)h(`)p Fr(-re)p +Fv(')f(option)g(for)h(the)g Fr(expect)150 2361 y Fv(command)k(to)h +(write)f(the)h(pattern)f(as)h(a)g(full)d(regular)i(expressions;)f(then) +h(y)m(ou)h(can)g(matc)m(h)g(the)g(end)f(of)150 2471 y(output)i(using)f +(a)i(`)p Fr($)p Fv('.)44 b(It)31 b(is)g(also)g(a)h(go)s(o)s(d)f(idea)g +(to)h(write)f(patterns)g(that)h(matc)m(h)g(all)f(a)m(v)-5 +b(ailable)30 b(output)150 2580 y(b)m(y)36 b(using)f(`)p +Fr(.*\\)p Fv(')h(after)h(the)f(text)i(of)e(in)m(terest;)k(this)35 +b(will)f(also)i(matc)m(h)h(an)m(y)g(in)m(terv)m(ening)f(blank)e(lines.) +150 2690 y(Sometimes)e(an)h(alternativ)m(e)g(is)e(to)i(matc)m(h)h(end)e +(of)g(line)f(using)g(`)p Fr(\\r)p Fv(')i(or)f(`)p Fr(\\n)p +Fv(',)h(but)f(this)f(is)h(usually)e(to)s(o)150 2800 y(dep)s(enden)m(t)f +(on)i(terminal)e(settings.)275 2934 y(Alw)m(a)m(ys)45 +b(escap)s(e)g(punctuation,)j(suc)m(h)d(as)g(`)p Fr(\()p +Fv(')g(or)h(`)p Fr(")p Fv(',)j(in)43 b(y)m(our)j(patterns;)52 +b(for)45 b(example,)k(write)150 3044 y(`)p Fr(\\\()p +Fv('.)41 b(If)30 b(y)m(ou)h(forget)g(to)h(escap)s(e)f(punctuation,)e(y) +m(ou)i(will)d(usually)g(see)j(an)g(error)f(message)h(lik)m(e)f(`)p +Fr(extra)150 3153 y(characters)e(after)h(close-quote)p +Fv('.)275 3288 y(If)k(y)m(ou)h(ha)m(v)m(e)h(trouble)e(understanding)f +(wh)m(y)h(a)i(pattern)f(do)s(es)f(not)h(matc)m(h)h(the)f(program)g +(output,)150 3397 y(try)45 b(using)f(the)h(`)p Fr(--debug)p +Fv(')f(option)h(to)h Fr(runtest)p Fv(,)h(and)d(examine)h(the)h(debug)e +(log)h(carefully)-8 b(.)85 b(See)150 3507 y(Section)30 +b(5.7.3)i([Debug)f(Log],)h(page)f(36.)275 3641 y(Be)d(careful)f(not)h +(to)h(neglect)f(output)g(generated)g(b)m(y)g(setup)f(rather)h(than)f(b) +m(y)h(the)g(in)m(teresting)f(parts)150 3751 y(of)32 b(a)g(test)h(case.) +46 b(F)-8 b(or)33 b(example,)f(while)e(testing)i Fo(gdb)p +Fv(,)g(I)f(issue)g(a)h(send)f(`)p Fr(set)f(height)f(0\\n)p +Fv(')i(command.)150 3861 y(The)h(purp)s(ose)f(is)h(simply)f(to)i(mak)m +(e)h(sure)e Fo(gdb)h Fv(nev)m(er)g(calls)f(a)h(paging)f(program.)48 +b(The)33 b(`)p Fr(set)c(height)p Fv(')150 3970 y(command)39 +b(in)e Fo(gdb)i Fv(do)s(es)g(not)g(generate)h(an)m(y)g(output;)j(but)38 +b(running)e Fn(any)48 b Fv(command)38 b(mak)m(es)i Fo(gdb)150 +4080 y Fv(issue)28 b(a)h(new)g(`)p Fr(\(gdb\))g Fv(')g(prompt.)40 +b(If)28 b(there)i(w)m(ere)f(no)g Fr(expect)e Fv(command)i(to)h(matc)m +(h)g(this)e(prompt,)h(the)150 4189 y(output)c(`)p Fr(\(gdb\))k +Fv(')d(b)s(egins)e(the)i(text)h(seen)f(b)m(y)f(the)h(next)g +Fr(expect)e Fv(command|whic)m(h)g(migh)m(t)h(mak)m(e)i +Fn(that)150 4299 y Fv(pattern)j(fail)g(to)h(matc)m(h.)275 +4433 y(T)-8 b(o)39 b(preserv)m(e)g(basic)f(sanit)m(y)-8 +b(,)42 b(I)c(also)h(recommended)f(that)i(no)f(test)g(ev)m(er)h(pass)f +(if)e(there)i(w)m(as)h(an)m(y)150 4543 y(kind)32 b(of)i(problem)f(in)g +(the)h(test)h(case.)53 b(T)-8 b(o)34 b(tak)m(e)i(an)e(extreme)h(case,)h +(tests)f(that)f(pass)g(ev)m(en)h(when)e(the)150 4653 +y(to)s(ol)i(will)d(not)j(spa)m(wn)f(are)h(misleading.)51 +b(Ideally)-8 b(,)35 b(a)g(test)g(in)f(this)f(sort)i(of)g(situation)f +(should)e(not)j(fail)150 4762 y(either.)41 b(Instead,)31 +b(prin)m(t)e(an)i(error)f(message)i(b)m(y)e(calling)f(one)i(of)g(the)g +(DejaGn)m(u)g(pro)s(cedures)f Fr(error)f Fv(or)150 4872 +y Fr(warning)p Fv(.)p eop +%%Page: 42 44 +42 43 bop 150 -116 a Fv(42)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 83 y Fu(6.5)68 b(Sp)t(ecial)45 +b(v)-7 b(ariables)46 b(used)f(b)l(y)g(test)h(cases)275 +276 y Fv(Y)-8 b(our)44 b(test)i(cases)f(can)g(use)f(these)h(v)-5 +b(ariables,)47 b(with)c(con)m(v)m(en)m(tional)j(meanings)d(\(as)i(w)m +(ell)f(as)h(the)150 385 y(v)-5 b(ariables)29 b(sa)m(v)m(ed)i(in)f(`)p +Fr(site.exp)p Fv(')e(see)j(Chapter)f(4)h([Setting)f Fr(runtest)e +Fv(defaults],)i(page)h(15\):)390 514 y Fn(These)i(variables)g(ar)-5 +b(e)34 b(available)g(to)f(al)5 b(l)33 b(test)g(c)-5 b(ases.)150 +698 y Fr(prms_id)144 b Fv(The)34 b(trac)m(king)h(system)f(\(e.g.)55 +b Fo(gna)-6 b(ts)p Fv(\))34 b(n)m(um)m(b)s(er)f(iden)m(tifying)f(a)j +(corresp)s(onding)d(bugre-)630 808 y(p)s(ort.)40 b(\(`)p +Fr(0)p Fv(')31 b(if)e(y)m(ou)i(do)f(not)h(sp)s(ecify)e(it)h(in)f(the)h +(test)i(script.\))150 992 y Fr(bug_id)192 b Fv(An)28 +b(optional)f(bug)g(id;)h(ma)m(y)h(re\015ect)f(a)h(bug)e(iden)m +(ti\014cation)g(from)g(another)i(organization.)630 1102 +y(\(`)p Fr(0)p Fv(')i(if)e(y)m(ou)i(do)f(not)h(sp)s(ecify)e(it.\))150 +1286 y Fr(subdir)192 b Fv(The)30 b(sub)s(directory)e(for)i(the)h +(curren)m(t)f(test)h(case.)390 1440 y Fn(These)i(variables)g(should)h +(never)f(b)-5 b(e)32 b(change)-5 b(d.)43 b(They)33 b(app)-5 +b(e)g(ar)36 b(in)c(most)i(tests.)150 1624 y Fr(expect_out\(buffer\))630 +1733 y Fv(The)27 b(output)f(from)h(the)g(last)g(command.)40 +b(This)25 b(is)h(an)h(in)m(ternal)f(v)-5 b(ariable)26 +b(set)h(b)m(y)g Fr(expect)p Fv(.)150 1918 y Fr(exec_output)630 +2027 y Fv(This)j(is)h(the)h(output)f(from)h(a)g Fq(to)s(ol)t +Fr(_load)e Fv(command.)45 b(This)30 b(only)g(applies)g(to)j(to)s(ols)f +(lik)m(e)630 2137 y Fo(gcc)37 b Fv(and)f Fo(gas)h Fv(whic)m(h)f(pro)s +(duce)g(an)h(ob)5 b(ject)38 b(\014le)f(that)g(m)m(ust)h(in)d(turn)i(b)s +(e)f(executed)i(to)630 2247 y(complete)31 b(a)g(test.)150 +2431 y Fr(comp_output)630 2540 y Fv(This)k(is)g(the)h(output)g(from)g +(a)h Fq(to)s(ol)t Fr(_start)d Fv(command.)58 b(This)35 +b(is)g(con)m(v)m(en)m(tionally)i(used)630 2650 y(for)d(batc)m(h)h +(orien)m(ted)f(programs,)i(lik)m(e)d Fo(gcc)h Fv(and)g +Fo(gas)p Fv(,)h(that)g(ma)m(y)g(pro)s(duce)f(in)m(teresting)630 +2760 y(output)c(\(w)m(arnings,)g(errors\))g(without)f(further)g(in)m +(teraction.)p eop +%%Page: 43 45 +43 44 bop 150 -116 a Fv(Chapter)30 b(7:)41 b(New)30 b(T)-8 +b(o)s(ols,)31 b(T)-8 b(argets,)31 b(or)g(Hosts)1888 b(43)150 +100 y Fs(7)80 b(New)54 b(T)-13 b(o)t(ols,)53 b(T)-13 +b(argets,)53 b(or)g(Hosts)275 334 y Fv(The)31 b(most)h(common)g(w)m(a)m +(ys)h(to)g(extend)f(the)g(DejaGn)m(u)h(framew)m(ork)f(are:)44 +b(adding)31 b(a)h(suite)f(of)h(tests)150 443 y(for)24 +b(a)h(new)e(to)s(ol)h(to)h(b)s(e)f(tested;)j(adding)c(supp)s(ort)g(for) +h(testing)g(on)g(a)h(new)e(target;)28 b(and)c(p)s(orting)f +Fr(runtest)150 553 y Fv(to)31 b(a)g(new)f(host.)150 810 +y Fu(7.1)68 b(W)-11 b(riting)46 b(tests)f(for)h(a)f(new)g(to)t(ol)275 +1003 y Fv(In)38 b(general,)j(the)e(b)s(est)f(w)m(a)m(y)i(to)g(learn)e +(ho)m(w)h(to)g(write)f(\(co)s(de)i(or)e(ev)m(en)i(prose\))f(is)f(to)h +(read)g(some-)150 1112 y(thing)34 b(similar.)52 b(This)34 +b(principle)e(applies)h(to)j(test)g(cases)g(and)e(to)i(test)g(suites.) +54 b(Unfortunately)-8 b(,)37 b(w)m(ell-)150 1222 y(established)42 +b(test)i(suites)f(ha)m(v)m(e)i(a)f(w)m(a)m(y)h(of)e(dev)m(eloping)g +(their)g(o)m(wn)h(con)m(v)m(en)m(tions:)68 b(as)44 b(test)g(writers)150 +1332 y(b)s(ecome)29 b(more)g(exp)s(erienced)e(with)h(DejaGn)m(u)h(and)g +(with)e(Tcl,)h(they)h(accum)m(ulate)h(more)f(utilities,)e(and)150 +1441 y(tak)m(e)32 b(adv)-5 b(an)m(tage)32 b(of)f(more)f(and)g(more)h +(features)f(of)h Fr(expect)d Fv(and)i(Tcl)g(in)f(general.)275 +1576 y(Insp)s(ecting)37 b(suc)m(h)h(established)f(test)j(suites)d(ma)m +(y)j(mak)m(e)f(the)g(prosp)s(ect)f(of)h(creating)g(an)g(en)m(tirely)150 +1685 y(new)31 b(test)h(suite)e(app)s(ear)h(o)m(v)m(erwhelming.)42 +b(Nev)m(ertheless,)32 b(it)f(is)f(quite)h(straigh)m(tforw)m(ard)g(to)h +(get)g(a)f(new)150 1795 y(test)g(suite)f(going.)275 1929 +y(There)e(is)g(one)h(test)g(suite)f(that)i(is)d(guaran)m(teed)j(not)f +(to)g(gro)m(w)h(more)f(elab)s(orate)g(o)m(v)m(er)h(time:)39 +b(b)s(oth)28 b(it)150 2039 y(and)34 b(the)g(to)s(ol)h(it)f(tests)h(w)m +(ere)g(created)g(expressly)f(to)h(illustrate)d(what)j(it)f(tak)m(es)i +(to)f(get)g(started)g(with)150 2149 y(DejaGn)m(u.)63 +b(The)37 b(`)p Fr(example/)p Fv(')f(directory)h(of)h(the)g(DejaGn)m(u)g +(distribution)c(con)m(tains)k(b)s(oth)f(an)g(in)m(ter-)150 +2258 y(activ)m(e)d(to)s(ol)f(called)f Fr(calc)p Fv(,)h(and)f(a)h(test)h +(suite)e(for)h(it.)47 b(Reading)33 b(this)f(test)h(suite,)g(and)g(exp)s +(erimen)m(ting)150 2368 y(with)h(it,)j(is)d(a)i(go)s(o)s(d)f(w)m(a)m(y) +i(to)f(supplemen)m(t)e(the)i(information)e(in)g(this)g(section.)56 +b(\(Thanks)35 b(to)h(Rob)s(ert)150 2477 y(Lupton)29 b(for)g(creating)h +Fr(calc)e Fv(and)h(its)g(test)h(suite|and)e(also)i(the)g(\014rst)e(v)m +(ersion)h(of)h(this)e(section)i(of)g(the)150 2587 y(man)m(ual!\))275 +2721 y(T)-8 b(o)31 b(help)f(orien)m(t)i(y)m(ou)f(further)g(in)f(this)g +(task,)i(here)g(is)e(an)h(outline)f(of)i(the)f(steps)h(to)g(b)s(egin)e +(building)150 2831 y(a)h(test)g(suite)f(for)g(a)h(program)f +Fq(example)p Fv(.)199 2966 y(1.)61 b(Create)38 b(or)g(select)g(a)g +(directory)g(to)g(con)m(tain)g(y)m(our)g(new)f(collection)g(of)h +(tests.)63 b(Change)38 b(to)g(that)330 3075 y(directory)30 +b(\(sho)m(wn)g(here)g(as)h Fr(testsuite)p Fv(\):)570 +3204 y Fr(eg$)47 b(cd)g(testsuite/)199 3338 y Fv(2.)61 +b(Create)51 b(a)g(`)p Fr(configure.in)p Fv(')d(\014le)i(in)f(this)g +(directory)-8 b(,)56 b(to)51 b(con)m(trol)g(con\014guration-dep)s +(enden)m(t)330 3448 y(c)m(hoices)36 b(for)e(y)m(our)h(tests.)56 +b(So)35 b(far)g(as)g(DejaGn)m(u)h(is)e(concerned,)i(the)f(imp)s(ortan)m +(t)g(thing)f(is)g(to)h(set)330 3557 y(a)g(v)-5 b(alue)33 +b(for)h(the)h(v)-5 b(ariable)33 b Fr(target_abbrev)p +Fv(;)f(this)h(v)-5 b(alue)34 b(is)f(the)i(link)d(to)j(the)f(init)f +(\014le)g(y)m(ou)i(will)330 3667 y(write)30 b(so)s(on.)40 +b(\(F)-8 b(or)32 b(simplicit)m(y)-8 b(,)28 b(w)m(e)j(assume)f(the)h(en) +m(vironmen)m(t)f(is)g(Unix,)f(and)h(use)g(`)p Fr(unix)p +Fv(')g(as)h(the)330 3777 y(v)-5 b(alue.\))330 3911 y(What)28 +b(else)g(is)f(needed)g(in)f(`)p Fr(configure.in)p Fv(')f(dep)s(ends)h +(on)h(the)h(requiremen)m(ts)f(of)h(y)m(our)g(to)s(ol,)g(y)m(our)330 +4021 y(in)m(tended)j(test)i(en)m(vironmen)m(ts,)f(and)g(whic)m(h)e +Fr(configure)g Fv(system)i(y)m(ou)h(use.)45 b(This)31 +b(example)g(is)h(a)330 4130 y(minimal)g Fr(configure.in)g +Fv(for)i(use)h(with)e(Cygn)m(us)h(Con\014gure.)54 b(\(F)-8 +b(or)36 b(an)e(alternativ)m(e)i(based)e(on)330 4240 y(the)d(FSF)g +Fr(autoconf)e Fv(system,)j(see)f(the)g Fr(calc)f Fv(example)h +(distributed)d(with)i(DejaGn)m(u.\))44 b(Replace)330 +4350 y Fq(example)35 b Fv(with)29 b(the)i(name)f(of)h(y)m(our)f +(program:)p eop +%%Page: 44 46 +44 45 bop 150 -116 a Fv(44)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)330 52 y Fm(\013)p 380 +52 3374 4 v 3373 w(\010)p 330 1683 4 1584 v 358 205 a +Fr(#)48 b(This)e(file)h(is)g(a)h(shell)e(script)g(fragment)358 +309 y(#)i(for)f(use)f(with)h(Cygnus)f(configure.)358 +516 y(srctrigger=")p Fq(example)p Fr(.0")358 620 y(srcname="The)f +(DejaGnu)g Fq(example)53 b Fr(tests")358 828 y(#)48 b(per-host:)358 +1035 y(#)g(per-target:)358 1243 y(#)g(everything)d(defaults)g(to)i +(unix)g(for)g(a)g(target)358 1347 y(target_abbrev=unix)358 +1554 y(#)h(post-target:)p 3803 1683 V 330 1735 a Fm(\012)p +380 1735 3374 4 v 3373 w(\011)199 1880 y Fv(3.)61 b(Create)28 +b(`)p Fr(Makefile.in)p Fv(',)e(the)i(source)f(\014le)g(used)g(b)m(y)g +Fr(configure)e Fv(to)j(build)d(y)m(our)i(`)p Fr(Makefile)p +Fv('.)38 b(Its)330 1989 y(leading)29 b(section)i(should)d(as)j(usual)e +(con)m(tain)h(the)h(v)-5 b(alues)30 b(that)g Fr(configure)e +Fv(ma)m(y)j(o)m(v)m(erride:)330 2070 y Fm(\013)p 380 +2070 V 3373 w(\010)p 330 3721 4 1604 v 358 2224 a Fr(srcdir)46 +b(=)i(.)358 2327 y(prefix)e(=)i(/usr/local)358 2535 y(exec_prefix)d(=)i +($\(prefix\))358 2639 y(bindir)f(=)i($\(exec_prefix\)/bin)358 +2742 y(libdir)e(=)i($\(exec_prefix\)/lib)358 2846 y(tooldir)e(=)h +($\(libdir\)/$\(target_alias\))358 3054 y(datadir)f(=)h +($\(exec_prefix\)/lib/dejagnu)358 3261 y(RUNTEST)f(=)h(runtest)358 +3365 y(RUNTESTFLAGS)e(=)358 3469 y(FLAGS_TO_PASS)f(=)358 +3676 y(####)j(host,)f(target,)g(site)h(specific)e(Makefile)h(frags)g +(come)h(in)g(here.)p 3803 3721 V 330 3773 a Fm(\012)p +380 3773 3374 4 v 3373 w(\011)330 3918 y Fv(This)26 b(should)g(b)s(e)h +(follo)m(w)m(ed)h(b)m(y)f(the)i(standard)e(targets)i(at)f(y)m(our)g +(site.)40 b(T)-8 b(o)28 b(b)s(egin)f(with,)g(they)h(need)330 +4028 y(not)j(do)f(an)m(ything|for)f(example,)i(these)g(de\014nitions)c +(will)h(do:)p eop +%%Page: 45 47 +45 46 bop 150 -116 a Fv(Chapter)30 b(7:)41 b(New)30 b(T)-8 +b(o)s(ols,)31 b(T)-8 b(argets,)31 b(or)g(Hosts)1888 b(45)330 +52 y Fm(\013)p 380 52 3374 4 v 3373 w(\010)p 330 1420 +4 1321 v 358 253 a Fr(all:)358 461 y(info:)358 668 y(install-info:)358 +876 y(install:)358 980 y(uninstall:)358 1187 y(clean:)740 +1291 y(-rm)47 b(-f)g(*~)g(core)g(*.info*)p 3803 1420 +V 330 1472 a Fm(\012)p 380 1472 3374 4 v 3373 w(\011)330 +1616 y Fv(It)30 b(is)f(also)h(a)g(go)s(o)s(d)g(idea)f(to)i(mak)m(e)g +(sure)e(y)m(our)h(`)p Fr(Makefile)p Fv(')e(can)i(rebuild)d(itself)i(if) +g(`)p Fr(Makefile.in)p Fv(')330 1726 y(c)m(hanges,)j(with)d(a)h(target) +i(lik)m(e)e(this)f(\(whic)m(h)h(w)m(orks)g(for)g(either)g(Cygn)m(us)g +(or)g(FSF)h(Con\014gure\):)330 1810 y Fm(\013)p 380 1810 +V 3373 w(\010)p 330 2223 4 366 v 358 1970 a Fr(Makefile)46 +b(:)h($\(srcdir\)/Makefile.in)42 b($\(host_makefile_frag\))g(\\)979 +2074 y($\(target_makefile_frag\))740 2178 y($\(SHELL\))k +(./config.status)p 3803 2223 V 330 2275 a Fm(\012)p 380 +2275 3374 4 v 3373 w(\011)330 2420 y Fv(Y)-8 b(ou)34 +b(also)f(need)g(to)h(include)d(t)m(w)m(o)j(targets)h(imp)s(ortan)m(t)d +(to)i(DejaGn)m(u:)47 b Fr(check)p Fv(,)33 b(to)h(run)e(the)h(tests,)330 +2530 y(and)d Fr(site.exp)p Fv(,)g(to)i(set)f(up)f(the)h(Tcl)g(copies)g +(of)g(con\014guration-dep)s(enden)m(t)f(v)-5 b(alues.)42 +b(The)30 b Fr(check)330 2639 y Fv(target)i(m)m(ust)e(run)f(`)p +Fr(runtest)g(--tool)f Fq(example)5 b Fv(':)330 2718 y +Fm(\013)p 380 2718 V 3373 w(\010)p 330 3121 4 356 v 358 +2871 a Fr(check:)46 b(site.exp)g(all)740 2975 y($\(RUNTEST\))f +($\(RUNTESTFLAGS\))f($\(FLAGS_TO_PASS\))f(\\)931 3078 +y(--tool)j Fq(example)53 b Fr(--srcdir)45 b($\(srcdir\))p +3803 3121 V 330 3173 a Fm(\012)p 380 3173 3374 4 v 3373 +w(\011)330 3323 y Fv(The)35 b Fr(site.exp)f Fv(target)k(should)33 +b(usually)h(set)j(up)d(\(among)j(other)f(things!\))57 +b(a)36 b(Tcl)f(v)-5 b(ariable)35 b(for)330 3433 y(the)c(name)f(of)h(y)m +(our)f(program:)p eop +%%Page: 46 48 +46 47 bop 150 -116 a Fv(46)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)330 52 y Fm(\013)p 380 +52 3374 4 v 3373 w(\010)p 330 3475 4 3376 v 358 213 a +Fr(site.exp:)45 b(./config.status)f(Makefile)740 316 +y(@echo)i("Making)g(a)i(new)f(config)f(file...")740 420 +y(-@rm)h(-f)g(./tmp?)740 524 y(@touch)f(site.exp)740 +731 y(-@mv)h(site.exp)e(site.bak)740 835 y(@echo)h("##)h(these)g +(variables)e(are)i(automatically\\)406 939 y(generated)e(by)i(make)g +(##")g(>)g(./tmp0)740 1043 y(@echo)f("#)i(Do)f(not)g(edit)f(here.)h(If) +g(you)g(wish)f(to\\)406 1147 y(override)f(these)i(values")f(>>)h +(./tmp0)740 1250 y(@echo)f("#)i(add)e(them)h(to)g(the)g(last)g +(section")e(>>)j(./tmp0)740 1354 y(@echo)e("set)h(host_os)f +(${host_os}")f(>>)i(./tmp0)740 1458 y(@echo)f("set)h(host_alias)e +(${host_alias}")f(>>)j(./tmp0)740 1562 y(@echo)f("set)h(host_cpu)f +(${host_cpu}")e(>>)j(./tmp0)740 1665 y(@echo)f("set)h(host_vendor)e +(${host_vendor}")e(>>)48 b(./tmp0)740 1769 y(@echo)e("set)h(target_os)e +(${target_os}")f(>>)k(./tmp0)740 1873 y(@echo)e("set)h(target_alias)d +(${target_alias}")g(>>)j(./tmp0)740 1977 y(@echo)f("set)h(target_cpu)e +(${target_cpu}")f(>>)j(./tmp0)740 2081 y(@echo)f("set)h(target_vendor)d +(${target_vendor}")f(>>)k(./tmp0)740 2184 y(@echo)f("set)h +(host_triplet)d(${host_canonical}")f(>>)k(./tmp0)740 +2288 y(@echo)f("set)h(target_triplet)d(${target_canonical}">>./)o(tmp0) +740 2392 y(@echo)i("set)h(tool)g(binutils")e(>>)i(./tmp0)740 +2496 y(@echo)f("set)h(srcdir)f(${srcdir}")f(>>)i(./tmp0)740 +2599 y(@echo)f("set)h(objdir)f(`pwd`")g(>>)h(./tmp0)740 +2703 y(@echo)f("set)h Fq(examplename)53 b(example)5 b +Fr(")47 b(>>)g(./tmp0)740 2807 y(@echo)f("##)h(All)g(variables)e(above) +i(are)g(generated)e(by\\)406 2911 y(configure.)g(Do)i(Not)g(Edit)g(##") +g(>>)g(./tmp0)1122 3015 y(@cat)f(./tmp0)h(>)g(site.exp)740 +3118 y(@sed)g(<)g(site.bak)f(\\)1074 3222 y(-e)h('1,/^##)f(All)h +(variables)e(above)i(are.*##/)e(d')i(\\)1074 3326 y(>>)g(site.exp)740 +3430 y(-@rm)g(-f)g(./tmp?)p 3803 3475 V 330 3527 a Fm(\012)p +380 3527 3374 4 v 3373 w(\011)199 3677 y Fv(4.)61 b(Create)31 +b(a)g(directory)f(\(in)f(`)p Fr(testsuite/)p Fv('\))g(called)g(`)p +Fr(config/)p Fv(':)570 3805 y Fr(eg$)47 b(mkdir)f(config)199 +3940 y Fv(5.)61 b(Mak)m(e)31 b(an)e(init)e(\014le)i(in)e(this)h +(directory;)i(its)e(name)i(m)m(ust)f(start)g(with)f(the)i +Fr(target_abbrev)25 b Fv(v)-5 b(alue,)330 4049 y(so)33 +b(call)g(it)f(`)p Fr(config/unix.exp)p Fv('.)45 b(This)32 +b(is)g(the)h(\014le)f(that)i(con)m(tains)f(the)g(target-dep)s(enden)m +(t)h(pro-)330 4159 y(cedures;)f(fortunately)-8 b(,)33 +b(most)g(of)f(them)h(do)f(not)g(ha)m(v)m(e)i(to)f(do)f(v)m(ery)h(m)m +(uc)m(h)f(in)f(order)h(for)g Fr(runtest)330 4269 y Fv(to)f(run.)330 +4403 y(If)f Fq(example)35 b Fv(is)29 b(not)i(in)m(teractiv)m(e,)g(y)m +(ou)g(can)f(get)i(a)m(w)m(a)m(y)g(with)d(this)g(minimal)f(`)p +Fr(unix.exp)p Fv(')g(to)j(b)s(egin)330 4513 y(with:)330 +4574 y Fm(\013)p 380 4574 V 3373 w(\010)p 330 4883 4 +262 v 358 4734 a Fr(proc)47 b(foo_exit)e({})j({})358 +4838 y(proc)f(foo_version)e({})i({})p 3803 4883 V 330 +4935 a Fm(\012)p 380 4935 3374 4 v 3373 w(\011)330 5080 +y Fv(If)30 b Fq(example)36 b Fv(is)30 b(in)m(teractiv)m(e,)h(ho)m(w)m +(ev)m(er,)i(y)m(ou)e(migh)m(t)f(as)h(w)m(ell)f(de\014ne)g(a)h(start)g +(routine)f Fn(and)k(invoke)330 5190 y(it)39 b Fv(b)m(y)30 +b(using)f(an)h(init)f(\014le)h(lik)m(e)f(this:)p eop +%%Page: 47 49 +47 48 bop 150 -116 a Fv(Chapter)30 b(7:)41 b(New)30 b(T)-8 +b(o)s(ols,)31 b(T)-8 b(argets,)31 b(or)g(Hosts)1888 b(47)330 +52 y Fm(\013)p 380 52 3374 4 v 3373 w(\010)p 330 1284 +4 1185 v 358 213 a Fr(proc)47 b(foo_exit)e({})j({})358 +316 y(proc)f(foo_version)e({})i({})358 524 y(proc)g(foo_start)e({})i({) +454 628 y(global)f Fq(examplename)454 731 y Fr(spawn)g($)p +Fq(examplename)454 835 y Fr(expect)g({)549 939 y(-re)h("")g({})454 +1043 y(})358 1147 y(})358 1250 y(foo_start)p 3803 1284 +V 330 1336 a Fm(\012)p 380 1336 3374 4 v 3373 w(\011)199 +1481 y Fv(6.)61 b(Create)31 b(a)g(directory)f(whose)g(name)g(b)s(egins) +f(with)g(y)m(our)i(to)s(ol's)f(name,)h(to)g(con)m(tain)g(tests:)570 +1609 y Fr(eg$)47 b(mkdir)f Fq(example)p Fr(.0)199 1744 +y Fv(7.)61 b(Create)33 b(a)g(sample)f(test)h(\014le)f(in)f(`)p +Fq(example)p Fr(.0)p Fv('.)47 b(Its)32 b(name)h(m)m(ust)f(end)g(with)f +(`)p Fr(.exp)p Fv(';)j(y)m(ou)e(can)h(use)330 1853 y(`)p +Fr(first-try.exp)p Fv(')27 b(T)-8 b(o)30 b(b)s(egin)e(with,)h(just)g +(write)g(there)h(a)g(line)e(of)i(Tcl)f(co)s(de)h(to)h(issue)d(a)j +(message:)330 1935 y Fm(\013)p 380 1935 V 3373 w(\010)p +330 2140 4 159 v 358 2095 a Fr(send_user)45 b("Testing:)h(one,)g +(two...\\n")p 3803 2140 V 330 2192 a Fm(\012)p 380 2192 +3374 4 v 3373 w(\011)199 2342 y Fv(8.)61 b(Bac)m(k)32 +b(in)d(the)i(`)p Fr(testsuite/)p Fv(')d(\(top)j(lev)m(el\))f(directory) +-8 b(,)31 b(run)570 2471 y Fr(eg$)47 b(configure)330 +2606 y Fv(\(Y)-8 b(ou)36 b(ma)m(y)f(ha)m(v)m(e)i(to)e(sp)s(ecify)f +(more)h(of)g(a)g(path,)i(if)c(a)j(suitable)d Fr(configure)g +Fv(is)h(not)h(a)m(v)-5 b(ailable)34 b(in)330 2715 y(y)m(our)c +(execution)h(path.\))199 2850 y(9.)61 b(Y)-8 b(ou)34 +b(are)g(no)m(w)g(ready)g(to)g(triumphan)m(tly)e(t)m(yp)s(e)i(`)p +Fr(make)29 b(check)p Fv(')k(or)g(`)p Fr(runtest)c(--tool)g +Fq(example)5 b Fv('.)330 2959 y(Y)-8 b(ou)31 b(should)d(see)j +(something)f(lik)m(e)g(this:)330 3038 y Fm(\013)p 380 +3038 V 3373 w(\010)p 330 4046 4 961 v 358 3191 a Fr(Test)47 +b(Run)g(By)g(rhl)g(on)g(Fri)g(Jan)g(29)g(16:25:44)f(EST)g(1993)1122 +3399 y(===)h Fq(example)52 b Fr(tests)47 b(===)358 3606 +y(Running)f(./)p Fq(example)p Fr(.0/first-try.exp)d(...)358 +3710 y(Testing:)j(one,)g(two...)1122 3917 y(===)h Fq(example)52 +b Fr(Summary)46 b(===)p 3803 4046 V 330 4098 a Fm(\012)p +380 4098 3374 4 v 3373 w(\011)330 4243 y Fv(There)35 +b(is)g(no)g(output)h(in)e(the)i(summary)-8 b(,)36 b(b)s(ecause)g(so)g +(far)f(the)h(example)g(do)s(es)f(not)h(call)f(an)m(y)h(of)330 +4352 y(the)31 b(pro)s(cedures)e(that)i(establish)d(a)j(test)g(outcome.) +154 4487 y(10.)61 b(Begin)39 b(writing)e(some)i(real)g(tests.)67 +b(F)-8 b(or)40 b(an)f(in)m(teractiv)m(e)h(to)s(ol,)h(y)m(ou)e(should)e +(probably)g(write)i(a)330 4597 y(real)31 b(exit)f(routine)g(in)g +(fairly)f(short)i(order;)f(in)g(an)m(y)h(case,)i(y)m(ou)e(should)e +(also)i(write)f(a)h(real)f(v)m(ersion)330 4706 y(routine)f(so)s(on.)p +eop +%%Page: 48 50 +48 49 bop 150 -116 a Fv(48)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 83 y Fu(7.2)68 b(Adding)44 +b(a)h(target)275 276 y Fv(DejaGn)m(u)j(has)f(some)h(additional)e +(requiremen)m(ts)h(for)g(target)i(supp)s(ort,)i(b)s(ey)m(ond)c(the)h +(general-)150 385 y(purp)s(ose)37 b(pro)m(visions)g(of)h(Cygn)m(us)g +Fr(configure)p Fv(.)63 b Fr(runtest)37 b Fv(m)m(ust)h(activ)m(ely)h +(comm)m(unicate)g(with)f(the)150 495 y(target,)31 b(rather)e(than)g +(simply)e(generating)i(or)g(managing)g(co)s(de)g(for)g(the)h(target)g +(arc)m(hitecture.)41 b(There-)150 604 y(fore,)30 b(eac)m(h)i(to)s(ol)d +(requires)g(an)h(initialization)d(mo)s(dule)h(for)i(eac)m(h)h(target.) +42 b(F)-8 b(or)31 b(new)e(targets,)j(y)m(ou)e(m)m(ust)150 +714 y(supply)21 b(a)j(few)g(Tcl)e(pro)s(cedures)h(to)h(adapt)g(DejaGn)m +(u)g(to)h(the)f(target.)40 b(This)21 b(p)s(ermits)h(DejaGn)m(u)j +(itself)d(to)150 824 y(remain)j(target)i(indep)s(enden)m(t.)37 +b(See)26 b(Section)f(5.2)i([Initialization)c(mo)s(dule],)j(page)g(22,)i +(for)d(a)i(discussion)150 933 y(of)k(the)f(naming)f(con)m(v)m(en)m +(tions)j(that)f(enable)f(DejaGn)m(u)h(to)g(lo)s(cate)g(and)f(use)g +(init)f(\014les.)275 1068 y(Usually)24 b(the)i(b)s(est)f(w)m(a)m(y)i +(to)g(write)e(a)h(new)g(initialization)c(mo)s(dule)j(is)g(to)h(edit)g +(an)f(existing)g(initializa-)150 1177 y(tion)30 b(mo)s(dule;)g(some)h +(trial)f(and)g(error)g(will)e(b)s(e)i(required.)41 b(If)30 +b(necessary)-8 b(,)32 b(y)m(ou)f(can)g(use)f(the)h(`)p +Fr(--debug)p Fv(')150 1287 y(option)f(to)h(see)g(what)f(is)g(really)f +(going)h(on.)275 1421 y(When)f(y)m(ou)h(co)s(de)g(an)f(initialization)e +(mo)s(dule,)h(b)s(e)h(generous)h(in)e(prin)m(ting)f(information)h(con)m +(trolled)150 1531 y(b)m(y)i(the)h Fr(verbose)d Fv(pro)s(cedure)h(\(see) +j(Section)e(5.3)h([DejaGn)m(u)h(Builtins],)c(page)j(23\).)275 +1665 y(Most)40 b(of)f(the)h(w)m(ork)g(is)e(in)g(getting)i(the)g(comm)m +(unications)f(righ)m(t.)67 b(Comm)m(unications)38 b(co)s(de)i(\(for)150 +1775 y(sev)m(eral)26 b(situations)e(in)m(v)m(olving)g(IP)h(net)m(w)m +(orks)h(or)f(serial)f(lines\))g(is)h(a)m(v)-5 b(ailable)25 +b(in)f(a)h(DejaGn)m(u)i(library)c(\014le,)150 1885 y(`)p +Fr(lib/remote.exp)p Fv('.)37 b(See)31 b(Section)f(5.3)i([DejaGn)m(u)f +(Builtins],)d(page)j(23.)275 2019 y(If)e(y)m(ou)i(susp)s(ect)e(a)i +(comm)m(unication)f(problem,)f(try)h(running)d(the)k(connection)f(in)m +(teractiv)m(ely)g(from)150 2129 y Fr(expect)p Fv(.)37 +b(\(There)24 b(are)h(three)f(w)m(a)m(ys)h(of)g(running)c +Fr(expect)i Fv(as)i(an)f(in)m(teractiv)m(e)h(in)m(terpreter.)38 +b(Y)-8 b(ou)25 b(can)f(run)150 2238 y Fr(expect)k Fv(with)g(no)h +(argumen)m(ts,)h(and)f(con)m(trol)h(it)f(completely)g(in)m(teractiv)m +(ely;)h(or)f(y)m(ou)h(can)f(use)g(`)p Fr(expect)150 2348 +y(-i)p Fv(')c(together)i(with)e(other)g(command-line)f(options)h(and)g +(argumen)m(ts;)j(or)e(y)m(ou)f(can)h(run)e(the)i(command)150 +2457 y Fr(interpreter)f Fv(from)i(an)m(y)i Fr(expect)d +Fv(pro)s(cedure.)39 b(Use)28 b Fr(return)e Fv(to)j(get)g(bac)m(k)g(to)f +(the)h(calling)d(pro)s(cedure)150 2567 y(\(if)32 b(an)m(y\),)i(or)e +Fr(return)d(-tcl)i Fv(to)i(mak)m(e)h(the)e(calling)f(pro)s(cedure)g +(itself)h(return)f(to)i(its)f(caller;)h(use)f Fr(exit)150 +2677 y Fv(or)40 b(end-of-\014le)g(to)h(lea)m(v)m(e)g +Fr(expect)e Fv(altogether.\))72 b(Run)39 b(the)h(program)h(whose)f +(name)g(is)f(recorded)h(in)150 2786 y(`)p Fr($connectmode)p +Fv(',)45 b(with)d(the)j(argumen)m(ts)f(in)e(`)p Fr($targetname)p +Fv(',)j(to)g(establish)d(a)j(connection.)81 b(Y)-8 b(ou)150 +2896 y(should)28 b(at)j(least)g(b)s(e)f(able)g(to)h(get)g(a)g(prompt)f +(from)g(an)m(y)g(target)i(that)f(is)f(ph)m(ysically)e(connected.)150 +3153 y Fu(7.3)68 b(P)l(orting)46 b(to)f(a)g(new)h(host)275 +3346 y Fv(The)c(task)i(of)f(p)s(orting)f(DejaGn)m(u)h(is)g(basically)e +(that)j(of)f(p)s(orting)e(Tcl)i(and)f Fr(expect)p Fv(.)77 +b(Tcl)43 b(and)150 3455 y Fr(expect)p Fv(,)31 b(as)h(distributed)e +(with)g(DejaGn)m(u,)k(b)s(oth)d(use)h Fr(autoconf)p Fv(;)f(they)h +(should)f(p)s(ort)g(automatically)150 3565 y(to)g(most)g(Unix)e +(systems.)275 3699 y(Once)k(Tcl)g(and)g Fr(expect)e Fv(are)j(p)s +(orted,)g(DejaGn)m(u)h(should)c(run.)49 b(Most)34 b(system)g(dep)s +(endencies)e(are)150 3809 y(tak)m(en)f(care)h(of)e(b)m(y)g(using)f +Fr(expect)g Fv(as)i(the)f(main)f(command)i(shell.)p eop +%%Page: 49 51 +49 50 bop 150 -116 a Fv(App)s(endix)28 b(A:)i(Installing)e(DejaGn)m(u) +2215 b(49)150 100 y Fs(App)t(endix)53 b(A)81 b(Installing)55 +b(DejaGn)l(u)275 301 y Fv(Once)27 b(y)m(ou)h(ha)m(v)m(e)h(the)f(DejaGn) +m(u)h(source)f(unpac)m(k)m(ed)g(and)f(a)m(v)-5 b(ailable,)28 +b(y)m(ou)g(m)m(ust)f(\014rst)g(con\014gure)h(the)150 +411 y(soft)m(w)m(are)35 b(to)g(sp)s(ecify)d(where)i(it)f(is)g(to)h(run) +f(\(and)g(the)h(asso)s(ciated)g(defaults\);)h(then)f(y)m(ou)g(can)g +(pro)s(ceed)150 520 y(to)d(installing)d(it.)150 758 y +Fu(A.1)67 b(Con\014guring)45 b(the)h(DejaGn)l(u)f(test)h(driv)l(er)275 +944 y Fv(It)37 b(is)g(usually)e(b)s(est)i(to)h(con\014gure)g(in)e(a)i +(directory)f(separate)h(from)f(the)h(source)g(tree,)i(sp)s(ecifying)150 +1054 y(where)29 b(to)i(\014nd)d(the)j(source)f(with)e(the)i(optional)f +(`)p Fr(--srcdir)p Fv(')g(option)g(to)i Fr(configure)p +Fv(.)38 b(DejaGn)m(u)30 b(uses)150 1164 y(the)39 b(GNU)h +Fr(autoconf)c Fv(to)k(con\014gure)e(itself.)65 b(F)-8 +b(or)40 b(more)f(info)f(on)h(using)e(auto)s(conf,)k(read)e(the)g(GNU) +150 1273 y(auto)s(conf)i(man)m(ual.)70 b(T)-8 b(o)41 +b(con\014gure,)i(execute)f(the)e(`)p Fr(configure)p Fv(')f(program,)k +(no)d(other)h(options)f(are)150 1383 y(required.)f(F)-8 +b(or)31 b(an)f(example,)h(to)g(con\014gure)f(in)f(a)i(sep)s(erate)f +(tree)h(for)g(ob)5 b(jects,)31 b(execute)h(the)e(con\014gure)150 +1492 y(script)f(from)h(the)h(source)f(tree)h(lik)m(e)f(this:)390 +1615 y Fr(../dejagnu-1.3/configure)275 1743 y Fv(DejaGn)m(u)f(do)s +(esn't)g(care)g(at)g(con\014g)g(time)g(if)e(it's)i(for)f(testing)h(a)g +(nativ)m(e)g(system)g(or)g(a)g(cross)g(system.)150 1852 +y(That)h(is)g(determined)f(at)i(run)m(time)e(b)m(y)h(using)f(the)i +(con\014g)f(\014les.)275 1980 y(Y)-8 b(ou)49 b(ma)m(y)g(also)g(w)m(an)m +(t)h(to)g(use)e(the)h Fr(configure)e Fv(option)h(`)p +Fr(--prefix)p Fv(')f(to)j(sp)s(ecify)d(where)i(y)m(ou)150 +2090 y(w)m(an)m(t)f(DejaGn)m(u)f(and)f(its)g(supp)s(orting)e(co)s(de)j +(installed.)88 b(By)47 b(default,)j(installation)44 b(is)i(in)g(sub)s +(di-)150 2199 y(rectories)40 b(of)f(`)p Fr(/usr/local)p +Fv(',)g(but)g(y)m(ou)g(can)h(select)g(an)m(y)f(alternate)h(directory)f +Fq(altdir)44 b Fv(b)m(y)39 b(including)150 2309 y(`)p +Fr(--prefix=)p Fq(altdir)7 b Fv(')23 b(on)k(the)g Fr(configure)d +Fv(command)j(line.)37 b(\(This)26 b(v)-5 b(alue)26 b(is)g(captured)h +(in)e(the)i(Mak)m(e\014le)150 2419 y(v)-5 b(ariables)29 +b Fr(prefix)g Fv(and)g Fr(exec_prefix)p Fv(.\))275 2547 +y(Sa)m(v)m(e)46 b(for)e(a)i(small)d(n)m(um)m(b)s(er)g(of)i(example)g +(tests,)k(the)d(DejaGn)m(u)f(distribution)c(itself)j(do)s(es)h(not)150 +2656 y(include)38 b(an)m(y)j(test)g(suites;)j(these)d(are)f(a)m(v)-5 +b(ailable)40 b(separately)-8 b(.)71 b(T)-8 b(est)41 b(suites)e(for)h +(the)g Fo(gnu)g Fv(compiler)150 2766 y(\(testing)e(b)s(oth)g(GCC)f(and) +g(G)p Fr(++)p Fv(\))h(and)g(for)g(the)g Fo(gnu)f Fv(binary)g(utilities) +e(are)j(distributed)d(in)i(parallel)150 2875 y(with)29 +b(the)h(DejaGn)m(u)h(distribution)26 b(\(but)k(pac)m(k)-5 +b(aged)31 b(as)g(separate)g(\014les\).)39 b(The)30 b(test)h(suite)e +(for)h(the)g Fo(gnu)150 2985 y Fv(debugger)h(is)f(distributed)e(in)i +(parallel)g(with)f(eac)m(h)k(release)e(of)h(GDB)g(itself,)e(starting)h +(with)f(GDB)j(4.9.)150 3095 y(After)27 b(con\014guring)e(the)h(top-lev) +m(el)h(DejaGn)m(u)g(directory)-8 b(,)27 b(unpac)m(k)f(and)g +(con\014gure)g(the)h(test)g(directories)150 3204 y(for)40 +b(the)h(to)s(ols)f(y)m(ou)h(w)m(an)m(t)g(to)g(test;)47 +b(then,)c(in)c(eac)m(h)j(test)f(directory)-8 b(,)43 b(run)c +Fr(make)h Fv(to)h(build)c(auxiliary)150 3314 y(programs)30 +b(required)f(b)m(y)h(some)h(of)f(the)h(tests.)150 3552 +y Fu(A.2)67 b(Installing)47 b(DejaGn)l(u)275 3738 y Fv(T)-8 +b(o)36 b(install)e(DejaGn)m(u)k(in)d(y)m(our)h(\014lesystem)f(\(either) +i(in)e(`)p Fr(/usr/local)p Fv(',)g(or)i(as)f(sp)s(eci\014ed)f(b)m(y)h +(y)m(our)150 3847 y(`)p Fr(--prefix)p Fv(')29 b(option)g(to)j +Fr(configure)p Fv(\),)c(execute)390 3969 y Fr(eg$)47 +b(make)g(install)150 4098 y Fv(`)p Fr(make)29 b(install)p +Fv(')g(do)s(es)h(these)h(things)e(for)h(DejaGn)m(u:)199 +4226 y(1.)61 b(Lo)s(ok)28 b(in)f(the)h(path)f(sp)s(eci\014ed)g(for)g +(executables)i(\(`)p Fr($exec_prefix)p Fv('\))d(for)h(directories)g +(called)g(`)p Fr(lib)p Fv(')330 4335 y(and)j(`)p Fr(bin)p +Fv('.)40 b(If)30 b(these)h(directories)e(do)i(not)f(exist,)h(`)p +Fr(make)e(install)p Fv(')g(creates)i(them.)199 4463 y(2.)61 +b(Create)31 b(another)g(directory)f(in)f(the)h(`)p Fr(lib)p +Fv(')g(directory)-8 b(,)31 b(called)e(`)p Fr(dejagnu)p +Fv('.)199 4591 y(3.)61 b(Cop)m(y)30 b(the)h Fr(runtest)d +Fv(shell)h(script)g(in)m(to)i(`)p Fr($exec_prefix/bin)p +Fv('.)199 4719 y(4.)61 b(Cop)m(y)20 b(all)f(the)i(library)d(\014les)h +(\(used)h(to)h(supp)s(ort)d(the)j(framew)m(ork\))g(in)m(to)f(`)p +Fr($exec_prefix/lib/dejagnu)o Fv('.)199 4847 y(5.)61 +b(Cop)m(y)40 b(`)p Fr(runtest.exp)p Fv(')e(in)m(to)i(`)p +Fr($exec_prefix/lib/dejagnu)o Fv('.)65 b(This)38 b(is)h(the)h(main)f +(Tcl)h(co)s(de)330 4957 y(implemen)m(ting)28 b(DejaGn)m(u.)275 +5103 y(Eac)m(h)33 b(test)h(suite)e(collection)h(comes)g(with)f(simple)f +(installation)f(instructions)h(in)h(a)h(`)p Fr(README)p +Fv(')f(\014le;)150 5213 y(in)43 b(general,)49 b(the)c(test)g(suites)f +(are)h(designed)e(to)j(b)s(e)e(unpac)m(k)m(ed)g(in)g(the)g(source)h +(directory)f(for)h(the)150 5322 y(corresp)s(onding)28 +b(to)s(ol,)j(and)f(extract)i(in)m(to)e(a)h(directory)f(called)f(`)p +Fr(testsuite)p Fv('.)p eop +%%Page: 50 52 +50 51 bop 150 -116 a Fv(50)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)p eop +%%Page: 51 53 +51 52 bop 150 -116 a Fv(Index)3286 b(51)150 100 y Fs(Index)150 +1097 y Fu(-)150 1255 y Ff(--all)27 b Fe(\()p Ff(runtest)g +Fe(option\))20 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)46 b Fe(10)150 +1366 y Ff(--baud)27 b Fe(\()p Ff(runtest)g Fe(option\))19 +b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)44 b Fe(11)150 1476 y Ff(--build)27 +b Fe(\()p Ff(runtest)g Fe(option\))17 b Fd(.)c(.)g(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43 +b Fe(11)150 1587 y Ff(--connect)28 b Fe(\()p Ff(runtest)f +Fe(option\))15 b Fd(.)d(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)40 b Fe(11)150 1698 y Ff(--debug)27 +b Fe(\()p Ff(runtest)g Fe(option\))17 b Fd(.)c(.)g(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43 +b Fe(11)150 1809 y Ff(--help)27 b Fe(\()p Ff(runtest)g +Fe(option\))19 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)44 b Fe(11)150 1920 +y Ff(--host)27 b Fe(\()p Ff(runtest)g Fe(option\))19 +b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)44 b Fe(11)150 2031 y Ff(--name)27 +b Fe(\()p Ff(runtest)g Fe(option\))19 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)44 +b Fe(11)150 2142 y Ff(--objdir)27 b Fe(\()p Ff(runtest)g +Fe(option\))16 b Fd(.)d(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)g(.)42 b Fe(12)150 2252 y Ff(--outdir)27 +b Fe(\()p Ff(runtest)g Fe(option\))16 b Fd(.)d(.)f(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)42 b Fe(12)150 +2363 y Ff(--reboot)27 b Fe(\()p Ff(runtest)g Fe(option\))16 +b Fd(.)d(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)g(.)42 b Fe(12)150 2474 y Ff(--srcdir)27 b Fe(\()p +Ff(runtest)g Fe(option\))16 b Fd(.)d(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)42 b Fe(12)150 2585 +y Ff(--strace)27 b Fe(\()p Ff(runtest)g Fe(option\))16 +b Fd(.)d(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)g(.)42 b Fe(12)150 2696 y Ff(--target)27 b Fe(\()p +Ff(runtest)g Fe(option\))16 b Fd(.)d(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)42 b Fe(12)150 2807 +y Ff(--tool)27 b Fe(\()p Ff(runtest)g Fe(option\))19 +b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)44 b Fe(10)150 2918 y Ff(--tool)27 +b Fe(and)e(naming)g(con)n(v)n(en)n(tions)9 b Fd(.)j(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34 b Fe(21)150 3028 +y Ff(--verbose)28 b Fe(\()p Ff(runtest)f Fe(option\))15 +b Fd(.)d(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)40 b Fe(13)150 3139 y Ff(--version)28 b Fe(\()p Ff(runtest)f +Fe(option\))15 b Fd(.)d(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)40 b Fe(13)150 3250 y Ff(-b)26 b Fe(\()p +Ff(runtest)h Fe(option\))7 b Fd(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)32 +b Fe(11)150 3361 y Ff(-v)26 b Fe(\()p Ff(runtest)h Fe(option\))7 +b Fd(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)32 b Fe(13)150 +3472 y Ff(-V)26 b Fe(\()p Ff(runtest)h Fe(option\))7 +b Fd(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)32 b Fe(13)150 +3805 y Fu(.)150 3962 y Ff(.exp)14 b Fd(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40 +b Fe(1)150 4296 y Fu(A)150 4453 y Ff(absolute)27 b Fc(path)8 +b Fd(.)k(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)33 +b Fe(28)150 4564 y(adding)26 b(a)g(target)14 b Fd(.)f(.)f(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)40 b Fe(48)150 4675 y(adding)26 +b(a)g(test)f(case)8 b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)33 +b Fe(40)150 4786 y Ff(all_flag)7 b Fd(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)32 b Fe(17)150 +4897 y(am)n(biguit)n(y)-6 b(,)24 b(required)i(for)g(POSIX)11 +b Fd(.)g(.)i(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +37 b Fe(7)150 5007 y(arc)n(hiv)n(e)26 b(ob)t(ject)g(\014les)15 +b Fd(.)e(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)41 b Fe(30)150 +5118 y(auxiliary)26 b(\014les,)h(building)16 b Fd(.)c(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) +g(.)43 b Fe(3)150 5229 y(auxiliary)26 b(programs)11 b +Fd(.)i(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)36 b Fe(49)150 +5340 y(auxiliary)26 b(test)g(programs)9 b Fd(.)j(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)34 +b Fe(12)2025 424 y Fu(B)2025 557 y Ff(baud)13 b Fd(.)g(.)f(.)g(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38 +b Fe(17)2025 657 y(baud)25 b(rate,)h(sp)r(ecifying)12 +b Fd(.)i(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)38 b Fe(11)2025 756 y(bps,)25 +b(sp)r(ecifying)8 b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)33 b Fe(11)2025 856 y Ff(bt)15 b Fd(.)e(.)f(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)41 +b Fe(31)2025 956 y(bug)25 b(n)n(um)n(b)r(er)16 b Fd(.)11 +b(.)h(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)42 +b Fe(42)2025 1055 y(bug)25 b(n)n(um)n(b)r(er,)f(extra)15 +b Fd(.)e(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)41 b Fe(42)2025 +1155 y Ff(bug_id)10 b Fd(.)j(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 b Fe(42)2025 1254 +y(build)25 b(con\014g)h(name,)f(c)n(hanging)c Fd(.)12 +b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)46 +b Fe(11)2025 1354 y(build)25 b(host)h(con\014guration)g(test)14 +b Fd(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)40 b Fe(25)2025 1454 y Ff(build_triplet)18 b Fd(.)d(.)d(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)43 b Fe(17)2025 1553 y(built)25 +b(in)h(pro)r(cedures,)g(DejaGn)n(u)19 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45 b Fe(23)2025 +1819 y Fu(C)2025 1952 y Fe(C)26 b(torture)f(test)d Fd(.)12 +b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)47 +b Fe(39)2025 2052 y(canadian)26 b(cross)h(con\014guration)f(test)12 +b Fd(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)38 +b Fe(25)2025 2151 y(cancelling)27 b(exp)r(ected)e(failure)11 +b Fd(.)j(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)37 b Fe(26)2025 2251 y Ff(check)26 b Fe(mak)n(e\014le)f +(target)e Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)48 b Fe(3)2025 +2351 y Ff(clear_xfail)28 b Fc(con\014g)22 b Fd(.)12 b(.)h(.)f(.)g(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)41 b Fe(26)2025 2450 y(Closing)27 b(a)f(remote)f +(connection)14 b Fd(.)g(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)g(.)h(.)40 b Fe(27)2025 2550 y(command)24 +b(line)i(option)g(v)l(ariables)13 b Fd(.)g(.)g(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)39 b Fe(17)2025 2650 y(command)24 +b(line)i(options)13 b Fd(.)g(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40 +b Fe(9)2025 2749 y(command)24 b(line)i(Tcl)g(v)l(ariable)g +(de\014nition)18 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)44 +b Fe(10)2025 2849 y(comm)n(unications)24 b(pro)r(cedures)9 +b Fd(.)k(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) +f(.)g(.)35 b Fe(26)2025 2948 y Ff(comp_output)23 b Fd(.)12 +b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)46 +b Fe(42)2025 3048 y(comparing)25 b(\014les)c Fd(.)13 +b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)46 b Fe(28)2025 +3148 y(compile)25 b(a)h(\014le)14 b Fd(.)f(.)g(.)f(.)g(.)h(.)f(.)g(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)40 b Fe(29)2025 3247 y(con\014guration)26 +b(dep)r(enden)n(t)e(defaults)14 b Fd(.)f(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.) +g(.)h(.)f(.)g(.)h(.)39 b Fe(15)2025 3347 y(con\014guring)26 +b(DejaGn)n(u)16 b Fd(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42 b +Fe(49)2025 3447 y(connecting)26 b(to)g(target)e Fd(.)13 +b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)50 b Fe(11)2025 3546 y Ff(connectmode)23 +b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)46 +b Fe(17)2025 3646 y(con)n(v)n(erting)25 b(relativ)n(e)i(paths)e(to)h +(absolute)d Fd(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)48 +b Fe(28)2025 3746 y(Core)26 b(In)n(ternal)g(Pro)r(cedures)14 +b Fd(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)39 b Fe(23)2025 3845 y(cross)27 b(con\014guration)14 +b Fd(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)40 b Fe(4)2025 +3945 y(curren)n(t)25 b(test)h(sub)r(directory)18 b Fd(.)12 +b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g +(.)h(.)f(.)44 b Fe(42)2025 4211 y Fu(D)2025 4344 y Ff(dbg.log)27 +b Fe(\014le)19 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)45 b Fe(11)2025 4443 y(debug)25 b(log)c Fd(.)12 +b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)45 +b Fe(36)2025 4543 y(debug)25 b(log)i(for)f(test)g(cases)8 +b Fd(.)13 b(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)g(.)h(.)f(.)g(.)h(.)33 b Fe(11)2025 4642 y Ff(debugger.exp)22 +b Fd(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45 +b Fe(30)2025 4742 y(debugging)26 b(a)g(test)f(case)f +Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)48 b Fe(40)2025 4842 y(default)26 +b(options,)g(con)n(trolling)c Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)46 b Fe(17)2025 +4941 y(defaults,)27 b(option)11 b Fd(.)h(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)37 b Fe(17)2025 5041 y(defaults,)27 b(setting)f(in)f +(init)h(\014le)9 b Fd(.)k(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)35 b Fe(23)2025 5141 y(DejaGn)n(u)25 +b(con\014guration)18 b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)44 b +Fe(49)2025 5240 y(DejaGn)n(u)25 b(test)h(driv)n(er)11 +b Fd(.)h(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)38 b Fe(9)2025 +5340 y(DejaGn)n(u,)26 b(the)f(name)18 b Fd(.)12 b(.)g(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)44 b Fe(6)p eop +%%Page: 52 54 +52 53 bop 150 -116 a Fv(52)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 152 y Fe(Delete)26 +b(a)g(w)n(atc)n(hp)r(oin)n(t.)16 b Fd(.)d(.)f(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42 +b Fe(31)150 253 y(design)26 b(goals)18 b Fd(.)c(.)f(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)44 b Fe(5)150 354 +y(detailed)26 b(log)f Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)49 b Fe(36)150 455 y Ff(diff)27 b Fc(\014lename)i +(\014lename)18 b Fd(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40 b Fe(28)150 +555 y(directories)27 b(matc)n(hing)e(a)h(pattern)18 b +Fd(.)11 b(.)i(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43 +b Fe(28)150 656 y(directory)26 b(names)f(and)g Ff(--tool)17 +b Fd(.)d(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)43 b Fe(21)150 757 y(do)n(wnload)26 b(a)g(\014le)20 +b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)45 +b Fe(27)150 858 y Ff(download)27 b Fc(\014le)j Fe([)c +Fc(spa)n(wnid)j Fe(])18 b Fd(.)13 b(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)44 b Fe(27)150 +959 y(do)n(wnload,)27 b Ff(tip)13 b Fd(.)g(.)f(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)39 b Fe(27)150 1059 y Ff(dumplocals)28 +b Fd(expr)15 b(.)e(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)32 +b Fe(30)150 1160 y Ff(dumprocs)27 b Fd(expr)18 b(.)c(.)e(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 b Fe(30)150 1261 y +Ff(dumpvars)27 b Fd(expr)18 b(.)c(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)35 b Fe(30)150 1362 y Ff(dumpwatch)28 b Fd(expr)16 +b(.)d(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)34 +b Fe(30)150 1635 y Fu(E)150 1770 y Ff(echo.exp)8 b Fd(.)14 +b(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)34 b Fe(5)150 1870 y Ff(ERROR)24 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)49 b Fe(9,)26 +b(23)150 1971 y(example)9 b Fd(.)i(.)i(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 b Fe(5)150 +2072 y Ff(exec_output)23 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)46 b Fe(42)150 2173 y Ff(exec_prefix)p +Fe(,)28 b(con\014gure)e(options.)9 b Fd(.)k(.)g(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)34 b Fe(49)150 2274 y Ff(execute_anywhere)29 +b Fd(cmd)t(line)17 b(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)37 b Fe(30)150 2374 y(executing)26 +b(commands)e(remotely)18 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)44 b Fe(30)150 2475 y(existing)26 +b(tests,)h(running)10 b Fd(.)h(.)h(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)36 +b Fe(3)150 2576 y(exit)25 b(co)r(de)i(from)e Ff(runtest)8 +b Fd(.)14 b(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)35 b Fe(9)150 2677 y(exit)25 +b(pro)r(cedure,)h(tested)g(to)r(ols)14 b Fd(.)g(.)e(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40 b Fe(31)150 +2778 y Ff(exit_remote_shell)29 b Fc(spa)n(wnid)10 b Fd(.)j(.)g(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)33 +b Fe(27)150 2878 y Ff(exp)26 b Fe(\014lename)f(su\016x)15 +b Fd(.)d(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)41 b Fe(21)150 +2979 y Ff(expect)27 b Fe(in)n(ternal)f(tracing)10 b Fd(.)j(.)f(.)h(.)f +(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)35 b Fe(12)150 3080 y Ff(expect)27 b Fe(script)f(names)c +Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)48 b Fe(1)150 +3181 y Ff(expect)27 b Fe(scripting)f(language)21 b Fd(.)12 +b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)45 b Fe(8)150 3281 y Ff(expect_out\(buffer\))10 +b Fd(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)36 b Fe(42)150 +3382 y(exp)r(ected)25 b(failure)20 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)44 b Fe(9,)26 b(25)150 3483 y(exp)r(ected)f(failure,)i +(cancelling)21 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)44 b Fe(26)150 3756 y Fu(F)150 +3891 y Ff(FAIL)7 b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)34 b Fe(7,)26 +b(9)150 3992 y Ff(fail)h(")p Fc(string)6 b Ff(")g Fd(.)14 +b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)32 +b Fe(24)150 4093 y(failing)c(test,)e(exp)r(ected)15 b +Fd(.)d(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)41 b Fe(9)150 4193 +y(failing)28 b(test,)e(unexp)r(ected)9 b Fd(.)i(.)h(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 +b Fe(9)150 4294 y(failure,)27 b(exp)r(ected)14 b Fd(.)e(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)40 b Fe(25)150 4395 y(failure,)27 +b(POSIX)e(de\014nition)17 b Fd(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)43 +b Fe(7)150 4496 y(\014lename)25 b(for)h(test)g(\014les)14 +b Fd(.)f(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)40 b Fe(21)150 4596 y(\014les)26 +b(matc)n(hing)f(a)h(pattern)18 b Fd(.)12 b(.)g(.)g(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43 +b Fe(28)150 4697 y Ff(find)27 b Fc(dir)k(pattern)13 b +Fd(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)39 b Fe(28)150 +4798 y Ff(findfile)7 b Fd(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)32 b Fe(22)150 4899 y(\014nding)25 +b(\014le)h(di\013erences)17 b Fd(.)c(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43 +b Fe(28)150 5000 y(future)25 b(directions)15 b Fd(.)f(.)e(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)g(.)h(.)41 b Fe(8)2025 501 y Fu(G)2025 +648 y Ff(gdb.t00/echo.exp)14 b Fd(.)i(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)41 b Fe(5)2025 755 y Ff(get_warning_threshold)29 +b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)g(.)h(.)f(.)50 b Fe(24)2025 862 y Ff(getdirs)27 +b Fc(dir)d Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)44 b Fe(28)2025 968 y Ff(getdirs)27 b Fc(dir)k(pattern)9 +b Fd(.)j(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)35 b Fe(28)2025 1075 +y Ff(getenv)27 b Fc(v)l(ar)19 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)40 b Fe(29)2025 1181 +y(getting)26 b(en)n(vironmen)n(t)e(v)l(ariables)11 b +Fd(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)37 +b Fe(29)2025 1288 y(GNA)-6 b(TS)25 b(bug)g(n)n(um)n(b)r(er)15 +b Fd(.)c(.)h(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)41 b Fe(42)2025 1395 +y(Granlund,)25 b(T)-6 b(orb)t(jorn)12 b Fd(.)i(.)e(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)38 b Fe(39)2025 1501 y Ff(grep)26 b Fc(\014lename)j(regexp)10 +b Fd(.)i(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)33 b Fe(28)2025 1608 +y Ff(grep)26 b Fc(\014lename)j(regexp)f Ff(line)7 b Fd(.)13 +b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)33 b Fe(28)2025 1915 y Fu(H)2025 2063 y Fe(help)25 +b(with)h Ff(runtest)21 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45 +b Fe(11)2025 2170 y(hin)n(ts)25 b(on)h(test)f(case)i(writing)12 +b Fd(.)h(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +g(.)h(.)f(.)g(.)38 b Fe(41)2025 2276 y(host)26 b(con\014g)f(name,)h(c)n +(hanging)17 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)42 b Fe(11)2025 2383 y(host)26 +b(con\014guration)g(test)c Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47 +b Fe(25)2025 2490 y(host,)26 b(explained)19 b Fd(.)13 +b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)45 b Fe(49)2025 +2596 y Ff(host_triplet)22 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)45 b Fe(17)2025 2904 y Fu(I)2025 3052 +y Ff(ignoretests)23 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) +f(.)g(.)h(.)46 b Fe(17)2025 3158 y(init)26 b(\014le)f(name)14 +b Fd(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)40 +b Fe(22)2025 3265 y(init)26 b(\014le,)g(purp)r(ose)16 +b Fd(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)42 b +Fe(22)2025 3372 y(initialization)7 b Fd(.)14 b(.)f(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)33 b Fe(22)2025 3478 +y(input)25 b(\014les)15 b Fd(.)d(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)g(.)h(.)f(.)41 b Fe(34)2025 3585 y(installed)26 +b(to)r(ol)h(name)c Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)50 +b Fe(24)2025 3691 y(installing)27 b(DejaGn)n(u)11 b Fd(.)i(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)37 b Fe(49)2025 3798 y(in)n(ternal)26 +b(details)c Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47 +b Fe(21)2025 3904 y(in)n(v)n(oking)23 b Fd(.)13 b(.)f(.)g(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)50 +b Fe(9)2025 4011 y(IP)25 b(net)n(w)n(ork)h(pro)r(cedures)20 +b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)46 b Fe(27)2025 4118 y Ff(isbuild)27 +b(")p Fc(host)r Ff(")12 b Fd(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)38 b Fe(25)2025 4224 y Ff(ishost)27 b(")p Fc(host)r +Ff(")13 b Fd(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)39 +b Fe(25)2025 4331 y Ff(isnative)7 b Fd(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 b Fe(25)2025 +4437 y Ff(istarget)27 b(")p Fc(target)r Ff(")17 b Fd(.)c(.)g(.)f(.)g(.) +h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)43 b Fe(25)2025 4745 y Fu(K)2025 4893 +y Ff(kermit)27 b Fc(p)r(ort)g(bps)18 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)42 b Fe(27)2025 5000 y Ff(kermit)p +Fe(,)27 b(remote)e(testing)h(via)9 b Fd(.)k(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34 b Fe(11)p +eop +%%Page: 53 55 +53 54 bop 150 -116 a Fv(Index)3286 b(53)150 695 y Fu(L)150 +850 y Fe(last)26 b(command)e(output)c Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)46 +b Fe(42)150 960 y Ff(lib/debugger.exp)13 b Fd(.)j(.)d(.)f(.)g(.)h(.)f +(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)39 b Fe(30)150 1070 y Ff(lib/remote.exp)16 +b Fd(.)g(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42 b +Fe(26)150 1180 y Ff(lib/target.exp)16 b Fd(.)g(.)c(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)42 b Fe(29)150 1289 y Ff(lib/utils.exp)18 +b Fd(.)d(.)d(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43 +b Fe(28)150 1399 y(Lib)r(es,)27 b(Don)18 b Fd(.)12 b(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)44 b Fe(8)150 +1509 y(list,)27 b(pruning)13 b Fd(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)38 b Fe(29)150 1619 y Ff(list_targets)22 +b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)45 +b Fe(29)150 1729 y(lists)27 b(supp)r(orted)e(targets)6 +b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)32 b Fe(29)150 1839 y(load)26 +b(library)g(\014le)15 b Fd(.)e(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)41 b Fe(25)150 1948 y(load)26 b(pro)r(cedure,)g(tested)g(to)r(ols)7 +b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)32 b Fe(31)150 2058 y Ff(load_lib)27 b(")p +Fc(library-\014le)t Ff(")15 b Fd(.)e(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)40 +b Fe(25)150 2168 y(lo)r(cal)27 b(`)p Ff(site.exp)p Fe(')e +Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47 +b Fe(19)150 2278 y(log)27 b(\014les,)f(where)g(to)g(write)7 +b Fd(.)13 b(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)g(.)h(.)f(.)g(.)h(.)32 b Fe(12)150 2388 y(Lupton,)25 +b(Rob)r(ert)10 b Fd(.)i(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)36 +b Fe(43)150 2715 y Fu(M)150 2870 y Ff(make)27 b Fe(builds)e(part)h(of)g +(tests)9 b Fd(.)k(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)35 b Fe(49)150 2980 y +Ff(make)27 b(check)12 b Fd(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)38 b Fe(3)150 3090 y(master)25 +b(`)p Ff(site.exp)p Fe(')g Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)48 +b Fe(18)150 3199 y(Menapace,)27 b(Julia)20 b Fd(.)13 +b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)45 b Fe(6)150 +3309 y Ff(mondfe)10 b Fd(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 b Fe(32)150 3419 +y Ff(mondfe)p Fe(,)27 b(remote)f(testing)g(via)9 b Fd(.)j(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)34 +b Fe(11)150 3746 y Fu(N)150 3901 y Fe(name)25 b(\\DejaGn)n(u")c +Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)46 +b Fe(6)150 4011 y(name)25 b(for)h(remote)g(test)f(mac)n(hine)7 +b Fd(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)32 b Fe(12)150 4121 y(name)25 b(transformations)15 +b Fd(.)e(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)41 b Fe(24)150 4231 y(name,)25 +b(initialization)j(mo)r(dule)13 b Fd(.)e(.)i(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38 b Fe(22)150 +4341 y(naming)25 b(con)n(v)n(en)n(tions)14 b Fd(.)e(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)40 b Fe(21)150 4450 y(naming)25 b(tests)h(to)g(run)14 +b Fd(.)e(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)40 b Fe(10)150 4560 +y(nativ)n(e)25 b(con\014guration)11 b Fd(.)j(.)e(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)37 b Fe(4)150 4670 y(nativ)n(e)25 b(con\014guration)i(test)8 +b Fd(.)k(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)33 b Fe(25)150 4780 y(net)n(w)n(ork)25 +b(\(IP\))h(pro)r(cedures)8 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)34 +b Fe(27)150 4890 y Ff(NOTE)6 b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)32 b Fe(9,)26 +b(24)150 5000 y Ff(note)h(")p Fc(string)6 b Ff(")g Fd(.)14 +b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)32 +b Fe(24)2025 84 y Fu(O)2025 217 y Ff(objdir)10 b Fd(.)j(.)f(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 +b Fe(17)2025 316 y(ob)t(ject)26 b(directory)e Fd(.)13 +b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)50 b Fe(12)2025 +416 y(Op)r(ening)25 b(a)h(remote)f(connection)15 b Fd(.)e(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)40 +b Fe(26)2025 516 y(op)r(erating)26 b(principles)13 b +Fd(.)g(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)39 b Fe(21)2025 615 +y(option)26 b(defaults)c Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)47 b Fe(17)2025 715 y(option)26 b(list,)g Ff(runtest)15 +b Fd(.)f(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)41 b Fe(9)2025 +814 y(options)7 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)33 b Fe(9)2025 914 +y(options)26 b(for)g Ff(runtest)p Fe(,)i(common)15 b +Fd(.)c(.)h(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)41 b Fe(4)2025 1014 y(options,)26 b(Tcl)h(v)l(ariables)f(for)h +(defaults)18 b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +44 b Fe(17)2025 1113 y(order)26 b(of)g(tests)15 b Fd(.)e(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)41 b Fe(21)2025 +1213 y(Ousterhout,)25 b(John)h(K.)16 b Fd(.)c(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) +h(.)42 b Fe(8)2025 1313 y Ff(outdir)10 b Fd(.)j(.)f(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 +b Fe(17)2025 1412 y(output)24 b(directory)14 b Fd(.)f(.)g(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)40 b Fe(12)2025 1512 y(output)24 +b(\014les)10 b Fd(.)j(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)36 b Fe(35)2025 1612 y(output,)25 b(additional)e +Fd(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)48 b Fe(13)2025 +1711 y(o)n(v)n(erriding)26 b(`)p Ff(site.exp)p Fe(')f +Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)49 b Fe(15)2025 1811 y(o)n(v)n(erview)20 +b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)46 b Fe(1)2025 2077 y Fu(P)2025 2210 y Ff(PASS)7 +b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)g(.)h(.)f(.)33 b Fe(6,)27 b(9)2025 2309 y Ff(pass)f(")p +Fc(string)6 b Ff(")g Fd(.)14 b(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)32 b Fe(24)2025 2409 y(path)25 b(lo)r(okup)15 +b Fd(.)e(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)41 +b Fe(28)2025 2509 y(pattern)25 b(matc)n(h,)g(directory)d +Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)48 b Fe(28)2025 2608 y(pattern)25 +b(matc)n(h,)g(\014lenames)18 b Fd(.)13 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)44 b +Fe(28)2025 2708 y Ff(perror)27 b(")p Fc(string)33 b(n)n(um)n(b)r(er)5 +b Ff(")h Fd(.)11 b(.)h(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)32 b Fe(23)2025 2807 y(p)r(ersonal)26 +b(con\014g)g(`)p Ff(site.exp)p Fe(')12 b Fd(.)j(.)e(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)38 +b Fe(20)2025 2907 y Ff(pop_host)7 b Fd(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 b Fe(29)2025 +3007 y Ff(pop_target)24 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)48 b Fe(29)2025 3106 y(p)r(orting)26 +b(to)g(a)g(new)g(host)18 b Fd(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)43 +b Fe(48)2025 3206 y(POSIX)24 b(conformance)e Fd(.)13 +b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)48 b Fe(6)2025 3306 y +Ff(prefix)p Fe(,)27 b(con\014gure)f(options)9 b Fd(.)j(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34 +b Fe(49)2025 3405 y(Prin)n(t)25 b(a)h(bac)n(ktrace)17 +b Fd(.)c(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)43 b Fe(31)2025 +3505 y(Prin)n(t)25 b(global)j(v)l(ariable)e(v)l(alues)14 +b Fd(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) +f(.)g(.)40 b Fe(30)2025 3605 y(Prin)n(t)25 b(lo)r(cal)j(v)l(ariable)e +(v)l(alue)15 b Fd(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)41 b Fe(30)2025 3704 y(Prin)n(t)25 +b(pro)r(cedure)h(b)r(o)r(dies)15 b Fd(.)e(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)40 +b Fe(30)2025 3804 y Ff(print)26 b Fd(var)d(.)12 b(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)39 b Fe(31)2025 +3904 y(Prin)n(t)25 b(w)n(atc)n(hp)r(oin)n(ts)8 b Fd(.)14 +b(.)e(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)34 b Fe(30)2025 +4003 y(Prin)n(ting)26 b(v)l(ariable)g(v)l(alues)21 b +Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)47 b Fe(31)2025 4103 y(PRMS)25 +b(bug)h(n)n(um)n(b)r(er)17 b Fd(.)c(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)46 +b Fe(42)2025 4202 y Ff(prms_id)8 b Fd(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)34 b Fe(42)2025 +4302 y(problem,)25 b(detected)g(b)n(y)g(test)h(case)17 +b Fd(.)c(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +44 b Fe(9)2025 4402 y Ff(prune)26 b Fc(list)i(pattern)9 +b Fd(.)k(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 b Fe(29)2025 +4501 y Ff(prune_system_crud)29 b Fc(system)c(text)d Fd(.)13 +b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47 +b Fe(29)2025 4601 y(pruning)25 b(system)g(output,)g(examining)g +(program)g(output)2193 4701 y Fd(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)40 +b Fe(29)2025 4800 y Ff(psource)27 b Fc(\014lename)22 +b Fd(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)44 b Fe(28)2025 +4900 y Ff(push_host)27 b Fd(name)14 b(.)f(.)f(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)34 b Fe(29)2025 5000 y Ff(push_target)28 +b Fd(name)i(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)49 b Fe(29)p +eop +%%Page: 54 56 +54 55 bop 150 -116 a Fv(54)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 657 y Fu(Q)150 810 +y Ff(quit)13 b Fd(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38 b Fe(31)150 919 +y(Quiting)26 b(DejaGn)n(u)19 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)g(.)45 b Fe(31)150 1243 y Fu(R)150 1396 y Fe(ranlib)26 +b(a)g(\014le)8 b Fd(.)k(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)33 b Fe(30)150 1506 y Ff(reboot)10 b Fd(.)j(.)g(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 +b Fe(17)150 1615 y(reb)r(o)r(oting)27 b(remote)e(targets)c +Fd(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)45 b Fe(12)150 1724 y(regular)27 b(expression,)f +(\014le)g(con)n(ten)n(ts)18 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)44 b Fe(28)150 1833 y(remote)25 +b(connection)h(pro)r(cedures)8 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)33 b Fe(26)150 1942 +y(remote)25 b(connection,)i(ending)12 b Fd(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38 +b Fe(27)150 2052 y(remote)25 b(test)h(mac)n(hine)f(name)11 +b Fd(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)37 b Fe(12)150 2161 y(remote)25 b(testb)r(ed,)h(connecting) +g(to)8 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h +(.)f(.)g(.)34 b Fe(11)150 2270 y(remote)25 b(testing)13 +b Fd(.)g(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)39 +b Fe(32)150 2379 y(remote)25 b(testing)h(via)g Ff(kermit)21 +b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)45 b Fe(11)150 2488 y(remote)25 b(testing)h(via)g +Ff(mondfe)21 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)g(.)h(.)f(.)45 b Fe(11)150 2597 y(remote)25 +b(testing)h(via)g Ff(rlogin)21 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)45 b Fe(11)150 +2707 y(remote)25 b(testing)h(via)g Ff(rsh)f Fd(.)12 b(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) +49 b Fe(11)150 2816 y(remote)25 b(testing)h(via)g Ff(telnet)21 +b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)45 b Fe(11)150 2925 y(remote)25 b(testing)h(via)g +Ff(tip)f Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)49 b Fe(11)150 3034 +y Ff(remote.exp)24 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)47 b Fe(26)150 3143 y Ff(remote_close)28 +b Fc(shellid)10 b Fd(.)j(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 b +Fe(27)150 3253 y Ff(remote_open)c Fc(t)n(yp)r(e)e Fd(.)13 +b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)48 b Fe(26)150 3362 +y Ff(rlogin)27 b Fc(hostname)20 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)42 b Fe(27)150 3471 y Ff(rlogin)p Fe(,)27 b(remote)f(testing)g +(via)9 b Fd(.)j(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)g(.)h(.)34 b Fe(11)150 3580 y Ff(rsh)26 b +Fc(hostname)e Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +46 b Fe(27)150 3689 y Ff(rsh)p Fe(,)27 b(remote)e(testing)h(via)13 +b Fd(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)g(.)h(.)f(.)g(.)39 b Fe(11)150 3799 y(running)16 +b Fd(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)42 b Fe(9)150 3908 y(running)25 b(tests)17 +b Fd(.)c(.)f(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43 +b Fe(3)150 4017 y Ff(runtest)27 b Fe(description)12 b +Fd(.)h(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)38 b Fe(9)150 +4126 y Ff(runtest)27 b Fe(exit)f(co)r(de)8 b Fd(.)13 +b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34 b Fe(9)150 +4235 y Ff(runtest)27 b Fe(option)f(defaults)17 b Fd(.)c(.)f(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 +b Fe(17)150 4344 y Ff(runtest)27 b Fe(option)f(list)7 +b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)33 b Fe(9)150 +4454 y Ff(runtest)p Fe(,)28 b(listing)e(options)21 b +Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)45 b Fe(11)150 4563 y Ff(runtest)p +Fe(,)28 b(most)d(common)f(options)16 b Fd(.)d(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)42 b Fe(4)150 4672 +y Ff(runtest)p Fe(,)28 b(v)l(ariable)e(defns)g(on)f(cmdline)12 +b Fd(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)37 +b Fe(10)150 4781 y Ff(runtest.exp)23 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)46 b Fe(21)150 4890 y +Ff(runtest_file_p)29 b Fc(run)n(tests)f(testcase)17 b +Fd(.)d(.)e(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)39 +b Fe(29)150 5000 y Ff(runtests)7 b Fd(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)32 b Fe(17)2025 +681 y Fu(S)2025 835 y Fe(searc)n(hing)26 b(\014le)g(con)n(ten)n(ts)13 +b Fd(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)39 b Fe(28)2025 945 y(selecting)27 +b(a)f(range)g(of)g(tests)15 b Fd(.)e(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)41 b Fe(10,)27 b(29)2025 +1054 y(selecting)g(tests)f(for)g(a)g(to)r(ol)16 b Fd(.)e(.)e(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42 +b Fe(10)2025 1164 y(serial)27 b(do)n(wnload,)g Ff(tip)22 +b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47 b Fe(27)2025 1274 +y(serial)27 b(line)f(connection,)g Ff(kermit)15 b Fd(.)f(.)f(.)f(.)g(.) +h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)41 b +Fe(27)2025 1383 y(serial)27 b(line)f(connection,)g Ff(tip)21 +b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)45 b Fe(27)2025 1493 y(set)26 b(curren)n(t)f(host)9 +b Fd(.)j(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)34 +b Fe(29)2025 1602 y(set)26 b(curren)n(t)f(target)15 b +Fd(.)e(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)41 b Fe(29)2025 +1712 y Ff(set_warning_threshold)30 b Fc(threshold)20 +b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43 +b Fe(24)2025 1822 y Ff(setenv)27 b Fc(v)l(ar)j(v)l(al)10 +b Fd(.)i(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 +b Fe(29)2025 1931 y(setting)26 b(defaults)g(for)h(DejaGn)n(u)f(v)l +(ariables)17 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 +b Fe(15)2025 2041 y(setting)26 b(en)n(vironmen)n(t)e(v)l(ariables)15 +b Fd(.)e(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +41 b Fe(29)2025 2150 y(setting)26 b(up)f(targets)12 b +Fd(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)38 b Fe(22)2025 +2260 y Ff(setup_xfail)28 b(")p Fc(con\014g)k Fe([)p Fc(bugid)s +Fe(])p Ff(")10 b Fd(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)36 b Fe(25)2025 2369 y Ff(site.exp)7 b +Fd(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)32 b Fe(15)2025 2479 y(`)p Ff(site.exp)p Fe(')c(for)e(all)h(of) +f(DejaGn)n(u)13 b Fd(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)38 b Fe(18)2025 2589 y(`)p Ff(site.exp)p +Fe(')28 b(for)e(eac)n(h)g(p)r(erson)8 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)34 +b Fe(20)2025 2698 y(`)p Ff(site.exp)p Fe(')28 b(for)e(eac)n(h)g(to)r +(ol)17 b Fd(.)c(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)42 b Fe(19)2025 2808 y(`)p +Ff(site.exp)p Fe(',)28 b(m)n(ultiple)23 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)50 b Fe(15)2025 2917 y Ff(slay)26 b Fc(name)21 b +Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +43 b Fe(28)2025 3027 y(sla)n(ying)26 b(pro)r(cesses)9 +b Fd(.)14 b(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 +b Fe(28)2025 3137 y(source)26 b(directory)d Fd(.)12 b(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)48 b Fe(12)2025 3246 y(sourcing)26 +b(Tcl)h(\014les)7 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) +32 b Fe(28)2025 3356 y(sp)r(ecial)27 b(v)l(ariables)20 +b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)45 +b Fe(42)2025 3465 y(sp)r(ecifying)26 b(target)h(name)18 +b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)44 b Fe(11)2025 3575 y(sp)r(ecifying)26 +b(the)g(build)f(con\014g)h(name)19 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)46 b Fe(11)2025 3685 y(sp)r(ecifying)26 +b(the)g(host)g(con\014g)f(name)17 b Fd(.)12 b(.)g(.)g(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 b Fe(11)2025 3794 y(sp)r(ecifying)26 +b(the)g(target)g(con\014guration)d Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)48 b Fe(12)2025 3904 y Ff(srcdir)10 b +Fd(.)j(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)35 b Fe(17)2025 4013 y(standard)25 b(conformance:)35 +b(POSIX)25 b(1003.3)17 b Fd(.)e(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)44 +b Fe(6)2025 4123 y(start)26 b(pro)r(cedure,)g(tested)f(to)r(ols)16 +b Fd(.)e(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)42 b Fe(31)2025 4232 y(starting)26 b(in)n(teractiv)n(e)g(to)r(ols)f +Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)49 b Fe(22)2025 4342 y(starting)26 +b(the)f(tcl)h(debugger)20 b Fd(.)13 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)45 b Fe(13)2025 +4452 y Ff(subdir)10 b Fd(.)j(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 b Fe(42)2025 4561 +y(success,)27 b(POSIX)d(de\014nition)f Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)49 +b Fe(6)2025 4671 y(successful)27 b(test)19 b Fd(.)12 +b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)45 +b Fe(9)2025 4780 y(successful)27 b(test,)f(unexp)r(ected)c +Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)50 b Fe(9)2025 4890 y(su\016x,)25 b Ff(expect)i +Fe(scripts)12 b Fd(.)i(.)e(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)39 +b Fe(1)2025 5000 y(summary)23 b(log)e Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)45 b Fe(35)p eop +%%Page: 55 57 +55 56 bop 150 -116 a Fv(Index)3286 b(55)150 84 y Fu(T)150 +217 y Fe(target)26 b(con\014guration)h(test)10 b Fd(.)i(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 +b Fe(25)150 316 y(target)26 b(con\014guration,)h(sp)r(ecifying)d +Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)49 +b Fe(12)150 416 y(target)26 b(dep)r(enden)n(t)f(pro)r(cedures)11 +b Fd(.)h(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) +g(.)37 b Fe(31)150 516 y(target)26 b(mac)n(hine)f(name)10 +b Fd(.)i(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)36 b Fe(11)150 615 y(target,)27 +b(explained)8 b Fd(.)k(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)33 +b Fe(49)150 715 y Ff(target.exp)24 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47 b Fe(29)150 815 y +Ff(target_triplet)16 b Fd(.)g(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +42 b Fe(17)150 914 y Ff(targetname)24 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47 b Fe(17)150 1014 +y(targets)12 b Fd(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)37 b Fe(32)150 1113 y(tcl)13 +b Fd(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)39 b Fe(8)150 1213 +y(tcl)26 b(debugger)11 b Fd(.)h(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +g(.)h(.)f(.)g(.)37 b Fe(13)150 1313 y(Tcl)27 b(v)l(ariables)f(for)g +(option)g(defaults)8 b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)33 b Fe(17)150 1412 y(Tcl)27 b(v)l(ariables,)f +(de\014ning)f(for)i Ff(runtest)22 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)46 b Fe(10)150 1512 y Fc(tclv)l(ar)5 +b Ff(=)p Fc(v)l(alue)16 b Fd(.)d(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)38 b Fe(10)150 1612 y Ff(telnet)27 +b Fc(hostname)i(p)r(ort)24 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47 +b Fe(27)150 1711 y Ff(telnet)p Fe(,)27 b(remote)f(testing)g(via)9 +b Fd(.)j(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)g(.)h(.)34 b Fe(11)150 1811 y(terminating)25 b(remote)h(connection) +10 b Fd(.)j(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) +36 b Fe(27)150 1911 y(test)26 b(case)g(cannot)g(run)7 +b Fd(.)k(.)i(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)33 b Fe(9)150 +2010 y(test)26 b(case)g(messages)d Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)48 b Fe(9)150 2110 y(test)26 b(case)g(w)n(arnings)f +Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)49 b Fe(9)150 +2210 y(test)26 b(case,)h(debugging)8 b Fd(.)k(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) +h(.)33 b Fe(40)150 2309 y(test)26 b(case,)h(declaring)f(am)n(biguit)n +(y)10 b Fd(.)i(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)g(.)36 b Fe(24)150 2409 y(test)26 b(case,)h(declaring)f(failure)17 +b Fd(.)d(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)43 b Fe(24)150 2508 y(test)26 b(case,)h(declaring)f(no)g +(supp)r(ort)13 b Fd(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)38 b Fe(24)150 2608 y(test)26 b(case,)h(declaring)f(no)g +(test)8 b Fd(.)k(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)33 b Fe(24)150 2708 y(test)26 b(case,)h(declaring)f +(success)f Fd(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)49 b Fe(24)150 2807 y(test)26 b(case,)h(ERR)n(OR)d +(in)12 b Fd(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)38 b Fe(23)150 +2907 y(test)26 b(case,)h(exp)r(ecting)e(failure)9 b Fd(.)14 +b(.)e(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)34 b Fe(25)150 3007 y(test)26 b(case,)h(informational)g +(messages)8 b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f +(.)34 b Fe(24)150 3106 y(test)26 b(case,)h(W)-9 b(ARNING)24 +b(in)12 b Fd(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)g(.)h(.)f(.)g(.)h(.)f(.)38 b Fe(23)150 3206 y(test)26 +b(case,)h(W)-9 b(ARNING)24 b(threshold)16 b Fd(.)c(.)g(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)41 b Fe(24)150 3306 +y(test)26 b(case,)h(writing)c Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)48 b Fe(39)150 3405 y(test)26 b(cases,)h(debug)e(log)c +Fd(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45 b Fe(11)150 3505 +y(test)26 b(directories,)h(naming)22 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)48 +b Fe(21)150 3605 y(test)26 b(\014lename)c Fd(.)12 b(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)48 b Fe(21)150 3704 y(test)26 +b(output,)f(displa)n(ying)h(all)c Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)46 b Fe(10)150 +3804 y(test)26 b(programs,)g(auxiliary)16 b Fd(.)d(.)f(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42 +b Fe(12)150 3903 y(test)26 b(suite)g(distributions)21 +b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)47 b Fe(49)150 4003 y(test,)26 +b(failing)12 b Fd(.)i(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)38 b Fe(9)150 4103 y(test,)26 b(successful)8 +b Fd(.)14 b(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34 +b Fe(9)150 4202 y(test,)26 b(unresolv)n(ed)f(outcome)c +Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)47 b Fe(9)150 4302 y(test,)26 +b(unsupp)r(orted)14 b Fd(.)d(.)i(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)40 +b Fe(9)150 4402 y(tests,)26 b(running)6 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 b Fe(3)150 4501 +y(tests,)26 b(running)f(order)14 b Fd(.)f(.)f(.)h(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +39 b Fe(21)150 4601 y(tests,)26 b(running)f(sp)r(eci\014cally)e +Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)48 b Fe(10,)26 b(29)150 4701 y(TET)10 b Fd(.)k(.)e(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)37 +b Fe(6)150 4800 y Ff(tip)26 b Fc(p)r(ort)c Fd(.)12 b(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)45 +b Fe(27)150 4900 y Ff(tip)p Fe(,)27 b(remote)e(testing)h(via)13 +b Fd(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)g(.)h(.)f(.)g(.)39 b Fe(11)150 5000 y Ff(tip_download)28 +b Fc(spa)n(wnid)h(\014le)f Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)49 b Fe(27)2025 368 +y Ff(tool)13 b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38 b Fe(17)2025 472 +y(to)r(ol)26 b(command)e(language)d Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)45 +b Fe(8)2025 576 y(to)r(ol)26 b(initialization)d Fd(.)12 +b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)46 b Fe(22)2025 +681 y(to)r(ol)26 b(name,)g(as)g(installed)c Fd(.)12 b(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +46 b Fe(24)2025 785 y(to)r(ol)26 b(names)g(and)f(naming)g(con)n(v)n(en) +n(tions)17 b Fd(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 +b Fe(21)2025 889 y Fc(to)r(ol)s Ff(_exit)17 b Fd(.)d(.)f(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43 b Fe(31)2025 +994 y Fc(to)r(ol)s Ff(_load)17 b Fd(.)d(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43 b Fe(31)2025 1098 +y Fc(to)r(ol)s Ff(_start)16 b Fd(.)e(.)f(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)41 b Fe(31)2025 1202 y Fc(to)r(ol)s +Ff(_version)13 b Fd(.)i(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)39 b Fe(32)2025 1307 y Ff(tracelevel)24 b Fd(.)12 +b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)48 +b Fe(17)2025 1411 y(tracing)26 b(Tcl)h(commands)22 b +Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)50 b Fe(12)2025 1516 y Ff(transform)25 +b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +49 b Fe(22)2025 1620 y Ff(transform)27 b(")p Fc(to)r(olname)t +Ff(")14 b Fd(.)g(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)40 b Fe(24)2025 1724 +y(transform)26 b(to)r(ol)g(name)19 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +45 b Fe(24)2025 1829 y(turning)25 b(on)h(output)d Fd(.)12 +b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)50 b Fe(13)2025 2123 +y Fu(U)2025 2266 y Fe(unexp)r(ected)24 b(success)7 b +Fd(.)14 b(.)e(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)34 b Fe(9)2025 +2370 y Ff(UNRESOLVED)17 b Fd(.)d(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)42 b Fe(7,)27 b(9)2025 2475 y Ff(unresolved)h(")p +Fc(string)6 b Ff(")16 b Fd(.)d(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)41 +b Fe(24)2025 2579 y(unset)25 b(curren)n(t)g(host)c Fd(.)12 +b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)46 b Fe(29)2025 2684 +y(unset)25 b(curren)n(t)g(target)9 b Fd(.)k(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +34 b Fe(29)2025 2788 y Ff(unsetenv)27 b Fc(v)l(ar)17 +b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)37 +b Fe(29)2025 2892 y(unsetting)25 b(en)n(vironmen)n(t)f(v)l(ariables)9 +b Fd(.)k(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)35 +b Fe(29)2025 2997 y Ff(UNSUPPORTED)15 b Fd(.)g(.)d(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)41 b Fe(7,)27 b(9)2025 3101 y +Ff(unsupported)h(")p Fc(string)6 b Ff(")14 b Fd(.)g(.)e(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +40 b Fe(24)2025 3205 y(unsupp)r(orted)24 b(test)6 b Fd(.)13 +b(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)33 b Fe(9)2025 +3310 y Ff(UNTESTED)21 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)g(.)h(.)f(.)g(.)h(.)45 b Fe(7,)27 b(9)2025 3414 y +Ff(untested)g(")p Fc(string)6 b Ff(")20 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)44 b Fe(24)2025 3519 y(un)n(tested)25 b(prop)r(erties)f +Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)50 b Fe(9)2025 +3623 y(utilities,)27 b(loading)g(from)e(init)h(\014le)15 +b Fd(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) +40 b Fe(23)2025 3727 y Ff(utils.exp)25 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)49 b Fe(28)2025 +4022 y Fu(V)2025 4165 y Fe(v)l(ariables)26 b(for)h(all)f(tests)15 +b Fd(.)e(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)41 b Fe(42)2025 4269 +y(v)l(ariables)26 b(for)h(option)f(defaults)c Fd(.)12 +b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47 +b Fe(17)2025 4373 y(v)l(ariables)26 b(of)h(DejaGn)n(u,)f(defaults)21 +b Fd(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +46 b Fe(15)2025 4478 y Ff(verbose)8 b Fd(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) +h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)34 b +Fe(17)2025 4582 y Ff(verbose)27 b Fe([)p Ff(-log)p Fe(])g([)p +Ff(-n)p Fe(])g([)p Ff(--)p Fe(])g Ff(")p Fc(string)6 +b Ff(")27 b Fc(n)n(um)n(b)r(er)21 b Fd(.)12 b(.)h(.)f(.)g(.)g(.)44 +b Fe(26)2025 4686 y Ff(verbose)27 b Fe(builtin)e(function)6 +b Fd(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)g(.)h(.)32 b Fe(26)2025 4791 y(v)n(ersion)26 +b(n)n(um)n(b)r(ers)18 b Fd(.)10 b(.)j(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)44 b Fe(13)2025 4895 y(v)n(ersion)26 b(pro)r(cedure,)g(tested)f(to) +r(ols)14 b Fd(.)g(.)e(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)40 b Fe(32)2025 5000 y(VxW)-6 b(orks,)25 b(link)g(with)h(`)p +Ff(-r)p Fe(')16 b Fd(.)d(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)41 b Fe(33)p eop +%%Page: 56 58 +56 57 bop 150 -116 a Fv(56)2364 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 147 y Fu(W)150 282 +y Ff(WARNING)22 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)46 b Fe(9,)26 b(23)150 383 y Ff(warning)h(")p +Fc(string)33 b(n)n(um)n(b)r(er)5 b Ff(")22 b Fd(.)12 +b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)48 b Fe(23)150 483 y(W)-6 b(atc)n(h)25 b(when)h(a)g(v)l(ariable) +g(is)g(read)19 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)g(.)h(.)44 b Fe(30)150 584 y(W)-6 b(atc)n(h)25 +b(when)h(a)g(v)l(ariable)g(is)g(unset)19 b Fd(.)13 b(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)45 b Fe(30)150 685 +y(W)-6 b(atc)n(h)25 b(when)h(a)g(v)l(ariable)g(is)g(written)f +Fd(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)50 +b Fe(30)150 785 y Ff(watchdel)27 b Fd(watch)j(.)13 b(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)48 b Fe(31)150 886 y Ff(watchread)28 +b Fd(var)16 b(.)d(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)33 +b Fe(30)150 987 y Ff(watchunset)28 b Fd(var)14 b(.)f(.)g(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)32 b Fe(30)150 1087 y Ff(watchwrite)c +Fd(var)14 b(.)f(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)32 +b Fe(30)2025 90 y(What)25 b(is)h(New)17 b Fd(.)c(.)g(.)f(.)g(.)h(.)f(.) +g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)44 b Fe(3)2025 189 +y Ff(which)26 b Fc(binary)21 b Fd(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)40 b Fe(28)2025 289 y(writing)26 +b(a)g(test)g(case)21 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)45 +b Fe(39)2025 556 y Fu(X)2025 688 y Ff(XFAIL)25 b Fd(.)12 +b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) +g(.)50 b Fe(6,)27 b(9)2025 788 y(XF)-9 b(AIL,)25 b(a)n(v)n(oiding)h +(for)h(POSIX)19 b Fd(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)47 b Fe(6)2025 888 y Ff(XFAIL)p +Fe(,)27 b(pro)r(ducing)20 b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h +(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) +g(.)46 b Fe(25)2025 988 y Ff(XPASS)12 b Fd(.)h(.)g(.)f(.)g(.)h(.)f(.)g +(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.) +f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)38 +b Fe(9)2025 1087 y Ff(XPASS)p Fe(,)27 b(pro)r(ducing)20 +b Fd(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f +(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)46 b Fe(25)p +eop +%%Page: -1 59 +-1 58 bop 3725 -116 a Fv(i)150 100 y Fs(T)-13 b(able)54 +b(of)g(Con)l(ten)l(ts)150 442 y Fu(1)135 b(What)45 b(is)g(DejaGn)l(u?) +24 b Fb(.)19 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h +(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)69 b Fu(1)150 +711 y(2)135 b(What)45 b(is)g(new)g(in)g(this)g(release)i(?)29 +b Fb(.)19 b(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)73 +b Fu(3)449 848 y Fv(2.1)92 b(Running)28 b(existing)h(tests)20 +b Fn(.)c(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)49 b Fv(3)449 958 y(2.2)92 b(What)31 b(do)s(es)f(a)h(DejaGn)m(u)g +(test)g(lo)s(ok)f(lik)m(e?)f Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)59 b Fv(5)449 +1068 y(2.3)92 b(Design)30 b(goals)23 b Fn(.)16 b(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)53 b Fv(5)449 1177 y(2.4)92 b(A)30 b(POSIX)g(conforming)f(test) +j(framew)m(ork)25 b Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)55 b Fv(6)449 +1287 y(2.5)92 b(F)-8 b(uture)30 b(directions)17 b Fn(.)d(.)h(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +47 b Fv(8)449 1396 y(2.6)92 b(Tcl)30 b(and)f(Exp)s(ect)e +Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)56 b Fv(8)150 1639 y Fu(3)135 +b(Using)45 b Fa(runtest)11 b Fb(.)16 b(.)k(.)f(.)h(.)f(.)h(.)f(.)g(.)h +(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.) +h(.)f(.)g(.)56 b Fu(9)150 1909 y(4)135 b(Setting)46 b +Fa(runtest)41 b Fu(defaults)26 b Fb(.)21 b(.)e(.)h(.)f(.)g(.)h(.)f(.)h +(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)71 b Fu(15)748 +2046 y Fv(4.0.1)93 b(Con\014g)29 b(V)-8 b(ariables)17 +b Fn(.)d(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46 +b Fv(15)748 2155 y(4.0.2)93 b(Master)31 b(Con\014g)f(File)13 +b Fn(.)h(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)43 b +Fv(18)748 2265 y(4.0.3)93 b(Lo)s(cal)30 b(Con\014g)g(File)22 +b Fn(.)14 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)51 +b Fv(19)748 2374 y(4.0.4)93 b(P)m(ersonal)30 b(Con\014g)g(File)24 +b Fn(.)15 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)55 b Fv(20)150 +2617 y Fu(5)135 b(The)44 b(DejaGn)l(u)h(Implemen)l(tation)28 +b Fb(.)22 b(.)e(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)73 +b Fu(21)449 2754 y Fv(5.1)92 b(Con)m(v)m(en)m(tions)31 +b(for)f(using)f(to)s(ol)h(names)16 b Fn(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)45 +b Fv(21)449 2863 y(5.2)92 b(Initialization)28 b(mo)s(dule)d +Fn(.)16 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)56 b Fv(22)449 2973 y(5.3)92 b(DejaGn)m(u)31 b(pro)s(cedures)14 +b Fn(.)g(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)44 b Fv(23)748 3083 y(5.3.1)93 b(Core)30 b(In)m(ternal)g(Pro)s +(cedures)15 b Fn(.)e(.)j(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)44 b Fv(23)748 3192 +y(5.3.2)93 b(Remote)31 b(Comm)m(unication)e(Pro)s(cedures)14 +b Fn(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)43 +b Fv(26)748 3302 y(5.3.3)93 b(Utilit)m(y)29 b(Pro)s(cedures)21 +b Fn(.)14 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)50 +b Fv(28)748 3411 y(5.3.4)93 b(Cross)29 b(target)j(pro)s(cedure)17 +b Fn(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)47 b Fv(29)748 3521 y(5.3.5)93 +b(Debugging)30 b(Pro)s(cedures)25 b Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +55 b Fv(30)449 3631 y(5.4)92 b(T)-8 b(arget)32 b(dep)s(enden)m(t)d(pro) +s(cedures)13 b Fn(.)h(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)42 +b Fv(31)449 3740 y(5.5)92 b(Remote)32 b(targets)f(supp)s(orted)10 +b Fn(.)j(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)39 +b Fv(32)449 3850 y(5.6)92 b(The)30 b(\014les)f(DejaGn)m(u)i(reads)26 +b Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)55 +b Fv(34)449 3959 y(5.7)92 b(The)30 b(\014les)f(DejaGn)m(u)i(writes)11 +b Fn(.)j(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)40 +b Fv(35)748 4069 y(5.7.1)93 b(Summary)28 b(log)14 b Fn(.)i(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)43 b +Fv(35)748 4178 y(5.7.2)93 b(Detailed)30 b(log)17 b Fn(.)e(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)47 +b Fv(36)748 4288 y(5.7.3)93 b(Logging)30 b Fr(expect)f +Fv(in)m(ternal)g(actions)f Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)57 b Fv(36)150 4531 y Fu(6)135 +b(Ho)l(w)45 b(T)-11 b(o)45 b(W)-11 b(rite)45 b(a)h(T)-11 +b(est)44 b(Case)39 b Fb(.)19 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h +(.)f(.)h(.)f(.)h(.)82 b Fu(39)449 4667 y Fv(6.1)92 b(W)-8 +b(riting)30 b(a)g(test)i(case)25 b Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)53 b Fv(39)449 +4777 y(6.2)92 b(Debugging)30 b(a)h(test)g(case)f Fn(.)15 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)58 +b Fv(40)449 4887 y(6.3)92 b(Adding)29 b(a)h(test)i(case)f(to)g(a)g +(test)g(suite)19 b Fn(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)48 b Fv(40)449 +4996 y(6.4)92 b(Hin)m(ts)30 b(on)g(writing)f(a)h(test)i(case)22 +b Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)51 +b Fv(41)449 5106 y(6.5)92 b(Sp)s(ecial)29 b(v)-5 b(ariables)29 +b(used)g(b)m(y)h(test)i(cases)23 b Fn(.)15 b(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)52 +b Fv(42)p eop +%%Page: -2 60 +-2 59 bop 150 -116 a Fv(ii)2402 b(DejaGn)m(u)32 b(T)-8 +b(esting)30 b(F)-8 b(ramew)m(ork)150 83 y Fu(7)135 b(New)45 +b(T)-11 b(o)t(ols,)45 b(T)-11 b(argets,)46 b(or)f(Hosts)23 +b Fb(.)e(.)e(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)68 +b Fu(43)449 220 y Fv(7.1)92 b(W)-8 b(riting)30 b(tests)h(for)f(a)h(new) +e(to)s(ol)19 b Fn(.)d(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)48 +b Fv(43)449 330 y(7.2)92 b(Adding)29 b(a)h(target)17 +b Fn(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)46 b Fv(48)449 439 y(7.3)92 b(P)m(orting)30 +b(to)h(a)g(new)f(host)f Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)58 b Fv(48)150 682 y Fu(App)t(endix)44 +b(A)134 b(Installing)46 b(DejaGn)l(u)29 b Fb(.)20 b(.)f(.)h(.)f(.)g(.)h +(.)f(.)h(.)f(.)h(.)f(.)g(.)74 b Fu(49)449 819 y Fv(A.1)92 +b(Con\014guring)28 b(the)i(DejaGn)m(u)i(test)f(driv)m(er)9 +b Fn(.)k(.)j(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)38 b Fv(49)449 928 y(A.2)92 b(Installing)28 +b(DejaGn)m(u)10 b Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)39 b Fv(49)150 1171 y Fu(Index)e +Fb(.)19 b(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h +(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.) +h(.)f(.)g(.)h(.)f(.)82 b Fu(51)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/contrib/bluegnu2.0.3/doc/dejagnu.texi b/contrib/bluegnu2.0.3/doc/dejagnu.texi new file mode 100644 index 0000000..0d787fa --- /dev/null +++ b/contrib/bluegnu2.0.3/doc/dejagnu.texi @@ -0,0 +1,3503 @@ +o\input texinfo @c -*- Texinfo -*- +@finalout +@setfilename dejagnu.info +@c +@c This file documents the GNU Testing Framework ``DejaGnu'' +@c +@c Copyright (C) 92, 93, 94, 95, 1996 Free Software Foundation, Inc. +@c +@c This text may be freely distributed under the terms of the GNU +@c General Public License. +@c + +@c FIXME---MAIN TODO LIST! +@c +@c * Revisit organization. +@c +@c * discuss Tcl/expect basics---enough to get started (see seminar notes). +@c Maybe this would permit abbreviating appendices. + +@ifinfo +@format +START-INFO-DIR-ENTRY +* DejaGnu: (dejagnu). The GNU testing framework. +END-INFO-DIR-ENTRY +@end format +@end ifinfo + +@syncodeindex ky cp +@syncodeindex fn cp + +@setchapternewpage odd +@settitle DejaGnu Testing Framework +@titlepage +@title The DejaGnu Testing Framework +@subtitle for DejaGnu Version 1.3 +@sp 1 +@subtitle Jan 1996 +@author Rob Savoye +@page + +@tex +{\parskip=0pt \hfill Cygnus Support} +@end tex + +@vskip 0pt plus 1filll +Copyright @copyright{} 92, 93, 94, 95, 1996 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@noindent +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that +the entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. +@end titlepage + +@ifinfo +Copyright @copyright{} 92, 93, 94, 95, 1996 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries a copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). +@end ignore + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that +the entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. + +@node Top +@top DejaGnu + +DejaGnu is a framework for running test suites on software tools. + +This file describes version 1.3 of DejaGnu. + +@menu +* Overview:: What is DejaGnu? +* What is New:: What is new in this release. +* Invoking runtest:: Using `runtest', the main test driver +* Customizing:: Setting `runtest' defaults +* Internals:: The DejaGnu implementation +* Tests:: How to write a test case +* Extending:: New tools, new targets, and new hosts +* Installation:: Configuring and Installing DejaGnu +* Index:: Index +@end menu +@end ifinfo + +@iftex +@raggedbottom +@end iftex + +@node Overview +@chapter What is DejaGnu? +@cindex overview + +DejaGnu is a framework for testing other programs. Its purpose is to +provide a single front end for all tests. Beyond this, DejaGnu offers +several advantages for testing: + +@enumerate +@item +The flexibility and consistency of the DejaGnu framework make it easy +to write tests for any program. + +@item +DejaGnu provides a layer of abstraction which allows you to write tests +that are portable to any host or target where a program must be tested. +For instance, a test for GDB can run (from any Unix based host) on any +target architecture that DejaGnu supports. Currently DejaGnu runs tests +on several single board computers, whose operating software ranges from +just a boot monitor to a full-fledged, Unix-like realtime OS. + +@item +All tests have the same output format. This makes it easy to integrate +testing into other software development processes. DejaGnu's output is +designed to be parsed by other filtering script, and it is also human +readable. +@end enumerate + +DejaGnu is written in @code{expect}, which in turn uses @dfn{Tcl}---Tool +command language. + +@cindex @code{expect} script names +@kindex .exp +@cindex suffix, @code{expect} scripts +Running tests requires two things: the testing framework, and the test +suites themselves. Tests are usually written in @code{expect} using +Tcl, but you can also use a Tcl script to run a test suite that is not +based on @code{expect}. (@code{expect} script filenames conventionally +use @samp{.exp} as a suffix; for example, the main implementation of the +DejaGnu test driver is in the file @file{runtest.exp}.) + + +@menu +* Running Tests:: A first look at running DejaGnu tests +* Sample Test:: What does a DejaGnu test case look like? +* Design Goals:: Goals behind DejaGnu +* Posix:: DejaGnu conforms to POSIX 1003.3 +* Future Directions:: Where is DejaGnu going? +* Tcl and Expect:: Reading more about Tcl and Expect +@end menu + +@node What is New +@chapter What is new in this release ? +@cindex What is New + +This release has a number of substantial changes over version 1.2. The +most visible change is that the version of expect and Tcl included in +the release are up-to-date with the current stable net releases. Other +changes are: + +@enumerate +@item +@c FIXME: add a link to the config section +The config sub-system in DejaGnu has been completely redesigned. It now +supports testing on remote hosts as well as remote targets. + +@item +More builtin support for building target binaries with the correct +linker flags. Currently this only works with GCC, preferably with a +target support by @code{libgloss}. + +@item +Lots of little bug fixes from a year of heavy use here at Cygnus +Support. + +@item +DejaGnu now uses @code{autoconf} for configuration. + +@item +New test cases for DejaGnu have been added for the new features, plus +the "--tool" option bug in the 1.2 testsuite has been fixed. + +@item +The @code{--tool} option is now optional. + +@item +@code{runtest} when searching for test drivers ignores all directories +named SCCS, RCS, and CVS. + +@item +There is now a generic keyword based test harness that uses comments in +source code to control how each test case gets built and run. + +@item +There is now some support for running a testsuite with multiple passes. + +@end enumerate + +@node Running Tests +@section Running existing tests +@cindex existing tests, running +@cindex running tests +@cindex tests, running + +@kindex make check +To run tests from an existing collection, first use @code{configure} as +usual to set up the source directory containing the tests. Then try +running + +@example +make check +@end example + +@cindex @code{check} makefile target +If the @code{check} target exists, it usually saves you some +trouble---for instance, it can set up any auxiliary programs or other +files needed by the tests. + +@cindex auxiliary files, building +Once you have run @samp{make check} to build any auxiliary files, you +might want to call the test driver @code{runtest} directly to repeat the +tests. You may also have to call @code{runtest} directly for test +collections with no @code{check} target in the @file{Makefile}. + +@c force page break to avoid losing footnote to another page +@page +@cindex @code{runtest}, most common options +@cindex options for @code{runtest}, common +Typically, you must use two command-line options: @samp{--tool}, to +specify which set of tests to run@footnote{@samp{--tool} selects a +particular suite of tests, @emph{not} the name of the executable program +to run. @xref{Config Values,,Configuration dependent values}, for +information on the variables that you can use to specify the names of +programs to run.}, and @samp{--srcdir}, to specify where to find test +directories. + +For example, if the directory @file{gdb/testsuite} contains a collection +of DejaGnu tests for @sc{gdb}, you can run them like this: + +@example +eg$ cd gdb/testsuite +eg$ runtest --tool gdb +@exdent @emph{Test output follows, ending with:} + + === gdb Summary === + +# of expected passes 508 +# of expected failures 103 +/usr/latest/bin/gdb version 4.14.4 -nx +@end example + +You can use the option @samp{--srcdir} to point to some other directory +containing a collection of tests: + +@smallexample +eg$ runtest --tool gdb --srcdir /devo/gdb/testsuite +@end smallexample + +@cindex native configuration +@cindex cross configuration +These examples assume a @dfn{native} configuration, where the same +computer runs both @code{runtest} and the tests themselves. When you +have a @dfn{cross} configuration, the tests run on a different computer, +controlled by the host running @code{runtest}. In this situation, you +need the option @samp{--name} to specify the network address for the +other computer: + +@smallexample +eg$ runtest --tool gdb --name vx9.munist.com +@end smallexample + +If you always use the same option values, you can record them in a file +called @file{site.exp}, rather than typing them each time. @xref{Config +Values,,Setting defaults for @code{runtest} options}. + +By default, @code{runtest} prints only the names of the tests it runs, +output from any tests that have unexpected results, and a summary +showing how many tests passed and how many failed. To display output +from all tests (whether or not they behave as expected), use the +@samp{--all} option. For more verbose output about processes being run, +communication, and so on, use @samp{--verbose}. To see even more output, +use multiple @samp{--verbose} options. @xref{Invoking runtest,,Using +@code{runtest}}, for a more detailed explanation of each @code{runtest} +option. + +Test output goes into two files in your current directory: summary +output in @file{@var{tool}.sum}, and detailed output in +@file{@var{tool}.log}. (@var{tool} refers to the collection of tests; +for example, after a run with @samp{--tool gdb}, look for output files +@file{gdb.sum} and @file{gdb.log}.) @xref{Output Files,,The files +DejaGnu writes}. + +@node Sample Test +@section What does a DejaGnu test look like? + +@cindex example +Each DejaGnu test is an @code{expect} script; the tests vary widely in +complexity, depending on the nature of the tool and the feature tested. + +@kindex gdb.t00/echo.exp +@kindex echo.exp +Here is a very simple @sc{gdb} test---one of the simplest tests shipped +with DejaGnu (extracted from @file{gdb.t00/echo.exp}):@footnote{More +recent @sc{gdb} tests use the @samp{gdb_test} procedure. +An equivalent test using that procedure is @samp{ gdb_test "echo Hello +world!" "Hello world!" }} +@c FIXME! include xref in footnote, when gdb_test documented in some manual. +@c @xref{}. +@c Extra spaces in @samp above avoid running end ' against " inside. + +@cartouche +@smallexample +# send a string to the GDB stdin: +send "echo Hello world!\n" + +# inspect the GDB stdout for the correct reply, +# and determine whether the test passes or fails: +expect @{ + -re "Hello world.*$prompt $" @{ pass "Echo test" @} + -re "$prompt $" @{ fail "Echo test" @} + timeout @{ fail "(timeout) Echo test" @} + @} +@end smallexample +@end cartouche + +Though brief, this example is a complete test. It illustrates some of +the main features of DejaGnu test scripts: + +@itemize @bullet +@item +The test case does not start the tested program (@sc{gdb} in this case); +all test scripts for interactive tools can assume the corresponding tool +is running. + +@item +Comments start with @samp{#}. + +@item +The main commands you use to control a tested program are @code{send} +(to give it commands) and @code{expect} (to analyze its responses). + +@item +The @code{expect} command uses a list of pairs; a pattern (regular +expression if @samp{-re} specified), followed by an action to run if the +pattern matches output from the program. Only the action for the +@emph{first} matching pattern will execute. + +@item +Test cases use the commands @code{pass} and @code{fail} to record the +test outcome. +@end itemize + +@node Design Goals +@section Design goals +@cindex design goals + +DejaGnu grew out of the internal needs of Cygnus Support. Cygnus +maintains and enhances a variety of free programs in many different +environments, and we needed a testing tool that: + +@itemize @bullet +@item +is useful to developers while fixing bugs; + +@item +automates running many tests during a software release process; + +@item +is portable among a variety of host computers; + +@item +supports cross-development testing; + +@item +permits testing interactive programs, like @sc{gdb}; and + +@item +permits testing batch oriented programs, like @sc{gcc}. +@end itemize + +Some of the requirements proved challenging. For example, interactive +programs do not lend themselves very well to automated testing. But all +the requirements are important: for instance, it is imperative to make +sure that @sc{gdb} works as well when cross-debugging as it does in a +native configuration. + +Probably the greatest challenge was testing in a cross-development +environment (which can be a real nightmare). Most cross-development +environments are customized by each developer. Even when buying +packaged boards from vendors there are many differences. The +communication interfaces vary from a serial line to ethernet. DejaGnu +was designed with a modular communication setup, so that each kind of +communication can be added as required, and supported thereafter. Once +a communication procedure is coded, any test can use it. Currently +DejaGnu can use @code{rsh}, @code{rlogin}, @code{telnet}, @code{tip}, +@code{kermit}, and @code{mondfe} for remote communications. + +@cindex name ``DejaGnu'' +@cindex DejaGnu, the name +@cindex Menapace, Julia +Julia Menapace first coined the term ``Deja Gnu'' to describe an earlier +testing framework at Cygnus Support. When we replaced it with the +Expect-based framework, it was like DejaGnu all over again@dots{} + +@node Posix +@section A POSIX conforming test framework + +@cindex POSIX conformance +@cindex standard conformance: POSIX 1003.3 +DejaGnu conforms to the @sc{posix} standard for test frameworks. + +@cindex TET +@sc{posix} standard 1003.3 defines what a testing framework needs to +provide, in order to permit the creation of @sc{posix} conformance +test suites. This standard is primarily oriented to running @sc{posix} +conformance tests, but its requirements also support testing of features +not related to @sc{posix} conformance. @sc{posix} 1003.3 does not +specify a particular testing framework, but at this time there is only +one other @sc{posix} conforming test framework: +@sc{tet}.@footnote{@sc{tet} was created by Unisoft for a consortium +comprised of X/Open, Unix International, and the Open Software +Foundation.} + +The @sc{posix} documentation refers to @dfn{assertions}. An assertion +is a description of behavior. For example, if a standard says ``The sun +shall shine'', a corresponding assertion might be ``The sun is +shining.'' A test based on this assertion would pass or fail depending +on whether it is daytime or nighttime. It is important to note that the +standard being tested is never 1003.3; the standard being tested is some +other standard, for which the assertions were written. + +As there is no test suite to test @emph{testing frameworks} for +@sc{posix} 1003.3 conformance, verifying conformance to this standard is +done by repeatedly reading the standard and experimenting. One of the +main things 1003.3 does specify is the set of allowed output messages, +and their definitions. Four messages are supported for a required +feature of @sc{posix} conforming systems, and a fifth for a conditional +feature. DejaGnu supports the use of all five output messages; in this +sense a test suite that uses exactly these messages can be considered +@sc{posix} conforming. These definitions specify the output of a test +case: + +@ftable @code +@cindex success, POSIX definition +@item PASS +A test has succeeded. That is, it demonstrated that the assertion is true. + +@cindex XFAIL, avoiding for POSIX +@item XFAIL +@sc{posix} 1003.3 does not incorporate the notion of expected failures, +so @code{PASS}, instead of @code{XPASS}, must also be returned for test +cases which were expected to fail and did not. This means that +@code{PASS} is in some sense more ambiguous than if @code{XPASS} is also +used. For information on @code{XPASS} and @code{XFAIL}, see +@ref{Invoking runtest,,Using @code{runtest}}. + +@item FAIL +@cindex failure, POSIX definition +A test @emph{has} produced the bug it was intended to capture. That is, +it has demonstrated that the assertion is false. The @code{FAIL} +message is based on the test case only. Other messages are used to +indicate a failure of the framework. + +As with @code{PASS}, @sc{posix} tests must return @code{FAIL} rather +than @code{XFAIL} even if a failure was expected. + +@item UNRESOLVED +@cindex ambiguity, required for POSIX +A test produced indeterminate results. Usually, this means the test +executed in an unexpected fashion; this outcome requires that a human +being go over results, to determine if the test should have passed or +failed. This message is also used for any test that requires human +intervention because it is beyond the abilities of the testing +framework. Any unresolved test should resolved to @code{PASS} or +@code{FAIL} before a test run can be considered finished. + +Note that for @sc{posix}, each assertion must produce a test result +code. If the test isn't actually run, it must produce @code{UNRESOLVED} +rather than just leaving that test out of the output. This means that +you have to be careful when writing tests, to not carelessly use tcl +statements like @code{return}---if you alter the flow of control of the +tcl code you must insure that every test still produces some result code. + +Here are some of the ways a test may wind up @code{UNRESOLVED}: + +@itemize @bullet +@item +A test's execution is interrupted. + +@item +A test does not produce a clear result. This is usually because there +was an @code{ERROR} from DejaGnu while processing the test, or because there +were three or more @code{WARNING} messages. Any @code{WARNING} or +@code{ERROR} messages can invalidate the output of the test. This +usually requires a human being to examine the output to +determine what really happened---and to improve the test case. + +@item +A test depends on a previous test, which fails. + +@item +The test was set up incorrectly. +@end itemize + +@item UNTESTED +A test was not run. This is a placeholder, used when there is no +real test case yet. +@end ftable + +@noindent +The only remaining output message left is intended to test features that +are specified by the applicable @sc{posix} standard as conditional: + +@ftable @code +@item UNSUPPORTED +There is no support for the tested case. This may mean that a +conditional feature of an operating system, or of a compiler, is not +implemented. DejaGnu also uses this message when a testing environment +(often a ``bare board'' target) lacks basic support for compiling or +running the test case. For example, a test for the system subroutine +@code{gethostname} would never work on a target board running only a +boot monitor. +@end ftable + +DejaGnu uses the same output procedures to produce these messages for +all test suites, and these procedures are already known to conform to +@sc{posix} 1003.3. For a DejaGnu test suite to conform to @sc{posix} +1003.3, you must avoid the @code{setup_xfail} procedure as described in +the @code{PASS} section above, and you must be careful to return +@code{UNRESOLVED} where appropriate, as described in the +@code{UNRESOLVED} section above. + +@node Future Directions +@section Future directions +@cindex future directions + +In the near future, there are two parallel directions for DejaGnu +development. The first is to add support for more hosts and targets. + +The second would permit testing programs with a more complex interface, +whether text based or GUI based. Two components already exist: a Tcl +based X window toolkit, and a terminal package for @code{expect}. Both +of these could be merged into DejaGnu in a way that permits testing +programs that run in each environment. + +Meanwhile, we hope DejaGnu enables the creation of test suites for +conformance to @sc{ansi} C and C++, to @sc{posix}, and to other +standards. We encourage you to make any test suites you create freely +available, under the same terms as DejaGnu itself. + +@node Tcl and Expect +@section Tcl and Expect +@cindex tool command language +@cindex tcl +@cindex Ousterhout, John K. +Tcl was introduced in a paper by John K. Ousterhout at the 1990 Winter +Usenix conference, @cite{Tcl: An Embeddable Command Language}. That +paper is included in PostScript form in the @file{doc} subdirectory of +the Tcl distribution. The version of Tcl included in DejaGnu at this time is +Tcl 7.4p3. + +@cindex @code{expect} scripting language +@cindex Libes, Don +Don Libes introduced @code{expect} in his paper @cite{expect: Curing +Those Uncontrollable Fits of Interaction} at the 1990 Summer Usenix +conference. The paper is included in PostScript form in the +@code{expect} distribution (as are several other papers about +@code{expect}). The version of expect included in DejaGnu at this time +is expect 5.18.0. + +@node Invoking runtest +@chapter Using @code{runtest} +@cindex invoking +@cindex running +@cindex command line options +@cindex options + +@cindex @code{runtest} description +@cindex DejaGnu test driver +@code{runtest} is the executable test driver for DejaGnu. You can +specify two kinds of things on the @code{runtest} command line: command +line options, and Tcl variables for the test scripts. The options are +listed alphabetically below. + +@cindex exit code from @code{runtest} +@cindex @code{runtest} exit code +@code{runtest} returns an exit code of @code{1} if any test +has an unexpected result; otherwise (if all tests pass or fail as +expected) it returns @code{0} as the exit code. + +@code{runtest} flags the outcome of each test as one of these cases. +(@xref{Posix,,A POSIX conforming test framework}, for a discussion of +how @sc{posix} specifies the meanings of these cases.) + +@table @code +@item PASS +@kindex PASS +@cindex successful test +@cindex test, successful +The most desirable outcome: the test succeeded, and was expected to +succeed. + +@item XPASS +@kindex XPASS +@cindex successful test, unexpected +@cindex unexpected success +A pleasant kind of failure: a test was expected to fail, but succeeded. +This may indicate progress; inspect the test case to determine whether +you should amend it to stop expecting failure. + +@item FAIL +@kindex FAIL +@cindex failing test, unexpected +@cindex test, failing +A test failed, although it was expected to succeed. This may indicate +regress; inspect the test case and the failing software to locate the bug. + +@item XFAIL +@kindex XFAIL +@cindex expected failure +@cindex failing test, expected +A test failed, but it was expected to fail. This result indicates no +change in a known bug. If a test fails because the operating system +where the test runs lacks some facility required by the test, the +outcome is @code{UNSUPPORTED} instead. + +@item UNRESOLVED +@kindex UNRESOLVED +@cindex test, unresolved outcome +Output from a test requires manual inspection; the test suite could not +automatically determine the outcome. For example, your tests can report +this outcome is when a test does not complete as expected. + +@item UNTESTED +@kindex UNTESTED +@cindex untested properties +A test case is not yet complete, and in particular cannot yet produce a +@code{PASS} or @code{FAIL}. You can also use this outcome in dummy +``tests'' that note explicitly the absence of a real test case +for a particular property. + +@item UNSUPPORTED +@kindex UNSUPPORTED +@cindex unsupported test +@cindex test, unsupported +A test depends on a conditionally available feature that does not exist +(in the configured testing environment). For example, you can use this +outcome to report on a test case that does not work on a particular +target because its operating system support does not include a required +subroutine. +@end table + +@code{runtest} may also display the following messages: + +@table @code +@item ERROR +@kindex ERROR +@cindex problem, detected by test case +@cindex test case cannot run +Indicates a major problem (detected by the test case itself) in running +the test. This is usually an unrecoverable error, such as a missing file +or loss of communication to the target. (@sc{posix} test suites should +not emit this message; use @code{UNSUPPORTED}, @code{UNTESTED}, or +@code{UNRESOLVED} instead, as appropriate.) + +@item WARNING +@kindex WARNING +@cindex test case warnings +Indicates a possible problem in running the test. Usually warnings +correspond to recoverable errors, or display an important message about +the following tests. + +@item NOTE +@kindex NOTE +@cindex test case messages +An informational message about the test case. +@end table + +This is the full set of command line options that @code{runtest} +recognizes. Arguments may be abbreviated to the shortest unique string. + +@cindex @code{runtest} option list +@cindex option list, @code{runtest} +@smallexample +runtest --tool @var{tool} [ @var{testsuite}.exp @dots{} ] +[ @var{testsuite}.exp="testfile1 @dots{}" ] +[ @var{tclvar}=@var{value}@dots{} ] +[ --all ] [ --baud @var{baud-rate} ] [ --connect @var{type} ] +[ --debug ] [ --help ] [ --host @var{string} ] +[ --mail "@var{name} @dots{}" ] [ --name @var{string} ] +[ --name @var{name} ] [ --outdir @var{path} ] +[ --objdir @var{path} ] [ --reboot ] +[ --srcdir @var{path} ] [ --strace @var{n} ] +[ --target @var{string} --build @var{string} ] +[ -v | --verbose ] [ -V | --version ] [ --D@var{n} ] +@end smallexample + +@table @code +@item --tool @var{tool} +@cindex selecting tests for a tool +@cindex @code{--tool} (@code{runtest} option) +@var{tool} specifies what set of tests to run, and what initialization +module to use. @var{tool} is used @emph{only} for these two purposes: +it is @emph{not} used to name the executable program to test. +Executable tool names (and paths) are recorded in @file{site.exp} +(@pxref{Config Values,,Configuration dependent values}), and you can +override them by specifying Tcl variables on the command line. + +For example, including @samp{--tool gcc} on the @code{runtest} command +line runs tests from all test subdirectories whose names match +@file{gcc.*}, and uses one of the initialization modules named +@file{config/*-gcc.exp}. To specify the name of the compiler (perhaps +as an alternative path to what @code{runtest} would use by default), use +@samp{GCC=@var{binname}} on the @code{runtest} command line. + +@item @var{testsuite}.exp @dots{} +@cindex selecting a range of tests +@cindex tests, running specifically +@cindex naming tests to run +Specify the names of testsuites to run. +By default, @code{runtest} runs all tests for the tool, but you can +restrict it to particular testsuites by giving the names of the @samp{.exp} +@code{expect} scripts that control them. + +@var{testsuite}.exp may not include path information; use plain filenames. + +@item @var{testfile}.exp="testfile1 @dots{}" +@cindex selecting a range of tests +@cindex tests, running specifically +@cindex naming tests to run +Specify a subset of tests in a suite to run. +For compiler or assembler tests, which often use a single @samp{.exp} +script covering many different source files, this option allows you to +further restrict the tests by listing particular source files to compile. +Some tools even support wildcards here. The wildcards supported depend +upon the tool, but typically they are @code{?}, @code{*}, and @code{[chars]}. + +@item @var{tclvar}=@var{value} +@kindex @var{tclvar}=@var{value} +@cindex Tcl variables, defining for @code{runtest} +@cindex command line Tcl variable definition +@cindex @code{runtest}, variable defns on cmdline +You can define Tcl variables for use by your test scripts in the same +style used with @code{make} for environment variables. For example, +@samp{runtest GDB=gdb.old} defines a variable called @samp{GDB}; when +your scripts refer to @samp{$GDB} in this run, they use the value +@samp{gdb.old}. + +The default Tcl variables used for most tools are defined in the main +DejaGnu @code{Makefile}; their values are captured in the +@file{site.exp} file. @xref{Config Values,,Configuration dependent +values}. + +@item --all +@cindex @code{--all} (@code{runtest} option) +@cindex test output, displaying all +Display all test output. By default, @code{runtest} shows only the +output of tests that produce unexpected results; that is, tests with +status @samp{FAIL} (unexpected failure), @samp{XPASS} (unexpected +success), or @samp{ERROR} (a severe error in the test case itself). +Specify @samp{--all} to see output for tests with status @samp{PASS} +(success, as expected) @samp{XFAIL} (failure, as expected), or +@samp{WARNING} (minor error in the test case itself). + +@item --baud @var{baud-rate} +@itemx -b @var{baud-rate} +@cindex baud rate, specifying +@cindex bps, specifying +@cindex @code{--baud} (@code{runtest} option) +@cindex @code{-b} (@code{runtest} option) +Set the default baud rate to something other than 9600. (Some serial +interface programs, like @code{tip}, use a separate initialization file +instead of this value.) + +@item --connect @var{type} +@cindex connecting to target +@cindex @code{--connect} (@code{runtest} option) +@cindex remote testbed, connecting to +@cindex @code{rlogin}, remote testing via +@cindex @code{telnet}, remote testing via +@cindex @code{rsh}, remote testing via +@cindex @code{tip}, remote testing via +@cindex @code{kermit}, remote testing via +@cindex @code{mondfe}, remote testing via +@cindex remote testing via @code{rlogin} +@cindex remote testing via @code{telnet} +@cindex remote testing via @code{rsh} +@cindex remote testing via @code{tip} +@cindex remote testing via @code{kermit} +@cindex remote testing via @code{mondfe} +Connect to a target testing environment as specified by @var{type}, if +the target is not the computer running @code{runtest}. For example, use +@samp{--connect} to change the program used to connect to a ``bare +board'' boot monitor. The choices for @var{type} in the DejaGnu 1.0 +distribution are @samp{rlogin}, @samp{telnet}, @samp{rsh}, @samp{tip}, +@samp{kermit}, and @samp{mondfe}. + +@noindent +The default for this option depends on the configuration (@pxref{Cross +Targets,,Remote targets supported}). The default is chosen to be the +most convenient communication method available, but often other +alternatives work as well; you may find it useful to try alternative +connect methods if you suspect a communication problem with your testing +target. + +@item --debug +@cindex @code{--debug} (@code{runtest} option) +@cindex debug log for test cases +@cindex test cases, debug log +@cindex @code{dbg.log} file +Turns on the @code{expect} internal debugging output. Debugging output +is displayed as part of the @code{runtest} output, and logged to a file +called @file{dbg.log}. The extra debugging output does @emph{not} +appear on standard output, unless the verbose level is greater than 2 +(for instance, to see debug output immediately, specify @samp{--debug -v +-v}). The debugging output shows all attempts at matching the test +output of the tool with the scripted patterns describing expected +output. The output generated with @samp{--strace} also goes into +@file{dbg.log}. + +@item --help +@itemx -he +@cindex @code{--help} (@code{runtest} option) +@cindex help with @code{runtest} +@cindex @code{runtest}, listing options +Prints out a short summary of the @code{runtest} options, then exits +(even if you also specify other options). + +@item --host @var{string} +@cindex @code{--host} (@code{runtest} option) +@cindex specifying the host config name +@cindex host config name, changing +@var{string} is a full configuration ``triple'' name as used by +@code{configure}. Use this option to override the default string +recorded by your configuration's choice of host. This choice does not +change how anything is actually configured unless --build is also +specified; it affects @emph{only} DejaGnu procedures that compare the +host string with particular values. The procedures @code{ishost}, +@code{istarget}, @code{isnative}, and @code{setup_xfail} are affected by +@samp{--host}. In this usage, @code{host} refers to the machine that the +tests are to be run on, which may not be the same as the @code{build} +machine. If @code{--build} is also specified, then @code{--host} refers +to the machine that the tests wil, be run on, not the machine DejaGnu is +run on. + +@item --build @var{string} +@cindex @code{--build} (@code{runtest} option) +@cindex specifying the build config name +@cindex build config name, changing +@var{string} is a full configuration ``triple'' name as used by +@code{configure}. This is the type of machine DejaGnu and the tools to +be tested are built on. For a normal cross this is the same as the host, +but for a canadian cross, they are seperate. + +@item --name @var{name} +@cindex specifying target name +@cindex target machine name +@cindex @code{--name} (@code{runtest} option) +@var{name} is a name for the particular testing target machine (for +cross testing). If the testing target has IP network support (for +example, @code{RPC} or @code{NFS}), this is the network name for the +target itself. (@var{name} is @emph{not the configuration string} you +specify as a target with @code{configure}; the @samp{--name} option +names a particular target, rather than describing a class of targets.) +For targets that connect in other ways, the meaning of the @var{name} +string depends on the connection method. @xref{Cross Targets,,Remote +targets supported}. + +@item --name @var{string} +@cindex remote test machine name +@cindex name for remote test machine +Specify a network name of testing target or its host. The particular +names that are meaningful with @samp{--name} will depend on your site +configuration, and on the connection protocol: for example, @code{tip} +connections require names from a serial line configuration file (usually +called @file{/etc/remote}), while @code{telnet} connections use IP +hostnames. + +@item --objdir @var{path} +@cindex @code{--objdir} (@code{runtest} option) +@cindex object directory +@cindex test programs, auxiliary +@cindex auxiliary test programs +Use @var{path} as the top directory containing any auxiliary compiled +test code. This defaults to @file{.}. Use this option to locate +pre-compiled test code. You can normally prepare any auxiliary files +needed with @code{make}. + +@item --outdir @var{path} +@cindex output directory +@cindex @code{--outdir} (@code{runtest} option) +@cindex log files, where to write +Write output logs in directory @var{path}. The default is @samp{.}, the +directory where you start @code{runtest}. This option affects only the +summary and the detailed log files @file{@var{tool}.sum} and +@file{@var{tool}.log}. The DejaGnu debug log @file{dbg.log} always +appears (when requested) in the local directory. + +@item --reboot +@cindex rebooting remote targets +@cindex @code{--reboot} (@code{runtest} option) +Reboot the target board when @code{runtest} initializes. +Usually, when running tests on a separate target board, it is safer to +reboot the target to be certain of its state. However, when developing +test scripts, rebooting takes a lot of time. + +@item --srcdir @var{path} +@cindex source directory +@cindex @code{--srcdir} (@code{runtest} option) +Use @var{path} as the top directory for test scripts to run. +@code{runtest} looks in this directory for any subdirectory whose name +begins with the toolname (specified with @samp{--tool}). For instance, +with @samp{--tool gdb}, @code{runtest} uses tests in subdirectories +@file{gdb.*} (with the usual shell-like filename expansion). If you do +not use @samp{--srcdir}, @code{runtest} looks for test directories under +the current working directory. + +@item --strace @var{n} +@cindex @code{--strace} (@code{runtest} option) +@cindex tracing Tcl commands +@cindex @code{expect} internal tracing +Turn on internal tracing for @code{expect}, to @var{n} levels deep. By +adjusting the level, you can control the extent to which your output +expands multi-level Tcl statements. This allows you to ignore some +levels of @code{case} or @code{if} statements. Each procedure call or +control structure counts as one ``level''. + +The output is recorded in the same file, @file{dbg.log}, used for output +from @samp{--debug}. + +@item --target @var{string} +@cindex @code{--target} (@code{runtest} option) +@cindex specifying the target configuration +@cindex target configuration, specifying +Use this option to override the default setting (running native tests). +@var{string} is a full configuration ``triple'' +name@footnote{Configuration triples have the form +@samp{@var{cpu}-@var{vendor}-@var{os}}.} as used by @code{configure}. +This option changes the configuration @code{runtest} uses for the +default tool names, and other setup information. @xref{Using +configure,,Using @code{configure}, configure.info, Cygnus configure}, +for details about @code{configure} names. + +@item --verbose +@itemx -v +@cindex @code{--verbose} (@code{runtest} option) +@cindex @code{-v} (@code{runtest} option) +@cindex turning on output +@cindex output, additional +Turns on more output. Repeating this option increases the amount of +output displayed. Level one (@samp{-v}) is simply test output. Level +two (@samp{-v -v}) shows messages on options, configuration, and process +control. Verbose messages appear in the detailed (@file{*.log}) log +file, but not in the summary (@file{*.sum}) log file. + +@item --version +@itemx -V +@cindex @code{-V} (@code{runtest} option) +@cindex @code{--version} (@code{runtest} option) +@cindex version numbers +Prints out the version numbers of DejaGnu, @code{expect} and Tcl, and +exits without running any tests. + +@item -D0 +@itemx -D1 +@cindex starting the tcl debugger +@cindex tcl debugger +@c FIXME!!! we should say a *lot* more about this debugger +Start the internal Tcl debugger. The Tcl debugger supports breakpoints, +single stepping, and other common debugging activities. (See @cite{A +Debugger for Tcl Applications} by Don Libes. @footnote{Distributed in +PostScript form with @code{expect} as the file@* +@file{expect/tcl-debug.ps}.}) + +If you specify @samp{-D1}, the @code{expect} shell stops at a breakpoint +as soon as DejaGnu invokes it. + +If you specify @samp{-D0}, DejaGnu starts as usual, but you can enter +the debugger by sending an interrupt (e.g. by typing @key{C-c}). +@end table + +@node Customizing +@chapter Setting @code{runtest} defaults + +@kindex site.exp +@cindex variables of DejaGnu, defaults +The site configuration file, @file{site.exp}, captures +configuration-dependent values and propagates them to the DejaGnu test +environment using Tcl variables. This ties the DejaGnu test scripts +into the @code{configure} and @code{make} programs. + +@cindex @file{site.exp}, multiple +@cindex overriding @file{site.exp} +DejaGnu supports more than one @file{site.exp} file. The multiple +instances of @file{site.exp} are loaded in a fixed order built into +DejaGnu (the more local last). The first file loaded is the optional +@code{~/.dejagnurc}, then the local files, and finally the global file. + +@enumerate +@item +There is am optional ``master'' @file{site.exp}, capturing configuration values +that apply to DejaGnu across the board, in each configuration-specific +subdirectory of the DejaGnu library directory. @code{runtest} loads +these values first. @xref{Installation,,Configuring and Installing +DejaGnu}. The master @file{site.exp} contains the default values for +all targets and hosts supported by DejaGnu. This master file is +identified by setting the environment variable @code{DEJAGNU} to the +name of the file. This is also refered to as the ``global'' config file. + +@item +Any directory containing a configured test suite also has a +@file{site.exp}, capturing configuration values specific to the tool +under test. Since @code{runtest} loads these values last, the +individual test configuration can either rely on and use, or override, +any of the global values from the ``master'' @file{site.exp}. + +You can usually generate or update the testsuite @file{site.exp} by +typing @samp{make site.exp} in the test suite directory, after the test +suite is configured. + +@item +You can also have a file in your home directory called +@code{.dejagnurc}. This gets loaded first before the other config +files. Usually this is used for personal stuff, like setting +@code{all_flag} so all the output gets printed, or verbosity levels. +@end enumerate + +You can further override the default values in a user-editable section +of any @file{site.exp}, or by setting variables on the @code{runtest} +command line. + +@menu +* Config Values:: Variables used in the configuration file. +* Master Config File:: The master configuration file. +* Local Config File:: The local configuration file. +* Personal Config File:: The personal configuration file. +@end menu + +@node Config Values, Master Config File, , Customizing +@subsection Config Variables +@cindex configuration dependent defaults +@cindex setting defaults for DejaGnu variables + +@c NOTE: default values are given via @code{"fubar"} rather than the +@c more conventional @samp{fubar} to permit a consistent and clear +@c notation for the empty string (@code{""}), which will work exactly as +@c typed. + +DejaGnu uses a named array in Tcl to hold all the info for each +machine. In the case of a canadian cross, this means host information as +well as target information. The named array is called +@code{target_info}, and it has two indices. The following fields are +part of the array. + +@table @code +@item name +The name of the target. (mostly for error messages) This +should also be the string used for this target's array. +It should also be the same as the linker script so we +can find them dynamically. This should be the same as the argument used +for @code{push_target@{@}}. + +@item ldflags +This is the linker flags required to produce a fully linked +executable. For @code{libgloss} supported targets this is usually just +the name of the linker script. + +@item config +The target canonical for this target. This is used by some init files to +make sure the target is supported. + +@item cflags +The flags required to produce an object file from a source file. + +@item connect +This is the connectmode for this target. This is for both IP and +serial connections. Typically this is either @code{telnet}, +@code{rlogin}, or @code{rsh}. + +@item target +This is the hostname of the target. This is for TCP/IP based connections, +and is also used for version of tip that use /etc/remote. + +@item serial +This is the serial port. This is typically /dev/tty? or com?:. + +@item netport +This is the IP port. This is commonly used for telneting to target +boards that are connected to a terminal server. In that case the IP port +specifies the which serial port to use. + +@item baud +This is the baud rate for a serial port connection. + +@item x10 +This is the parameters for an x10 controller. These are simple devices +that let us power cycle or reset a target board remotely. + +@item fileid +This is the fileid or spawn id of of the connection. + +@item prompt +a glob style pattern to recognize the prompt. + +@item abbrev +abbreviation for tool init files. + +@item ioport +This is the port for I/O on dual port systems. In this configuration, +the main serial port @code{0} is usually used for stdin and stdout, +which the second serial port can be used for debugging. +@end table + +The first index into the array is the same value as used in the +@code{name} field. This is usually a short version of the name of the +target board. For an example, here's the settings I use for my +@code{Motorola's} @code{IDP} board and my @code{Motorola} 6U VME +@code{MVME135-1} board. (both m68k targets) + +@cartouche +@smallexample +# IDP board +set target_info(idp,name) "idp" +set target_info(idp,ldflags) "-Tidp.ld" +set target_info(idp,config) m68k-unknown-aout +set target_info(idp,cflags) "" +set target_info(idp,connect) telnet +set target_info(idp,target) "s7" +set target_info(idp,serial) "tstty7" +set target_info(idp,netport) "wharfrat:1007" +set target_info(idp,baud) "9600" +# MVME 135 board +set target_info(idp,name) "mvme" +set target_info(idp,ldflags) "-Tmvme.ld" +set target_info(idp,config) m68k-unknown-aout +set target_info(idp,cflags) "" +set target_info(idp,connect) telnet +set target_info(idp,target) "s8" +set target_info(idp,serial) "tstty8" +set target_info(idp,netport) "wharfrat:1008" +set target_info(idp,baud) "9600" +@end smallexample +@end cartouche + +DejaGnu can use this information to switch between multiple targets in +one test run. This is done through the use of the @code{push_target} +procedure, which is discussed elsewhere. +@c FIXME: write that section and put an xref here + +This array can also hold information for a remote host, which is used +when testing a candain cross. In this case, the only thing different is +the index is just @code{host}. Here's the settings I use to run tests +on my NT machine while running DejaGnu on a Unix machine. (in this case +a Linux box) + +@cartouche +@smallexample +set target_info(host,name) "nt-host" +set target_info(host,config) "386-unknown-winnt" +set target_info(host,connect) "telnet" +set target_info(host,target) "ripple" +@end smallexample +@end cartouche + +There is more info on how to use these variables in the sections on the +config files. @xref{Master Config File,,Configuration Files}. + +@cindex option defaults +@cindex @code{runtest} option defaults +@cindex variables for option defaults +@cindex defaults, option +In the user editable second section of @file{site.exp}, you can not only +override the configuration variables captured in the first section, but +also specify default values for all the @code{runtest} command line +options. Save for @samp{--debug}, @samp{--help}, and @samp{--version}, +each command line option has an associated Tcl variable. Use the Tcl +@code{set} command to specify a new default value (as for the +configuration variables). The following table describes the +correspondence between command line options and variables you can set in +@file{site.exp}. @xref{Invoking runtest,,Running the Tests}, for +explanations of the command-line options. + +@kindex all_flag +@kindex baud +@kindex reboot +@kindex outdir +@kindex objdir +@kindex runtests +@kindex ignoretests +@kindex srcdir +@kindex tracelevel +@kindex targetname +@kindex connectmode +@kindex tool +@kindex target_triplet +@kindex host_triplet +@kindex build_triplet +@kindex verbose + +@cindex command line option variables +@cindex Tcl variables for option defaults +@cindex default options, controlling +@cindex options, Tcl variables for defaults + +@ifinfo +@display +runtest Tcl +option variable description +__________ ________ ___________________________________________ + +--all all_flag display all test results if set + +--baud baud set the default baud rate to something other + than 9600. +--connect connectmode @samp{rlogin}, @samp{telnet}, @samp{rsh}, + @samp{kermit}, @samp{tip}, or @samp{mondfe} + +--outdir outdir directory for @file{@var{tool}.sum} and @file{@var{tool}.log} + +--objdir objdir directory for pre-compiled binaries + +--reboot reboot reboot the target if set to @code{"1"}; + do not reboot if set to @code{"0"} (the default) + +--srcdir srcdir directory of test subdirectories + +--strace tracelevel a number: Tcl trace depth + +--tool tool name of tool to test; identifies init, test subdir + +--verbose verbose verbosity level. As option, use multiple times; + as variable, set a number, 0 or greater +--target target_triplet The canonical configuration string for the target. +--host host_triplet The canonical configuration string for the host. +--build build_triplet The canonical configuration string for the + build host. + +@end display +@end ifinfo + +@tex +\vbox{\halign{\hfil \tt #\quad &\quad\tt #\hfil &\hbox{\vtop{{\raggedright\parindent=0pt\parskip=5pt\hsize=2.75in\rm#\strut\par}}}\hfill\cr +\cr +{\it runtest}&{\it Tcl}\cr +{\it option}&{\it variable}&{\it description}\cr +\noalign{\hrule width\hsize}\cr +--all &all\_flag &display all test results if set\cr +--baud &baud &set the default baud rate to something other + than 9600.\cr +--connect &connectmode &@samp{rlogin}, @samp{telnet}, @samp{rsh}, + @samp{kermit}, @samp{tip}, or @samp{mondfe}\cr +--mail &mailing\_list&address list for mailing test output\cr +--name &targetname &network name of testing target or its host\cr +--outdir &outdir &directory for @file{@var{tool}.sum} and @file{@var{tool}.log}\cr +--objdir &objdir &directory for compiled binaries\cr +--reboot &reboot &reboot the target if set to @code{"1"}; +do not reboot if set to @code{"0"} (the default)\cr +--srcdir &srcdir &directory of test subdirectories\cr +--strace &tracelevel &a number: Tcl trace depth\cr +--tool &tool &name of tool to test; identifies init, test subdir\cr +--verbose &verbose &verbosity level. As option, use multiple times; + as variable, set a number, 0 or greater\cr +--target &target\_triplet + &The canonical configuration string for the target.\cr +--host &host\_triplet &The canonical configuration string for the host.\cr +--build &build\_triplet &The canonical configuration string for the + build host.\cr +}} +@end tex + +@node Master Config File, Local Config File, Config Values, Customizing +@subsection Master Config File +@cindex master @file{site.exp} +@cindex @file{site.exp} for all of DejaGnu +The master config file is where all the target specific config variables +get set for a whole site get set. The idea is that for a centralized +testing lab where people have to share a target between multiple +developers. There are settings for both remote targets and remote hosts. +Here's an example of a Master Config File (also called the Global config +file) for a @emph{canadian cross}. A canadian cross is when you build +and test a cross compiler on a machine other than the one it's to be +hosted on. + +Here we have the config settings for our California office. Note that +all config values are site dependant. Here we have two sets of values +that we use for testing m68k-aout cross compilers. As both of these +target boards has a different debugging protocol, we test on both of +them in sequence. + +@cartouche +@smallexample +global CFLAGS +global CXXFLAGS + +case "$target_triplet" in @{ + @{ "native" @} @{ + set target_abbrev unix + @} + @{ "m68*-unknown-aout" @} @{ + set target_abbrev "rom68k" + # IDP target # IDP board with rom68k monitor + set target_info(idp,name) "idp" + set target_info(idp,ldflags) "-Tidp.ld" + set target_info(idp,config) m68k-unknown-aout + set target_info(idp,cflags) "" + set target_info(idp,connect) telnet + set target_info(idp,target) "s7" + set target_info(idp,serial) "tstty12" + set target_info(idp,netport) "truckin:1007" + set target_info(idp,baud) "9600" + # MVME target # Motorola MVME 135 with BUG monitor + set target_info(mvme,name) "mvme" + set target_info(mvme,ldflags) "-Tmvme.ld" + set target_info(mvme,config) m68k-unknown-aout + set target_info(mvme,cflags) "" + set target_info(mvme,connect) telnet + set target_info(mvme,target) "s4" + set target_info(mvme,serial) "tstty8" + set target_info(mvme,netport) "truckin:1004" + set target_info(mvme,baud) "9600" + @} +@} +@end smallexample +@end cartouche + + In this case, we have support for several remote hosts for +our m68k-aout cross compiler. Typically the remote Unix hosts run +DejaGnu locally, but we also use them for debugging the testsuites when +we find problems in running on remote hosts. Expect won't run on NT, so +DejaGnu is run on the local build machine, and it'll connect to the NT +host and run all the tests for this cross compiler on that host. + +@smallexample +@cartouche +case "$host_triplet" in @{ + "native" @{ + @} + "i?86-*-linux*" @{ # Linux host + set target_info(host,name) "linux-host" + set target_info(host,config) $host_triplet + set target_info(host,connect) rlogin + set target_info(host,target) chinadoll + @} + "i?86-*-winnt # NT host + set target_info(host,name) "nt-host" + set target_info(host,config) i386-unknown-winnt + set target_info(host,connect) telnet + set target_info(host,target) ripple + @} + "hppa*-hp-hpux*" @{ # HP-UX host + set target_info(host,name) "hpux-host" + set target_info(host,config) $host_triplet + set target_info(host,connect) rlogin + set target_info(host,target) slipknot + @} + "sparc-sun-sunos*" @{ # SunOS (sun4) + set target_info(host,name) "sunos-host" + set target_info(host,config) $host_triplet + set target_info(host,connect) rlogin + set target_info(host,target) darkstar + @} +@} +@end cartouche +@end smallexample + +@node Local Config File, Personal Config File, Master Config File, Customizing +@subsection Local Config File +@cindex local @file{site.exp} +@cindex @file{site.exp} for each tool +It is usually more convenient to keep these ``manual overrides'' in the +@file{site.exp} local to each test directory, rather than in the +``master'' @file{site.exp} in the DejaGnu library. + +All local @file{site.exp} usually files have two sections, separated by +comment text. The first section is the part that is generated by +@code{make}. It is essentially a collection of Tcl variable definitions +based on @file{Makefile} environment variables. Since they are generated +by @code{make}, they contain the values as specified by +@code{configure}. (You can also customize these values by using the +@samp{--site} option to @code{configure}.) In particular, this section +contains the @file{Makefile} variables for host and target configuration +data. Do not edit this first section; if you do, your changes are replaced +next time you run @code{make}. + +The first section starts with: + +@cartouche +@smallexample +## these variables are automatically generated by make ## +# Do not edit here. If you wish to override these values +# add them to the last section +@end smallexample +@end cartouche + +In the second section, you can override any default values (locally to +DejaGnu) for all the variables. The +second section can also contain your preferred defaults for all the +command line options to @code{runtest}. This allows you to easily +customize @code{runtest} for your preferences in each configured +test-suite tree, so that you need not type options repeatedly on the +command line. (The second section may also be empty, if you do not wish +to override any defaults.) + +The first section ends with this line: + +@cartouche +@smallexample +## All variables above are generated by configure. Do Not Edit ## +@end smallexample +@end cartouche + +You can make any changes under this line. If you wish to redefine a +variable in the top section, then just put a duplicate value in this +second section. Usually the values defined in this config file are +related to the configuration of the test run. This is the ideal place to +set the variables @code{host_triplet}, @code{build_triplet}, +@code{target_triplet}. All other variables are tool dependant. ie for +testing a compiler, the value for @var{CC} might be set to a freshly +built binary, as opposed to one in the user's path. + +@node Personal Config File, , Local Config File, Customizing +@subsection Personal Config File +@cindex personal config @file{site.exp} +@cindex @file{site.exp} for each person +The personal config file is used to customize @code{runtest's} behaviour +for each person. It's typically used to set the user prefered setting +for verbosity, and any experimental Tcl procedures. My personal +@file{~/.dejagnurc} file looks like: + +@cartouche +@smallexample +set all_flag 1 +set RLOGIN /usr/ucb/rlogin +set RSH /usr/ucb/rsh +@end smallexample +@end cartouche + +Here I set @code{all_flag} so I see all the test cases that PASS along +with the ones that FAIL. I also set @var{RLOGIN} and @code{RSH} to the +BSD version. I have @code{kerberos} installed, and when I rlogin to a +target board, it usually isn't supported. So I use the non secure +versions of these programs rather than the default that's in my path. + +@node Internals +@chapter The DejaGnu Implementation +@cindex operating principles +@cindex internal details + +DejaGnu is entirely written in @code{expect}, which uses Tcl as a +command language. @code{expect} serves as a very programmable shell; +you can run any program, as with the usual Unix command shells---but +once the program is started, your @code{expect} script has fully +programmable control of its input and output. This does not just apply +to the programs under test; @code{expect} can also run any auxiliary +program, such as @code{diff} or @code{sh}, with full control over its +input and output. + +DejaGnu itself is merely a framework for the set of test suites +distributed separately for each @sc{gnu} tool. Future releases of +@sc{gnu} tools will include even more tests, developed throughout the +free software community. + +@kindex runtest.exp +@code{runtest} is the glue to tie together and manage the test scripts. +The @code{runtest} program is actually a simple Bourne shell script that +locates a copy of the @code{expect} shell and then starts the main Tcl +code, @code{runtest.exp}. @code{runtest.exp} itself has these essential +functions: + +@enumerate +@item +Parse the command line options, load the library files, and load the +default configuration files. + +@item +Locating the individual test scripts. @code{runtest.exp} locates the tests +by exploiting a straightforward naming convention based on the string +you specify with the @samp{--tool} option. + +@item +Providing an extended test environment, by defining additional Tcl +procedures beyond those already in @code{expect}. + +@item +Locating target-dependent functions, to standardize the test environment +across a wide variety of test platforms. +@end enumerate + +@menu +* Names:: Conventions for using tool names +* Init Module:: Initialization module +* DejaGnu Builtins:: DejaGnu provides these Tcl procedures +* Target Dependent:: Procedures supplied by the init module +* Cross Targets:: Remote targets supported +* Input Files:: The files DejaGnu depends on +* Output Files:: The files DejaGnu produces +@end menu + +@node Names +@section Conventions for using tool names + +@cindex @code{--tool} and naming conventions +@cindex tool names and naming conventions +@cindex naming conventions +DejaGnu uses @samp{$tool}, the name of the tool under test, to tie +together the testing configuration in a straightforward but flexible +way. If there is only one testsuite for a particular application, then +@samp{$tool} is optional. + +@samp{$tool} is @emph{not} used to invoke the tool, since sites that run +multiple configurations of a particular tool often call each +configuration by a different name. @code{runtest} uses the +configuration-dependent variables captured in @file{site.exp} to +determine how to call each tool. + +@cindex directory names and @code{--tool} +@cindex test directories, naming +@code{runtest} uses tool names to find directories containing tests. +@code{runtest} scans the source directory (specified with +@code{--srcdir}) for all directories whose names start with the tool +name. It is a common practice to put a period after the tool part of the +name. For instance, directories that start with +@samp{g++.} contain @sc{g++} tests. To add a new test, just put it in +any directory (create an entirely new directory, if you wish) whose name +follows this convention. + +@cindex @code{exp} filename suffix +@cindex test filename +@cindex filename for test files +A test is any file in an appropriately named subdirectory whose name +ends in @samp{.exp} (the conventional way of naming @code{expect} +scripts). These simple naming conventions make it as simple as possible +to install new tests: all you must do is put the test in the right +directory. + +@cindex order of tests +@cindex tests, running order +@code{runtest} sorts the tests in each subdirectory by name (using the +Tcl @code{lsort} command) and runs them in the resulting order. + +@node Init Module +@section Initialization module +@cindex tool initialization +@cindex setting up targets + +@c FIXME! should this node be merged with "Target dependent"? + +@cindex init file, purpose +@cindex starting interactive tools +@cindex initialization +The initialization module (or ``init file'') has two purposes: to +provide tool and target dependent procedures, and to start up an +interactive tool to the point where it is ready to operate. The latter +includes establishing communications with the target. All the tests for +interactive programs assume that the tool is already running and +communicating. Initialization modules for non-interactive programs may +only need to supply the support functions. + +@cindex init file name +@cindex name, initialization module +Each test suite directory must contain (in its @file{config} +subdirectory) a separate initialization module for each target. The +appropriate init file is can be named several ways. The prefered name is +the @emph{os} part of the canonical configuration name with @code{.exp} +as the suffix. An example would be that for an @code{m68k-coff} system, +the @code{target_os} part would be @code{coff}. The next way is for +system where there are short filenames, or a shortcut is desired to +refer to the OS name for that target. This is uses the value of +@code{$target_abbrev} rather than the @code{target_os}. + +The final file looked for is simply @file{default.exp}. If there is only +one operating system to support, then this file can be used. It's main +purpose is to offer some support for new operating systems, or for +unsupported cross targets. The last file looked for is +@file{unknown.exp}. This is usually limited to error handling for +unsupported targets. It's whole contents is typically. + +@cartouche +@smallexample +perror "Sorry, there is no support for this target" +exit 1 +@end smallexample +@end cartouche + +At the beginning of the init file, you must first determine the proper +executable name of the tool to execute, since the actual name of the +tool to be tested my vary from system to system. Here's an example +for the @sc{GNU} C compiler. + +@cartouche +@smallexample +global AR +# look for the archiver ar +if ![info exists AR] @{ + set AR [findfile $base_dir/../../binutils/ar $base_dir/../../binutils/ar [tr +ansform ar]] + verbose "AR defaulting to $AR" 2 +@} +@} + +global CFLAGS +if ![info exists CFLAGS] then @{ + set CFLAGS "" +@} +@end smallexample +@end cartouche + +It is always a good idea to first check the variable, and only set it if +it has not yet been defined. Often the proper value of @code{AR} is set +on the command line that invokes @file{runtest}. + +@kindex findfile +The @code{findfile} procedure takes as it's first argument a file name +to look for. The second argument is returned if the file is found, and +the third argument is returned if the file is not found. @code{base_dir} +is set internally by DejaGnu to the top level directory of the object +tree. + +@kindex transform +The @code{transform} procedure takes as its argument the native name of +a tool (such as @samp{gcc} for the compiler), and returns the name as +configured for that tool in the current installation. (For example, a +cross-compiling version of @sc{gnu} CC that generates MIPS code may be +installed with a name like @code{mips-idt-ecoff-gcc}.) + +In a test running native, writing the Tcl code for initialization is +usually quite simple. For cross configurations, however, more elaborate +instructions are usually needed to describe how to talk to a remote +target. + +Each initialization module defines up to four procedures with standard +names and purposes. The names of these procedures begin with +@samp{$tool}, the string that identifies tests for a particular tool: +@code{$tool_start}, @code{$tool_load}, @code{$tool_exit}, and +@code{$tool_version}. For example, the start procedure for @sc{gdb} is +called @code{gdb_start}. (Since start procedures are used differently +for batch and interactive tools, however, @code{runtest} itself never +calls the start procedure. Init files for interactive tools are +expected to end by running the start procedure.) + +@cindex utilities, loading from init file +@cindex defaults, setting in init file +The initialization module is also a good place to call @code{load_lib} +to get any collections of utility procedures meant for a family of test +cases, and to set up default values for any additional Tcl variables +needed for a specific set of tests. + +@xref{Target Dependent,,Target dependent procedures}, for full +descriptions of these procedures. + +@node DejaGnu Builtins +@section DejaGnu procedures +@cindex built in procedures, DejaGnu + +DejaGnu provides these Tcl procedures for use in test scripts. +You can also use any standard @code{expect} or Tcl function. These +procedures are stored in libraries, which DejaGnu loads at +runtime. Here's explanation of the library procedures that get loaded at +runtime. All other librarys are optional, and need to be loaded by the +testsuite. + +@menu +* framework.exp:: Core Internal Procedures. +* remote.exp:: Procedures for remote communication. +* utils.exp:: Utility procedures. +* target.exp:: Cross target procedures. +* debugger.exp:: Procedures for debugging your Tcl code. +@end menu + +@node framework.exp, remote.exp, ,DejaGnu Builtins +@subsection Core Internal Procedures +@cindex Core Internal Procedures + +@xref{Posix,,A POSIX conforming test framework}, for more detailed +explanations of the test outcomes (@samp{FAIL}, @samp{PASS}, +@samp{UNTESTED}, @samp{UNRESOLVED}, @samp{UNSUPPORTED}). + +@ftable @code +@item perror "@var{string} @var{number}" +@cindex test case, ERROR in +@kindex ERROR +Declares a severe error in the testing framework itself. +@code{perror} writes in the log files a message beginning with +@samp{ERROR}, appending the argument @var{string}. If the optional +@var{number} is supplied, then this is used to set the internal count of +errors to that value. + +As a side effect, @code{perror} also changes the effect of the next +@code{pass} or @code{fail} command: the test outcome becomes +@samp{UNRESOLVED}, since an automatic @samp{PASS} or @samp{FAIL} cannot +be trusted after a severe error in the test framework. If the optional +numeric value is @samp{0}, then there are no further side effects to +calling this function, and the following test outcome doesn't become +@samp{UNRESOLVED}. This can be used for errors with no known side +effects. + +@item warning "@var{string} @var{number}" +@cindex test case, WARNING in +@kindex WARNING +Declares detection of a minor error in the test case itself. +@code{warning} writes in the log files a message beginning with +@samp{WARNING}, appending the argument @var{string}. Use @code{warning} +rather than @code{error} for cases (such as communication failure +to be followed by a retry) where the test case can recover from the +error. If the optional @var{number} is supplied, then this is used to +set the internal count of warnings to that value. + +As a side effect, @code{warning_threshold} or more calls to +@code{warning} in a single test case also changes the effect of the next +@code{pass} or @code{fail} command: the test outcome becomes +@samp{UNRESOLVED} since an automatic @samp{PASS} or @samp{FAIL} may not +be trustworthy after many warnings. If the optional numeric value is +@samp{0}, then there are no further side effects to calling this +function, and the following test outcome doesn't become +@samp{UNRESOLVED}. This can be used for errors with no known side +effects. + +@item note "@var{string}" +@cindex test case, informational messages +@kindex NOTE +Appends an informational message to the log file. +@code{note} writes in the log files a message beginning with +@samp{NOTE}, appending the argument @var{string}. Use @code{note} +sparingly. @code{verbose} should be used for most such messages, +but in cases where a message is needed in the log file regardless of +the verbosity level use @code{note}. + +@item pass "@var{string}" +@cindex test case, declaring success +Declares a test to have passed. @code{pass} writes in the +log files a message beginning with @samp{PASS} (or @code{XPASS}, if +failure was expected), appending the argument @var{string}. + +@item fail "@var{string}" +@cindex test case, declaring failure +Declares a test to have failed. @code{fail} writes in the +log files a message beginning with @samp{FAIL} (or @code{XFAIL}, if +failure was expected), appending the argument @var{string}. + +@item unresolved "@var{string}" +@cindex test case, declaring ambiguity +Declares a test to have an unresolved outcome. @code{unresolved} writes +in the log file a message beginning with @samp{UNRESOLVED}, appending +the argument @var{string}. This usually means the test did not execute +as expected, and a human being must go over results to determine if it +passed or failed (and to improve the test case). + +@item untested "@var{string}" +@cindex test case, declaring no test +Declares a test was not run. @code{untested} writes in the log file a +message beginning with @samp{UNTESTED}, appending the argument +@var{string}. For example, you might use this in a dummy test whose +only role is to record that a test does not yet exist for some feature. + +@item unsupported "@var{string}" +@cindex test case, declaring no support +Declares that a test case depends on some facility that does not exist +in the testing environment. @code{unsupported} writes in the log file a +message beginning with @samp{UNSUPPORTED}, appending the argument +@var{string}. + +@item get_warning_threshold +@cindex test case, WARNING threshold +Returns the current value of @code{warning_threshold}. +The default value is 3. + +@item set_warning_threshold @var{threshold} +@cindex test case, WARNING threshold +Sets the value of @code{warning_threshold}. +A value of @code{0} disables it: calls to @code{warning} will not turn +a @samp{PASS} or @samp{FAIL} into an @samp{UNRESOLVED}. + +@item transform "@var{toolname}" +@cindex transform tool name +@cindex installed tool name +@cindex tool name, as installed +@cindex name transformations +Generates a string for the name of a tool as it was configured and +installed, given its native name (as the argument @var{toolname}). +This makes the assumption that all tools are installed using the same +naming conventions: it extrapolates from the invocation name for +@file{runtest}. For example, if you call @code{runtest} as +@file{m68k-vxworks-runtest}, the result of @w{@samp{ transform "gcc" }} +is @samp{m68k-vxworks-gcc}. + +@item ishost "@var{host}" +@cindex host configuration test +Tests for a particular @emph{host} environment. If the currently +configured host matches the argument string, the result is @code{1}; +otherwise the result is @code{0}. @var{host} must be a full three-part +@code{configure} host name; in particular, you may not use the shorter +nicknames supported by @code{configure} (but you can use wildcard +characters, using shell syntax, to specify sets of names). + +@item istarget "@var{target}" +@cindex target configuration test +Tests for a particular @emph{target} environment. If the currently +configured target matches the argument string, the result is @code{1}; +otherwise the result is @code{0}. @var{target} must be a full +three-part @code{configure} target name; in particular, you may not use +the shorter nicknames supported by @code{configure} (but you can use +wildcard characters, using shell syntax, to specify sets of names). If it is +passed a @code{NULL} string, then it returns the name of the build +canonical configuration. + +@item isbuild "@var{host}" +@cindex build host configuration test +Tests for a particular @emph{build host} environment. If the currently +configured host matches the argument string, the result is @code{1}; +otherwise the result is @code{0}. @var{host} must be a full three-part +@code{configure} host name; in particular, you may not use the shorter +nicknames supported by @code{configure} (but you can use wildcard +characters, using shell syntax, to specify sets of names). If it is +passed a @code{NULL} string, then it returns the name of the build +canonical configuration. + +item is3way "@var{host}" +@cindex canadian cross configuration test +Tests for a canadian cross. This is when the tests will be run on a +remotly hosted cross compiler. If it is a canadian cross, then the +result is @code{1}; otherwise the result is @code{0}. + +@item isnative +@cindex native configuration test +Tests whether the current configuration has the same host and target. +When it runs in a @emph{native} configuration this procedure returns a +@code{1}; otherwise it returns a @code{0}. + +@item load_lib "@var{library-file}" +@cindex load library file +Loads the file @var{library-file} by searching a fixed path built into +@code{runtest}. If DejaGnu has been installed, it looks in a path +starting with the installed library directory. If you are running +DejaGnu directly from a source directory, without first running +@samp{make install}, this path defaults to the current directory. In +either case, it then looks in the current directory for a directory +called @code{lib}. If there are duplicate definitions, the last one +loaded takes precedence over the earlier ones. + +@item setup_xfail "@var{config} @r{[}@var{bugid}@r{]}" +@c two spaces above to make it absolutely clear there's whitespace---a +@c crude sort of italic correction! +@cindex test case, expecting failure +@cindex failure, expected +@cindex expected failure +Declares that the test is expected to fail on a particular set of +configurations. The @var{config} argument must be a list of full +three-part @code{configure} target name; in particular, you may not use +the shorter nicknames supported by @code{configure} (but you can use the +common shell wildcard characters to specify sets of names). The +@var{bugid} argument is optional, and used only in the logging file +output; use it as a link to a bug-tracking system such as @sc{gnats} +(@pxref{Overview,, Overview, gnats.info, Tracking Bugs With GNATS}). + +@cindex @code{XFAIL}, producing +@cindex @code{XPASS}, producing +Once you use @code{setup_xfail}, the @code{fail} and @code{pass} +procedures produce the messages @samp{XFAIL} and @samp{XPASS} +respectively, allowing you to distinguish expected failures (and +unexpected success!) from other test outcomes. + +@emph{Warning:} you must clear the expected failure after using +@code{setup_xfail} in a test case. Any call to @code{pass} or +@code{fail} clears the expected failure implicitly; if the test has some +other outcome, e.g. an error, you can call @code{clear_xfail} to clear +the expected failure explicitly. Otherwise, the expected-failure +declaration applies to whatever test runs next, leading to surprising +results. + +@item clear_xfail @var{config} +@cindex cancelling expected failure +@cindex expected failure, cancelling +Cancel an expected failure (previously declared with @code{setup_xfail}) +for a particular set of configurations. The @var{config} argument is a +list of configuration target names. It is only necessary to call +@code{clear_xfail} if a test case ends without calling either +@code{pass} or @code{fail}, after calling @code{setup_xfail}. + +@item verbose @r{[}-log@r{]} @r{[}-n@r{]} @r{[}--@r{]} "@var{string}" @var{number} +@cindex @code{verbose} builtin function +Test cases can use this function to issue helpful messages depending on +the number of @samp{--verbose} options on the @code{runtest} command +line. It prints @var{string} if the value of the variable +@code{verbose} is higher than or equal to the optional @var{number}. The +default value for @var{number} is 1. Use the optional @samp{-log} argument +to cause @var{string} to always be added to the log file, even if it won't +be printed. Use the optional @samp{-n} argument to print @var{string} +without a trailing newline. Use the optional @samp{--} argument if +@var{string} begins with "-". + +@end ftable + +@noindent +@node remote.exp, utils.exp, framework.exp, DejaGnu Builtins +@subsection Remote Communication Procedures + +@kindex remote.exp +@kindex lib/remote.exp +@cindex remote connection procedures +@cindex communications procedures +@file{lib/remote.exp} defines these functions, for establishing and +managing communications: + +@emph{Procedures to establish a connection:} Each of these procedures +tries to establish the connection up to three times before returning. +Warnings (if retries will continue) or errors (if the attempt is +abandoned) report on communication failures. The result for any of +these procedures is either @code{-1}, when the connection cannot be +established, or the spawn ID returned by the @code{expect} command +@code{spawn}. + +It use the value of the @code{connect} field in the @code{target_info} +array (was @code{connectmode} as the type of connection to make. Current +supported connection types are tip, kermit, telnet, rsh, rlogin, and +netdata. If the @code{--reboot} option was used on the runtest command +line, then the target is rebooted before the connection is made. + +@ftable @code + +@item remote_open @var{type} +@cindex Opening a remote connection +@emph{Remote Connection Procedure.} This is passed @emph{host} or +@emph{target}. Host or target refers to whether it is a connection to a +remote target, or a remote host. This opens the connection to the +desired target or host using the default values in the configuration +system. It returns that @code{spawn_id} of the process that manages the +connection. This value can be used in @code{expect} or @code{exp_send} +statements, or passed to other procedures that need the connection +process's id. This also sets the @code{fileid} field in the +@code{target_info} array. + + +@item remote_close @var{shellid} +@cindex Closing a remote connection +@emph{shellid} is value returned by a call to @code{remote_open}. This +closes the connection to the target so resources can be used by +others. This parameter can be left off if the @code{fileid} field in the +@code{target_info} array is set. + +@item telnet @var{hostname} @var{port} +@itemx rlogin @var{hostname} +@itemx rsh @var{hostname} +@cindex IP network procedures +@cindex network (IP) procedures +@emph{IP network procedures.} @var{hostname} refers to the IP address or +name (for example, an entry in @file{/etc/hosts}) for this target. The +procedure names reflect the Unix utility used to establish a +connection. The optional @var{port} is used to specify the IP port +number. The value of the @code{netport} field in the @code{target_info} +array is used. (was @code{$netport}) This value has two parts, the +hostname and the port number, seperated by a @emph{:}. If @code{host} or +@code{target} is used in the @code{hostname} field, than the config +array is used for all information. + +@item tip @var{port} +@cindex serial line connection, @code{tip} +@emph{Serial line procedure.} Connect using the Unix utility @code{tip}. +@var{port} must be a name from the @code{tip} configuration file +@file{/etc/remote}. Often, this is called @samp{hardwire}, or something +like @samp{ttya}. This file holds all the configuration data for +the serial port. The value of the @code{serial} field in the +@code{target_info} array is used. (was @code{$serialport}) If +@code{host} or @code{target} is used in the @code{port} field, than +the config array is used for all information. + +@item kermit @var{port} @var{bps} +@cindex serial line connection, @code{kermit} +@emph{Serial line procedure.} Connect using the program @code{kermit}. +@var{port} is the device name, e.g. @file{/dev/ttyb}. @var{bps} is +the line speed to use (in bits per second) for the connection. The value +of the @code{serial} field in the @code{target_info} array is used. (was +@code{$serialport}) If @code{host} or @code{target} is used in the +@code{port} field, than the config array is used for all information. + +@end ftable + +@noindent +@emph{Procedures to manage a connection:} + +@ftable @code +@item tip_download @var{spawnid} @var{file} +@cindex download, @code{tip} +@cindex serial download, @code{tip} +Download @file{@var{file}} to the process @var{spawnid} (the value +returned when the connection was established), using the @code{~put} +command under @code{tip}. Most often used for single board computers +that require downloading programs in @sc{ascii} S-records. Returns +@code{1} if an error occurs, @code{0} otherwise. + +@item exit_remote_shell @var{spawnid} +@cindex terminating remote connection +@cindex remote connection, ending +Exits a remote process started by any of the connection procedures. +@var{spawnid} is the result of the connection procedure that started the +remote process. + +@item download @var{file} @r{[} @var{spawnid} @r{]} +@cindex download a file +After you establish a connection to a target, you can download programs +using this command. @code{download} reads in @var{file} (object code in +S-record format) and writes it to the device controlling this +@var{spawnid}. (From the point of view of the target, the S-record file +comes in via standard input.) + +If you have more than one target active, you can use the optional argument +@var{spawnid} to specify an alternative target (the default is the most +recently established @var{spawnid}.) +@end ftable + +@noindent +@node utils.exp, target.exp, remote.exp, DejaGnu Builtins +@subsection Utility Procedures + +@kindex utils.exp +@kindex lib/utils.exp +@file{lib/utils.exp} defines these utility procedures: + +@ftable @code +@item getdirs @var{dir} +@itemx getdirs @var{dir} @var{pattern} +@cindex directories matching a pattern +@cindex pattern match, directory +Returns a list of all the directories in the single directory @var{dir} +that match @var{pattern}. If you do not specify @var{pattern}, +@code{getdirs} assumes @samp{*}. You may use the common shell wildcard +characters in @var{pattern}. If no directories match the pattern, then a +@code{NULL} string is returned. + +@item find @var{dir} @var{pattern} +@cindex files matching a pattern +@cindex pattern match, filenames +Search for files whose names match @var{pattern} (using shell wildcard +characters for filename expansion). Search subdirectories recursively, +starting at @var{dir}. The result is the list of files whose names +match; if no files match, the result is empty. Filenames in the result +include all intervening subdirectory names. If no files match the +pattern, then a @code{NULL} string is returned. + +@item which @var{binary} +@cindex path lookup +Searches the execution path for an executable file @var{binary}, like +the the BSD @code{which} utility. This procedure uses the shell +environment variable @samp{PATH}. It returns @code{0} if the binary is +not in the path, or if there is no @samp{PATH} environment variable. If +@var{binary} is in the path, it returns the full path to @var{binary}. + +@item grep @var{filename} @var{regexp} +@item grep @var{filename} @var{regexp} line +@cindex regular expression, file contents +@cindex searching file contents +Search the file called @var{filename} (a fully specified path) for lines +that contain a match for regular expression @var{regexp}. The result is +a list of all the lines that match. If no lines match, the result is an +empty string. Specify @var{regexp} using the standard regular +expression style used by the Unix utility program @code{grep}. + +Use the optional third argument @samp{line} to start lines in the result +with the line number in @var{filename}. (This argument is simply an +option flag; type it just as shown---@samp{line}.) + +@item diff @var{filename} @var{filename} +@cindex finding file differences +@cindex comparing files +Compares the two files and returns a 1 if they match, or a 0 if they +don't. If @code{verbose} is set, then it'll print the differences to the +screen. + +@item slay @var{name} +@cindex slaying processes +This look in the process tabel for @var{name} and send it a unix +@code{SIGINT}, killing the process. + +@item absolute @var{path} +@cindex converting relative paths to absolute +This procedure takes the relative @var{path}, and converts it to an +absolute path. + +@item psource @var{filename} +@cindex sourcing Tcl files +This sources the file @var{filename}, and traps all errors. It also +ignores all extraneous output. If there was an error it returns a 1, +otherwise it returns a 0. + +@item prune @var{list} @var{pattern} +@cindex list, pruning +Remove elements of the Tcl list @var{list}. Elements are fields +delimited by spaces. The result is a copy of @var{list}, without any +elements that match @var{pattern}. You can use the common shell +wildcard characters to specify @var{pattern}. + +@item setenv @var{var} @var{val} +@cindex setting environment variables +Sets the variable @var{var} to the value @var{val}. + +@item unsetenv @var{var} +@cindex unsetting environment variables +Unsets the environment variable @var{var} + +@item getenv @var{var} +@cindex getting environment variables +returns the value of @var{var} in the environment if it exists, +otherwise it returns @code{NULL}. + +@item runtest_file_p @var{runtests} @var{testcase} +@cindex selecting a range of tests +@cindex tests, running specifically +Search @var{runtests} for @var{testcase} and return 1 if found, 0 if not. +@var{runtests} is a list of two elements. The first is the pathname of +the testsuite expect script running. The second is a copy of what was +on the right side of the @code{=} if @samp{foo.exp="@dots{}"} was specified, +or an empty string if no such argument is present. +This is used by tools like compilers where each testcase is a file. + +@item prune_system_crud @var{system} @var{text} +@cindex pruning system output, examining program output +For system @var{system}, delete text the host or target operating system might +issue that will interfere with pattern matching of program output in +@var{text}. An example is the message that is printed if a shared library +is out of date. + +@end ftable + +@noindent +@node target.exp, debugger.exp, utils.exp, DejaGnu Builtins +@subsection Cross target procedure + +@kindex target.exp +@kindex lib/target.exp +@file{lib/target.exp} defines these utility procedures: + +@ftable @code + +@item push_target @emph{name} +@cindex set current target +This makes the target named @emph{name} be the current target +connection. The value of @emph{name} is an index into the +@code{target_info} array and is set in the global config file. + +@item pop_target +@cindex unset current target +This unsets the current target connection. + +@item list_targets +@cindex lists supported targets +This lists all the supported targets for this architecture. + +@item push_host @emph{name} +@cindex set current host +This makes the host named @emph{name} be the current remote host +connection. The value of @emph{name} is an index into the +@code{target_info} array and is set in the global config file. + +@item pop_host +@cindex unset current host +This unsets the current host connection. + +@c @item compile @emph{file} +@cindex compile a file +This invokes the compiler as set by @code{CC} to compile the file +@emph{file}. The default options for many cross compilation targets are +@emph{guessed} by DejaGnu, and these options can be added to by passing +in more parameters as arguments to @code{compile}. Optionally, this will +also use the value of the @code{cflags} field in the target config +array. If the host is not the same as the build machines, then then +compiler is run on the remote host using @code{execute_anywhere}. + +@c @item archive @emph{file} +@cindex archive object files +This produces an archive file. Any parameters passed to @code{archive} +are used in addition to the default flags. Optionally, this will +also use the value of the @code{arflags} field in the target config +array. If the host is not the same as the build machines, then then +archiver is run on the remote host using @code{execute_anywhere}. + +@c @item ranlib @emph{file} +@cindex ranlib a file +This generates an index for the archive file for systems that aren't +POSIX yet. Any parameters passed to @code{ranlib} are used in for the +flags. + +@item execute_anywhere @emph{cmdline} +@cindex executing commands remotely +This executes the @emph{cmdline} on the proper host. This should be used +as a replacement for the Tcl command @code{exec} as this version +utilizes the target config info to execute this command on the build +machine or a remote host. All config information for the remote host +must be setup to have this command work. If this is a canadian cross, +(where we test a cross compiler that runs on a different host then where +DejaGnu is running) then a connection is made to the remote host and +the command is executed there. It returns either @emph{REMOTERROR} (for +an error) or the output produced when the command was executed. This is +used for running the tool to be tested, not a test case. + +@end ftable + +@node debugger.exp, , target.exp, DejaGnu Builtins +@subsection Debugging Procedures + +@kindex debugger.exp +@kindex lib/debugger.exp +@file{lib/debugger.exp} defines these utility procedures: + +@ftable @code + +@item dumpvars @emph{expr} +@cindex Print global variable values +This takes a csh style regular expression (glob rules) and prints the +values of the global variable names that match. It is abbreviated as +@code{dv} + +@item dumplocals @emph{expr} +@cindex Print local variable value +This takes a csh style regular expression (glob rules) and prints the +values of the local variable names that match. It is abbreviated as +@code{dl}. + +@item dumprocs @emph{expr} +@cindex Print procedure bodies +This takes a csh style regular expression (glob rules) and prints the +body of all procs that match. It is abbreviated as @code{dp} + +@item dumpwatch @emph{expr} +@cindex Print watchpoints +This takes a csh style regular expression (glob rules) and prints all +the watchpoints. It is abbreviated as @code{dw}. + +@c FIXME: finish these when the code is fixed. +@c @item watcharray @emph{element} @emph{type} +@c @cindex Set a watchpoint on an array +@c This sets an watchpoint of the @emph{element-type} on the +@c @item watchvar v null type +@c @cindex Set a watchpoint on a variable + +@item watchunset @emph{var} +@cindex Watch when a variable is unset +This breaks program execution when the variable @emph{var} is unset. It +is abbreviated as @code{wu}. + +@item watchwrite @emph{var} +@cindex Watch when a variable is written +This breaks program execution when the variable @emph{var} is +written. It is abbreviated as @code{ww}. + +@item watchread @emph{var} +@cindex Watch when a variable is read +This breaks program execution when the variable @emph{var} is read. It +is abbreviated as @code{wr}. + +@item watchdel @emph{watch} +@cindex Delete a watchpoint. +This deletes a the watchpoint for @emph{watch}. It is abbreviated as +@code{wd}. + +@item print @emph{var} +@cindex Printing variable values +This prints the value of the variable @emph{var}. It is abbreviated as +@code{p}. + +@item quit +@cindex Quiting DejaGnu +This makes runtest exit. It is abbreviated as @code{q}. + +@item bt +@cindex Print a backtrace +This prints a backtrace of the executed Tcl commands. + +@end ftable + +@node Target Dependent +@section Target dependent procedures +@cindex target dependent procedures + +@c FIXME? These may be renamed to just "start", "load", "exit", and +@c "version" eventually. + +Each combination of target and tool requires some target-dependent +procedures. The names of these procedures have a common form: the tool +name, followed by an underbar @samp{_}, and finally a suffix describing +the procedure's purpose. For example, a procedure to extract the +version from @sc{gdb} is called @samp{gdb_version}. @xref{Init Module,, +Initialization Module}, for a discussion of how DejaGnu arranges to find +the right procedures for each target. + +@code{runtest} itself calls only two of these procedures, +@code{@var{tool}_exit} and @code{@var{tool}_version}; these procedures use +no arguments. + +The other two procedures, @code{@var{tool}_start} and +@code{@var{tool}_load}, are only called by the test suites themselves +(or by testsuite-specific initialization code); they may take arguments +or not, depending on the conventions used within each test suite. + +@ftable @code +@item @var{tool}_start +@cindex start procedure, tested tools +Starts a particular tool. For an interactive tool, +@code{@var{tool}_start} starts and initializes the tool, leaving the +tool up and running for the test cases; an example is @code{gdb_start}, +the start function for @sc{gdb}. For a batch oriented tool, +@code{@var{tool}_start} is optional; the recommended convention is to +let @code{@var{tool}_start} run the tool, leaving the output in a +variable called @code{comp_output}. Test scripts can then analyze +@samp{$comp_output} to determine the test results. An example of this +second kind of start function is @code{gcc_start}, the start function +for @sc{gcc}. + +@code{runtest} itself @emph{does not call} @code{@var{tool}_start}. The +initialization module @file{@var{tool}_init.exp} must call +@code{@var{tool}_start} for interactive tools; for batch-oriented tools, +each individual test script calls @code{@var{tool}_start} (or makes +other arrangements to run the tool). + +@item @var{tool}_load +@cindex load procedure, tested tools +Loads something into a tool. For an interactive tool, this conditions +the tool for a particular test case; for example, @code{gdb_load} loads +a new executable file into the debugger. For batch oriented tools, +@code{@var{tool}_load} may do nothing---though, for example, the +@sc{gcc} support uses @code{gcc_load} to load and run a binary on the +target environment. Conventionally, @code{@var{tool}_load} leaves the +output of any program it runs in a variable called @samp{exec_output}. +Writing @code{@var{tool}_load} can be the most complex part of extending +DejaGnu to a new tool or a new target, if it requires much communication +coding or file downloading. + +Test scripts call @code{@var{tool}_load}. + +@item @var{tool}_exit +@cindex exit procedure, tested tools +Cleans up (if necessary) before @code{runtest} exits. For interactive +tools, this usually ends the interactive session. You can also use +@code{@var{tool}_exit} to remove any temporary files left over from the +tests. + +@code{runtest} calls @code{@var{tool}_exit}. + +@item @var{tool}_version +@cindex version procedure, tested tools +Prints the version label and number for @var{tool}. This is called by +the DejaGnu procedure that prints the final summary report. The output +should consist of the full path name used for the tested tool, and its +version number. + +@code{runtest} calls @code{@var{tool}_version}. +@end ftable + +The usual convention for return codes from any of these procedures +(although it is not required by @code{runtest}) is to return @code{0} if +the procedure succeeded, @code{1} if it failed, and @code{-1} if there +was a communication error. + +@node Cross Targets +@section Remote targets supported + +@cindex targets +@cindex remote testing +The DejaGnu distribution includes support for the following remote +targets. You can set the target name and the connect mode in the +@file{site.exp} file (using the Tcl variables @samp{targetname} and +@samp{connectmode}, respectively), or on the @code{runtest} command line +(using @samp{--name} and @samp{--connect}). + +@table @strong +@item @sc{amd} 29000, with UDI protocol +Configure DejaGnu for target @samp{a29k-amd-udi}. (Cygnus +@code{configure} also recognizes the abbreviation @samp{udi29k}.) Then, +to run tests, use the @code{runtest} target name to specify whether you +want to use a simulator, or a particular hardware board. The particular +string to use with @samp{--name} will depend on your UDI setup file, +@file{udi_soc} (if @file{udi_soc} is not in your working directory, the +environment variable @samp{UDICONF} should contain a path to this file). +For example, if your UDI setup file includes these lines: +@end table +@c table "ends" *only* to allow wider example below + +@cartouche +@smallexample +iss AF_UNIX * isstip -r /home/gnu/29k/src/osboot/sim/osboot +mon AF_UNIX * montip -t serial -baud 9600 -com /dev/ttyb +@end smallexample +@end cartouche + +@table @strong +@item @w{ } +@c fake out table/item into continuing w/same margin as before +You can use @samp{--name iss} to run tests on the simulator, and +@samp{--name mon} to run tests on the 29K hardware. See the +manufacturer's manuals for more information on UDI and @file{udi_soc}. +@c FIXME! Is there a better ref than "the manufacturer's manuals"? + +@kindex mondfe +The default connect protocol is @samp{mondfe} with either back end. +@code{mondfe} is the only shell DejaGnu supports for UDI targets. +@code{mondfe} is an @sc{amd} specific monitor program freely available +from @sc{amd}. + +@emph{Warning:} This target requires @sc{gdb} version 4.7.2 (or +greater). Earlier versions of @sc{gdb} do not fully support the +@code{load} command on this target, so DejaGnu has no way to load +executable files from the debugger. + +@item Motorola 680x0 boards, a.out or @sc{coff} object format +Configure DejaGnu for any remote target matching @samp{m68k-*}. + +@emph{Warning:} Most @samp{m68k-*} configurations run all tests only for +native testing (when the target is the same as the host). When you +specify most of these targets for a cross configuration, you will only be +able to use tests that run completely within the host (for example, +tests of the binary utilities such as the archiver; or compiler tests +that only generate code rather than running it). + +To run a.out or @sc{coff} binaries on a remote M68K, you must configure +DejaGnu for a particular target board. @samp{m68k-abug} is an example. +(In general for an embedded environment, because it does not have absolute +addresses, a.out is not a good choice for output format in any case; most +often S-records or Hex-32 are used instead.) + +@item Motorola 68K MVME 135 board running ABug boot monitor +Configure for @samp{m68k-abug-aout} or @samp{m68k-abug-coff} (as a +target). This boot monitor can only download S-records; therefore, the +DejaGnu tests for this environment require a linker command script to +convert either output format to S-records, setting the default addresses +for @code{.text}, @code{.bss}, and @code{.data}. + +With this configuration, the default for @samp{--connect} is @samp{tip}. +@samp{tip} is the only communications protocol supported for connecting +to @samp{m68k-abug-*} targets. @samp{tip} uses an @sc{ascii} downloader +(the @code{~put} command) to load S-records into the target board. The +@samp{--name} string must be a machine name that @code{tip} +understands (for example, on some @code{tip} implementations it must be +an entry from the initialization file for @code{tip}; this file is +sometimes called @file{/etc/remote}). + +See your system documentation for information on how to create new +entries in @file{/etc/remote}. (Some @sc{unix} systems are distributed +with at least one default entry with a name resembling @samp{hardwire}; +if your system has one, you can edit it, or make a modified copy with a +new name.) When you have a working @file{/etc/remote} entry +@var{abugtarget}, you should be able to type @samp{tip +@var{abugtarget}}, and get the prompt @samp{135ABUG>} from the board. +Use the same @var{abugtarget} string with @samp{runtest --name}. + +@item Motorola IDP board running the rom68k boot monitor +@c FIXME 1: this doesn't really say anything! OK, so functionality is +@c the same. Is object code the same (srecords)? Do we configure with +@c the same triplets? What is the default for --connect? Is +@c any comms method other than tip supported? What prompt to expect +@c when tip connected? +@c FIXME 2: should @code{BUG} below be @code{ABUG}? +This is the same in functionality as the MVME board running the +@code{BUG} boot monitor. Only the monitor commands and the addresses are +different. + +@item VxWorks (Motorola 68K or Intel 960) +Configure DejaGnu for either @samp{m68k-wrs-vxworks} (abbreviated +@samp{vxworks68}) or @samp{i960-wrs-vxworks} (abbreviated +@samp{vxworks960}). Since both targets support IP addressing, specify +the network address (for example, a host name from @file{/etc/hosts}) +with @samp{--name}. + +The default connect protocol is @samp{rlogin}, but you can use any of +@samp{--connect rlogin}, @samp{--connect telnet}, or @samp{--connect +rsh}. + +Test scripts need no special code to load programs into these targets; +since VxWorks supports NFS, all you must do is ensure test programs are +on an exported filesystem. + +@cindex VxWorks, link with @samp{-r} +When you compile for VxWorks, use the linker @samp{-r} option to make +the linker output relocatable---at least if you want to use library +routines. Many standard C routines are included in VxWorks; often no +additional libraries are needed. See your VxWorks system documentation +for additional details. +@end table + +@node Input Files +@section The files DejaGnu reads +@cindex input files + +The @code{runtest} program used to invoke DejaGnu is a short shell +script generated by @code{make} during the configuration process. Its +main task is to read the main test framework driver, @file{runtest.exp}. + +@file{runtest.exp}, in turn, reads @code{expect} code from certain other +files, in this order: + +@enumerate +@item +Each of the @file{site.exp} local definition files available. +@xref{Customizing,,Setting @code{runtest} defaults}, for details. + +@item +@file{lib/utils.exp}, a collection of utility procedures. @xref{DejaGnu +Builtins,,DejaGnu Builtins}, for descriptions of these procedures. + +@item +@file{lib/framework.exp}, a file of subroutines meant for @code{runtest} +itself rather than for general-purpose use in both @code{runtest} and +test suites. + +@item +@file{debugger.exp}, Don Libes' Tcl Debugger. (See @cite{A Debugger for +Tcl Applications} by Don Libes. This paper is distributed with +@code{expect} in PostScript form as the file +@file{expect/tcl-debug.ps}.) + +@item +@file{lib/remote.exp}, a collection of subroutines meant for connecting +to remote machines. + +@item +@file{lib/target.exp}, a collection of subroutines used for the +configuration systems in DejaGnu. These procedures typically manipulate +or utilize the configuration system. + +@item +@c FIXME! A comment in runtest.exp claims a system default is used if +@c no tool-specific init file is not available; I couldn't see where +@c the program flow actually does this, though---pesch 30jul1993. +An initialization file @code{@var{tool}_init.exp}. @xref{Init +Module,,Initialization module}, for more discussion of init files. +@end enumerate + +@c This hard page break is mainly intended for smallbook formatting; +@c some examples in this section come out better if this starts at a +@c page boundary. +@page +@node Output Files +@section The files DejaGnu writes +@cindex output files + +@code{runtest} always writes two kinds of output files: summary logs and +detailed logs. The contents of both of these are determined by your +tests. + +For troubleshooting, a third kind of output file is useful: use +@samp{--debug} to request an output file showing details of what +@code{expect} is doing internally. + +@menu +* Summary:: Files that summarize tests +* Detail:: Files that contain complete test results +* Debug:: Logging expect internal actions +@end menu + +@node Summary +@subsection Summary log +@cindex summary log + +@code{runtest} always produces a summary output file +@file{@var{tool}.sum}. This summary shows the names of all test files +run; for each test file, one line of output from each @code{pass} +command (showing status @samp{PASS} or @samp{XPASS}) or @code{fail} +command (status @samp{FAIL} or @samp{XFAIL}); trailing summary +statistics that count passing and failing tests (expected and +unexpected); and the full pathname and version number of the tool +tested. (All possible outcomes, and all errors, are always reflected in +the summary output file, regardless of whether or not you specify +@samp{--all}.) + +If any of your tests use the procedures @code{unresolved}, +@code{unsupported}, or @code{untested}, the summary output also +tabulates the corresponding outcomes. + +For example, after @samp{runtest --tool binutils}, look for a summary +log in @file{binutils.sum}. Normally, @code{runtest} writes this file +in your current working directory; use the @samp{--outdir} option to +select a different directory. + +@need 3500 +@noindent +Here is a short sample summary log: + +@cartouche +@smallexample +Test Run By rob on Mon May 25 21:40:57 PDT 1992 + === gdb tests === +Running ./gdb.t00/echo.exp ... +PASS: Echo test +Running ./gdb.all/help.exp ... +PASS: help add-symbol-file +PASS: help aliases +PASS: help breakpoint "bre" abbreviation +FAIL: help run "r" abbreviation +Running ./gdb.t10/crossload.exp ... +PASS: m68k-elf (elf-big) explicit format; loaded +XFAIL: mips-ecoff (ecoff-bigmips) "ptype v_signed_char" signed +C types + === gdb Summary === +# of expected passes 5 +# of expected failures 1 +# of unexpected failures 1 +/usr/latest/bin/gdb version 4.6.5 -q +@end smallexample +@end cartouche + +@node Detail +@subsection Detailed log +@cindex detailed log + +@code{runtest} also saves a detailed log file @file{@var{tool}.log}, +showing any output generated by tests as well as the summary output. +For example, after @samp{runtest --tool binutils}, look for a detailed +log in @file{binutils.log}. Normally, @code{runtest} writes this file +in your current working directory; use the @samp{--outdir} option to +select a different directory. + +@need 4000 +@noindent +Here is a brief example showing a detailed log for @sc{g++} tests: + +@cartouche +@smallexample +Test Run By rob on Mon May 25 21:40:43 PDT 1992 + + === g++ tests === + +--- Running ./g++.other/t01-1.exp --- + PASS: operate delete + +--- Running ./g++.other/t01-2.exp --- + FAIL: i960 bug EOF +p0000646.C: In function `int warn_return_1 ()': +p0000646.C:109: warning: control reaches end of non-void function +p0000646.C: In function `int warn_return_arg (int)': +p0000646.C:117: warning: control reaches end of non-void function +p0000646.C: In function `int warn_return_sum (int, int)': +p0000646.C:125: warning: control reaches end of non-void function +p0000646.C: In function `struct foo warn_return_foo ()': +p0000646.C:132: warning: control reaches end of non-void function + +--- Running ./g++.other/t01-4.exp --- + FAIL: abort +900403_04.C:8: zero width for bit-field `foo' +--- Running ./g++.other/t01-3.exp --- + FAIL: segment violation +900519_12.C:9: parse error before `;' +900519_12.C:12: Segmentation violation +/usr/latest/bin/gcc: Internal compiler error: program cc1plus got +fatal signal + + === g++ Summary === + +# of expected passes 1 +# of expected failures 3 +/usr/ps/bin/g++ version cygnus-2.0.1 +@end smallexample +@end cartouche + +@node Debug +@subsection Logging @code{expect} internal actions +@cindex debug log + +With the @samp{--debug} option, you can request a log file showing the +output from @code{expect} itself, running in debugging mode. This file +(@file{dbg.log}, in the directory where you start @code{runtest}) shows +each pattern @code{expect} considers in analyzing test output. + +This file reflects each @code{send} command, showing the string sent as +input to the tool under test; and each @code{expect} command, showing +each pattern it compares with the tool output. + +The log messages for @code{expect} begin with a message of the form + +@smallexample +expect: does @{@var{tool output}@} (spawn_id @var{n}) match pattern +@{@var{expected pattern}@}? +@end smallexample + +@noindent +For every unsuccessful match, @code{expect} issues a @samp{no} after +this message; if other patterns are specified for the same +@code{expect} command, they are reflected also, but without the first +part of the message (@samp{expect@dots{}match pattern}). + +When @code{expect} finds a match, the log for the successful match ends +with @samp{yes}, followed by a record of the @code{expect} variables set +to describe a successful match. Here is an excerpt from the debugging +log for a @sc{gdb} test: + +@c FIXME! Why is the second spawn_id shown 0 rather than 6? +@cartouche +@smallexample +send: sent @{break gdbme.c:34\n@} to spawn id 6 +expect: does @{@} (spawn_id 6) match pattern @{Breakpoint.*at.* file + gdbme.c, line 34.*\(gdb\) $@}? no +@{.*\(gdb\) $@}? no +expect: does @{@} (spawn_id 0) match pattern @{@}? no +@{\(y or n\) @}? no +@{buffer_full@}? no +@{virtual@}? no +@{memory@}? no +@{exhausted@}? no +@{Undefined@}? no +@{command@}? no +break gdbme.c:34 +Breakpoint 8 at 0x23d8: file gdbme.c, line 34. +(gdb) expect: does @{break gdbme.c:34\r\nBreakpoint 8 at 0x23d8: +file gdbme.c, line 34.\r\n(gdb) @} (spawn_id 6) match pattern +@{Breakpoint.*at.* file gdbme.c, line 34.*\(gdb\) $@}? yes +expect: set expect_out(0,start) @{18@} +expect: set expect_out(0,end) @{71@} +expect: set expect_out(0,string) @{Breakpoint 8 at 0x23d8: file +gdbme.c, line 34.\r\n(gdb) @} +expect: set expect_out(spawn_id) @{6@} +expect: set expect_out(buffer) @{break gdbme.c:34\r\nBreakpoint 8 +at 0x23d8: file gdbme.c, line 34.\r\n(gdb) @} + PASS: 70 0 breakpoint line number in file +@end smallexample +@end cartouche + +@noindent +This example exhibits three properties of @code{expect} and DejaGnu that +might be surprising at first glance: + +@itemize @bullet +@item +Empty output for the first attempted match. The first set of attempted +matches shown ran against the output @samp{@{@}}---that is, no output. +@code{expect} begins attempting to match the patterns supplied +immediately; often, the first pass is against incomplete output (or +completely before all output, as in this case). + +@item +Interspersed tool output. The beginning of the log entry for the second +attempted match may be hard to spot: this is because the prompt +@samp{(gdb) } appears on the same line, just before the @samp{expect:} +that marks the beginning of the log entry. + +@item +Fail-safe patterns. Many of the patterns tested are fail-safe patterns +provided by @sc{gdb} testing utilities, to reduce possible +indeterminacy. It is useful to anticipate potential variations +caused by extreme system conditions (@sc{gdb} might issue the message +@samp{virtual memory exhausted} in rare circumstances), or by changes in +the tested program (@samp{Undefined command} is the likeliest outcome if +the name of a tested command changes). + +The pattern @samp{@{@}} is a particularly interesting fail-safe +to notice; it checks for an unexpected @key{RET} prompt. This may +happen, for example, if the tested tool can filter output through a +pager. + +These fail-safe patterns (like the debugging log itself) are primarily +useful while developing test scripts. Use the @code{error} procedure to +make the actions for fail-safe patterns produce messages starting with +@samp{ERROR} on the @code{runtest} standard output, and in the detailed +log file. +@end itemize + +@node Tests +@chapter How To Write a Test Case +@cindex writing a test case +@cindex test case, writing + +@menu +* Writing:: Writing a test case +* Debugging:: Debugging a test case +* Adding:: Adding a test case to a test suite +* Hints:: Hints on writing a test case +* Variables:: Special variables used by test cases +@end menu + +@node Writing +@section Writing a test case + +The easiest way to prepare a new test case is to base it on an existing +one for a similar situation. There are two major categories of tests: +batch or interactive. Batch oriented tests are usually easier to write. + +The @sc{gcc} tests are a good example of batch oriented tests. All +@sc{gcc} tests consist primarily of a call to a single common procedure, +since all the tests either have no output, or only have a few warning +messages when successfully compiled. Any non-warning output is a test +failure. All the C code needed is kept in the test directory. The test +driver, written in @code{expect}, need only get a listing of all the C +files in the directory, and compile them all using a generic procedure. +This procedure and a few others supporting for these tests are kept in +the library module @file{lib/c-torture.exp} in the @sc{gcc} test suite. +Most tests of this kind use very few @code{expect} features, and are +coded almost purely in Tcl. + +@noindent +Writing the complete suite of C tests, then, consisted of these steps: + +@enumerate +@item +@cindex Granlund, Torbjorn +@cindex C torture test +Copying all the C code into the test directory. These tests were based on +the C-torture test created by Torbjorn Granlund (on behalf of the Free +Software Foundation) for @sc{gcc} development. + +@item +Writing (and debugging) the generic @code{expect} procedures for +compilation. + +@item +Writing the simple test driver: its main task is to search the directory +(using the Tcl procedure @code{glob} for filename expansion with +wildcards) and call a Tcl procedure with each filename. It also checks +for a few errors from the testing procedure. +@end enumerate + +Testing interactive programs is intrinsically more complex. Tests for most +interactive programs require some trial and error before they are complete. + +However, some interactive programs can be tested in a simple fashion +reminiscent of batch tests. For example, prior to the creation of +DejaGnu, the @sc{gdb} distribution already included a wide-ranging +testing procedure. This procedure was very robust, and had already +undergone much more debugging and error checking than many recent +DejaGnu test cases. Accordingly, the best approach was simply to +encapsulate the existing @sc{gdb} tests, for reporting purposes. +Thereafter, new @sc{gdb} tests built up a family of @code{expect} +procedures specialized for @sc{gdb} testing. + +@file{gdb.t10/crossload.exp} is a good example of an interactive test. +@c FIXME! Check what *kind* of example it is---work-intensive, or generic... + +@node Debugging +@section Debugging a test case +@cindex debugging a test case +@cindex test case, debugging + +@noindent +These are the kinds of debugging information available from DejaGnu: + +@enumerate +@item +Output controlled by test scripts themselves, explicitly allowed for by +the test author. This kind of debugging output appears in the detailed +output recorded in the @file{@var{tool}.log} file. To do the same for +new tests, use the @code{verbose} procedure (which in turn uses the +variable also called @code{verbose}) to control how much output to +generate. This will make it easier for other people running the test to +debug it if necessary. Whenever possible, if @samp{$verbose} is +@code{0}, there should be no output other than the output from +@code{pass}, @code{fail}, @code{error}, and @code{warning}. Then, to +whatever extent is appropriate for the particular test, allow +successively higher values of @samp{$verbose} to generate more +information. Be kind to other programmers who use your tests: provide +for a lot of debugging information. + +@item +Output from the internal debugging functions of Tcl and @code{expect}. +There is a command line options for each; both forms of debugging output +are recorded in the file @code{dbg.log} in the current directory. + +Use @samp{--debug} for information from the @code{expect} level; it +generates displays of the @code{expect} attempts to match the tool +output with the patterns specified (@pxref{Debug,,Debug Log}). This +output can be very helpful while developing test scripts, since it shows +precisely the characters received. Iterating between the latest attempt +at a new test script and the corresponding @file{dbg.log} can allow you +to create the final patterns by ``cut and paste''. This is sometimes +the best way to write a test case. + +Use @samp{--strace} to see more detail at the Tcl level; this shows how Tcl +procedure definitions expand, as they execute. The associated number +controls the depth of definitions expanded; see the discussion of +@samp{--strace} in @ref{Invoking runtest,,Running the Tests}. + +@item +Finally, if the value of @samp{verbose} is 3 or greater, @code{runtest} +turns on the @code{expect} command @code{log_user}. This command prints +all @code{expect} actions to the @code{expect} standard output, to the +detailed log file, and (if @samp{--debug} is on) to @file{dbg.log}. +@end enumerate + +@node Adding +@section Adding a test case to a test suite +@cindex adding a test case + +There are two slightly different ways to add a test case. One is to add +the test case to an existing directory. The other is to create a new +directory to hold your test. The existing test directories represent +several styles of testing, all of which are slightly different; examine +the directories for the tool of interest to see which (if any) is most +suitable. + +Adding a @sc{gcc} test can be very simple: just add the C code to any +directory beginning with @samp{gcc.} and it runs on the next +@samp{runtest --tool gcc}. + +To add a test to @sc{gdb}, first add any source code you will need to +the test directory. Then you can either create a new @code{expect} file, +or add your test to an existing one (any file with a @samp{.exp} +suffix). Creating a new @samp{.exp} file is probably a better idea if +the test is significantly different from existing tests. Adding it as a +separate file also makes upgrading easier. If the C code has to be +already compiled before the test will run, then you'll have to add it to +the @file{Makefile.in} file for that test directory, then run +@code{configure} and @code{make}. + +Adding a test by creating a new directory is very similar: + +@enumerate +@item +Create the new directory. All subdirectory names begin with the name of +the tool to test; e.g. @sc{g++} tests might be in a directory called +@file{g++.other}. There can be multiple test directories that start with +the same tool name (such as @samp{g++}). + +@item +Add the new directory name to the @samp{configdirs} definition in the +@file{configure.in} file for the test suite directory. This way when +@code{make} and @code{configure} next run, they include the new directory. + +@item +Add the new test case to the directory, as above. + +@item +To add support in the new directory for configure and make, you must +also create a @code{Makefile.in} and a @code{configure.in}. @xref{What +Configure Does,,What Configure Does, configure.info, Cygnus Configure}. +@end enumerate + +@c FIXME! Expand this sentence to at least a section, maybe a chapter... +@c The @file{admin} directory contains templates for a few common forms +@c of test. + +@node Hints +@section Hints on writing a test case +@cindex hints on test case writing + +There may be useful existing procedures already written for your test in +the @file{lib} directory of the DejaGnu distribution. @xref{DejaGnu +Builtins,,DejaGnu Builtins}. + +It is safest to write patterns that match @emph{all} the output +generated by the tested program; this is called @dfn{closure}. If a +pattern does not match the entire output, any output that remains will +be examined by the @emph{next} @code{expect} command. In this +situation, the precise boundary that determines which @code{expect} +command sees what is very sensitive to timing between the @code{expect} +task and the task running the tested tool. As a result, the test may +sometimes appear to work, but is likely to have unpredictable results. +(This problem is particularly likely for interactive tools, but can also +affect batch tools---especially for tests that take a long time to finish.) +The best way to ensure closure is to use the @samp{-re} option for the +@code{expect} command to write the pattern as a full regular +expressions; then you can match the end of output using a @samp{$}. It +is also a good idea to write patterns that match all available output by +using @samp{.*\} after the text of interest; this will also match any +intervening blank lines. Sometimes an alternative is to match end of +line using @samp{\r} or @samp{\n}, but this is usually too dependent on +terminal settings. +@c FIXME!! explain what "end of output" means for interactive task. +@c (Timeout or EOF, right?) + +Always escape punctuation, such as @samp{(} or @samp{"}, in your +patterns; for example, write @samp{\(}. If you forget to escape +punctuation, you will usually see an error message like @samp{extra +characters after close-quote}. + +If you have trouble understanding why a pattern does not match the +program output, try using the @samp{--debug} option to @code{runtest}, +and examine the debug log carefully. @xref{Debug,,Debug Log}. + +Be careful not to neglect output generated by setup rather than by the +interesting parts of a test case. For example, while testing @sc{gdb}, +I issue a send @samp{set height 0\n} command. The purpose is simply to +make sure @sc{gdb} never calls a paging program. The @samp{set height} +command in @sc{gdb} does not generate any output; but running @emph{any} +command makes @sc{gdb} issue a new @samp{(gdb) } prompt. If there were +no @code{expect} command to match this prompt, the output @samp{(gdb) } +begins the text seen by the next @code{expect} command---which might +make @emph{that} pattern fail to match. + +To preserve basic sanity, I also recommended that no test ever pass if +there was any kind of problem in the test case. To take an extreme +case, tests that pass even when the tool will not spawn are misleading. +Ideally, a test in this sort of situation should not fail either. +Instead, print an error message by calling one of the DejaGnu procedures +@code{error} or @code{warning}. + +@node Variables +@section Special variables used by test cases +@cindex special variables + +@cindex variables for all tests +Your test cases can use these variables, with conventional meanings (as +well as the variables saved in @file{site.exp} +@pxref{Customizing,,Setting @code{runtest} defaults}): + +@quotation +@emph{These variables are available to all test cases.} +@end quotation + +@ftable @code +@item prms_id +@cindex PRMS bug number +@cindex GNATS bug number +@cindex bug number +The tracking system (e.g. @sc{gnats}) number identifying a corresponding +bugreport. (@samp{0} if you do not specify it in the test script.) + +@item bug_id +@cindex bug number, extra +An optional bug id; may reflect a bug identification from another +organization. (@samp{0} if you do not specify it.) + +@item subdir +@cindex current test subdirectory +The subdirectory for the current test case. +@end ftable + +@quotation +@emph{These variables should never be changed. They appear in most +tests.} +@end quotation + +@ftable @code +@item expect_out(buffer) +@cindex last command output +The output from the last command. This is an internal variable set by +@code{expect}. + +@item exec_output +This is the output from a @code{@var{tool}_load} command. This only +applies to tools like @sc{gcc} and @sc{gas} which produce an object +file that must in turn be executed to complete a test. + +@item comp_output +This is the output from a @code{@var{tool}_start} command. This is +conventionally used for batch oriented programs, like @sc{gcc} and +@sc{gas}, that may produce interesting output (warnings, errors) without +further interaction. +@end ftable + +@node Extending +@chapter New Tools, Targets, or Hosts + +The most common ways to extend the DejaGnu framework are: adding a suite +of tests for a new tool to be tested; adding support for testing on a +new target; and porting @code{runtest} to a new host. + +@menu +* Adding Tools:: How to add tests for a new tool +* Adding Targets:: How to add a new target +* Porting:: Porting DejaGnu to a new host +@end menu + +@node Adding Tools +@section Writing tests for a new tool + +In general, the best way to learn how to write (code or even prose) is +to read something similar. This principle applies to test cases and to +test suites. Unfortunately, well-established test suites have a way of +developing their own conventions: as test writers become more +experienced with DejaGnu and with Tcl, they accumulate more utilities, +and take advantage of more and more features of @code{expect} and Tcl in +general. + +Inspecting such established test suites may make the prospect of +creating an entirely new test suite appear overwhelming. Nevertheless, +it is quite straightforward to get a new test suite going. + +@cindex Lupton, Robert +There is one test suite that is guaranteed not to grow more elaborate +over time: both it and the tool it tests were created expressly to +illustrate what it takes to get started with DejaGnu. The +@file{example/} directory of the DejaGnu distribution contains both an +interactive tool called @code{calc}, and a test suite for it. Reading +this test suite, and experimenting with it, is a good way to supplement +the information in this section. (Thanks to Robert Lupton for creating +@code{calc} and its test suite---and also the first version of this +section of the manual!) + +To help orient you further in this task, here is an outline of the steps +to begin building a test suite for a program @var{example}. + +@enumerate +@item +Create or select a directory to contain your new collection of tests. +Change to that directory (shown here as @code{testsuite}): + +@example +eg$ cd testsuite/ +@end example + +@item +Create a @file{configure.in} file in this directory, to control +configuration-dependent choices for your tests. So far as DejaGnu is +concerned, the important thing is to set a value for the variable +@code{target_abbrev}; this value is the link to the init file you will +write soon. (For simplicity, we assume the environment is Unix, and use +@samp{unix} as the value.) + +What else is needed in @file{configure.in} depends on the requirements +of your tool, your intended test environments, and which +@code{configure} system you use. This example is a minimal +@code{configure.in} for use with Cygnus Configure. (For an alternative +based on the FSF @code{autoconf} system, see the @code{calc} example +distributed with DejaGnu.) Replace @var{example} with the name of your +program: + +@cartouche +@smallexample +# This file is a shell script fragment +# for use with Cygnus configure. + +srctrigger="@var{example}.0" +srcname="The DejaGnu @var{example} tests" + +# per-host: + +# per-target: + +# everything defaults to unix for a target +target_abbrev=unix + +# post-target: + +@end smallexample +@end cartouche + +@item +Create @file{Makefile.in}, the source file used by @code{configure} to +build your @file{Makefile}. Its leading section should as usual contain +the values that @code{configure} may override: + +@cartouche +@smallexample +srcdir = . +prefix = /usr/local + +exec_prefix = $(prefix) +bindir = $(exec_prefix)/bin +libdir = $(exec_prefix)/lib +tooldir = $(libdir)/$(target_alias) + +datadir = $(exec_prefix)/lib/dejagnu + +RUNTEST = runtest +RUNTESTFLAGS = +FLAGS_TO_PASS = + +#### host, target, site specific Makefile frags come in here. +@end smallexample +@end cartouche + +This should be followed by the standard targets at your site. To begin +with, they need not do anything---for example, these definitions will +do: + +@cartouche +@smallexample + +all: + +info: + +install-info: + +install: +uninstall: + +clean: + -rm -f *~ core *.info* + +@end smallexample +@end cartouche + +It is also a good idea to make sure your @file{Makefile} can rebuild +itself if @file{Makefile.in} changes, with a target like this (which +works for either Cygnus or FSF Configure): + +@cartouche +@smallexample +Makefile : $(srcdir)/Makefile.in $(host_makefile_frag) \ + $(target_makefile_frag) + $(SHELL) ./config.status +@end smallexample +@end cartouche + +You also need to include two targets important to DejaGnu: @code{check}, +to run the tests, and @code{site.exp}, to set up the Tcl copies of +configuration-dependent values. The @code{check} target must run +@samp{runtest --tool @var{example}}: + +@cartouche +@smallexample +check: site.exp all + $(RUNTEST) $(RUNTESTFLAGS) $(FLAGS_TO_PASS) \ + --tool @var{example} --srcdir $(srcdir) +@end smallexample +@end cartouche + +The @code{site.exp} target should usually set up (among other things!) a +Tcl variable for the name of your program: + +@cartouche +@smallexample +site.exp: ./config.status Makefile + @@echo "Making a new config file..." + -@@rm -f ./tmp? + @@touch site.exp + + -@@mv site.exp site.bak + @@echo "## these variables are automatically\ + generated by make ##" > ./tmp0 + @@echo "# Do not edit here. If you wish to\ + override these values" >> ./tmp0 + @@echo "# add them to the last section" >> ./tmp0 + @@echo "set host_os $@{host_os@}" >> ./tmp0 + @@echo "set host_alias $@{host_alias@}" >> ./tmp0 + @@echo "set host_cpu $@{host_cpu@}" >> ./tmp0 + @@echo "set host_vendor $@{host_vendor@}" >> ./tmp0 + @@echo "set target_os $@{target_os@}" >> ./tmp0 + @@echo "set target_alias $@{target_alias@}" >> ./tmp0 + @@echo "set target_cpu $@{target_cpu@}" >> ./tmp0 + @@echo "set target_vendor $@{target_vendor@}" >> ./tmp0 + @@echo "set host_triplet $@{host_canonical@}" >> ./tmp0 + @@echo "set target_triplet $@{target_canonical@}">>./tmp0 + @@echo "set tool binutils" >> ./tmp0 + @@echo "set srcdir $@{srcdir@}" >> ./tmp0 + @@echo "set objdir `pwd`" >> ./tmp0 + @@echo "set @var{examplename} @var{example}" >> ./tmp0 + @@echo "## All variables above are generated by\ + configure. Do Not Edit ##" >> ./tmp0 + @@cat ./tmp0 > site.exp + @@sed < site.bak \ + -e '1,/^## All variables above are.*##/ d' \ + >> site.exp + -@@rm -f ./tmp? +@end smallexample +@end cartouche + +@item +Create a directory (in @file{testsuite/}) called @file{config/}: + +@example +eg$ mkdir config +@end example + +@item +Make an init file in this directory; its name must start with the +@code{target_abbrev} value, so call it @file{config/unix.exp}. +This is the file that contains the target-dependent procedures; +fortunately, most of them do not have to do very much in order for +@code{runtest} to run. + +If @var{example} is not interactive, you can get away with this minimal +@file{unix.exp} to begin with: + +@cartouche +@smallexample +proc foo_exit @{@} @{@} +proc foo_version @{@} @{@} +@end smallexample +@end cartouche + +If @var{example} is interactive, however, you might as well define a +start routine @emph{and invoke it} by using an init file like this: + +@cartouche +@smallexample +proc foo_exit @{@} @{@} +proc foo_version @{@} @{@} + +proc foo_start @{@} @{ + global @var{examplename} + spawn $@var{examplename} + expect @{ + -re "" @{@} + @} +@} +foo_start +@end smallexample +@end cartouche + +@item +Create a directory whose name begins with your tool's name, to contain +tests: + +@example +eg$ mkdir @var{example}.0 +@end example + +@item +Create a sample test file in @file{@var{example}.0}. Its name must end +with @samp{.exp}; you can use @samp{first-try.exp} To begin with, just +write there a line of Tcl code to issue a message: + +@cartouche +@smallexample +send_user "Testing: one, two...\n" +@end smallexample +@end cartouche + +@item +Back in the @file{testsuite/} (top level) directory, run + +@example +eg$ configure +@end example + +(You may have to specify more of a path, if a suitable @code{configure} +is not available in your execution path.) + +@item +You are now ready to triumphantly type @samp{make check} or +@samp{runtest --tool @var{example}}. You should see something like this: + +@cartouche +@smallexample +Test Run By rhl on Fri Jan 29 16:25:44 EST 1993 + + === @var{example} tests === + +Running ./@var{example}.0/first-try.exp ... +Testing: one, two... + + === @var{example} Summary === + +@end smallexample +@end cartouche + +There is no output in the summary, because so far the example does not +call any of the procedures that establish a test outcome. + +@item +Begin writing some real tests. For an interactive tool, you should +probably write a real exit routine in fairly short order; in any case, +you should also write a real version routine soon. +@end enumerate + +@node Adding Targets +@section Adding a target +@cindex adding a target + +DejaGnu has some additional requirements for target support, beyond the +general-purpose provisions of Cygnus @code{configure}. @code{runtest} +must actively communicate with the target, rather than simply generating +or managing code for the target architecture. Therefore, each tool +requires an initialization module for each target. For new targets, you +must supply a few Tcl procedures to adapt DejaGnu to the target. This +permits DejaGnu itself to remain target independent. @xref{Init +Module,,Initialization module}, for a discussion of the naming +conventions that enable DejaGnu to locate and use init files. + +Usually the best way to write a new initialization module is to edit an +existing initialization module; some trial and error will be required. +If necessary, you can use the @samp{--debug} option to see what +is really going on. + +When you code an initialization module, be generous in printing +information controlled by the @code{verbose} procedure (@pxref{DejaGnu +Builtins, DejaGnu procedures}). + +Most of the work is in getting the communications right. Communications +code (for several situations involving IP networks or serial lines) is +available in a DejaGnu library file, @file{lib/remote.exp}. +@xref{DejaGnu Builtins,,DejaGnu Builtins}. + +@c FIXME! Say something about Tcl debugger here. +If you suspect a communication problem, try running the connection +interactively from @code{expect}. (There are three ways of running +@code{expect} as an interactive interpreter. You can run @code{expect} +with no arguments, and control it completely interactively; or you can +use @samp{expect -i} together with other command-line options and +arguments; or you can run the command @code{interpreter} from any +@code{expect} procedure. Use @code{return} to get back to the calling +procedure (if any), or @code{return -tcl} to make the calling procedure +itself return to its caller; use @code{exit} or end-of-file to leave +@code{expect} altogether.) Run the program whose name is recorded in +@samp{$connectmode}, with the arguments in @samp{$targetname}, to +establish a connection. You should at least be able to get a prompt +from any target that is physically connected. + +@node Porting +@section Porting to a new host +@cindex porting to a new host + +The task of porting DejaGnu is basically that of porting Tcl and +@code{expect}. Tcl and @code{expect}, as distributed with DejaGnu, both +use @code{autoconf}; they should port automatically to most Unix +systems. + +Once Tcl and @code{expect} are ported, DejaGnu should run. Most system +dependencies are taken care of by using @code{expect} as the main +command shell. + +@node Installation +@appendix Installing DejaGnu + +@cindex host, explained +@cindex target, explained +@cindex DejaGnu configuration +@cindex configuring DejaGnu +Once you have the DejaGnu source unpacked and available, you must first +configure the software to specify where it is to run (and the associated +defaults); then you can proceed to installing it. + +@menu +* Configuring DejaGnu:: +* Installing DejaGnu:: +@end menu + +@node Configuring DejaGnu +@section Configuring the DejaGnu test driver + +It is usually best to configure in a directory separate +from the source tree, specifying where to find the source with the +optional @samp{--srcdir} option to @code{configure}. DejaGnu uses the +GNU @code{autoconf} to configure itself. For more info on using +autoconf, read the GNU autoconf manual. To configure, execute the +@file{configure} program, no other options are required. For an example, +to configure in a seperate tree for objects, execute the configure +script from the source tree like this: + +@smallexample +../dejagnu-1.3/configure +@end smallexample + +DejaGnu doesn't care at config time if it's for testing a native system +or a cross system. That is determined at runtime by using the config +files. + +@cindex @code{prefix}, configure options +@cindex @code{exec_prefix}, configure options. +You may also want to use the @code{configure} option @samp{--prefix} to +specify where you want DejaGnu and its supporting code installed. By +default, installation is in subdirectories of @file{/usr/local}, but you +can select any alternate directory @var{altdir} by including +@samp{--prefix=@var{altdir}} on the @code{configure} command line. +(This value is captured in the Makefile variables @code{prefix} +and @code{exec_prefix}.) + +@cindex auxiliary programs +@cindex test suite distributions +@cindex @code{make} builds part of tests +Save for a small number of example tests, the DejaGnu distribution +itself does not include any test suites; these are available separately. +Test suites for the @sc{gnu} compiler (testing both GCC and G++) and for +the @sc{gnu} binary utilities are distributed in parallel with the +DejaGnu distribution (but packaged as separate files). The test suite +for the @sc{gnu} debugger is distributed in parallel with each release +of GDB itself, starting with GDB 4.9. After configuring the top-level +DejaGnu directory, unpack and configure the test directories for the +tools you want to test; then, in each test directory, run @code{make} to +build auxiliary programs required by some of the tests. + +@node Installing DejaGnu +@section Installing DejaGnu + +@cindex installing DejaGnu +To install DejaGnu in your filesystem (either in @file{/usr/local}, or +as specified by your @samp{--prefix} option to @code{configure}), execute + +@example +eg$ make install +@end example + +@noindent +@samp{make install} does these things for DejaGnu: + +@enumerate +@item +Look in the path specified for executables (@file{$exec_prefix}) for +directories called @file{lib} and @file{bin}. If these directories do +not exist, @samp{make install} creates them. + +@item +Create another directory in the @file{lib} directory, called +@file{dejagnu}. + +@item +Copy the @code{runtest} shell script into @file{$exec_prefix/bin}. + +@item +Copy all the library files (used to support the framework) into +@file{$exec_prefix/lib/dejagnu}. + +@item +Copy @file{runtest.exp} into @file{$exec_prefix/lib/dejagnu}. This is +the main Tcl code implementing DejaGnu. + +@end enumerate + +Each test suite collection comes with simple installation instructions +in a @file{README} file; in general, the test suites are designed to be +unpacked in the source directory for the corresponding tool, and extract +into a directory called @file{testsuite}. + +@node Index +@unnumbered Index + +@printindex cp + +@contents + +@bye diff --git a/contrib/bluegnu2.0.3/doc/notice.html b/contrib/bluegnu2.0.3/doc/notice.html new file mode 100644 index 0000000..4c59360 --- /dev/null +++ b/contrib/bluegnu2.0.3/doc/notice.html @@ -0,0 +1,395 @@ + + + + +Release NoticeBlueGnu Testing Framework +Version 2.0.3 + + + + + + + + + +next +up +previous
+

+ + + +

+ +

+

Release Notice +
+BlueGnu Testing Framework +
+Version 2.0.3

+

Jan-Willem Neurdenburg +
+jotOmega dsc +
+56 Brigham Hill Road +
+Grafton MA  01519-1135 +
+neurdenburgj@acm.org +
+Tel: (508) 839-0276 +
+Fax: (508) 839-7267

+

+ +

+ +

+Introduction +

+BlueGnu is a framework for testing other programs. It has been created +to be compatible with DejaGnu. Its purpose is to provide a single +front end for all tests. Beyond this, BlueGnu offers several +advantages for testing: + +

+

    +

    +

  • The flexibility and consistency of the BlueGnu framework makes it +easy to write tests for any program, with the exception of GUI +applications. + +

    +

  • BlueGnu provides a layer of abstraction, which makes all tests +(if correctly written) portable to any host or target where a program +must be tested. + +

    +

  • BlueGnu is written in [incr Tcl], which in turn is based on Tcl +(Tool Command Language). The framework comprises two parts: +
    +
    1. +
    the testing framework, +
    2. +
    the test-suites or test-sets themselves. +
    +

    +

  • BlueGnu will work with any Tcl based interpreter as long as +[incr Tcl] has been included. You can include 'expect', 'Tk', and/or +other extensions. + +

    +

  • Includes DejaGnu release 1.6 + +

    +

+

+ +

+Requirements +

+The following modules should have been installed, before you can +install and/or use BlueGnu: + +

+

    +
  • Tcl release 8.0 or higher, +
  • incr Tcl release 3.0 or higher. +
+

+Any other extensions that is compatible with Tcl release 8.0 can be used +as well. + +

+ +

+Structure and Contents of the Release +

+ +

+The root directory of the release contains the README files with +installation instructions and the files needed to build and install +this product. It also contains the executable scripts of the +BlueGnu testing framework. + +

+The top-level directories are listed below: + +

+

+
lib: +
the packages and procedures that make the BlueGnu and +DejaGnu testing framework. This also includes the default target +definition files. +

+

testsets: +
the BlueGnu test-suites and test examples. It contains +the following subdirectories. + +

+

+
BlueGnu: +
test scripts to test the testing framework itself. +

+

examples: +
test suite and test script examples. + +

+

config, lib, tools: +
currently empty, but can be used for +test-set dependent configuration files, library files, and tools. +
+

+

config: +
currently empty. + +

+

doc: +
the DejaGnu texinfo source and the documentation in +'info', 'dvi', 'ps', and 'pdf' representation, respectively +dejagnu.info*, dejagnu.dvi, dejagnu.ps, and dejagnu.pdf. A DejaGnu man +page is also available. + +

+It also contains +the TEX version (README.tex) of this document as well as the 'dvi', 'ps' +'html', and 'pdf' representation, respectively notice.dvi, notice.ps, +notice.html, and notice.pdf. + +

+

testsuite: +
contains a mixture of DejaGnu and BlueGnu test +scripts. + +

+

contrib: +
contains examples how DejaGnu is used at Cygnus. + +

+

example: +
contains a full DejaGnu test framework example for testing the program 'calc' which is also included. + +

+

+

+ +

+Installation and use under Unix +

+ +

+Before you can install and use BlueGnu you need to have installed the +following three packages: +

    +
  • Tcl version 8.0.3 +
  • Tk version 8.0.3 +
  • incr Tcl version 3.0.1 +
The source for these packages should all be located in one directory. +The subdirectory in the directory should be: +
    +
  • tcl8.0.3 +
  • tk8.0.3 +
  • itcl3.0.1 +
+

+The following examples use the command `./configure +-prefix=/tools/...`. This will install all packages in a directory +``/tools''. When you omit the ``-prefix''-switch then the +installation default will be the directory ``/usr/local''. + +

+ +

+Installation of needed Packages +

+ +

+When you have not installed Tcl and the other needed extensions, then +you need to retrieve the sources from ``www.tcltk.com/itcl''. You need +to `gunzip` the files and do a `tar xf` of all these packages in one +directory, let's call this directory ``TclTk''. + +

+From the directory ``TclTk'', you should do the following to install +the packages: + +

+

+% cd tcl8.0.3/unix
+% ./configure --prefix=/tools/tcl8.0.3 --enable-gcc --enable-shared
+% make
+% mkdir /tools/tcl8.0.3
+% make install
+% cd ../../tk8.0.3/unix
+% ./configure --prefix=/tools/tk8.0.3 --enable-gcc --enable-shared
+% make
+% mkdir /tools/tk8.0.3
+% make install
+% cd ../../itcl3.0.1
+% ./configure --prefix=/tools/itcl3.0.1 --enable-gcc --enable-shared
+% make
+% mkdir /tools/itcl3.0.1
+% make install
+
+

+ +

+Installing BlueGnu +

+You can now `gunzip` and `tar xf` the BlueGnu version 2.0.3 in the +directory ``TckTk''. This will create the directory +``bluegnu2.0.3''. Now do the following: + +

+

+% cd bluegnu2.0.3
+% ./configure --prefix=/tools/bluegnu2.0.3
+% make
+% mkdir /tools/bluegnu2.0.3
+% make install
+
+

+This will install BlueGnu in the directories: +

    +
  • /tools/bluegnu2.0.3/bin +
  • /tools/bluegnu2.0.3/lib/bluegnu +
  • /tools/bluegnu2.0.3/info +
  • /tools/bluegnu2.0.3/man +
+

+ +

+Using BlueGnu +

+When you have installed [incr Tcl] and BlueGnu and you have the +respective ``bin'' directories in your PATH variable, then you can +start running some tests. You can go into the BlueGnu source directory +``bluegnu2.0.3/testsets/examples'' and run the following: + +

+

+% bluegnu versionTcl.itcl
+% bluegnu ts_001
+% bluegnu ts_002
+% bluegnu ts_003
+
+

+The above test result should all be PASS. The following test will give +a result UNKNOWN, because no pass/fail instruction have been given. + +

+

+% bluegnu tc001
+
+

+The last test you can run will fail in its simple form: + +

+

+% bluegnu tc002
+
+

+But will pass if you execute the test as follows: + +

+

+% bluegnu tc002[English]
+
+

+This is because the test scripts need a test case identifier to find +the correct benchmark code. + +

+ +

+Changes +

+ +

+Version 2.0.3 +

+This being the first public release it is not to useful to list all +the changes. BlueGnu has been modeled after DejaGnu and is a complete +new implementation which has been tested thoroughly. When +documentation is being written more changes will be made. An example +of some of these changes as a result of this documentation effort can +be found in the test-suites ts_001, ts_002, and +ts_003. The first two are not as easy to write as the +third. The test suite ts_001 is a script implementation of the +command line: +
+% cd bluegnu2.0.3/testsets
+% bluegnu examples/tc002[English=B] \
+> "examples/tc002[Dutch=B]={MSG=Hallo Wereld}"
+
This may be useful for simple tests but when you want to write more +complex test-suite scripts you would like some more flexibility, so two +procedures were introduced, which are shown in test-suite ts_002. This +makes writing rather complex so the procedures have become part of +the procedures 'appendQueue', 'prependQueue', and 'runtest'. The +resulting script is shown in test-suit ts_003. + +

+Changes like this will be made in the future! + +

+ +

+Future Enhancements +

+The following enhancements are being planned: +
    +
  • Target code will be made into a class with methods 'start', +'load', 'exit', and 'version'. Instead of the current +'<target>_start', '<target>_load', '<target>_exit', and +'<target>_version', which have been taken from DejaGnu. + +

    +

  • Procedures will be created that make it easy to test WEB +application from the framework. + +

    +

  • Other enhancements will be made depending on the use of the +framework in testing different applications. +
+

+ About this document ... +

+ Release Notice +
+BlueGnu Testing Framework +
+Version 2.0.3

+This document was generated using the +LaTeX2HTML translator Version 98.1p1 release (March 2nd, 1998) +

+Copyright © 1993, 1994, 1995, 1996, 1997, +Nikos Drakos, +Computer Based Learning Unit, University of Leeds. +

+The command line arguments were:
+ latex2html -t BlueGnu Release Notice -split 0 READMEdvi.tex. +

+The translation was initiated by Jan-Willem Neurdenburg on 1999-09-19


+next +up +previous
+ + +
+Jan-Willem Neurdenburg
+1999-09-19
+
+ + diff --git a/contrib/bluegnu2.0.3/doc/notice.pdf b/contrib/bluegnu2.0.3/doc/notice.pdf new file mode 100644 index 0000000..52645f4 --- /dev/null +++ b/contrib/bluegnu2.0.3/doc/notice.pdf @@ -0,0 +1,1165 @@ +%PDF-1.2 +8 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.19 +/Ascent 694.44 +/Descent -194.51 +/Flags 4 +/FontBBox [-232 -250 945 963] +/FontName /CMR17 +/ItalicAngle 0 +/XHeight 430 +/StemV 80 +/FontFile 7 0 R +>> +endobj +9 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F1 +/FontDescriptor 8 0 R +/BaseFont /BHYBSB+CMR17 +/FirstChar 0 +/LastChar 127 +/Widths [575.97 772.08 719.84 641.07 615.35 693.31 667.59 719.84 667.59 719.84 667.59 +525.41 499.29 499.29 748.93 748.93 249.64 275.77 458.62 458.62 458.62 458.62 458.62 +693.31 406.37 458.62 667.59 719.84 458.62 837.18 941.67 719.84 249.64 249.64 458.62 +772.08 458.62 772.08 719.84 249.64 354.13 354.13 458.62 719.84 249.64 301.89 249.64 +458.62 458.62 458.62 458.62 458.62 458.62 458.62 458.62 458.62 458.62 458.62 249.64 +249.64 249.64 719.84 432.5 432.5 719.84 693.31 654.33 667.59 706.58 628.21 602.09 +726.27 693.31 327.61 471.48 719.44 575.97 850.05 693.31 719.84 628.21 719.84 680.45 +510.86 667.59 693.31 693.31 954.53 693.31 693.31 563.11 249.64 458.62 249.64 458.62 +249.64 249.64 458.62 510.86 406.37 510.86 406.37 275.77 458.62 510.86 249.64 275.77 +484.74 249.64 772.08 510.86 458.62 510.86 484.74 354.13 359.36 354.13 510.86 484.74 +667.59 484.74 484.74 406.37 458.62 917.24 458.62 458.62 458.62] +>> +endobj +11 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -194.44 +/Flags 4 +/FontBBox [-246 -251 988 968] +/FontName /CMR12 +/ItalicAngle 0 +/XHeight 431 +/StemV 80 +/FontFile 10 0 R +>> +endobj +12 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F2 +/FontDescriptor 11 0 R +/BaseFont /JUQUTE+CMR12 +/FirstChar 0 +/LastChar 127 +/Widths [611.8 815.96 761.57 679.62 652.77 734.02 707.17 761.57 707.17 761.57 707.17 +571.17 543.98 543.98 815.96 815.96 271.99 299.19 489.58 489.58 489.58 489.58 489.58 +734.02 435.18 489.58 707.17 761.57 489.58 883.79 992.58 761.57 271.99 271.99 489.58 +815.96 489.58 815.96 761.57 271.99 380.78 380.78 489.58 761.57 271.99 326.39 271.99 +489.58 489.58 489.58 489.58 489.58 489.58 489.58 489.58 489.58 489.58 489.58 271.99 +271.99 271.99 761.57 462.38 462.38 761.57 734.02 693.4 707.17 747.79 666.2 639 768.28 +734.02 353.24 503.01 761.22 611.8 897.21 734.02 761.57 666.2 761.57 720.6 543.98 +707.17 734.02 734.02 1006.01 734.02 734.02 598.37 271.99 489.58 271.99 489.58 271.99 +271.99 489.58 543.98 435.18 543.98 435.18 299.19 489.58 543.98 271.99 299.19 516.78 +271.99 815.96 543.98 489.58 543.98 516.78 380.78 386.22 380.78 543.98 516.78 707.17 +516.78 516.78 435.18 489.58 979.16 489.58 489.58 489.58] +>> +endobj +14 0 obj +<< +/Type /FontDescriptor +/CapHeight 686.11 +/Ascent 694.44 +/Descent -194.44 +/Flags 4 +/FontBBox [-296 -251 1139 946] +/FontName /CMBX12 +/ItalicAngle 0 +/XHeight 444 +/StemV 80 +/FontFile 13 0 R +>> +endobj +15 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F3 +/FontDescriptor 14 0 R +/BaseFont /PRPCHF+CMBX12 +/FirstChar 0 +/LastChar 127 +/Widths [675.93 937.5 875 787.04 750 879.63 812.5 875 812.5 875 812.5 656.25 625 +625 937.5 937.5 312.5 343.75 562.5 562.5 562.5 562.5 562.5 849.54 500 574.07 812.5 +875 562.5 1018.52 1143.52 875 312.5 342.59 581.02 937.5 562.5 937.5 875 312.5 437.5 +437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 +562.5 562.5 312.5 312.5 342.59 875 531.25 531.25 875 849.54 799.77 812.5 862.27 738.43 +707.18 884.26 879.63 418.98 581.02 880.79 675.93 1067.13 879.63 844.91 768.52 844.91 +839.12 625 782.41 864.58 849.54 1162.04 849.54 849.54 687.5 312.5 581.02 312.5 562.5 +312.5 312.5 546.88 625 500 625 513.31 343.75 562.5 625 312.5 343.75 593.75 312.5 +937.5 625 562.5 625 593.75 459.49 443.75 437.5 625 593.75 812.5 593.75 593.75 500 +562.5 1125 562.5 562.5 562.5] +>> +endobj +17 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -960 +/Flags 68 +/FontBBox [-29 -960 1116 775] +/FontName /CMSY10 +/ItalicAngle -14 +/XHeight 431 +/StemV 80 +/FontFile 16 0 R +>> +endobj +18 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F4 +/FontDescriptor 17 0 R +/BaseFont /MYFBJI+CMSY10 +/FirstChar 0 +/LastChar 127 +/Widths [777.78 277.78 777.78 500 777.78 500 777.78 777.78 777.78 777.78 777.78 777.78 +777.78 1000 500 500 777.78 777.78 777.78 777.78 777.78 777.78 777.78 777.78 777.78 +777.78 777.78 777.78 1000 1000 777.78 777.78 1000 1000 500 500 1000 1000 1000 777.78 +1000 1000 611.11 611.11 1000 1000 1000 777.78 275 1000 666.67 666.67 888.89 888.89 +0 0 555.56 555.56 666.67 500 722.22 722.22 777.78 777.78 611.11 798.47 656.81 526.53 +771.39 527.78 718.75 594.87 844.52 544.52 677.78 761.95 689.72 1200.9 820.49 796.11 +695.56 816.67 847.5 605.56 544.64 625.83 612.78 987.78 713.3 668.34 724.73 666.67 +666.67 666.67 666.67 666.67 611.11 611.11 444.45 444.45 444.45 444.45 500 500 388.89 +388.89 277.78 500 500 611.11 500 277.78 833.34 750 833.34 416.67 666.67 666.67 777.78 +777.78 444.45 444.45 444.45 611.11 777.78 777.78 777.78 777.78] +>> +endobj +20 0 obj +<< +/Length 2396 +>> +stream +0 w 0 g 0 G BT/F1 20.66 Tf 172.82 -114.07 TD[(Release)-301(Notice)]TJ -58.8 -24.91 TD[(BlueGn)26(u)-301(T)77(esting)-301(F)78(ramew)26(ork)]TJ 66.1 -24.91 TD[(V)78(ersion)-301(2.0.3)]TJ/F2 14.35 Tf -24.54 -35.49 TD[(Jan-Willem)-326(Neurden)26(burg)]TJ 35.56 -17.93 TD[(jotOmega)-326(dsc)]TJ -25.71 -17.93 TD[(56)-326(Brigham)-326(Hill)-327(Road)]TJ -9.02 -17.94 TD[(Grafton)-326(MA)-653(01519-1135)]TJ 6.28 -17.93 TD[(neurden)27(burg)-26(j@acm.org)]TJ 10.54 -17.93 TD[(T)81(el:)-434(\(508\))-326(839-0276)]TJ -1.66 -17.93 TD[(F)81(ax:)-434(\(508\))-326(839-7267)]TJ 1.47 -28.05 TD[(Septem)27(b)-26(er)-327(19,)-326(1999)]TJ/F3 17.22 Tf -134.19 -52.4 TD[(1)-1124(In)30(tro)-30(duction)]TJ/F2 11.96 Tf 0 -26.28 TD[(BlueGn)27(u)-356(is)-356(a)-356(framew)26(ork)-355(for)-356(testing)-357(other)-356(programs.)-525(It)-356(has)-356(b)-27(een)-357(created)-356(to)]TJ 0 -14.45 TD[(b)-27(e)-300(compatible)-301(with)-301(DejaGn)26(u.)-425(Its)-301(purp)-27(ose)-301(is)-301(to)-301(pro)27(vide)-300(a)-301(single)-301(fron)26(t)-299(end)-301(for)]TJ 0 -14.44 TD[(all)-326(tests.)-435(Bey)26(ond)-325(this,)-327(BlueGn)27(u)-326(o\013ers)-326(sev)26(eral)-325(adv)53(an)27(tages)-325(for)-327(testing:)]TJ/F4 11.96 Tf 17.44 -26.97 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(The)-245(\015exibilit)26(y)-245(and)-246(consistency)-245(of)-246(the)-246(BlueGn)26(u)-245(framew)27(ork)-245(mak)26(es)-245(it)-246(easy)]TJ 0 -14.45 TD[(to)-283(write)-284(tests)-284(for)-284(an)27(y)-283(program,)-293(with)-283(the)-284(exception)-284(of)-284(GUI)-283(applications.)]TJ/F4 11.96 Tf -11.83 -24.3 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(BlueGn)27(u)-333(pro)26(vides)-333(a)-334(la)26(y)27(er)-333(of)-334(abstraction,)-336(whic)26(h)-333(mak)26(es)-333(all)-334(tests)-334(\(if)-334(cor-)]TJ 0 -14.45 TD[(rectly)-389(written\))-389(p)-28(ortable)-389(to)-390(an)27(y)-389(host)-389(or)-390(target)-389(where)-390(a)-389(program)-389(m)26(ust)]TJ 0 -14.44 TD[(b)-27(e)-326(tested.)]TJ/F4 11.96 Tf -11.83 -24.3 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(BlueGn)27(u)-376(is)-377(written)-377(in)-377([incr)-376(Tcl],)-390(whic)26(h)-375(in)-377(turn)-377(is)-377(based)-377(on)-376(Tcl)-377(\(T)80(o)-26(ol)]TJ 0 -14.45 TD[(Command)-326(Language\).)-435(The)-326(framew)26(ork)-326(comprises)-326(t)26(w)27(o)-325(parts:)]TJ 10.79 -24.3 TD[(1.)-489(the)-326(testing)-327(framew)26(ork,)]TJ 151.29 -29.89 TD[(1)]TJ ET 0 g 0 G +endstream +endobj +22 0 obj +<< +/F1 9 0 R +/F2 12 0 R +/F3 15 0 R +/F4 18 0 R +>> +endobj +6 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 22 0 R +>> +endobj +25 0 obj +<< +/Length 3301 +>> +stream +0 w 0 g 0 G BT/F2 11.96 Tf 78.91 -65.75 TD[(2.)-489(the)-326(test-suites)-327(or)-326(test-sets)-327(themselv)27(es.)]TJ/F4 11.96 Tf -22.62 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(BlueGn)27(u)-313(will)-314(w)26(ork)-313(with)-314(an)26(y)-313(Tcl)-314(based)-314(in)26(terpreter)-313(as)-314(long)-314(as)-314([incr)-315(Tcl])]TJ 0 -14.45 TD[(has)-301(b)-27(een)-301(included.)-427(Y)81(ou)-300(can)-302(include)-301('exp)-27(ect',)-306('Tk',)-306(and/or)-302(other)-301(exten-)]TJ 0 -14.44 TD[(sions.)]TJ/F4 11.96 Tf -11.83 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(Includes)-326(DejaGn)26(u)-325(release)-326(1.6)]TJ/F3 17.22 Tf -29.27 -39.94 TD[(2)-1124(Requiremen)30(ts)]TJ/F2 11.96 Tf 0 -26.28 TD[(The)-467(follo)26(wing)-466(mo)-27(dules)-467(should)-468(ha)26(v)28(e)-467(b)-27(een)-467(installed,)-503(b)-27(efore)-467(y)26(ou)-466(can)-468(install)]TJ 0 -14.45 TD[(and/or)-326(use)-326(BlueGn)26(u:)]TJ/F4 11.96 Tf 17.44 -27.39 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(Tcl)-326(release)-326(8.0)-327(or)-326(higher,)]TJ/F4 11.96 Tf -11.83 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(incr)-326(Tcl)-326(release)-327(3.0)-326(or)-326(higher.)]TJ -11.71 -27.4 TD[(An)27(y)-310(other)-310(extensions)-310(that)-311(is)-310(compatible)-310(with)-311(Tcl)-310(release)-310(8.0)-311(can)-310(b)-27(e)-311(used)]TJ -17.56 -14.45 TD[(as)-326(w)26(ell.)]TJ/F3 17.22 Tf 0 -39.93 TD[(3)-1124(Structure)-375(and)-375(Con)30(ten)31(ts)-374(of)-375(the)-375(Release)]TJ/F2 11.96 Tf 0 -26.28 TD[(The)-235(ro)-27(ot)-235(directory)-236(of)-235(the)-235(release)-235(con)26(tains)-235(the)-235(README)-235(\014les)-235(with)-236(installation)]TJ 0 -14.45 TD[(instructions)-407(and)-407(the)-408(\014les)-407(needed)-408(to)-407(build)-408(and)-407(install)-407(this)-408(pro)-27(duct.)-678(It)-408(also)]TJ 0 -14.45 TD[(con)27(tains)-326(the)-326(executable)-326(scripts)-327(of)-326(the)-327(BlueGn)27(u)-326(testing)-326(framew)26(ork.)]TJ 17.56 -14.44 TD[(The)-326(top-lev)26(el)-325(directories)-326(are)-327(listed)-326(b)-27(elo)26(w:)]TJ/F3 11.96 Tf -17.56 -27.4 TD[(lib:)]TJ/F2 11.96 Tf 24.54 0 TD[(the)-275(pac)26(k)54(ages)-274(and)-276(pro)-27(cedures)-276(that)-276(mak)26(e)-274(the)-276(BlueGn)26(u)-275(and)-275(DejaGn)26(u)-275(test-)]TJ 4.73 -14.44 TD[(ing)-326(framew)26(ork.)-434(This)-326(also)-327(includes)-326(the)-326(default)-327(target)-326(de\014nition)-327(\014les.)]TJ/F3 11.96 Tf -29.27 -24.41 TD[(testsets:)]TJ/F2 11.96 Tf 53.47 0 TD[(the)-298(BlueGn)26(u)-298(test-suites)-299(and)-298(test)-299(examples.)-426(It)-299(con)26(tains)-298(the)-298(follo)26(w-)]TJ -24.2 -14.45 TD[(ing)-326(sub)-27(directories.)]TJ/F3 11.96 Tf 0 -27.4 TD[(BlueGn)31(u:)]TJ/F2 11.96 Tf 61.64 0 TD[(test)-326(scripts)-326(to)-327(test)-326(the)-326(testing)-327(framew)26(ork)-325(itself.)]TJ/F3 11.96 Tf -61.64 -19.42 TD[(examples:)]TJ/F2 11.96 Tf 63.22 0 TD[(test)-326(suite)-326(and)-327(test)-326(script)-326(examples.)]TJ/F3 11.96 Tf -63.22 -19.43 TD[(con\014g,)-375(lib,)-375(to)-31(ols:)]TJ/F2 11.96 Tf 103.44 0 TD[(curren)27(tly)-402(empt)26(y)82(,)-421(but)-403(can)-403(b)-27(e)-403(used)-403(for)-403(test-set)-403(de-)]TJ -77.69 -14.45 TD[(p)-27(enden)26(t)-325(con\014guration)-326(\014les,)-327(library)-326(\014les,)-326(and)-327(to)-27(ols.)]TJ 136.33 -41.41 TD[(2)]TJ ET 0 g 0 G +endstream +endobj +26 0 obj +<< +/F2 12 0 R +/F4 18 0 R +/F3 15 0 R +>> +endobj +24 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 26 0 R +>> +endobj +29 0 obj +<< +/Length 3404 +>> +stream +0 w 0 g 0 G BT/F3 11.96 Tf 38.85 -65.75 TD[(con\014g:)]TJ/F2 11.96 Tf 43.96 0 TD[(curren)27(tly)-326(empt)27(y)81(.)]TJ/F3 11.96 Tf -43.96 -24.41 TD[(do)-31(c:)]TJ/F2 11.96 Tf 30.14 0 TD[(the)-275(DejaGn)26(u)-275(texinfo)-275(source)-276(and)-275(the)-276(do)-27(cumen)26(tation)-275(in)-275('info',)-286('dvi',)-286('ps',)]TJ -0.87 -14.45 TD[(and)-426('p)-28(df)-69(')-427(represen)26(tation,)-451(resp)-27(ectiv)26(ely)-426(dejagn)26(u.info*,)-451(dejagn)26(u.dvi,)-451(de-)]TJ 0 -14.44 TD[(jagn)27(u.ps,)-326(and)-326(dejagn)26(u.p)-26(df.)-435(A)-327(DejaGn)27(u)-326(man)-326(page)-327(is)-326(also)-326(a)26(v)54(ailable.)]TJ 0 -19.43 TD[(It)-375(also)-375(con)26(tains)-374(the)-376(T)]TJ 111.07 -2.57 TD[(E)]TJ 6.5 2.57 TD[(X)-375(v)26(ersion)-374(\(README.tex\))-375(of)-376(this)-375(do)-27(cumen)26(t)-374(as)]TJ -117.57 -14.45 TD[(w)27(ell)-340(as)-340(the)-341('dvi',)-343('ps')-341('h)26(tml',)-343(and)-340('p)-27(df)-70(')-340(represen)26(tation,)-343(resp)-27(ectiv)26(ely)-339(no-)]TJ 0 -14.44 TD[(tice.dvi,)-326(notice.ps,)-326(notice.h)26(tml,)-325(and)-327(notice.p)-27(df.)]TJ/F3 11.96 Tf -29.27 -24.41 TD[(testsuite:)]TJ/F2 11.96 Tf 59.38 0 TD[(con)27(tains)-326(a)-326(mixture)-326(of)-327(DejaGn)26(u)-325(and)-326(BlueGn)26(u)-326(test)-326(scripts.)]TJ/F3 11.96 Tf -59.38 -24.41 TD[(con)31(trib:)]TJ/F2 11.96 Tf 51.33 0 TD[(con)27(tains)-326(examples)-326(ho)26(w)-325(DejaGn)26(u)-325(is)-327(used)-326(at)-327(Cygn)27(us.)]TJ/F3 11.96 Tf -51.33 -24.41 TD[(example:)]TJ/F2 11.96 Tf 57.92 0 TD[(con)27(tains)-384(a)-386(full)-385(DejaGn)26(u)-384(test)-385(framew)26(ork)-384(example)-385(for)-385(testing)-386(the)]TJ -28.65 -14.44 TD[(program)-326('calc')-326(whic)26(h)-325(is)-327(also)-326(included.)]TJ/F3 17.22 Tf -29.27 -39.94 TD[(4)-1124(Installation)-375(and)-375(use)-375(under)-375(Unix)]TJ/F2 11.96 Tf 0 -26.28 TD[(Before)-370(y)26(ou)-369(can)-371(install)-370(and)-371(use)-370(BlueGn)26(u)-369(y)26(ou)-370(need)-370(to)-371(ha)27(v)27(e)-370(installed)-370(the)-371(fol-)]TJ 0 -14.45 TD[(lo)27(wing)-326(three)-326(pac)26(k)55(ages:)]TJ/F4 11.96 Tf 17.44 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(Tcl)-326(v)26(ersion)-325(8.0.3)]TJ/F4 11.96 Tf -11.83 -24.4 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(Tk)-326(v)26(ersion)-325(8.0.3)]TJ/F4 11.96 Tf -11.83 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(incr)-326(Tcl)-326(v)26(ersion)-325(3.0.1)]TJ -29.27 -24.41 TD[(The)-410(source)-410(for)-410(these)-410(pac)26(k)55(ages)-410(should)-410(all)-410(b)-27(e)-410(lo)-27(cated)-410(in)-411(one)-410(directory)81(.)-686(The)]TJ 0 -14.45 TD[(sub)-27(directory)-326(in)-326(the)-327(directory)-326(should)-327(b)-27(e:)]TJ/F4 11.96 Tf 17.44 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(tcl8.0.3)]TJ/F4 11.96 Tf -11.83 -24.4 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(tk8.0.3)]TJ/F4 11.96 Tf -11.83 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(itcl3.0.1)]TJ -11.71 -24.41 TD[(The)-261(follo)26(wing)-260(examples)-262(use)-261(the)-262(command)-261(`./con\014gure)-262({pre\014x=/to)-27(ols/...`.)]TJ -17.56 -14.45 TD[(This)-332(will)-332(install)-332(all)-332(pac)27(k)54(ages)-331(in)-332(a)-332(directory)-332(\\/to)-27(ols".)-453(When)-332(y)27(ou)-331(omit)-333(the)-332(\\{)]TJ 0 -14.44 TD[(pre\014x"-switc)27(h)-254(then)-255(the)-255(installation)-254(default)-255(will)-255(b)-27(e)-255(the)-255(directory)-255(\\/usr/lo)-27(cal".)]TJ 191.35 -55.83 TD[(3)]TJ ET 0 g 0 G +endstream +endobj +30 0 obj +<< +/F3 15 0 R +/F2 12 0 R +/F4 18 0 R +>> +endobj +28 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 30 0 R +>> +endobj +34 0 obj +<< +/Type /FontDescriptor +/CapHeight 611.11 +/Ascent 611.11 +/Descent -222.22 +/Flags 5 +/FontBBox [-1 -234 716 801] +/FontName /CMTT12 +/ItalicAngle 0 +/XHeight 431 +/StemV 80 +/FontFile 33 0 R +>> +endobj +35 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F5 +/FontDescriptor 34 0 R +/BaseFont /ATVUDO+CMTT12 +/FirstChar 0 +/LastChar 127 +/Widths [514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 +514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58 514.58] +>> +endobj +36 0 obj +<< +/Length 2558 +>> +stream +0 w 0 g 0 G BT/F3 14.35 Tf 38.85 -65.75 TD[(4.1)-1124(Installation)-375(of)-375(needed)-375(P)30(ac)31(k)63(ages)]TJ/F2 11.96 Tf 0 -22.17 TD[(When)-324(y)26(ou)-324(ha)26(v)27(e)-323(not)-325(installed)-325(Tcl)-325(and)-325(the)-324(other)-325(needed)-325(extensions,)-325(then)-325(y)26(ou)]TJ 0 -14.45 TD[(need)-252(to)-252(retriev)26(e)-251(the)-252(sources)-252(from)-252(\\www.tcltk.com/itcl".)-411(Y)81(ou)-251(need)-252(to)-252(`gunzip`)]TJ 0 -14.44 TD[(the)-310(\014les)-311(and)-311(do)-310(a)-311(`tar)-311(xf`)-311(of)-310(all)-311(these)-311(pac)26(k)55(ages)-310(in)-311(one)-310(directory)80(,)-313(let's)-310(call)-311(this)]TJ 0 -14.45 TD[(directory)-326(\\TclTk".)]TJ 17.56 -14.44 TD[(F)81(rom)-393(the)-394(directory)-394(\\TclTk",)-411(y)26(ou)-393(should)-394(do)-394(the)-395(follo)27(wing)-393(to)-395(install)-394(the)]TJ -17.56 -14.45 TD[(pac)27(k)54(ages:)]TJ/F5 11.96 Tf 0 -27.4 TD[(%)-514(cd)-515(tcl8.0.3/unix)]TJ 0 -14.44 TD[(%)-514(./configure)-515(--prefix=/tools/tcl8.0.3)-514(--enable-gcc)-515(--enable-shared)]TJ 0 -14.45 TD[(%)-514(make)]TJ 0 -14.44 TD[(%)-514(mkdir)-515(/tools/tcl8.0.3)]TJ 0 -14.45 TD[(%)-514(make)-515(install)]TJ 0 -14.45 TD[(%)-514(cd)-515(../../tk8.0.3/unix)]TJ 0 -14.44 TD[(%)-514(./configure)-515(--prefix=/tools/tk8.0.3)-514(--enable-gcc)-515(--enable-shared)]TJ 0 -14.45 TD[(%)-514(make)]TJ 0 -14.44 TD[(%)-514(mkdir)-515(/tools/tk8.0.3)]TJ 0 -14.45 TD[(%)-514(make)-515(install)]TJ 0 -14.44 TD[(%)-514(cd)-515(../../itcl3.0.1)]TJ 0 -14.45 TD[(%)-514(./configure)-515(--prefix=/tools/itcl3.0.1)-514(--enable-gcc)-515(--enable-shared)]TJ 0 -14.45 TD[(%)-514(make)]TJ 0 -14.44 TD[(%)-514(mkdir)-515(/tools/itcl3.0.1)]TJ 0 -14.45 TD[(%)-514(make)-515(install)]TJ/F3 14.35 Tf 0 -34.66 TD[(4.2)-1124(Installing)-375(BlueGn)30(u)]TJ/F2 11.96 Tf 0 -22.17 TD[(Y)81(ou)-411(can)-412(no)26(w)-411(`gunzip`)-412(and)-412(`tar)-412(xf`)-413(the)-412(BlueGn)27(u)-412(v)27(ersion)-412(2.0.3)-412(in)-412(the)-412(direc-)]TJ 0 -14.44 TD[(tory)-401(\\Tc)26(kTk".)-660(This)-401(will)-402(create)-402(the)-401(directory)-402(\\bluegn)26(u2.0.3".)-659(No)26(w)-401(do)-401(the)]TJ 0 -14.45 TD[(follo)27(wing:)]TJ/F5 11.96 Tf 0 -27.4 TD[(%)-514(cd)-515(bluegnu2.0.3)]TJ 0 -14.44 TD[(%)-514(./configure)-515(--prefix=/tools/bluegnu2.0.3)]TJ 0 -14.45 TD[(%)-514(make)]TJ 0 -14.44 TD[(%)-514(mkdir)-515(/tools/bluegnu2.0.3)]TJ 0 -14.45 TD[(%)-514(make)-515(install)]TJ/F2 11.96 Tf 17.56 -27.4 TD[(This)-326(will)-326(install)-327(BlueGn)27(u)-326(in)-326(the)-327(directories:)]TJ 173.79 -42.05 TD[(4)]TJ ET 0 g 0 G +endstream +endobj +37 0 obj +<< +/F3 15 0 R +/F2 12 0 R +/F5 35 0 R +>> +endobj +32 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 37 0 R +>> +endobj +40 0 obj +<< +/Length 2393 +>> +stream +0 w 0 g 0 G BT/F4 11.96 Tf 56.29 -65.75 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(/to)-27(ols/bluegn)26(u2.0.3/bin)]TJ/F4 11.96 Tf -11.83 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(/to)-27(ols/bluegn)26(u2.0.3/lib/bluegn)28(u)]TJ/F4 11.96 Tf -11.83 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(/to)-27(ols/bluegn)26(u2.0.3/info)]TJ/F4 11.96 Tf -11.83 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(/to)-27(ols/bluegn)26(u2.0.3/man)]TJ/F3 14.35 Tf -29.27 -34.66 TD[(4.3)-1124(Using)-375(BlueGn)30(u)]TJ/F2 11.96 Tf 0 -22.17 TD[(When)-384(y)26(ou)-384(ha)26(v)27(e)-383(installed)-385([incr)-385(Tcl])-385(and)-385(BlueGn)27(u)-384(and)-385(y)26(ou)-384(ha)27(v)27(e)-384(the)-385(resp)-27(ec-)]TJ 0 -14.44 TD[(tiv)27(e)-231(\\bin")-231(directories)-232(in)-231(y)26(our)-231(P)81(A)82(TH)-231(v)53(ariable,)-249(then)-232(y)27(ou)-231(can)-231(start)-232(running)-231(some)]TJ 0 -14.45 TD[(tests.)-398(Y)80(ou)-216(can)-218(go)-218(in)27(to)-217(the)-218(BlueGn)27(u)-217(source)-218(directory)-217(\\bluegn)26(u2.0.3/testsets/examples")]TJ 0 -14.44 TD[(and)-326(run)-326(the)-327(follo)27(wing:)]TJ/F5 11.96 Tf 0 -27.4 TD[(%)-514(bluegnu)-515(versionTcl.itcl)]TJ 0 -14.45 TD[(%)-514(bluegnu)-515(ts_001)]TJ 0 -14.44 TD[(%)-514(bluegnu)-515(ts_002)]TJ 0 -14.45 TD[(%)-514(bluegnu)-515(ts_003)]TJ/F2 11.96 Tf 17.56 -27.4 TD[(The)-356(ab)-28(o)27(v)27(e)-356(test)-357(result)-357(should)-357(all)-357(b)-27(e)-357(P)80(ASS.)-356(The)-357(follo)26(wing)-356(test)-357(will)-357(giv)27(e)-356(a)]TJ -17.56 -14.44 TD[(result)-326(UNKNO)26(WN,)-325(b)-27(ecause)-327(no)-326(pass/fail)-326(instruction)-327(ha)26(v)28(e)-326(b)-27(een)-326(giv)26(en.)]TJ/F5 11.96 Tf 0 -27.4 TD[(%)-514(bluegnu)-515(tc001)]TJ/F2 11.96 Tf 17.56 -27.4 TD[(The)-326(last)-326(test)-327(y)27(ou)-326(can)-326(run)-327(will)-326(fail)-326(in)-327(its)-326(simple)-327(form:)]TJ/F5 11.96 Tf -17.56 -27.39 TD[(%)-514(bluegnu)-515(tc002)]TJ/F2 11.96 Tf 17.56 -27.4 TD[(But)-326(will)-326(pass)-327(if)-326(y)26(ou)-325(execute)-327(the)-326(test)-326(as)-327(follo)26(ws:)]TJ/F5 11.96 Tf -17.56 -27.4 TD[(%)-514(bluegnu)-515(tc002[English])]TJ/F2 11.96 Tf 17.56 -27.4 TD[(This)-463(is)-463(b)-27(ecause)-463(the)-463(test)-463(scripts)-463(need)-463(a)-463(test)-463(case)-463(iden)26(ti\014er)-462(to)-463(\014nd)-463(the)]TJ -17.56 -14.44 TD[(correct)-326(b)-27(enc)26(hmark)-325(co)-27(de.)]TJ 191.35 -99.59 TD[(5)]TJ ET 0 g 0 G +endstream +endobj +41 0 obj +<< +/F4 18 0 R +/F2 12 0 R +/F3 15 0 R +/F5 35 0 R +>> +endobj +39 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 41 0 R +>> +endobj +45 0 obj +<< +/Type /FontDescriptor +/CapHeight 683.33 +/Ascent 694.44 +/Descent -194.44 +/Flags 68 +/FontBBox [-30 -250 1026 750] +/FontName /CMMI12 +/ItalicAngle -14 +/XHeight 431 +/StemV 80 +/FontFile 44 0 R +>> +endobj +46 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F6 +/FontDescriptor 45 0 R +/BaseFont /AEVAHO+CMMI12 +/FirstChar 0 +/LastChar 127 +/Widths [606.65 815.96 748.3 679.62 728.67 811.28 765.79 571.17 652.77 598.03 757.63 +622.79 552.77 507.89 433.67 395.37 427.66 483.1 456.3 346.06 563.65 571.17 589.12 +483.79 427.66 555.44 505.03 556.53 425.23 527.77 579.51 613.42 636.57 609.72 458.21 +577.08 808.91 505.03 354.16 641.43 979.16 979.16 979.16 979.16 271.99 271.99 489.58 +489.58 489.58 489.58 489.58 489.58 489.58 489.58 489.58 489.58 489.58 489.58 271.99 +271.99 761.57 489.58 761.57 489.58 516.89 734.02 743.86 700.54 812.98 724.82 633.85 +772.35 811.28 431.86 541.2 833.04 666.2 947.27 784.08 748.3 631.13 775.5 745.29 602.19 +573.89 665.01 570.83 924.41 812.64 568.11 670.19 380.78 380.78 380.78 979.16 979.16 +410.88 514 416.31 421.41 508.79 453.82 482.64 468.86 563.65 334.03 405.09 509.25 +291.66 856.47 584.48 470.71 491.43 434.14 441.26 461.22 353.58 557.29 473.37 699.93 +556.42 477.43 454.86 312.5 377.89 623.37 489.58 271.99] +>> +endobj +47 0 obj +<< +/Length 4786 +>> +stream +0 w 0 g 0 G BT/F3 17.22 Tf 38.85 -65.75 TD[(5)-1124(Changes)]TJ/F3 14.35 Tf 0 -29.78 TD[(5.1)-1124(V)92(ersion)-374(2.0.3)]TJ/F2 11.96 Tf 0 -22.16 TD[(This)-370(b)-28(eing)-370(the)-371(\014rst)-371(public)-371(release)-371(it)-370(is)-371(not)-371(to)-371(useful)-371(to)-371(list)-370(all)-371(the)-371(c)26(hanges.)]TJ 0 -14.45 TD[(BlueGn)27(u)-462(has)-462(b)-27(een)-463(mo)-27(deled)-462(after)-463(DejaGn)26(u)-461(and)-463(is)-462(a)-462(complete)-463(new)-462(imple-)]TJ 0 -14.44 TD[(men)27(tation)-323(whic)26(h)-323(has)-325(b)-27(een)-324(tested)-324(thoroughly)80(.)-433(When)-324(do)-27(cumen)26(tation)-323(is)-324(b)-28(eing)]TJ 0 -14.45 TD[(written)-301(more)-302(c)26(hanges)-301(will)-302(b)-27(e)-302(made.)-427(An)-302(example)-302(of)-302(some)-302(of)-302(these)-302(c)26(hanges)-301(as)]TJ 0 -14.45 TD[(a)-350(result)-351(of)-351(this)-351(do)-27(cumen)26(tation)-350(e\013ort)-351(can)-350(b)-28(e)-350(found)-351(in)-351(the)-351(test-suites)-351(ts)]TJ/F5 11.96 Tf 361.58 0 TD[(_)]TJ/F2 11.96 Tf 6.16 0 TD[(001,)]TJ -367.74 -14.44 TD[(ts)]TJ/F5 11.96 Tf 9.17 0 TD[(_)]TJ/F2 11.96 Tf 6.16 0 TD[(002,)-331(and)-330(ts)]TJ/F5 11.96 Tf 56.75 0 TD[(_)]TJ/F2 11.96 Tf 6.15 0 TD[(003.)-447(The)-330(\014rst)-331(t)26(w)28(o)-330(are)-330(not)-331(as)-330(easy)-331(to)-330(write)-330(as)-331(the)-330(third.)-448(The)]TJ -78.23 -14.45 TD[(test)-326(suite)-326(ts)]TJ/F5 11.96 Tf 60.03 0 TD[(_)]TJ/F2 11.96 Tf 6.15 0 TD[(001)-326(is)-326(a)-327(script)-326(implemen)26(tation)-325(of)-327(the)-326(command)-326(line:)]TJ/F5 11.96 Tf -66.18 -24.41 TD[(%)-514(cd)-515(bluegnu2.0.3/testsets)]TJ 0 -14.44 TD[(%)-514(bluegnu)-515(examples/tc002[English=B])-514(\\)]TJ 0 -14.45 TD[(>)-514("examples/tc002[Dutch=B]={MSG=Hallo)-515(Wereld}")]TJ/F2 11.96 Tf 0 -24.41 TD[(This)-351(ma)26(y)-350(b)-27(e)-352(useful)-351(for)-352(simple)-351(tests)-352(but)-351(when)-352(y)27(ou)-351(w)26(an)27(t)-350(to)-351(write)-352(more)-351(com-)]TJ 0 -14.44 TD[(plex)-277(test-suite)-277(scripts)-277(y)26(ou)-276(w)26(ould)-277(lik)27(e)-277(some)-277(more)-277(\015exibilit)26(y)82(,)-287(so)-277(t)26(w)28(o)-277(pro)-27(cedures)]TJ 0 -14.45 TD[(w)27(ere)-374(in)26(tro)-26(duced,)-387(whic)26(h)-373(are)-375(sho)26(wn)-374(in)-375(test-suite)-374(ts)]TJ/F5 11.96 Tf 255.16 0 TD[(_)]TJ/F2 11.96 Tf 6.15 0 TD[(002.)-580(This)-375(mak)27(es)-374(writing)]TJ -261.31 -14.44 TD[(rather)-386(complex)-386(so)-387(the)-386(pro)-28(cedures)-386(ha)26(v)27(e)-385(b)-27(ecome)-387(part)-386(of)-387(the)-386(pro)-28(cedures)-386('ap-)]TJ 0 -14.45 TD[(p)-27(endQueue',)-304('prep)-27(endQueue',)-304(and)-299('run)26(test'.)-425(The)-298(resulting)-299(script)-299(is)-298(sho)26(wn)-298(in)]TJ 0 -14.44 TD[(test-suit)-326(ts)]TJ/F5 11.96 Tf 54.83 0 TD[(_)]TJ/F2 11.96 Tf 6.15 0 TD[(003.)]TJ -43.42 -14.45 TD[(Changes)-326(lik)26(e)-325(this)-326(will)-327(b)-27(e)-326(made)-327(in)-326(the)-327(future!)]TJ/F3 17.22 Tf -17.56 -39.93 TD[(6)-1124(F)92(uture)-374(Enhancemen)31(ts)]TJ/F2 11.96 Tf 0 -26.29 TD[(The)-326(follo)26(wing)-325(enhancemen)26(ts)-325(are)-327(b)-27(eing)-326(planned:)]TJ/F4 11.96 Tf 17.44 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(T)81(arget)-246(co)-27(de)-247(will)-247(b)-27(e)-247(made)-247(in)26(to)-246(a)-247(class)-246(with)-247(metho)-28(ds)-246('start',)-263('load',)-263('exit',)]TJ 0 -14.44 TD[(and)-217('v)26(ersion'.)-398(Instead)-217(of)-218(the)-218(curren)27(t)-217(')]TJ/F6 11.96 Tf 185.36 0 TD[(<)]TJ/F2 11.96 Tf 9.11 0 TD[(target)]TJ/F6 11.96 Tf 30.56 0 TD[(>)]TJ/F5 11.96 Tf 9.11 0 TD[(_)]TJ/F2 11.96 Tf 6.15 0 TD[(start',)-239(')]TJ/F6 11.96 Tf 36.74 0 TD[(<)]TJ/F2 11.96 Tf 9.11 0 TD[(target)]TJ/F6 11.96 Tf 30.56 0 TD[(>)]TJ/F5 11.96 Tf 9.11 0 TD[(_)]TJ/F2 11.96 Tf 6.15 0 TD[(load',)]TJ -331.96 -14.45 TD[(')]TJ/F6 11.96 Tf 3.25 0 TD[(<)]TJ/F2 11.96 Tf 9.11 0 TD[(target)]TJ/F6 11.96 Tf 30.56 0 TD[(>)]TJ/F5 11.96 Tf 9.11 0 TD[(_)]TJ/F2 11.96 Tf 6.15 0 TD[(exit',)-334(and)-334(')]TJ/F6 11.96 Tf 55.78 0 TD[(<)]TJ/F2 11.96 Tf 9.11 0 TD[(target)]TJ/F6 11.96 Tf 30.56 0 TD[(>)]TJ/F5 11.96 Tf 9.11 0 TD[(_)]TJ/F2 11.96 Tf 6.15 0 TD[(v)27(ersion',)-334(whic)26(h)-332(ha)26(v)27(e)-332(b)-27(een)-333(tak)26(en)-332(from)]TJ -168.89 -14.44 TD[(DejaGn)27(u.)]TJ/F4 11.96 Tf -11.83 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(Pro)-27(cedures)-331(will)-331(b)-27(e)-331(created)-331(that)-331(mak)27(e)-330(it)-331(easy)-331(to)-331(test)-331(WEB)-331(application)]TJ 0 -14.45 TD[(from)-326(the)-326(framew)26(ork.)]TJ/F4 11.96 Tf -11.83 -24.41 TD[(\017)]TJ/F2 11.96 Tf 11.83 0 TD[(Other)-340(enhancemen)27(ts)-339(will)-340(b)-28(e)-340(made)-340(dep)-27(ending)-340(on)-340(the)-340(use)-340(of)-340(the)-340(frame-)]TJ 0 -14.44 TD[(w)27(ork)-326(in)-326(testing)-326(di\013eren)26(t)-326(applications.)]TJ 162.08 -49.72 TD[(6)]TJ ET 0 g 0 G +endstream +endobj +48 0 obj +<< +/F3 15 0 R +/F2 12 0 R +/F5 35 0 R +/F4 18 0 R +/F6 46 0 R +>> +endobj +43 0 obj +<< +/ProcSet [/PDF /Text /ImageC] +/Font 48 0 R +>> +endobj +7 0 obj +<< +/Length1 1137 +/Length2 5239 +/Length3 533 +/Length 6909 +>> +stream +%!PS-AdobeFont-1.1: CMR17 1.0 +%%CreationDate: 1991 Aug 20 16:38:24 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR17) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /BHYBSB+CMR17 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 46 /period put +dup 48 /zero put +dup 50 /two put +dup 51 /three put +dup 66 /B put +dup 70 /F put +dup 71 /G put +dup 78 /N put +dup 82 /R put +dup 84 /T put +dup 86 /V put +dup 97 /a put +dup 99 /c put +dup 101 /e put +dup 103 /g put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 119 /w put +readonly def +/FontBBox{-33 -250 945 749}readonly def +/UniqueID 5000795 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÍÖP +½¥í˜5ö ÏÈð l.×j‡…kPôØ úëPŒ—ø(?ˆ±~M;Àö^Ãyy¬Ü*f˼[âõ:­ç-ѵZ/¿îeŒ¹_[³+ 5{^Ýòd tp¾ñÅ!¶ûÕÇ~¾Ùd¬Z+¾ÉسäŠå»:cÕEwK’+_ö°nÎCdZy°2}m‚3…þUó@-UÓ´HkãVÂœ:ì‘ïõÓƒ±ä‰ñúUšf“ûÝÔ÷阆ØË|ÊÔªœë4§¯"æœÎðåÙpu$5…íö dGÈÐÿ°Kn=Ûª}¥‰††"§•éÙýV¯/\+5€ ‡NJÃÒ2áPD2SÉ*‹Q=JAT©‘ö)ÌÓvP]ª©²ºÖ5KBL3uò”›Á’zob!%/Š–aŽdj¡°SÉ‹ìÂk7ƒwu$¼§+1@tÁÉNAHÓ×Ñ-žæ— Õ]ªš—ö?,}½žÂí;¥øpêXTê]¼Àaâô¯ —*ɦ‰¢©b ‘µ?kP’ˆCrõ÷¯ÊI_38ØZ—Å»ƒØ-È€ü‰‹`¼ÔùhÊSärõ%…?LxO,,: š4ÙßÞ¼®@7äÀûÜ㘟5–KLç{€[þŒðÀëò&Ïö¶)Tðô-ÿŒ!Je7«fm%8œDÛ{XfD ¿Á7q+Í̉ƌѭý…d‹Ò›ûE¥d°!rî÷‚Öà×áñs|–qœÊžKýÈ~Y™¸†¡ZÅr=ø`~Ï«^êþÙòy‹;ÛVÜ&ø¶ðëÏ$4–™SãË¿r¿,c+Q•¢‰•À²04gÒÿ4tZ] dk¶{TO7kêAšau~Iza•éUÒU +" ôFùtð,bNì“BÊÄ$>Ú‚†\UÞ|fõôÜGÇUK0¨>2ÕH‹ë¢þ4ÉtNÎÕQ\6òz¡â +±J›Èôç(ùد-¬•­‘ù/8RfKý)ˆzÄæ;féIÆ‚`þ¶c©˜µYVìZƒ£5Ü¿^¬xöÓ´enÜ»Ú[¨q¯óHwSþ`EU-?©G¸Ó~<ÅÐäl)‹2\M8´ÇF2릭ƒÏ%IÕd®º ë°+îÑž/ç|=ÛOìr£Ì.à…=”±…ëlÿ£c³šnCw)8VÜnŒÓ]*D$h0VŠ±ä=€UÉ?ø¦œ´vZ½M\·ã^'éĘ|`Ì`z²j™iÅ™–lu1¤ˆ8®±…[Õ>pgKþÎM’—Ú–›¨-=@ܼŸ¸…Y‚%&†Éâì¾ ¯H +&’7+ !îSaÆšx“ã ÛE¤D±ƒ¦ êuF…Û,iÁosà‚IŸ*¦ìm˜eÓ'§BEô͸¡qßs>-A¡_ÂÄXŒÅiŸÒËÖÔt#4ŸÎiÌhŽY#˜EÉdПnƒ`'ü[ôÌ£¶gPÚ3ÛZ¦æÛÇ®ÞÔ“æsý½¥U:ðÂRÀñlH2àM›Ú’­¦ìw°Ò¿-íõAìa·fƒ–üÁduª£ÓN]ʇMÚߺÞÐò¼·J¶|訨ʯ_˜€8qPb[D/:7àí]§é ÙBÞúÁÒb[½Ž×ØzðƒI«N@àrœWÏŸ Õl*v3N©°w +ücpä`F2ÀBX.&!˾ÞæÐÃÛÛ÷$ɤ¹n‹‹ø?ɪõ¾í®ºýËSí—G`3&Þv\ß““®9OнQwÌ縠¨ì,k=Ý<µNl÷I™ÏÎûÑî •4fVÖ¹9J«Ö=ñ©ÌöÚá +p ŸÙ/½Z Jᬇ¸ëŠ dì«õ†5½N!g;š®˜ÑzŸióA.žGnw2R•}‘1b{Ô'ÉiÂ%É–ŒEòû>±öà³6iâiàßJa#nûå5Õz©{‡RÏCbÉ”^‘q +^¡´xÓ²–^(í¿ì´Ò \“œW˜¨ºÓM“§e7·1Ô½ W}`¦r.Ì Ñ“ˆÓΩXŠÒ‡P>¨&ÿÕ8ЬÀJõ@&ræ3hÌ7àÌ„‘çkD–«YkŠá¸òuÛÖl&Í+¨å•Ù«]Öñ6$e_æâ@ c³CÖPŽ‰¤*-ìÄB÷eÇ%ÈoŸžyj!ŒPŒ—pšêHªÉ«e,–~R ­› Ûæ0IÓ,Š/¡×¤TæÄõ4‚ù¥É¸J©,•$¸Ò7Éb¬Ø; EiGX[°Ê¬ôsÑçÁ²*ú OÄžD­Øë…«œ/ôW ‘ïõOHq‹ªã.nú…=êëž’èsý@-ˆÃw0¢“ ›\áõ¶HG‹£#¸Í ; *ÃÎÃ|V†m,ÅËÚŒáG¼RL$í4ƒ¼€ü·øú×QÐ|.47xUKöÍN5ûÞmmXùŒmG²d>¡ãŽr†órUٹߋ÷ü ‹¡äÀ :-á,ñdG,ô'¦\ŽóH¦ÏiA1Ýtþ½£hQº‚h£2ÇɻҰa³lo ḑ<Ü-RYš¦?@•%$É’¹·d¾kw«1ÍíÊ}}i†Å‹¥ÿ½‹q;³ Íf¿;˜y©‹õ3îëut­Ð„%Aí +ãYughì¡Ù4ÞþÃþîæFYh=+zÏrà nTGíÑ+Ãv Î]U®•s ‹Èþ˜eçäHjie®f.M.&›×Dˆ>Ñî\÷ +=ãõK¥ãÞ-çy\ï+éÅ ÓråOy¯†¯”§§u=Ÿt+ŸéCô¡cÙIÇ$ùèÈ–Éåmâ¨ñ iþ‰&¹Øœ”ålœ…‡!Û‘ {ªö(ÉíãV¦ÍÀ>kÐȱ\…ÏŽ´>OE P¡Êÿ‡l<áf^ì'!¾Œ)GÌèå…sl=®F½ÌUöªÌ~ÑØšgw*CÃcÇԌψӎvÆd.â•Ö¬ÜKÒ?À…IKcù‘ï‹@Ä—Ö"=xžqÇŒ2è‰5ø0 nkO—i¿ïòΠm£Ñ|zFŸ.àxë4ðísâBÃÚ¢ÞëËJÛœ"îkñô¬*`9L±Œá¥‹û ]»€DÙY/'r£"@ÚcLòBÖ¬ÀÅÆÆ  Ó+ˆÂ­à ewÿˆs• ø¹Hd!좀åòr¢4bo ÙOìád´gªðì›Ù­?LN;Ûp^«„ãe6ø^skþ3F¯4LyP×0…(Þ.Mn,g-µî¹lXRã‡\=er¨YxЗj5âÑÝdX(~¸Ká-B J,vŒQ0îý‘*¾ªä¹ì>D«Ù%¤Nº‡Rk<#’DÇð®J ?ÂÑDvÀ8dH3‚€:RƒÜ­â¸éTð—™l¶NAèà/øzÖÙXM£öü g½64ç‹õSÂuKÂúڠ㘠Œ±*á¸þ1lç×7CÏNÓ~…ìt1WH¬ƒDùƒEb9nhbjîõ“m9¸¿iì.ÉR9ïe†Ñ(L'úÓªM dXÈ\±s áû¥}ì_NŠªØP>û³ý¬˜Óø—ž­æKŠ^%¶—ý +„k;Kâö×óöD=ñ~š5û‡š]T‰¥·×–x¸Ud¯"°ÉhÛé\F¶MÐlj\”¹–‚G´ºG&“!Jßœ)ËP4›d\gtYe»šN±z³1Œ 0{½ô86‰‚åîvÌhI–¼ƒû DÒ^„·-d"ÃÒå×z Š3z\jíƒÔZˆv7Æhi?ÞǦÌúZ”ê"ÚÝÒìš´Ÿ› +B'ŽÄ\H(ÆYèV6’þ4 ³?PÔ£½¬cLkݾÅÒòœÙ:ûÐw°ÀñÁÝùêøD„3""„ÙL`BˆXÎ~â1×…ƒ3ËÙüÍ×s*Ò̘!»O¦¡åTkŒ}C&Zˆ¨‹ƒšÏ%Q‹W¥ß\éO/?F„ ˆÙc1“L+š8€Ô/:óu$#YZD‹¹0‰)h8ÅÊ(Æ æX ®Œ¥ÐCÐm”{¡´üù½ËEÍÈà€VÍšLôÎW¾ÕkOrï~ñä‚'jDWx§cª+ +Ríá-J©ÍwÃyð'ÌI“wÊ·?Ê8ò’ÚûîTÖ{…ºÜÜÒi‘=¥ |Ã;„÷$’œªœÂMw«(IK,+°8ámöóÆ÷ìn[’昆M½#'Èú{îžê´ ÑîŽ"ìiN\,÷œ|Þzç7¦ì›íò@½Ÿ@êK8å“tLS£-ÞGHÀÛ€k™ò¼î×^Óå—îàaI3¬ Þ«êLÞ»{ÂN]T6u®NßJ=6(Oò®*Öô»¯~èD$×£Hê-uNUù˪EÒ4Ž&»¬Û„Oáþìâ(rëªNÞÏUŒ=œ»†…ÇOz“˜=¼­:kš¬W[ [o±í‰mÑ‹ÍÂÛ#ÏJL™ÀïFýò8ihCnzTÞ"J»â¹Œ¶ý´DñsσTä»'ó çP¹5Q_ ÄG\HKµo$i@>ܤÄÅÍ6¥¿\õâT¹G8 BâÄmG.õÙþù‹ùXÏî*F¬÷wBK0žhMn#¡ÔizâfÀT7‹;™ffË8Âç¡Lä +1á:µÐ» ¾ù´’!ŠÞÖ Âðhô€PU5| ë&œý°Y ž’ÝÂÑ""Ó:š•‰çˆ$kvwß“=eaÇ+€'8òS?žG¿üqv.â ï®v~i…'mßõ®¤”¾3úÒÅâõNmÉ¢Æ]Ç8š‚Žò3ëoVàÅž•ÞZ ý'I¾Hé# ðD'â|ýóX\¤£&¢^Yƒ‡¹x}?²\ò#Á±?ÝÏ{~‡ÌWúxd‘£Ó&6— îBED!1°Ïbx(§ +]YÛZÉBT‰è$‹Pª‹b¹ïµ~ëvÇÎ×âN7°­xjÂÆåã„3Ù;VGµ˜:6×<9CœÏ²·ÿI*C}T–_ð!ÊñöÖƒŠ^’]áYsƒ"tyi]Ó¡ÙG ëºU5SxºêkúX³â"‚H+áÙM YšÀæ>¦ ¤V^Öµ¿½Gs ++ñ£*YC=fUýe°`Ëi–ôÅ mäÖeBá³Ü_1í¢ÿ6úͦØÕÖê Ë`´ )f•ïš*˜ÓŽë?oRýƒ&Ü~ó&‡?V ËÌ3¸ˆ”ß¡­rÑ”‡Ê™ª~^þ¯âú¼oÓœTÌšZžgºtVœ•T‡Ta¬—9±ZºÅ<Äc,ó/BS•€çy—ú±ìÊ©óQÍ ¸ïMj¾kÂËþ¼ÚÔ 9ݱ°ÉXÿ«oD½i”½œV'mHcX_¦Ì'´²¡†M”Þ@ÉOeM<$ë¶ògbЂ-rìs4>Ð8ÔˤÂÝ47.O“øR˜‹¤se^ëÜ·0z=bvÄÜö|Ý—%V*Fsö»%W¹š–uJL8uXbéûžJ(–Ù'²ç¦Î‰§bÀ pèS^2FeŽ¬B¼l6k2›Ð³ÿ(›“º¨ ‘‹áª±R™8ê®´môY­ Ø×U´5'É®ÐòBt"7,>ë|’Ÿ}âú´ÆÆŠ?áÉ~¶÷8©àHGÙnãç^ÛÝ|·Þž„àש:ÈG4䙑=·wQx&SµˆC ߰·H i»aÊO@Çî9uÚ³Ñ[Òsè†Anëî˜âźþ/^cÝtÞív]8©ûå‘Ä¡V‹FçþªØ"Í©žC¬G>®$œæjÿtÃîÈ繾ܩëÞ]Fµšy`/¸™÷ ´¢™ó×" +#U07=·ì¯iyòúªA›¤~Vß´|åw-x÷™¶ul÷/!¢-ĽEŽS‹ëÚg8Å¥Ëù>;H"Þn×V°€D‡a“«ˆCr†ŽT‰¿ +›*œ ‰÷2bµÐÄ»HƒyßÅÛålZl#——Æ5¡^ª¾~žVµ«!Û—Ø RÙã¥PÚêïfÉæÒE·ÿX>ù³‡G¾Ù¶ì¬‘_W5oÏçÝo]Ùµ#˜·#·uôï&@pâžÛItþôèåMhN”Âæ÷0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +10 0 obj +<< +/Length1 2044 +/Length2 13621 +/Length3 533 +/Length 16198 +>> +stream +%!PS-AdobeFont-1.1: CMR12 1.0 +%%CreationDate: 1991 Aug 20 16:38:05 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /JUQUTE+CMR12 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 12 /fi put +dup 13 /fl put +dup 33 /exclam put +dup 34 /quotedblright put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 42 /asterisk put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 58 /colon put +dup 61 /equal put +dup 64 /at put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 91 /bracketleft put +dup 92 /quotedblleft put +dup 93 /bracketright put +dup 96 /quoteleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /endash put +readonly def +/FontBBox{-34 -251 988 750}readonly def +/UniqueID 5000794 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÍÖP +½¥í˜5ö ÏÈð l.×j‡…kPôØ úëPŒ—ø(?ˆ±~M;Àö^Ãyy¬Ü*f˼[âõ:­ç-ѵZ/¿îeŒ¹_[³+ 5{^Ýòd tp¾ñÅ!¶ûÕÇ~¾Ùd¬Z+¾ÉسäŠå»:cÕEwK’+_ö°nÎCdZy°2}m‚3…þUó@-UÓ´HhX²¤µ Ì.ô⤠çHH<;Ï]ä|Å& +:–|¬p§£[ˆµC#´\zC)‡“Œkí­;r­c‘‹nZ E~ N¼ JR@ý|Mã^¥Ho¤=—‡ 8UÚ̱í 2X(±;|vzXÈyðTn¥@D@úe&—WƒÂשW+Ž]QvºÅ˜¸– ô®¿7c‰Á­þjü S³¬ÙÑhì:'ÔñÙ°…Ü-÷4l‡=# +’´*E»]£C´íØ9Ý`hZYª¤ŸÆ\Øâ­*œ\«•4•*Ÿ@ÕóŽ’$C¥Ý–ög @‹ÑØž5ô«˜âöŒ3fïÁKZþÙÈEØÔøà~¨…¡q«Mn!pî¬ ž·ïFë—8M¡úó;·¼€.®¨‡YtQˆòf³ ~yc?í”àU£!cçL½–Ü]°fò¥1=m FVË@FàðX:ðå½úû¿ ÀÕÀ*4GòÍÁõd4&\&Ó1¬?…½ËÇÅùíß+œœRSøçB‚ÖðS×у®ê^^¼@gҟꜻó»XǧXC³šiª+{—_Sÿ"ÑÜ;ßzͯ¡Ú!VƒÆ‚A³=¿@KÓ ¯œÁœu¹X¼ç_Ë þ,®'ªÔ¶(JQ|&Þu¸Æöª©Þ¾JìÊKdmxx¬ÛD[µ]ËÂ#{ÿ«X 9›ŽG îæ$2T‡¦—œ«ýuÊ꤀ô©‹m:.~i7x2y¬šQ¬i9 …Ø8(þîÂê(Še~yæŠÃEk±È˜œQ- fÖÜwHòÚ;xÐâøò ¾%jìþr:úñ½r‹†óﶤ˼£Vø ƒ|šZËQWjkŒ §ë§2c%¨Cx1g‰)€ZnŒªãQݼš[æÈ) y]ðݼêðš´çum–{üqM¶KóÕ-?Ô+ùþíÜ{“‰kÍb+›1Ñ & ÔÌ„¡JaGƒŸ} –%!V˜#²r;®b•2‹ÊO)ù‹‰,òà£ÆÁéƒD]Rã²ÁšŠ¦=†m‰v?&)”º©uòÑݸ=½$~6wâ䡽¬SkQlG÷÷™øoãH‚³¾èzG‰Ãâ,ø9P·Þ(‚; «2uœº¸š–X“è[åA}&õ e³oi`“Xe_ŠpÊJc‹$i$$¡L¹UØëRàdHrÇ;Òf+‰Óçà 8TzÔÞè˜'‰öííàÆAúª½Pƒ[ë› +QŠð´ŸI¿ Ý£/‰nKãúà/™Ö@VJ XÒéŠ|¿ƒ éü_ü‹Î;Ÿ¼|Ëáè!._1ûý¼Ü!ø3Sjñ´ Ö-‡áY~aƒ8M7IqÖ¹%­‚ò _|íâp‹/on™l]5~Ù…̱uÐQ8ƒ¥¾õ;$I&óPm?¼–Jü” ¼D¼#jWUÿid¸ÍžH »9áSh~ 8ð!,92ž•c0²!¾Rƒ(… 2[ñ˜¡Þw–|I·®ÔsXpÙº. Ò³¼¿§ ß]A.Ñ C4¢ÓѬŒE"f]DF†åhGà䜊ý‘ç'ÄŽ¿¨›Ã™YÆ4\® ¾šIÏ&Éΰ,V€F–+b5’)Ü«Ñ%Î`]ùPÝõ&*¦[ùÞ!Y^¶Í²PêÓ*ù Eße;®i5²€þõ¨æO pü2J5Ð_ +”¹|¾¤z)/¦zѯÑ÷á,_oæNÑàaÊHce(_±ÃKLð%¥3®öæV/ì«< ,ï7yàáNF}ïæŠIFD´Ûßúx͉NŠñÐ5yÃÒšáLbj¿Á}#Có%°3®c +µØQžüåVäÆÂeÉ@Qb‰skß¼êöýM¾rûKq¥"YÎES ÍëÃdßì:Tÿtïµ·öòe[~‘ O&¬vþFý¯_I¬êìÈŸ6#¢ë¥+@?ØÂ6k5LybU¶]?ê†=øñÃTÈÓõña÷!k©£t`Í”Öð÷ý¶lÓFe}`ó»g=­§d2h"àüŸG,>m¡.ëZz'R¼Þj\ÎÚ&CRÚ]qý$V_v?4×¹BÕÇŸUÖn¦#VφR­‰tÖÍþc­áÛøáTºÊÊÒZõŸŸìO“-R¾´C$öÐâüà`ªëœÁ +nrärIÎú. O9˜3™ Hã8¡z¦.Æßý–Ñ­áÜ¥> ¥  sêTûµ~1;¦2qqVh FÕÑHÇŒŠÊ¦pÒ\°çFïëšÅ(^­\ äkEZñhÔš„×dY€üšÂB©”{ ˆäòd­¥/ž&•Ž•ÈvÛ *üÔÊ_¥UÕm™+;-ivÀYÄÆèLüY»p˜<0yq7sý…³BíÈ|Œ–iÔ•Q«2•“Ç®ûh|¼ÊÖFPîîŽ Óù%\ó:¯»:;1 9Dû¨G žò äÎ6…¿¹ß`6δÇìÔŒÄ6ƒÝƾmS_è:ZÍ¿±÷Ù¢VTÍjyç—HÊ/ jDþfŒ‘Ø RA<UH†|b%ZÄÏ,n¥kø¾t~wG€:=aª’öÅ7X¸¹<*›Rq?à‡+°úÛhæj7Ÿ¸{بކé2öÑzà>gÏ¡¿Á<›û1 ×«î¿çS10ó¢ü*‘gì:ÔfÞŇV!T¸7$›ÚÀ¨: Ý(ƒ|€ bø˜‘Ã!~ñ³o¼å´—·²»¡ùð6ý• +nev“òXn¥n2ªR’åÙXS_âXA«pSˆTZAmJ•R/꿺q ¨Ä³}lqyˆ—jÓY_~y¨ aÓËyj:gÇj³+bñÒƒ^*÷³šUa}$ºÑȽ;?rÖlK僅¸wÛ(0U^ó´=“¸9ßwö¾[–•…†n²…^¹kG¸Ê"èK ¹C«C´&Añ¤­¨êÔ“¢Ìd̨!²gâÙVÂX~Å7]Îá¦.‚¦ °ÏƒÌàã–„Ø„M´j÷j­*¨‹ÛBÖ¬P¼0kK?±CÙl^ÄlÌŠUE-Kß·5NâY ~]Ó¡šn±‘0ü*q rðšÛËgß×pEZ˜Ìq7÷Ô—ÚP)V}¯E<ä—ZBcçÀ‰©ŸÍð,ံ.Ïüyá*ïÌ"tÅé•RwÍ»1…:¿ZlŠAè2Õ€WkóÛ½é3&‰JäDä!G4!—€ÊÖ‰¹ÔZF·UÎ+çA/gŽæY/¸U—cy>kŠ +RÊ ³Ï0›¤Ú¿ú¦¿Y7uGÈ%"7tåQ †d ÑKBݘ—ææP‚ä(5£¿õDò¥Ù½ %G +^Ÿ’D k‡à¼¤Àµv* +ä¢Ûhˆ8Ö QGÞ«_ãµÅR$ü˜!a–±Ì&¹u„ßÓÇìÜ›Ö}­‰°Š~C‡,Öüm–zÍEiˆU!xG¾n¦Iy÷¾Ø†Í¢k’#L®wA‰™!Ê + …›ÃäöÀ÷¢Af©dºüE¥¬eS¢äŸs†”J°—:8ÝØá½$Tº1›”?™ÞÓ='X9øÇ-ÕÄñ6¬b¼¦ŸCÄ%î,I +1¢&”[¦¬)Újµîµ’™” +#RpBÁò?]X$99Cs›+n¯ižî‹¹Á?ó‘#GáÓ*¹³>ð¼ä l`‡ö˜YAÁµ2BtÓl,´@ÛJþWÆvRK oÑ<ü/OßnPNóÀ÷ò°ìÁšÚL[’k ‚ŽyÖ…§êÕ°A<{´0g³'›þuUg“_Áª¾H:Yº>E–:–ªÿÊÂ:Ýýª¶\Õå ½@R©llp÷·ð2+tÒ‹õ¸»»œy~øÈÉRòôIPJô‰/Rëwj‚ }i"¥ƒ„œÏ‰4:ŠZKJQçÁuT`y2°!_qYä—&ßãVsprh[±qE&mQ¼2ÝKE ¥ôBE² tçipDmy󵜲"«¢ìN߀„1¾¿]×ùž´JèÐyL|,®Ä¶›²åýûo••sx:ž\¸áܨÆÿÿ^n>Þ}¨dW?Àõ&ø×6gŠp`©LOÜQàHÜkìÇG©Q½‚ÑvïC—9çWKÁwÁsúð‘4ÁWÁóÏÉàDC4û7ÝՀ߾X-ÛïÎ=–Ы5-‰ä¾²‹˜kçEYøq¾ä¢R!PAÐ, ¡ªDzà¬y[g[”Õƈ"¾KðäÝ-@âš¹» òñíTßN\\>ÐΞXµÞ£`˜T2_BÕþ–w>w^áp +÷4LÁ±öˆMï0[½8žÊXìÔñ‘Wý +ÐæÔ–ÆÊ”xþp¤ŒÌPg˜»I8ÎÄýì#ºÀ)ú`ìÞp‡¢dƒ©”Ì×°j–c–_6¿Ä5%æÜ AÝ=`ä@%®®C0B~èF®wŠ,¼ˆ >9€5¾îªó~_äPB¥°ë saN´£Šh˜;+Ž…%81¯ÓуóËà +®ûÌ iÃhä›n?H¿Ì=újã>ïÚo™$–·ÓÐ)äºÉÄ è¼ +˜UèZ»â~®$ M"—g¦ìè3ß“¾  ;\ﳎ•ù’ò øqÉkà ÈV€1gÄHCGÁjBàæ6©¨¡Q^ge‡°Kê$”_)Ó.ªŒoœÈN¹½ ^%–eõ½èÅãçzüLâ*Ôop­´sZddTº(©üiNÉúO_ u–/ù†EId‰”íLMg õ„Ù $/‡Åé$xa£€ÉkUY•t„b·>Ã)÷•˜ÈìªÛV†Â_R¢,‹øÝâ\)»H­¥PÔ_²I½œ¯‡”š3“MX!0Uáê÷X‹„Æ&Ä÷èŒ*V@dŽPöèÒ¿Ò¥hù_¢ŒÊؤ”L¤¯6 Ò±qïîARm¾¦‘S>dzA²Kh=¹†C:U 9#*}gÐËTBÆÒÆ ú $dg©Ó‰Ä/=´O©þù»¥y»Æ1 E¥”-1» ƒ™Ip…g¶>˜×@V6½­NÒý@‰Ì$ÜšóÑp™¿”­ýÎÂ`íÚnÖ)WôF’!yÙ[ÈÜHÁÐS¬©‰GÒê ² wŠ”AþXúèÍË”>ôz8à +ˆ<Äg¸¡7|éd*‰r®÷ÌDƒ@ üŒýKœÍ‰Lt÷¡v4¨a`Çü•åõ)>o'‹ïônU+F| Ž*¦ÅÂ/ÏGÛ¢¹uhðèøhuCD /%÷Ý éŽ¢²è-¼wøÌãNrõ]‘àxZ3Áð„"î¿à“/ûßͼ*í ãKŠŽ£%m¯šŒQF)åÎþŠk°Õ-w²¼Îw€-ÜöT¢‘@çN=± šäÿGàÎ RÉV*}’‰ÃHU`¶ûhzRÙc+¦¹vOäÊïSx•‡z+uIàtoÏ©¡}+ôÿˆÀ^ËÒì?8ÙÊ?kDazÔšüæqMÓ‡­ùÝaöû¼RŸy\½ØÏE:š’»ÒJ.äHÝñ¬SÔ*– +Ä·¾}êzvÑÍ홯'À‡t-»—(=ü‹lìÒ!¹â&¿DiÖ{ Ÿï–ÂüTOeš])=‘ÃD¹ó#ÑÇî-Õi'?sþK–™ÜŸÅmû›Ü 9ñT9½ïVÔzàw¦‚‚B‡§ÿ›cwvå‚6¸üÀ²Xiè·12˜²!ø›˜aTçm­9I‡Ï½‹–þ }…¼³ Ã!¤„-A“2éB¨ª +"æ˜ >r¸½âð‰SÏt3Á1¥âóÖª-&aåéÅ^z´­ÐÕä$‡yb¯Ì&Í6;šr%FóØ2ªr㔹Nt9á-Ĥifý¥h63/fÜŠ!}ïŠi!µ^ÜûhÊ…Úú¨Æíáz?TyêÀãá‰] ð®ð¾Ì¸¢óÜSà,: ˜æ®ûIP¢,¾Sj¦*Ã&o”!ð¿„à v2µša‹@–ŽW3{Ù¬“Û~ãmaÏv¶È>ïÝÅ¥Ð+‚³ÜLΦ’@ŠºöŠÙI»#Þº2ù‹ŒcÌ^ê³ +–ût™%lÉyP=–-‰Ž-à­|Í/XÔsÄ€© ’-Cþfë“,þTÑ’™]øógbÝÎü§@Ë%æ}ÊÌ´#¿í(&€*õÍG_Ä# +]O®h¨³°–Ô(u­ô9¤cZ³Ÿ^i|ôm#M¨‰² °Ì>†cC›Xɱ <õMnâ—Ò s˜ß5t$ñï½Fþ×¼¸ +M3vË&µ?HCª8çégõ~úô8²NÖ±ñD3íRÕc‘~Ы‚û«*çd’áí­ƒö&¹™mCÅüÇ?â´´•Ê]E4hŸo1¤¾ )-âní¹:Fߎ95ÀIåŒ##Ã3¡D7Á¨‘¯4Íꀶ p~›9â”b÷¥éa8%ƒë3„Ú¡)æ&F6 ṳ̀ðκ\Ù½H}Åi¶1ß{õ³Ñb%mÈkÃÖ„ä yš8s7IsøÏ÷}]ìó®¨4-ÞªKý¼š¾z.}Ð;\ÛWdØë «ó‰I×ù£‡‡s…˜9kƒo*Ø"z–+l8œ§CšBÈÚÖ•š5I?däú⛚fôÃã³ÇA¦–;¥hÜWŽÒ–ãdp’Øø3ë#¬´÷uþé1Ú}ä`ú¬.Sç¢Ü|à5ï£Ѓ.üÓÒÑÑoCœþ½{U͹٠(rŒ“`FóF¡ü¾[ÁcN«×e8²/ðTþ£‡cý°=ЫcÖöÍþ4pé]lP|ĘåJN÷Úi’š2Ð D¯¸0¤ªwÝÒ°‚…B_Í9¢æN®Ï3/×Õ|€ÎqLÈ7‡ +QÜrú꧱H4-_VË*º¯œ@T³+Äåsf “ žë8•BªˆîÕÝŒÛÀ(¯âÚc`ÃùQÕ#ùT-™ûÍm¯l[TbÓSÎ\ -㹂ÀZ·Ýéjl)Vò¼i î¿é“`4Î_;òQß,°º†Öþ¬÷5Ž®1ÇDÑ"wéDÏÂi¥€1z,Ë嬼`RCˆm5~\j3:ôªí –-Xýˆ.…å¥0Ç[±ÍëãGb®tŸsVuåóZ^*jZ@±¯Ai&Vì“øay\QãÄñ{êÅ=«AîóO¿¿~]Z* +,µ¨÷Ķž‚7°ß”I—ùAø¨—Þ {HÆ,ÑEwQ‚¥¡Äx$sŒÞ&ß$¹>6ñJ)Ãn–pi¾ª!½%)=çø{‹+¹Ý9'UPðÖ‰Á0^"iݳ<Ô~V…ü§ŠcªAߎŽ˜aÎM[þ¦s^ÖûË^äÂ%IðŽ'Ïqts?j!Þ?ï~À[ÊèØ™ÓOVêtWÐŽ; çhK*¾qÇ~Òèì§É³%. +±VÛ¤-ý‡‚- ÿ‘‰Ï.¼f˜"xÿ´­Ø, +äá­Y”‘Kî–4ž @‰FéòLÄ¥ïl’ô™…š”›FNç î°tcÔ- A JðzŒá‰R™k˜Ÿ×ÞǺ©åµHÈ°aïÏ‘”ÐèpŸÄŠ;vÀà +’s=ÍiÞÚ¥ü¦¿nÀã@¶¾-£µÛö>söòÖ.Y…˜K„×ú,⮕´íàZV.)íFøT69ØðQl>Xõþd”Ò€{lûම`;ìrÁNÄS••âe xÿ–§/ö@V®€<º[’" ¢ r­f%+%óÝ–õüÜ[Ó7Žâàñè©c•[èéKE*S¸Õð ñ¦±$Ðç¦Ýñb”·ÉNJ×ÂItüt–-$¿O“7\lþÆEüí" +Q"á#{ 9ín'Œ;ï µOZTæ« t#;‡¯aì)gµÏ䣅ÔÌïUMáÇæ2×hãQ™Z)­ñË!ˆ~Ôx0;os›JëÁ8ÅcÛJ®X½l0©Üü\w44Ÿ”F’X7³ F‘á°Y$ô‹;5 ûgÔܳ<,® ê#°ŒšQ[©<ʺâQÉÞOŠHOû¤¤àð]Þ¿@ëߘv>ÊËñnñ‹C7 õÜ‚ }^˜QM'F¹±5OÀŒ¡M»ƒ÷4I8lã15L4YÕi L«ÆòÿØȱãYÊâì–í‰w›fG|ó…—Qìì1–‘˜ÅtƒŒü… òVW~ò§É9Þ½ä-}ÿ+{5|¼ åÅ£Áÿ‘¸¶¡ Ïxkų¢Ç7<])S;Vk‚Æ_Ósv¾‘“S© ºôÞ +¸:ç²Zš3&'ó¦©4~­ ô„£MÙp—>å­xç»X´¶Ö¸!dŒA+þ´–^3êýàÚlÍÉfDôшÖò0ýM‰ýá÷ô’«fr+Ûà6Þׂ“ö§ª%Ógµg—¿$œC.Ík\œ²°ß[H1T<¢©´^ MéÝÚ#^Ù¢:‘ùIÇuÄn˜­%Áªw¶5ŒÄ×I·‡Ä‘®T3ó#š9IszòQL ¿{ÆéÆ¥@„†_|£cܦˆ9^€yl%ü0»‘îçã?ñh_ gÛú9`f[`ç¿8}€®È<ùóõ]-¾íúW„´Ž¬Q]PõGéD +ñá/‘ž“ù ·W`^& 0›ýÐoOª•· b@"“Æê ‰¥>èY)sýND_ªHËãˆâs”ñe/‡!ioƒY½¼Z…Ü^«KP@܇µÍAþK´¢®©aìÝ‚^ *½ñcà —8(±’ÇR-®±H‰÷jLÊâ»RÕ„Eìâ”oÈ‹&¥‹<ï~Ü©Ò‡¸<;0G‡l‚œÓ¿ÒÇJÍ…Õ`¶y: +˜ÂÈ þ;31>ŒqÝÕ/îmo¦nÖ™þŠyÀ60@H¡!Äfbg t°ô|çè/—"?gè¹¼ƒeq¦å%¸€¼—Ö¯ÎýÚüXè¢ú^µ¤_pUvòAF°¾(w`ÕlÚÔÛ9¶W×Bö°ž"…Ñ-­Î|ç-;áV™:íÛY+ÑR«‹5àšŠÈ’ÚöŽ/ƒ¼üÿœúÉ+?EÎd¾êU¡?¡)³2àQÙ¾9õ;CõQ € ·ØÎk¤íRŽþ^ÐÓŽj¼1Õ³HWløyHaqX{&å­#ÌážÉ9K éŽ&âRþmó¶ÁNC¼XáÏO>ÉhãâN¨®2ìd`ˆRÇéb¤±• °AýJ`-Á$t@n<ŽÕ‰î—½:*kçËÏe5Ö`Š¸ú@5{R: BQ^Á>I« +P`“¨È²À½Ö§á²p&n‘­oOØœÏtçzõG54NH‚‚Y$ç ÆKœ­Éx QŸhŽ7m¦E6ÛPXÀ^z,6׶cí>¤[=½lMá+Ÿá5¢&Á-ëqÆ Ú\2ûÚ ƒŒD£ú— _ö‹†¨°„úȾ+õ¹¥í>º ÇðÍ lŽs‚¼–K¡ +bb *}Âe—0.ú—Å}Žü}çsî#Œ$éàÒ×òE`Æ2²çßâÖ˦êžÿ\#°,S@µ;¾îïÞ÷h§ÓþÕBF5íK}´ðÁ¿8xhŒ Ûˆ,­Õ)QówÎ)N­ÞúÒãnG?Ià4‘cçg6\®— ½J†=ˆõ.)7™öPÓ3«=E¶ÒdãüjFá•(>Pó½ë L%t ÂÏE“¥qfýáohZlé—ûŸWÀIÜ°:J¥Õ¨vmAo–—€Þ4”q1²›hìÉ·¨ÒÞcâ.Xjº@[9ŽOÛ¾vËÔÈ‘i©íXSDojÿÞý‰’H3²Þ|U ÄÝÎ[È^’PŽSÂÕÏT<žcü}=éþ§WÙË*•¢™Så²7¥›1'á'3BAŒ½p½øßqTJA÷¯BrD} +tÞþ3wæ±gN ‡7Q—x9#R,ÖF‰cÍŒ·ŒÁ_Ðufƒº§OÝ]¶cAìcw¶©MÏxÁÜ +SzÙÉY¿P9°Zˆ+þÁ[¦åNÇ,׸ˆ€F¬¢BvåªYS¤dôSû²µÜÄѦý…Þ¿ñêÁú⨯Ñ×6yÝQÏ4Nptù>%ã ­ÇøhnU7¬ð" ¢.öÜDÜhìئtëðS¯WŠ°)S]òHÖs,®^’¿(úgnr‹#MøøèAú²™p¿YP®oZÃb3˳ ’ ¶0\rntuYà–Uknùe¸+þáKŸÃ‚±Á˜ò²ªŸ>AT¤²2+–7ËɵDZ%‹`u J«û;è¼W^H$Vwï5– ¥'|ì? Ž`MFœ>Ëó,ý!¥b2íÁs’üo¬ÏÜ?v*Z‡aàÉÁΈZ«¡x~²§_ä s­Eõ*˜Hg©%ÛWÐgµH€Û7õðîs8fÉKÿùÕ^Ʊ~â¯c‚R)‚än;@Ùó'çåM«C7ZôZ…¢x²¯_ù—âò ½ßç ÷[œÀ.9®ÝštÍÀÿÜ]è"ÜdïùufòäÌ·a™ýì$Ý!n4ëo¸?îɃxÔþ‰;%X…O*KxZ£U¥âE– +ª u¦ðÃïÐ×Rÿ‹a¶FÀr°*U¾ ‡ÕWõµ5e`®ÄGi¾Êáƒcu&rµñ’õÑ[Á¨rO]rBèÙR4ÍCÿ;òT*ÚH1¨x¤ÐQ÷6¦‹Sç-éWíõ;fÖ”œì¶½z?žá2ÀˆŒqóK/–ï÷0\†áÎ7ú1‡ +F_FsÍÁZ‹(GŽŸŒ¶½ Î FâÄ$4·^Ì2J®|JØ$É™¶7yˆá¯£¹’u´€ÛùÝ ûMÊâU&xžQN01Ùníˆ`%L /íFáÁ SÎPtц¼e#‰ÉE’i^]5 {• 8>«eø¨n¡Åådž<xy¥D´Ò¨‰)ÿJ¢E³AšÚ]Ì d¿.'ס;bžûH¥RÇ/Ø°Š„Áa„+~Z¦ðo«v:[!E«º£•ž CyRa¡™ +²ÔÝŸD÷Õ%¢ª²£à©GØNk¦!+!i²8¢Ä¨Àî®2˜R‹,Ã}ÕO"ØM°=JËÞb 9iq}_v´ì~Ï­êÃ)œñÏ$P ¿P3åRdÒ,1ü®ÊûÀ’78º/ÞVÅße¢«Õ?³òˆ‰o*¼©J´^ÂÕ»,L=ôS…8MÙH~áÕ% ŒßÍiÙdƒkrœŽY‰,i_ŽoØÕq?4µèxÍ;íû_I*[¾XÂnTšQÓBAÅNVðà^¸Z™`Æ– re}éæ›gUBU+‚ˆãi°7ÜI:ùN¢ÇÐÀ<¨Ë/½|¯'=¬iÛE„×ê+þ#Þ < +g¸Å`’P× "ñïtÜQoå ‚Êü&5í)˜¦÷”˜—Y×FÕX)pV @+/Evg #*X‹¾G-£I +ã“ÒèÑ⛃L¥¶Î,ë=´€CúV:Ã’CH?CÊ ,~ ›âÃLiWt¤[´ýŒ‡Ã1“¨5>I¬úýyéYy*$‚ÄO º+"bþß9ª=‘ +éìYnXö+ XÓLø\ûw‹#J4›è‰š€Cmv7<Ee¬|õ ¦ÓQâêÙ“Ÿ¤¿¶ùÞüî(¦ùLݱp‚GÍŒ`ÿfÍW»W@¹ØÆOÞoÇ‹Ô"«3¾Y»ÅƬrOèíÂnêÊmUE œÚMxMº`mj:Æ +€ ›9¡0;E¦Ô]¦‚­ÌE€µÏ‚™NõÃÔõ +“-öš}Ioì[¬Rá@:ÈE‹$eO8 ®ã@~ÇiïG®Nv»¯.C ˜/6é"lmÀª)Ÿô[„{ tç84¸níß}°tq +ÍcŸk(cZ×Y„ÍȺ¯ÆØFéèªÖƒN½/Þ\/êíÖ}™(Ì0 -×Yc ÎàÖ bbÌpwwZSñP@#3¥KY‘¨=û­‘Uíí*þؘ¤sJPÎ÷Û9rjԛѶ›É÷ÝJHàŒõ5;9÷²]å½+~Q’µWoèíðncÞØdXÏ9ǀǒ’­üþŠÈ(CÄZø½2E´–ïÇÊc@ Ê~„EŠ KxŸ§cÅ-è‡p«·ð³¨jÑ£ïyå’®’.‘Ìòß +ýÀµÿq›œ€A;Ù´¶XS|óˆÃ ø ÎÚWÌüPïM$qHuoŒÅ%6h#€þe¥Ý5áw°ó½µ ™Ä è\º?¶”ýSñȯ„Z.zÜ +­Š”ïŸ!t#ç¾ÎÙaÖÞù’"®i’é 3S„Îù¥Åô¸Þ÷T(Òg¦Ý^=?N‚½“*Bå¼(Æ®¡ÅHÂѵn;¯ê/|ZG)üÒ-öÇ_Fëõ ç¶x rð¹ýß‚në4©"šˆ¥Tÿ‹Ús6ÔÞÀ¬1žIßÍ|Üé19ÿƒógÅiTÃ[Ä¥¼ƒÔmuÏ—;›µþCRôÔ\.ˆFw1BGý‚…²Ñ%ÏÌ00ÿs|«þ²ûòÅ`$tGrøÄ™vòxŽ*ÃÍÞ˜ŽË,ŸÝQºÄÎ{QŽEÀ„Vz«¨»“ÁO(”¡Y½ô΃,[K Á+¨0©°Ò#nÝRÀ˜5àªÈŸ1ÏxÉ[ÑÂtUO‡ÕO§Ë¡•‘žÌ;)r(Ù_Ûðkæ7͌Ԡ +ZBx!ƒ‹ƒÅz îòSo(dþŽ568ñ4Q¡XÓ¸\^%QÄ©›é>ûέ£Ü){¶6T’^ýÿ¨UÿËÅ÷Áh‚´»¤òaqEƾ.4a`øο°>$úv¼@<Åý’·r&ž¼ÚÖ"ã'Àª6£‘‚¢n*Le9kŸ7Ý“Ô ›ßáðoÊ*7†˜_µÌúîØDC P¬«HåbξópžÃ­lHα,Ø`Ûe[XõÝ´’2¢\ð?—·"•suRØ¡$^ý‚ŽûhÝd‚jÑ–é¹Äðlú5Í&¢¯Ô9N•ŠQŸÅ~Bv­\ÏÞGùxÁš]ÏÌ[né[¬,CöñþÎõ1½hRêV”XÔ@Œ|R’á’£ðh¢{îÚÔÊÓ=¿ˆ9>“Ó=´¸úIz¤1Š§õ=jYœµ55C¹Qà¶J€c jœèÕTo[ù=ób·-Žs·§Y˜†l¯1‘dÉɧJì³PpO±‹³)~ù3PŒ§µ-oZxE/n}X£<}û¤Ì\-|‰>j}ƒTLcBÇJPv]Ž<Õ÷/á¼»:7ÿ' +ª–9ˆœÞÌWåj‘ŸöCŸŽv,²1ê]m(eç÷Û/È8ô£x½ÜºTí[tmÀË#º@ˇ}"éðê§yuÑ⯛ÚudqgmÌÄxšÞ$‚—¨‘°aoÛ’œè5lnæGÊÒDhsÐ2ŸÛy5€ó4Õ´Û¹T‘Ë\"kš“ƒµ?ôö7¤¨ ØÇ©;AÝéèܱ}s ’piËÚš0WõRK7&[Ëß¹»›ð—l¼.ÈÕjCÿPÛ¤t YŽË,o}rèKe§º +¤¡œ¨ÏbØ"ƪ¸F÷Eã#öUÑO3´Qg¤±û@kÖ-¦¿œ"ˆØŽpíMQM+²Ý";ÄÆr32ÿáFM›¾Dåp˜ÀÀ@qÞ~Q¤ÒrÑ{<*ÀŽ<š(^¶Ä2ÞT‘-Ȉ"=œ¹ê7%îïÛco"nðtÐÆ5××Ϫ®'c>ýÑveÇ™5ÚQÉEñ­×¨†Ç‘Ö þ£Ô¥ +¢7aÝÿÚæEó¨iá’mÇ};¸?öj]ÆöKªeÇh†áßÎÿ¢;!~>c²h8ßèl);¿¹$6Õ/Û𦫱bÌÑìb(Æø_Îî™9ÆgîA˜`†ZЉ’0HzµÁ^rƒ›¬±+ÄËKouƬzóRmoA/G¼^hѽ á¨a0âV db‹Ö)=³%´'ò¥Á»s¾9NÑUñÕÛ£O4˜‡-ZÞ=[[Ýs?ß½#.JÏO;p¹î‘©†.&¢,JH? ¢ó;‡§k²jÖl\˜‚ZQâ ÷&¬B7ve¥„1fÈðÃVx¸C„ÿ`pOL·³ø0Ø“&¬g5¥ÂÌQ|Ûé‡î…k#Þ@žeGêgµÕ¨½üù‰c®bÉßD–HÅAÚaôïz-gìÙÁ‰÷~`wÓ°G$:Ñ÷=~‡0A’»A$ ŒÎ +>þ¸ËÝn²°ZÊ÷‡èfÁ‹ã,Ï}su¨Ž¢©*"xJ‡¡Üx‚Æ;D ^ ‹!÷°û „Z0-åÉP1Iå>ŒÙ?R]òÈÂ9®’‚Üæbº£ŠX>™Ž×K¶µ>NÄjÇV˜JhÁ‘¾Êz‹7É­]zVYT4d¢\"bâèÝƱ¿Õûe¸w¯ÏÏw¯çVLŒŒ;ju‰Žóíl[NîðÿÙƒLWúWc.?ƒ|b£0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +13 0 obj +<< +/Length1 1401 +/Length2 7398 +/Length3 533 +/Length 9332 +>> +stream +%!PS-AdobeFont-1.1: CMBX12 1.0 +%%CreationDate: 1991 Aug 20 16:34:54 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /PRPCHF+CMBX12 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 12 /fi put +dup 44 /comma put +dup 46 /period put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 58 /colon put +dup 66 /B put +dup 67 /C put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 73 /I put +dup 80 /P put +dup 82 /R put +dup 83 /S put +dup 85 /U put +dup 86 /V put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 120 /x put +readonly def +/FontBBox{-53 -251 1139 750}readonly def +/UniqueID 5000769 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÍÖP +½¥í˜5ö ÏÈð l.×j‡…kPôØ úëPŒ—ø(?ˆ±~M;Àö^Ãyy¬Ü*f˼[âõ:­ç-ѵZ/¿îeŒ¹_[³+ 5{^Ýòd tp¾ñÅ!¶ûÕÇ~¾Ùd¬Z+¾ÉسäŠå»:cÕEwK’+_ö°nÎCdZy°2}m‚3…þUó@-UÓ´HkçÑõ¿®\Gnæð^±ÒÊë&™X±”R—³üÎÔ†<½ ×ØÿÚÍEKNz—µŸçpæwQ›#ÖÀ„$ÕU$*Œ ŒI®ó”]™¹™§œçH®kýæ#ôF3qD/e#¥öÎÈ9§À%."Æ–ÈÌ­äV€åq‰ÐùŽ _•^59p³’ÏS +hÌV°]ß¿ l0t¾ë9ܼ¢r¦æ)ûzê,[§ºå {L¥•ßx 5)—ì>ådß"Ÿ»Tsõè̱ÌSé§â™¨ê¢›iѶ"±ðÏüX)Hu–ÙPËQ pÜŸt;ëïDö®’úÎÅvX™œ‹ð`a`9bÀi^¸} Ú«eeW Šf é®ïŠå_q¸¼v9My)gäØ;nŒ=™‡ÕåLS¿+»2…[”ds´H3½x‡=øäÇæhÿÿ%ª»¤tK$ÖË‚${0RÌ]fóñ¼ø¥j?´FêX{ؾ0%vRÎà5bŠíßØ(;ZÒ‹€­$ؘ— +È¡ã>T<äãÄžæ!ÅÎ>Šé0øcfɈ``hÙé#–ëõ³Û Eü= ÔpÇ¡M’»þ'½t³c¨Ž3¨é¨ZÃ!ç=Å+3;‘ pÅHs¤"-fà&¾m,ˆ•ŠpÁnå ð «—g^Ži"níP]6Â!¾ dtBDKð2_‰›¡^›Eù ÷=ÃIomàÝD¡yI¥(fÇ7t”¾ÿDA¼¤ü+ûryú)8ú›âÞv/ ÔpP‘H9ÞåÕÒ¶?ƒè§•83ïâI*01O2⽚u*½¨vîø†ñ9îÎ)ã &¥§rqÈ”P¶ËC ç–øÐUÔ +‰+Ìyá÷ͤ‡ÒÏ]…k¾>¨Üûã TÞQc@–%ÎPð£eœ ’LC*öªÊ‡¢æQ_ÓìÊNJ<F@–ĈÓuÀ%¡ŠýŠ8û%6g~±e0t(Å#Ø·¦ã™²ÒÊþ8&5qUûáVÒº—Ö>ÂÿÊPcÅJª³´Ï;ÿƒtñ̵€‘xWœI£ Ÿ9Q ]|ÅÛÙ¢Z\-Íë: ‹ª·¿Î_]áhÖaî)Êít`UTÉéLL.oü”­)0VV¼RS?Þ~S´šp¤- á6’6@? ñ‚à1CÃ"ÔmÿÈÐU¯j€Yºû‡¶œƒSÂÓÃþ¿’(ÍñÞ™¨ŸþÈËܶÖø: 4>J'¡XäÊÀCˆò‹yÒŸ‘$`èH#ßr8ßúábHád«Ã¬¶ÏbF³øqûÈ€†0PVÛà4…"*»‰š_znsÍMæ;l¬`=­ÒGå›Í)ŽN7¯%á!ãÇš9M8ƒž2¢ç«yckˆº/uë­ˆAþ–t5»Lýš±°Ë;½«  ­¾ t4@bgœYЊäB3äï¹ëÃ_¦¯û°é!qò©è6ì#þИ†öêÁ ï‹ôÔ{´œÔnøLXU’‚}Ñ¿Î!­à¢œ~Ì Îö:æËI!}2ؽ[*ßEd4ºT¯‘ËýÞN¹6S‡D'+ξP…ðõI(FÊa§×ŒÓd¢‡ÑEÀ£Œ§§ X 6ɹ&³¹”xuÔó±›GKlB´Z8m0åYN~/“ÈÎקœÞü´8œ0ûâ¡‚È%5ÐAšPí + ŸMôwçŽ=ÅuqFÒK!þxÖ<'(­üãŒÈì5ûc6ë$65ýeµ®£séJÐ.Á¼Â¹-5¢þEÝ~2a[w>6ÅZ²€˜rèÏAÈ44èƒèµ„ˆŸU ýD󿶟F…£æq^Ù§‹?œ—ýÁŠ‰&Ö‡±.rŸèM&è÷›¬QÊã6é4Ù»ˆü=éó?ñÏÀ÷ê©podŸæ»Õúßâˆ=„ÈTá=º»î¥6£ªMé¯õ€Ê*h¸Ê& N:³þ »ùS ¸Ìi@â “ï•Y¯#ÕJ;rspÕÓ„ºÝ Awî +RÜûkJ›ßð¼o»U™0Ðî I!•uõJlf ‚‘bp¸%÷'þ˜­x]‡SÎ  YõÂ1Ð_Ûß46´GËâ@«O$·¡±¥k^0%/ð3ËDÅz(½âÇ(‰ƒ­b¼rq¥,«V¹ëM ÎTLÕ’ûÃÊ0™²(¹OéÌ=‹‡ +“&^JB³oX¬d´#‡MýɈ‹(&ªôã´|ÏÐÛ9ÇÂBè{ÑùÞt7é1wˆåaõ‚éÀ&—8¥ ¤ŸÊ7¡Z Ŭ~ ‚“Úßs`ç”%á®6UìÛBmÂpD«p:èb×<Þ¯Eµ}5µÒç|ñzbæðwG´e1Þn‹Ñ)Æ´)þ‰1m$!O ä–-û®.)Úvâ*:@¢©Äëþ&ýÅ ’ž?‹êátîPè‰.Â>Íwüí÷ÒG‹Ö +Yß‘¥P:Ò€ +÷ aW¤}?Ž†$0ÇòKº™ž,$úÐÎj°¤ø(hpŽL6°*Šë¦áýͤψ.ù‹|¨$}µÞoƒˆS¨üÖ×ïÕã¯M ׬cF5.îm`z¿œ­n¤u߆KŠ?ToXú”¡˜/Òïî 6?›Yh„f.e䜊ޛMô•íg­6ßäZW̓§üÊʨMω:¥Ëõ&<§¬2“Š•#)"Š¯XnÉ!O‰ô•ýÎT + 7¹¶T†5­nþ±}®Œ÷¶¸}’ôìj€Ÿ¾“3×±³obHv\ê: +Ùý1ÉÌ׫\ÇžUÀÆ;Þ)õU¹CAUÍšRå¿P©i”Ë+'ÚøêžÏuÄï6qHd¨µcFþÍ*v9s¬'zóir»“MPpÎzb†*żZóösœÿ7pîd¬|Y2C µ²¸Õ]•bUêN/òÃð±L¥NSb}½ÖxÁW­XX‰F--æH©2Z¿¥€KoMo¦Ýß¡¤Ë[óº¡q¯‰?¿úh·©ƒ%÷ªtÔØ-1bý›â:§ðåÙË ÄÚÝGY M@ùÔl4ê¹z •­Dœg;ãÑ!þqáLÔyl4¤!6¨Uºo +=DÜô•HøíŒøÎÔÙäN½OR ÉÃzÀ c쇯Ó7¥2ŠŽ£g8³¯ã¹^rÛ\®UŸ‘­ø^ dØîEÆZeÇB‚‘mÆ5²Ž©µ(Ä:¸•öNÈéçbyÌŠóÆß v;d÷7#nÍ*¡£Nÿé2§ÖU»?ö€¨B£$KÝé’2ÈŽ(en duAiN¶rÈL2ØÇ‹²¿LÊ¿æŽA,fØõ@>bƒ“µO>¹L<`²]1å–'Çö”\¸JÌ=p}ZfJ²æ ä”ä«#…sýš7ØÒÖžM>ß`}7 qYa Jª9ÃÃkY¤äi“0©ú3¥Åv’Œf>^b¥Nñâ‹ðfÚ®J9´#¢O<ÉðÐÏÀ¨×{ nŸ‰;š&Å¿=!èT¡Äx79æU¨Wèc8lÈ‹|U+¨Ñdâþ`ÍÉ:2©Ëúêèh~³Ö¸Nt[$á%ôòݺ8Ïö\3a¾X»£¨²ì¶* (2,4ÖTÛ,n×!Î-¼ Á™sx|5|b,Ý##Âqt­)ŠÄ>•µJ е÷õ9p›§‚³bkì­ùó¢îÄ8wìmÒár¥šÖ¾žïpì®·WrB1Žàâõ|(Ø™ ƒ¿¨+Æý #ºž‘.ø.aýaÇÕ6çhÀpí⧬zç¾V3_¸‚K’Çšˆöa™’ å>À¬’~ œQjç$­ ²ëÝ +MÌðþA~&'uµ'¯;,ß +Ÿõú¸ÀÈÎT¬7z¨ÓÔ’‡v¢“‘4ròiŽ±‹¨DËDù•”v7*9õÑÔW”?·¬Ú–³ãA…‡¢m"î7öc\~hâ¡<ˆáÚR{Û6¸»x ‡ìÓUjÜDÞup—=ñÉwÅÃg€þÔ¤Ž¶lpU8QÅ%l¾÷ëÐ23ÕNeõˆäZàý)t›±AWÇcû3ò¹t;š’ù9’S¯CæóÖtæd·nÈÇ·PÆ…Ö‡P_QoÓÁý1=Ò_@“}y˜U3*7ŸüñˆÏQÀÛ–c3¢Öå›\Nùó2ªSzí=V/Ü`¨Ub¶œÚfz=JJ,ŽJP2óú–ü6ó3O2WÀ÷‡Í_bW’–éÜ:|rf] ·hCÈ‘`f³ÇÆƃ KãËÔ„~£þ!ç j[$¿äUϲÏC1‹óØ»¹´¹‘[u\¥ã"ˆY¢œyúÚ­ðë +Ë×òhLùù­Ø–½ŸêQž[ÌÉÛK±sÕS›©2¼Æ›‡¬Ìé¥Zij1Ç‘ÒA’ª#<Ÿœ¾]¾K„&i_‰XÐvŽ‡d‹88LÙj-„¶m /ÇÔŸš(27­ŒÀ·ü6X a'¼²jo½ôÏÄYhJëÇâ—HM»a»5Á[¦ô;p†¥ÊKokU€tª¨#(:?[ÔàL! 7ä/'@}À1¿L'¿ŸÂ™Ï—¢ usš‹Ù–Žæ¤Ù¼«Wucµ(‘©°”ÎåËè¬v®‹*Þä@éO·ïbwê~º©uSÃHtlø"ko¿G÷Ñ€Æá¦Ô8δÝMTëŠ*~:&:s–avå+TlXÚüK~¶Õ\pHYWÂýhšOÑƈ(å«2éð‰Úå&!¡ï—póݮƥâ.ŒQI¡1í£¿tÄâ]¾ÙÙ©ì=ª/k ߊ‚çÑ'YÁÐ ÓKYÅ²È + Å·ÛØá¼Óþ‰7kÍŒ“´ãvË^éÉw1eðÍ’B(íO½KQ±A8ðéØ,»žZa:úg<º ûŸkœR@®Š¶ƒú>‰5¯¨™»vT|‹¦õü‘¡0€R°èa¼¯…:ñ/ì”PÆ‘êr4„Hξ›Î“ô‰bÞŒˆOmœ%¤n| â 0«›dhäÛ~)£Ò¡*}›ýw0‘wÀ­÷yqYÍÐÎÝ5ž‚ÂYââK:±möïieθûSâA-¤ÿpË"ôwаäUcou‘2BÔÝ}ٳ͘ŽÏÔ7ß-÷uÊôá:@?èÅ-Am×ÏébŸÆKÊ°Rc›ʾ·¾:Öbð׫‹àИÓdÌK7&3,‰¬µ™€œTí/¿:ùI‘+áYÝñ„Ë=;®Ô›61¥ 8/âP¯&j$@ƒ¸3Ÿ:yOu2nFWþá"áOÿþûà0JKYnnL!Ô86Û¤Oæc%·Ë#XO†ƒúAEÝuÖ½È?·P›H(‡\eÏmh¹Ã7rÚi#.rš¤ x†ç• zs®_€~8±oJß^'5!¬-}gí(‡LëMâÿÈnAÉ]YhVí§‰C”beîÓä8,°?¬ŸÚ‚´è­Å‚(¯ÒÒ¨|¯¯šOçàèªLò“´#g…Þt40D Ä¹7 üC’—¹GÌL¼_Jõ¸òËrJb ~0¥ŒÆ.!­miMç­,^Ê®ªògP Dš~q¾¢k×÷¨À7÷ô±ÀíÇœSÆ“1ôdF^\¢EãóÞSx/.ÛûC¯ÇÒb+oƒmo1Z)­wl93틯màW¬ÊØÀ@„¡ä>ñSë´<ô:\ÖC¶®çg£\LÂ4S†ƒ™jj*( +öÙS·ÔÞ²åMï µ!vu%Oÿ;›Í +âYK"ðb¯}n­L3:ÏI9‹©þ(çäˆ ×]z -½Æ†ÿ¶-™<ïmìVFkÚ³£…9Ëÿ’"øfžk¥ŸtTlr^±P3žS½¬[ ^!=9Í'IN—½nð~`¨=£XI´¾ÚaÛ?OtµŸ4Œ†0Ðä%pп°ÒpÌÉÀÄAÐɸ¸]'ÖKömîÄœ•‰$pÀP$\Gã*ŽLD"çU•™Jÿ²þÅc±®Xoxª5æ}4{&òjßÑ »+=/-Û6=úk^NÖ#ç5.ØÉA"Ð R(±™¤S9]Z”O“™Áòs¨ãɇ˜3) %¤ŽpµZÝQþ!Jè¡ÎçI‰‹ÂPPk©g(.ž X_H§_è>#DÒ¯4šœ²,½¢Ræ£úÎf?Eo¤@´Ñ1[r«Ö“ÝÄ«ûöᣀÙ„êBdXølXˆò(¿^’q‘ƒm³¤'Þ;ÃÏóõkR†¤½§›c1‰Û íA@©ê(͇œ¼<²æm@‰ ]tB¦âÆ?ˆç¤€Lü‘p¡¾˜Û¤§BјÙÎû’çïz ]lÎZü‡Ùta_‘º>,ò'Ëëõ _8æzyr¹bä1:‰ïLµn¾.# 3h‘ËÕ¦†"BnAXqÊ#Gù_¸Zd!‰«åÛœ?|R6ˆiùž-ô¼'Êsaià ²X +H ÖªÍ{= y=ÓP›MÒÂf¥†`±@°šìÔâCd·ñt“v‚4fêæBv³@š«¶ö$pËßO"—_8OõܦßÖ)3¯oö:F“—LT.sàíÔÈ]9Êvgö—ê‘ñ†0_! +{>–t#QlÉ°Äæ»/â,†fóGd¶¨ÎŽ¤iòA¼>Ο_ñäÛSáÄ!¥Éûѽ†Tò””åÙ@‹EŒ+Ï©‹süÄŠóY^]Ü·Ù‰ì &¾ñ*$ zlEü!É‹âäñÇ;ÞKM@]Ur-„·vaz0!Ï+a]´§ž 'Z÷gU‰6‰_4ülÝr“ü·>o|ôÛöÔ#lL±psÞoP™3æ3rÞ"ÅókÕB*þCè­Ø* ¥›J×å¸7¸J Ó*S)ýGBa›ýÌöòŽF¤3ÎGL-‹ +*É¥s +—F4~:²2hÙó°/ø¤õåÄ8[ic€'[ÀŸê5×NIÍhEô,Ô¥,™>k](&N„2㞢5¹ +»pŠ”¨"ñF2÷g/¯z¶qÓ+§>ëJQÕ´¢òôÖœwž2Ù-/ÖÇ-r™ÍS´Ø|È7Þ“‡ +á´X}¦éÊ,“t bWy` +oH ßç™{“6_Žˆû¬”»Z`±={›㤽²ñŒÒëj%õx:†½! H3Í ŽA#¡oMÃ)#‘Ÿ3u*UùÅ'«Š} غ–ð%ãZ„#·€ñ|ÊÐÎm"=zñ®g’ÿ„ZÙâl3€ÍÀ—žÓòdw8+j•^|”MŽÖȤL§¦F ]÷ÞeZ|¯ +IöJMƒäWÃãξXøпrÒñKÕçÅ´·‹¼ 3†Æ«–è¯!àž.x±›Õ£r€Ò tPò\èçÑúrˆrž°û³Â2gJ’íø©3¥ °SƒIɾ’¹ÖcΠ>Sj¾5YðA>ÄPs?,P? sy;›¹æ2€57ÁÞ Ïµ öƒ-{ÈZD0Yªßï]Ü[s\pžx'˜"n½lðcœ¿ñ5V©&Ü”B+±½ÿñ”p¤ÏïèŒøÀÊ”SƒÆwXá!U€* Í;ÿƒPþÄé-ØD°Í¢ô(Û¥P§@ÆUåzdÅnBÀ\Úu„~K~òœ9(4ŸkK‘î–º¦A”ÞfG"OÛ³/Ža'œ~-ªåpiá.ÖÆŽÚÕÚ³ò,ú8Y‰G»¤]ÓÌ}¾¿(£…?¥´ºµx\7+s¥”ücïô6")ïõï×Àöu‡°Úy›9½k‡ŠhLî®%˜g´Îä¶=ÙÞËÞ:ˆ©Z„ߦW¥.´´a»¼dœ™)“V°t°êœÃnÏøÄ ”¤Yñ›“K>’¬Ç‚VfÛø›wop·mOlp§XÒÀý#ðù Mùx~DJÑœŒ·«û‹[üÝASåE4 +ªDݘ#l¾@Ʋ„'/Sp:WÐ]ÁiôB»ÎA,ùŒg`€-Â9 ݈–\_\ß7Ź B‰©$?Ûõ•É›:ÇÛ ·´º¥oÔ-ôº<ÖÉaa=ÅX»y íÙò-å $IhÖMô iEÁT€á… /õ±’¤ +ظ£‹_(¡s‡ª™ÝaZ©1àX*ñçf뉗°x ) ?ç%åÆÉy]ýM¨Oño¬ìQCE¶*ƒâqÄp I’ÍÂ麃¶Dó-°üÄ,+¢¯Ú~8aÜ{œ_nui+üga¤qAŒ~\C0ïZÕןJ37¨'\1¶=㧫{¥= +ÖI­¨RŠ‚™ù¸ohŠ«ÆËëò<˜¼.-¨%ëMR'@Ü‚óBd³3#ÊûË•—’P+Ä¿*Êû9£l]%‘†ȌL‹ª7Ѓ~?}´,•ª?…ØúðA«'Í@Ê|ãÊóÙœ\Ô«qs)W¬:šˆ°X3†½â$sJÂX- ÝŽçHV´Á;¬Š®OrtW˜ªù€ww©Ôc©÷±ö?^Š$\e1k ²0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +16 0 obj +<< +/Length1 775 +/Length2 594 +/Length3 533 +/Length 1902 +>> +stream +%!PS-AdobeFont-1.1: CMSY10 1.0 +%%CreationDate: 1991 Aug 15 07:20:57 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /MYFBJI+CMSY10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 15 /bullet put +readonly def +/FontBBox{-29 -960 1116 775}readonly def +/UniqueID 5000820 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÈÎÙ°š'Z²1NÏ‚“R‚oN—]ÎÎÇ+,󡈙ÌÞÙ5Ð; lƸ<ßO#¹¦ ´™v¬32cÉÜïͽL„í£nt‡cMŸÔZô£ŠV¤A,; ¯úëq{ðÞŸûz„`¿GZg°ÇºW¹Šb3ÙéðÃðÌk,j›¢:ó‰æßÿNþÃÞÖ'lkäp<å7%–ô탴›¸só¦9ÎóV"›dw “?ï;¸+ÿ§÷Ug±úMs›w/gNVu4ÆÅ»ñÏaSr¾ ±„r÷ªX¾Œ!m½ßÌ +†¶Ø1Œ¦â,Šñ;T×WoäÊZzù^¥ÌNÛyÀ«fŽOìKZžµðäÀˆÍŽÌOëK@ì‹Ò˜ò3`t¶LCÃÖ¿‹ÃÇv¬~·œ•#,ÿ=ÖŸˆ×Ðî0!ÇKû`¶’D“ª¦[úpÙ“ÍÍã3$‰âQ Z—µfå·j²ô%o˜ È 949ŒìY?z4Û@ÒÐá¬Mý7£F-[ÈôEVj8ƒ|©„gjs 0ûSaÎÅs$k]-Ëš¼»I¡€ðˆûeBÓZˆÜÌÙ÷}‰T.íÕØÚ¾â©[g*KT€’uxd9ÊU3Röã_ 8ýST—þö—rwë ÍKøãù0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +33 0 obj +<< +/Length1 1546 +/Length2 7957 +/Length3 533 +/Length 10036 +>> +stream +%!PS-AdobeFont-1.1: CMTT12 1.0 +%%CreationDate: 1991 Aug 20 16:45:46 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTT12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +end readonly def +/FontName /ATVUDO+CMTT12 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 34 /quotedbl put +dup 37 /percent put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 56 /eight put +dup 61 /equal put +dup 62 /greater put +dup 66 /B put +dup 68 /D put +dup 69 /E put +dup 71 /G put +dup 72 /H put +dup 77 /M put +dup 83 /S put +dup 84 /T put +dup 87 /W put +dup 91 /bracketleft put +dup 92 /backslash put +dup 93 /bracketright put +dup 95 /underscore put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 120 /x put +dup 123 /braceleft put +dup 125 /braceright put +readonly def +/FontBBox{-1 -234 524 695}readonly def +/UniqueID 5000833 def +currentdict end +currentfile eexec +›œi_,+õ`ôÀÕ"WºÍÖP +½¥í˜5ö ÏÈð l.×j‡…kPôØ úëPŒ—ø(?ˆ±~M;Àö^Ãyy¬Ü*f˼[âõ:­ç-ѵZ/¿îeŒ¹_[³+ 5{^Ýòd tp¾ñÅ!¶ûÕÇ~¾Ùd¬Z+¾ÉسäŠå»:cÕEwK’+_ö°nÎCdZy°2}m‚3…þUó@-UÓ´HkçÑõ¶gîØ_­ã +²ìN/OçPÏšiPdXè‰baÀ±Â“¤*¨}äéøjLœöŸºq‘ø®Q +L¥‹o=à'öro2t=Îs•ÂÆóÂÞíÜúŽí}¥mÖ¼Þ3Ÿ÷¦”vIä2^Éa²ß­Ò­Fñ‡ûÖ>ìbÂo´jfj ˆc‚Üë©÷ÎÝdÝÈ¢ñ_ã@v dÄoëÑôÜ7®Þ è¯ËŽJÚ - TºÊ[ç(«‹ó/× )ªò}eŠhôT¤¿8oc"MÇð¨bOk†1šN/Ñxõ–ó² °2ê(ÁW¦ŠiúÒ¼ˆˆXÒ(l Nða¼ 1Eò£~¾À?QÞ|Ú4Í—~°—X³¤–ôšt'žóÆ2-ÅIEùPbÅózQÏ~¯Eò³cK-}ì;)ó[fÍ0 à–öƪ+ðLJ“aÁŸêXœ®ÛXoÙ¸ôß2ì‘›t4Õ»å~‰.°8V}õ¸¯ Ú^’Ejó``’æ×ýÕ¡4<=ŒØSÄ…Ã7ÄH®¦O1ø‡'V–£'.ø†`¯±©2${pÔ_ì›uƒM¡oé¶Ñ—}lòQVŽÆá²2 +à«°Û…Z<“Ûbgß3¾4£E¨4ÀõpïÄæ­›ý5?$ø–æ/¯¢çμø“xAµA'‚ sx7ãµT{Ñû`t`¯Z[w".u™ñÝÏÕ¦‚^D°¥âÈò3zj>#Y$(µxxkÅ'ÎëàGŸ/FX꣪9§þ£ö±­"{iz–`Œ@¿jàìÄópÁyÎ:  RŒµQ3kèoÎÔVékõ +=Áʹ:T»wЇ·|…ñ¥yBi;9lÒWRxý1Ú¦@g‘5\x8šëóúN)vn9oŠC´¸OQT~=Üc&>¢­†×r*¾ ¦H¿æl&ăV¬"P0÷s±¡ vÝ4ü6ÖKë3Sþl—P¿‘ç*×JîA`ꦺ]ÊJo? Iâÿ Í{ÒŽ‹•$qÑEVÍ.ŽVQ ¿2€¾£È5ïŠP“ºó.߯É,]A½z- õ Uu3ó¦Ó£O"Fz§¤ZÏœïy—wÏïv îVeˆbOjŽç6#lDCj°w¿Y¿Ê6åP†G˜ GUSÂØ?ôÇW7m°ZÓ€0öû†›¨£¤*îfæ¹ô}òWæv½omyOm—uÚw®Š@Í{u=…åÙB³–;é¿2ýü}ã5zi´Êü$ÇmB$¡ÝŸÀ õí¥]Ïä´9;Çõý"î³ÓB{{„b@¨ì.%Ô,TƒR3"RÞz0çëK¸;5 +ŠÝaôŸÕÓ©)¥³«o¡®wE÷ÿ/w_W|¼À˜±Û¿ èÇzúM9«ËMA”ü-@CûØÞâ!.MoÁcw{½qÚÌ£™M±J¡HÀÙ ±3pŽ7·¡ +%WHEÑÙe˱×­¾_”¼áï|Ãð\M¿,±–êO¶ÍSûbCISÃ’EA‘L0V»ËEkØ}ÔçËþt msi®7u*™Kð:Z;^<ŸæT¢]dt…·–Ö³aõþ += zðs[¤Òä½89WLyK”ªö+Ï4¿IÕNCš+2·‹÷†å.lû©µ3xù-|ÁKg:þŽßÙÖ $XÁ-…ãŒHžñì×íìËôéZdëš—T¨xdÌ›Ø{ϱ…"¸öý¸ýŽDàõ3·”sŸñfoT©Eý--yÞ›ùj$ùá Û÷“]üö¸,s8O%™f š'\3ç׿Ž>}q?Rã.£ÿH¿—´ž+¬€GwL"Êuþz/ŒR >ÍëÓ.T4£‹¶9rs˜q÷o¯,ùÏ·”ŠºFXŸÉÓâ²f˜%¿æ7 +dÜù_§.äµ +Ù Šè?©Í7ÿ}5m„fa]ð&%ÅôÜ;ÐÜA +}ˆ¬Ë­(ì¬õ[ÄÞÖ <à­YU}Û©Fk^H|b§žÃÒ5Z«lO` ÖÆ¢í{<0}W:J㦧/u²ù¼çR'^tÂ^<Âæáhðy¼§„Q¶P¼j Lte^a4 âûö`:,‚ì¨gÏÆ%^ç×Û½_Umþò˜Ãù°^2}ŽÜ¥'ýR¯ý_p:Å7›Ò\ ‹‡!íG>É!ª• ÖI‘Î=Éÿ ª®Pže#ÞièÝû¿c@J½oB•þÄÓY¦Ü¬4À¹ÓŸ‚¶'³}až…l`Ú¸šri¶¥«4³ç3¼ Y@=Û¿†êv°ÓÉxÖZ/[èHèRœ¿U’׌l¡±ól¹®Ò‚Þ¬FÏÌÂÉd%HÛûoîµ~?\` mqåµ)qZ&²Òï¢4-|bÍÖÓ ¾Ç2M¢(Ýæ›$+âýÇ‹}GYÙ ? »ÝVÕÝF8P"}J‡ñSœ% _ªzÏÇzyxP×e¸êIÌ|GõÌñç•°pùRƒ»S’íôhGÏç“í"¥²Ð +c(?eªÌÇZ$¦k¡®¦GuOéªrsÂN]s‘Ó{«ˆdûŽÄa¯æøßg¢4•È/MK•3FqONÂÙyÝÆWÜôÉ™ Ž‚æßçë: :=™aÊ¥u»·¬?„Y9'\MŸÛÔ@Æ8¥ÉÏ¡à˪Âm´áÁ¨"C–p°xa]Vó>1½–Ü”+6–îT4ÿ[>¢?…Ìi>Y,3Ž³¬'8—³Á̉í>4Õ6BÀv‰a€_Y +õݱ¦¼†ÿÀ×íÝÏ…Í?–_§˜éévç…†|%}ÚÞù  g>Þ¤¯Iˆí¯ÍC¨¾æ\prq œÎuN¾”WéŽ4~9aÈ’²+³êZœÊÕÕ¡"ó–r$ˆ +/ŠD±ÚL¶”x{iÎN•ˆ÷Í¢>€í°ŽôÐ)*4®¾7þ[iƒÓO)¤ÿgÇ cãÕk ´¹KÆÇ}%ËMÍÃd²v BÂóo—…ðÙú#Q–m“°£%Ü×kWoûÇ¿c ZqŒÁŠ€C°4¶²~OqïšDpcÅjÚeÛP—[VMŽÛÝC´îsS3,²Y—'&w´‡æd"1p++Ÿ·ÒðIá”ß}fý/Æ[4e›ëœþïUÛKnª¿÷NÑ üd Ìò}¹ì[6nÅúØ,‚¸Ô=-Ò2ç0VZ®og{9sé²S*†_)PÁ¶uc‚ï^Àa lȘ¼L_û9»º\|z>,Ýý¢#àŸß ANØÿõƒ ., +¹ +ÇÉýaM[Âë?0½AáщÛmd_ÇÅâ ë `0ñE¯î±“ºõ7•ªÉŠ`ÅŒ?³ A‰TïÕ*4:áâÃèùCú¿dʽöL𘞗䗩²©™Ú6—/åÂûéÍ8䃶KÓ‰6¶cN•` +/jø ±µé.™‹»ÙôR‘ƒ¿ñ~g“-Xº&:¶<ì„ThF©.§rèƒA;úâ‡ÐÜòÕ圿{ÅÑ‚=f,á±q·#ñ=6†Í ÿÆyÄÏ·YœÚÃC{¤´j¬Ñþ@fºÌU­ $"ø%#þ+p5¦W¼èÜ•°ô½×nMÕæÛxOÓk^cjy·kZXiöí¾€¿-)_™ +u ÒÜqh‡²OˆÌc Ã~þ¦ +f£²³wYÁüØ:ëði‰Y+20•`œðP‰2cí``³´EBL”ýð=[.>ΖùçµNÐô&åfQŸ*~[£ò4¿}*ííß-VÇ´cêmßO¯#2`XiùH›]Ÿd=ç&SÅÍ#ªõÐy¥•Fš§––¯mQ#ô½ [|©ËC”PÈkÁ_á8.¶È^7U7¢ìù ijbk8`ÚÂ&IÀTc 5.·8râSˆ,ÇÕJU¿´`cê«ÂøT‹ð p´{î*àS#—ñDd-çÿo:«pÒ&Ñl#(ÌÑÆãþƒýÁh@;!z=ÆÒm¨€ ¾-?ÔÄ»YŒ2Òá°ö“ žýå×S5R¸´UýÃë·­ÈA”JH øló/KÒw\Þî»$å@ùg¯ýr*G·O>L^â1Énj;fr÷PqLeò†—¹mÉÉ3Iánòú>¹Ù‹ªöÎÆbÎYìðéšQñcØ’k×…s°‡ÐÇPÏˬÝ$o…‘ú ¬g®ŠˆÇsßÛ\AáÞxìëüî_àÎatiµa@0ÅûY—²n¤Ž6S‚i„Eë·`E£x˜t×7—ÁjïïÑnÄ-ÖÞÁ©ü€ªêŽÅ³ìúödæ…yÈ6Bºå¬äþÕÏU5öÁŸ«ÀZ#¶f‰j %Îp¬n‰‰€^‘æö“,AR§ß8}ðV½óâãƒñ²òÉG †­~9šfPñ÷xjzó°in0@IrxáÐõX£†ó¾È½ ™Û¯híTíɹ\'PÝyzªi\RE1ßnìùtI êí(È;’1=.eùiÑcÎrªÆ³5¨ßÚì†zå|…/¼Ä·‰‹4×Æ\)zîdð½u¦àzÐŽÐ{t®ñb%¢£©þQØåÏ¿A n*gè锿%3?ZßÐiðËEÉú/áÆñ‰†ŠÚòéa‰øÓ¯'Û÷ùQh êO¥í-”¥Ó£h–-)†Tîˆùþä'Ý+ãâDa‘üïßíË‹C±NTàÕÔŒ§x¿†Ò 줯YˆQ æWò§ï>bÔ@Ý’S %/ ÞC°ýÖ\úŸkäÙm¦RÌv ÛdètœT ŽÉ-Ŧý$ø@ÍžÖsRã¹nÔÇÝxä…åiëœO¦ÐŒ†‹ @f0Ìok „^|ª½â+ð6û•ú°€AEu;³ò‹yC ²ü°n‚Æ:àÁAÖeè¡ èÙp0j;À1l‚’3œ¾ùÞÍ„ûœ’‘S!hmñ‘ÇÊÛ;Ô‰¯ç¸=…Íø¢2cÞH"êóT¹ÃPÐ$èß‘[ÄéEK5Á™Wxú±ltýŸ9Qñê@©&h?h¤ü&H`ÚÒ®7óIËàg10L¬ rvüô_}w ðDó):£øÁÚ _©EØMbè7i¤z!Ttô¦«““ùÂ:éËÓâx¬ôS\[¼1å6HÍåö:qR´,3k¥5ÏfDlß#7Ðã œ¦MVñ™øÍÍEV†ÎÏyÿ§ (Oó·}á­-@'jêæ˜-ƒç7DK¤¢ ±f­ª{Ìd²Î6‚•”=æ€nÕ†V†[Ψ)Jê/&:IpÉzo®zF¤u½,ÿb†/~eÖäA€iÉu3nâK(‘pü‚¶ÍñÚî4­ãiØ +…óãµ^òh-‡ñÙcÎySh–¿q˜Ç^¬n‘Ç;‡Lú”7"Á5©²iZ1Õ¶-c½1DNMë Ãæ6=¬ 0#³Â:G‡) +™…9ZÎEiBÐÀ­ä×üIL¼¨…’JŠ QPÒ>ú3)É„ŒŸ\Fë©[È+Ñ>a¨%okEÓ#“@àô¥DÎR“¡õXÙ½E‹[–6î0³ÐþrnÅî À*°Eåß÷¾ÚÚ ›9c„¥ éänÒŒ ›/¸Õ”d½îW5`aíQ™ .PT¸ZLwSà-ÍNlªBž`áçCzÖÊ\@!^éi.Lº!Ž2îè–Ú¡Óày¯1|æðX«¡ù¨h·ùÇ[JÄ!óÓÕ7Õ¼.ÐpÀXì&'šhƒUúÖÅ·‰Xª7òH´£s¼…A댋uÊwx‡'ûä—W“";^» `NHÉŒ%¡•²ª/öÆÈw½AÞþoåÆŽçÜã@ÿøÒ0YØoêׄ‹éÆC£—ôábV~ÔÛ†Ëå»l·¥Ò;yqCûµoöÃ}Ï÷ã7 C§gÜÛb¾Œn(›¤Àr.j4Y‹Ïñ|FÙÔØ~ŒÕE +)†Là>ƒO¼x«^ A¹ßZ®x„ÅÜ‘yξÕJäí„]XKma_JXº«0k#µï=ZkG“+p´ÿªß¼ýŒlìRòΡ@Xè^¹ô0üÍòØQ³”™ØÇå9Ú×\Ε¡c ¦ˆÃ•þbH.û‰®X¸Ñ‚{ÑÁ½f¬é vª§ÔÈlµ#/Ì©BÛ6w6÷ÕË”AÚÉ¥ìJi6âaòZô;ø‚j(ҙW“W¡ê´ž3¶žÍ2(µ²uë ¯V‹G¤/õÍØ$æßcº -&æ l°¡f7pô.Ô³1‹Ø}”ïÅ£Æ +ڥر–eª~º„ÂY‘NªXÏôÅ‚r£h‹X ˆøˆ(›^ÊDüoH5¿}ìk'ˆ¾¼ç1®–ÔÙý.ïeðÆ +TU˜:5s vÓ×ëd½Æ*(êõ‹F¥kÞ‚]tµ®«­«¢œf³#A•ó/X0:6L-ùëÁäé“)šž$l®02ö«˜§Š î<Áåu,tÈmJ–•$•x§xjÀ?f‹U7¹e‹mèߧ;³¤>•—ÍÛ¢F¾¶þ ¢àÁ á×åî IÖïøÌì,ÀnéwNä ²IÛKÝ·¯©±ÑŠ½k}݈•ž \K`hzñdHЕzÞh{ç”TÑO—Ø.ƒ$ÄçÏ[„PËÍecl³&!øÿ2ÞÒþðrmêòsö‘Âfh5äbÓu^º§´8ç6 —÷öt§²€ ÖÔÔÑùÞùÇ+”SÎe¾Q§Á˜g½æ=®ºt0 ‰¨~ÅÙ~Ùït©_ó¬VúPŸombÁö7Žì eµ.ª0½Èf¢_<“*¨*yìêÄZ¸®û¢edPâ­4¸tÉÅn9]Xꊯëü"ªØf?î/mFíkÜ}RÎ_ºœ}®Jž©ƒüÑ×a1|¿ëGzÃN)ž¦˜ÁÁ)ÀŽ]Ç»(„;VÎ_ý° ú=â`{oâ*:.ËšïR¼¸M`@xeËÎYð­çÙõܽc+QRzX"îƧ>J²æ ¦í´‘*Û&PöõÎ2å52P¦îI¬ý,è;½M0Ã3?ü÷q΢¦G¢`â˾X5.B­ ôƒUÓN¥ÇHvMœ^³¤ŸÜ7é)Æ÷N-¬©\Ai¸ýrù!1Ñ^š5œY5Æ-i‡ŸÄÈ“ŸÚ½ “f‘ä(KúóöT§ßîõR«—Íñ¾ÈCãU—í·¯ê‘FÞÇJƒ!16ÈQHÒ¼´ÏÚkríúQÓUzP¬¾µû±_XíԾȚÖi¤Y5Vh·â{#O"UHUù¬ j}§?ÍeH«s…0€££éþ6}T^zÐjѱÖÕ=rí„Õ¶Bb†Þ.ærÖÐ)²ñÓ«õ…¡2c-E+¦¦•¸¡ÏßžÆ[¬¾K¦ÐV2 >ë{ÅÄå.#v#Ók×£¬fÌÃk€žbQôy‰CDÞœ%̪ñ¾«Å +C’ÄAòËúMþÉ7£ædhB ÷LˆzÝvõj ËR~î×]ìø#–ù¬ É#Ò’ÌæiÞž^Æ_ùxB¡—ø˜Y¯Kje$ŽŒÏëƒÐ…ÑM+—îËï‚ãRÿn Q­ú”Ú¶‡å¸Ý`v0=¯¨ª‚«©XW¹U&ñrðpÛ8v s Ã7Ññ™Ñ+ÊÄéz]Þóêçð˜~(In4±Œi˜2¸Ò¹Á9=½ìY#‰6ÝuÐɵýqæÓ]Ä»S…wì”÷¨S½Ò˜!u5I‘z]) ø PY3‹R#æuÀ°'?Ùí(SEGœÇõx°kh¿M‘4³šï-ØžÀ€>̵Î\eùÀ"–oöòÃE<¬Ê Fäh‰á\VEÄúÞ^êÀµ4iRXÔŸ ´q¡Ä}eÐ(6Qíò‰o¡4 ú +¥[z®6¼ y¹eXŸÌ“_5%ÿ‰yz\zEíµècÓÏ(ï Kò2ëY˜iâÓÌ`ÕF¸nÒ‹3ÀÛÆ'ý’¹LZÄÆCç§Vp8±/z>„jzD˜Sæ †¨)ÆCÅ:J-Ú½×h‚÷Ã($âIb +mú.—L#9Â6*Q’™60ë#é-ÍQnP臖«ÛzÔ 0¬âÊu~J/ïi^Nz*]."‹)Ÿ&¾Yr/MÊížé“³ÎX‡¼l´ìô¢[Büe–ýµ™Þ„s’›µ½~M_¼¶M¨Tk\X‚öh;„wúÀÖS{¦ïžìÙýùöѪž•%¨ò*’wHê7D˜à5ò©.ËŒÀ†(õˆYy ¦`ɱ•.ØïÏM¾EÂå±Áìm[^S×3ñ <íân¤i6±@UÚÎÁÌN°½—©¹è²>{}´óZ˜ø9d w8›J.Õalf°½¿ ZÁlx'[ùÈ^;1‰•(±À n„‘F&úÊ k<' ˜¦ÀÉ?±gø{ZYßœwC†V€lïµ"X³c¾®hñþ¨9¿#²{ð’?Ú&DŽÀ)ÖqŒFWÀ:L])àWhÕ¬wêCP݈r}|;î ”zª1yEauwS•nG«•WöB±ÎÜ)£ßA”Ãwb&“1±îQJMA6‡«k¤}~Ãx-{qí]üðpŒUŠ•/±îß{Ûˆ…¾+ k;S÷-`„jäx“Ì={`%scÑ•Ø;$ôG”4JLYí¢í)€Å\-ßçn¦Ê˜^¡åæ"ËóA Qå®+ÛfþjqìÊ·™ß +°YTðéÇýÂiûb6Q·+Œà”qQ P{‡sלj-•T¯KZgU€NŽ[r`/¤-þ®1ý¤K7¬àÛÖ®SYËö¡Õ9qûë¢Ñ+1h@<ºÛtSÈ;ûW‘ßB!E a‚ܸr–˜{{.°øY8çÆÕRA.;÷Žw?PßÈ/ìè(Ñ|1ó÷™×Xs‰€7æ®9T*ò—tH ¹ÄÀ° U+%KhmÜ"DïNj2šXâJŒÑ]ÿhó笺M$lA¸Eç/[JHÙR/‘Õîpò½Âîú(Ø'Ç:‚@öù}Á³vBœÂ=nØÏŸºãÜ \âgÌ.²Ê怗qûÇSÑ°Xb&šÉÓkÁÂH*ã)ªw2´(‰FUî"(Ò¸Dg‹êiÆ€ó.XJ;ÔøKÇæ(Ôs!íAôrT®Pê´$½lÖ«+W°£ÝMÔÈ‚¢.ok[û—˜as§d“Ï_òÖ–ßžUê§3;(^ Ç¿ÙbOˆZ-¸Ÿü¨ 㸣)ɶ§Œ¡¢õú‡wÔç‰~ÓYŽghƒ?ÏÍÍ]ÑK25S±[?[ŠÙŸ˜"‘jr¼;…º×Ø Æ]buoTvÍ×XgõZo5*û"mÇ[%NEA&ÚÇìÖiŠ .5•Êö;‹³ÁÜšÃyý·ùŸ%\ŠÂšFª2+Õ’–šܺiYŹ-¬@D@\ n4Ô܈gæ©0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +44 0 obj +<< +/Length1 796 +/Length2 2243 +/Length3 533 +/Length 3572 +>> +stream +%!PS-AdobeFont-1.1: CMMI12 1.100 +%%CreationDate: 1996 Jul 27 08:57:55 + +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /AEVAHO+CMMI12 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 60 /less put +dup 62 /greater put +readonly def +/FontBBox{-30 -250 1026 750}readonly def +/UniqueID 5087386 def +currentdict end +currentfile eexec +€4y‚«9BÙ0ài§ H1r^ƒ vû¡.Hn˜œ˜tµ'ð’W"xp'ôDpÔ„&,6 ßÝß6WS:W»÷0H¿»ü·:e„TAýÈ7­ÙJÈûÒ.>ÈñÔ´»{8"Ìa˜ïçh½ŸÎ³Dnä¨Ü'ÖÍ$…8Nõõ“ÿÚCòÒ °Š¢z²[wM± ¬ýÍ3æŒFSj´'½×ÚSK x­=x“r!‹0u’\á/ü…0üÕãŽ:jm²Üû®;FSçà'01NµJ)m+ïŠyA’%Ú×´æÖùψ¶›¢“¿•€~{Ë ·N‘ú í"ŽB ªä§ªÊ`±b™¬J½#ïñv_=‘ù/:ûýí7/ÏnKÚ/³Éþz‡¼¾oÓlÕµ‚?Ût"6¦<3F¡ >k6,ô/ÃÈ +¿ +G³DÃmä/Ä ÿD«mRIéõR¨p{·f$&D@ÈC½^_ ”LëfnæCYÖcãU²ñp“©d(l¦ $v~ºOä‡8Uº¾/¹`öƒ°mþ'&L1•ÔF˜ 5¼ ´xbjç&6Y:º@<áÀø²Î£ìÕ†é +Á}K¤¯pƒò114Yû»û—ÔƒM•uJ³ò-d•Ò@‡ÔHao¡Î'¼PÓFT2‡ã† ™´3bA»™ ¢6Àâ`ý'[¥^ÑœƒášÝú¡ó/kr„ˆEÌîq£1Û¸Iu÷©„¾×Æì*å³5§cÐÆ'?†¤f2ý‘A¢yOÈ`ß:.µ›‰wLvp"Ûµwã ¡(½w¤:ø†ÐÂVµ©hïwj¬ ¥8~ë#4Áô, ¡\ ~¦2N‡ôd ˆOVN£6 PÇ·Vžc?{(ÅÌGÚ|‡RÔ¡N&¤r±ûRÎc«ù¸@¸øºE¼Ï¶SgÈuܾ +Ýï7aâ–ÜÚ ~†FtcËK)ÍÉZÚ Gm^ùï{Å:¥:μ^ÕW‚’”‘KÇø#ì)I@¤Zh~Ä,½§ä ~«0Ø ‹òëî ÔíÉUf¢±F‰ðÕ¥­ºVX–yz¦ª´–òÀ¸Ë+7£X‰Ý‡€:æy[#¯V¨”.¹:Ö÷nð[8¿8?ôWTe¨Bè´Õ¼®6>êÎ@~[\è;gŠ$—6¬ëkL¹H‚Q«&+ÚÉf–ܳ³×íN„EJcÏRÿèÑʳŒÎu°„ˆNé + êÝdƒN€Ö$]eÇW4žÂä$¬s…¶Y0-µ€-÷ÌŒÙöëkè™MO»ë²ÍKöUYŠõÍSˆ €-„24ZWí,.•I. d(¢Æ/R4M}‹²0G}…ãšLcÒÒ äã¼xH/§Nt•+ÅvåXn¹‰.m?FÚ5ø„´œ=iÐÃdœ˜ä·È0 ¥ªFoy#oÙLè–Çv”ÐJ(4…ÂœgJ‚FØ{¶ ¸#ºûw,¨ð;8:9‡gÉyx­ì•‹úÚ–V‰7±¬Ž6[uÉ3ÛüKòÿúðÛ©‰¹Ï +w(Lÿž†…ÇYØ&Ž'‘2îLu $Û,8ÔfìK¬¸$ŸÙǶíSØ[™à¢n.l(oB*µôÉjËËؤÁ~D”•Æ ß™²‡ÑÇüï®dóÉ‹q_®ÚLq°÷°ƒiˆ2LÆà&*BÜÕžª,:KK½¹Ì±ç…›Çà­\-é[r Ï$$ƒ>„·p—öïúûÛ"‹ƒ^®SØ# 1øsèÖË7Éh¼µþëíõ×™êÙFÔäGœ½Yã 4¡‰ï©”‰ž­£ëµF×9¿]OøÀóGa£Ñ‹¨·wæ…VÖ2Fë¼)zÒ‡9ÖI|ß•Î0² ŸâÀ§`¿$†pL¥11#.Mv3fGý°®ÓਞBž'À©-0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +endstream +endobj +1 0 obj +<< +/Creator ( TeX output 1999.09.19:2116) +/Producer (dvipdfm \(null\), Copyright \251 1998, by Mark A. Wicks) +/CreationDate (D:19990919212041+00'00') +>> +endobj +5 0 obj +<< +/Type /Page +/Resources 6 0 R +/Contents [19 0 R 4 0 R 20 0 R 21 0 R] +/Parent 3 0 R +>> +endobj +23 0 obj +<< +/Type /Page +/Resources 24 0 R +/Contents [19 0 R 4 0 R 25 0 R 21 0 R] +/Parent 49 0 R +>> +endobj +27 0 obj +<< +/Type /Page +/Resources 28 0 R +/Contents [19 0 R 4 0 R 29 0 R 21 0 R] +/Parent 49 0 R +>> +endobj +49 0 obj +<< +/Type /Pages +/Count 2 +/Kids [23 0 R 27 0 R] +/Parent 3 0 R +>> +endobj +31 0 obj +<< +/Type /Page +/Resources 32 0 R +/Contents [19 0 R 4 0 R 36 0 R 21 0 R] +/Parent 3 0 R +>> +endobj +38 0 obj +<< +/Type /Page +/Resources 39 0 R +/Contents [19 0 R 4 0 R 40 0 R 21 0 R] +/Parent 50 0 R +>> +endobj +42 0 obj +<< +/Type /Page +/Resources 43 0 R +/Contents [19 0 R 4 0 R 47 0 R 21 0 R] +/Parent 50 0 R +>> +endobj +50 0 obj +<< +/Type /Pages +/Count 2 +/Kids [38 0 R 42 0 R] +/Parent 3 0 R +>> +endobj +3 0 obj +<< +/Type /Pages +/Count 6 +/Kids [5 0 R 49 0 R 31 0 R 50 0 R] +/MediaBox [0 0 612 792] +>> +endobj +19 0 obj +<< +/Length 1 +>> +stream + +endstream +endobj +21 0 obj +<< +/Length 1 +>> +stream + +endstream +endobj +4 0 obj +<< +/Length 18 +>> +stream +1 0 0 1 72 720 cm +endstream +endobj +51 0 obj +<< +>> +endobj +52 0 obj +null +endobj +53 0 obj +<< +>> +endobj +2 0 obj +<< +/Type /Catalog +/Pages 3 0 R +/Outlines 51 0 R +/Threads 52 0 R +/Names 53 0 R +>> +endobj +xref +0 54 +0000000000 65535 f +0000075678 00000 n +0000076972 00000 n +0000076638 00000 n +0000076840 00000 n +0000075846 00000 n +0000007289 00000 n +0000027172 00000 n +0000000009 00000 n +0000000212 00000 n +0000034173 00000 n +0000001248 00000 n +0000001453 00000 n +0000050466 00000 n +0000002485 00000 n +0000002692 00000 n +0000059891 00000 n +0000003611 00000 n +0000003817 00000 n +0000076740 00000 n +0000004776 00000 n +0000076790 00000 n +0000007224 00000 n +0000075949 00000 n +0000010761 00000 n +0000007353 00000 n +0000010706 00000 n +0000076055 00000 n +0000014337 00000 n +0000010826 00000 n +0000014282 00000 n +0000076241 00000 n +0000018312 00000 n +0000061884 00000 n +0000014402 00000 n +0000014606 00000 n +0000015647 00000 n +0000018257 00000 n +0000076346 00000 n +0000020888 00000 n +0000018377 00000 n +0000020822 00000 n +0000076452 00000 n +0000027107 00000 n +0000072014 00000 n +0000020953 00000 n +0000021162 00000 n +0000022192 00000 n +0000027030 00000 n +0000076161 00000 n +0000076558 00000 n +0000076907 00000 n +0000076929 00000 n +0000076950 00000 n +trailer +<< +/Size 54 +/Root 2 0 R +/Info 1 0 R +>> +startxref +77068 +%%EOF diff --git a/contrib/bluegnu2.0.3/doc/notice.ps b/contrib/bluegnu2.0.3/doc/notice.ps new file mode 100644 index 0000000..9836799 --- /dev/null +++ b/contrib/bluegnu2.0.3/doc/notice.ps @@ -0,0 +1,1394 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.85 Copyright 1999 Radical Eye Software +%%Title: READMEdvi.dvi +%%Pages: 6 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%DocumentPaperSizes: a4 +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips READMEdvi.dvi -o notice.ps +%DVIPSParameters: dpi=600, compressed +%DVIPSSource: TeX output 1999.09.19:2116 +%%BeginProcSet: texc.pro +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 +1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx +0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx +sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ +rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp +gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B +/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ +/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ +A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy +get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} +ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp +fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 +{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add +chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ +1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} +forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ +/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) +(LaserWriter 16/600)]{A length product length le{A length product exch 0 +exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse +end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask +grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} +imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round +exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto +fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p +delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} +B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ +p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S +rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +TeXDict begin 39158280 55380996 1000 600 600 (READMEdvi.dvi) +@start +%DVIPSBitmapFont: Fa cmmi12 12 2 +/Fa 2 63 df60 D<127012FCB4FCEA7FC0EA1FF0EA07 +FCEA01FF38007FC0EB1FF0EB07FE903801FF809038007FE0EC1FF8EC03FE913800FF80ED +3FE0ED0FF8ED03FF030013C0EE3FF0EE0FFCEE01FF9338007FC0EF1FF0EF07FCEF01FF94 +38007FC0F01FE0A2F07FC0943801FF00EF07FCEF1FF0EF7FC04C48C7FCEE0FFCEE3FF0EE +FFC0030390C8FCED0FF8ED3FE0EDFF80DA03FEC9FCEC1FF8EC7FE0903801FF80D907FECA +FCEB1FF0EB7FC04848CBFCEA07FCEA1FF0EA7FC048CCFC12FC12703B3878B44C>62 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fb cmtt12 12 48 +/Fb 48 126 df<00085B003EEB07C0007FEB0FE0A24814F0A26C14E0B3A2007E1307003E +14C0A20008EB01001C1E75BD33>34 D37 +D<007FB612FEA2B8FCA36C15FEA228077BA133>45 D<121FEA3F80EA7FC0EAFFE0A5EA7F +C0EA3F80EA1F000B0B6C8A33>I<167816F8ED01FCA21503A2ED07F8A2ED0FF0A2ED1FE0 +A216C0153FA2ED7F80A2EDFF00A24A5AA25D1403A24A5AA24A5AA24A5AA25D143FA24A5A +A24AC7FCA2495AA25C1303A2495AA2495AA25C131FA2495AA2495AA249C8FCA25B1201A2 +485AA2485AA2485AA25B121FA2485AA2485AA248C9FCA25AA2127CA2264D7AC433>I<14 +FF010313C0010F13F0497F497F497F9038FF81FF3A01FE007F804848EB3FC049131F4848 +EB0FE0A24848EB07F0A24848EB03F8A24848EB01FCA348C812FEA4007E157E00FE157FAE +6C15FF6C15FEA46D1301003F15FCA26D1303001F15F8A26C6CEB07F0A26C6CEB0FE06D13 +1F6C6CEB3FC0A26CB4EBFF806C018113006DB45A6D5B6D5B6D5B010313C0010090C7FC28 +3F7BBD33>III<903801FFC0010F13F8013F13FE90B67E4881 +4881489038807FF03A0FFC000FF801F06D7E484813036F7EA21500A26C5A6C5AC9FC1501 +5EA215034B5A150F4B5A4B5A913803FFC00103B55A4991C7FC5D8116C06D8090C76C7EED +0FF8ED03FC6F7E6F7E821780163FA2EE1FC0A3123C127EB4FCA2163F1780167F6C16006D +5C6D495A6C6C1303D81FF8EB0FFC3A0FFF807FF86C90B55A6C5D6C15806C6C91C7FC010F +13FC010113C02A3F7CBD33>I56 D<007FB71280A2B812C0A36C16806C1600CBFCA9003FB7FC481680B812 +C0A36C1680A22A177CA933>61 D<1278127EB4FC13C07FEA7FF813FEEA1FFF6C13C00003 +7F6C13F86C6C7EEB1FFF6D7F010313E06D7F9038007FFC6E7E91380FFF806E13C0020113 +F06E13F8ED3FFE151FED07FF815DED1FFE153FEDFFF84A13F0020713C04A138091383FFE +004A5A903801FFF0495B010F13804990C7FCEB7FFC48485A4813E0000F5B4890C8FCEA7F +FE13F8EAFFE05B90C9FC127E127828337BB733>I<007FB512F8B7FC16C082826C813A03 +F8000FFCED03FE15016F7E82A2EE3F80A7EE7F00A25E4B5AA2ED07FCED1FF890B65A5E16 +80828216F89039F8000FFCED01FE6F7EEE7F80163F17C0161FA2EE0FE0A7161F17C0A216 +3FEE7F8016FF4B1300150F007FB65AB75A5E16E05E6C4AC7FC2B3D7DBC33>66 +D<003FB512F04814FCB7FC826C816C813A03F8007FF0ED1FF8ED07FC15036F7E8281EE7F +80A2163F17C0161FA217E0160FA4EE07F0AD160F17E0A4161F17C0163FA21780167FEEFF +00A24B5A15034B5AED1FF8ED7FF0003FB6FC4815C0B75A93C7FC6C14FC6C14F02C3D7EBC +33>68 D<003FB712E04816F0B8FCA27E7ED801FCC71207A8EE03E093C7FCA6151F4B7EA4 +90B6FCA69038FC003FA46FC7FC92C8FCA817F8EE01FCA9003FB7FC5AB8FCA27E6C16F82E +3D7EBC33>I<91387F803C903901FFF03E0107EBFC7E011F13FE49EBFFFE5B9038FFE07F +48EB803FEC000FEA03FC00071407491303485A491301121F5B123F491300A2127F90C8FC +167C93C7FCA25A5AA992387FFFC092B512E0A37E6C6E13C0923800FE00A36D1301123FA2 +7F121F6D1303120F7F6C6C1307A26C6C130F6C6C131F9038FF803F6CEBE0FF6DB5FC7F6D +13FE010713F80101EBF07C9026007F80C7FC2B3F7CBD33>71 D<3B7FFFC00FFFF8B56C48 +13FCA46C496C13F8D803F8C7EA7F00B3A290B7FCA601F8C77EB3A53B7FFFC00FFFF8B56C +4813FCA46C496C13F82E3D7EBC33>I77 D83 D<003FB712F84816FCB8FCA43A +FE000FE001A8007CED00F8C71500B3B3A40107B512C049804980A26D5C6D5C2E3D7EBC33 +>I87 +D<007FB512C0B612E0A415C048C8FCB3B3B3ABB612C015E0A46C14C01B4D6CC433>91 +D<127CA212FEA27EA26C7EA26C7EA26C7EA2120F7FA26C7EA26C7EA26C7EA212007FA26D +7EA26D7EA26D7EA2130F80A26D7EA26D7EA2130180A26D7EA26E7EA26E7EA2141F81A26E +7EA26E7EA26E7EA2140181A26E7EA2ED7F80A2ED3FC0A2151F16E0A2ED0FF0A2ED07F8A2 +ED03FCA21501A2ED00F81678264D7AC433>I<007FB512C0B612E0A47EC7120FB3B3B3AB +007FB5FCB6FCA46C14C01B4D7DC433>I<007FB612FEA2B8FCA36C15FEA228077B7D33> +95 D97 DIIIIIII<14E0EB03F8A2497EA36D5AA2EB00 +E091C8FCAA383FFFF8487FA47EEA0001B3AD007FB612C0B712E016F0A216E06C15C0243E +78BD33>I107 D<383FFFFC487FB5FCA27E +7EC7FCB3B3AD003FB612F84815FCB712FEA26C15FC6C15F8273D7ABC33>I<02FC137E3B +7FC3FF01FF80D8FFEF01877F90B500CF7F15DF92B57E6C010F13872607FE07130301FC01 +FE7F9039F803FC01A201F013F8A401E013F0B3A53C7FFE0FFF07FF80B548018F13C0A46C +486C01071380322C80AB33>I<4AB4FC263FFC0713C0267FFE1F13F000FF017F7F91B5FC +6CB67E6CEC07FEC6EBF801ECF0004A7F4A7F5CA291C7FCA35BB3A43B3FFFF80FFFFC486D +4813FEB56C4813FFA26C496C13FE6C496C13FC302C7FAB33>III114 D<90381FFE0F90B5EA8F8000 +0314FF120F5A5AEBF007387F800190C7FC00FE147F5A153FA37E007FEC1F0001C090C7FC +EA3FF8EBFFC06C13FF6C14E0000314F8C680011F13FF01001480020713C0EC007FED1FE0 +007C140F00FEEC07F01503A27EA27F15076D14E06D130F6DEB3FC09038FE01FF90B61280 +160000FD5C00FC14F8D8F83F13E0D8780790C7FC242E79AC33>III<3B3FFF +C00FFFF0486D4813F8B56C4813FCA26C496C13F86C496C13F0D801F8C7EA7E006D14FE00 +005DA26D1301017E5CA2017F13036D5CA2EC8007011F5CA2ECC00F010F5CA36D6C485AA3 +ECF03F010391C7FCA26E5A0101137EA2ECFCFE01005BA214FF6E5AA36E5AA26E5A6E5A2E +2B7EAA33>I<3B3FFFC07FFF80486DB512C0B500F114E0A26C01E014C06C496C13803B00 +FE000FE000017F495AEB3F804B5A6D6C48C7FC90380FE07E903807F0FEECF1FC903803FB +F8EB01FF6D5B5D6E5A143F6E5A143F814A7E14FF903801FBF0ECF9F8903803F1FCEB07E0 +157E90380FC07F011F6D7E90383F801F02007F496D7E01FE6D7E484813033B7FFFC03FFF +E0B56C4813F0A46C496C13E02C2B7DAA33>120 D123 D125 D +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fc cmbx12 14.4 28 +/Fc 28 118 df46 D<913803FFC0023F13FC91B6FC010315C0010F018113F0903A1FFC003FF84948 +6D7E49486D7E49486D7E48496D138048496D13C0A24817E04890C813F0A34817F8A24817 +FC49157FA3007F17FEA600FF17FFB3A5007F17FEA6003F17FCA26D15FFA26C17F8A36C17 +F0A26C6D4913E0A26C6D4913C06C17806E5B6C6D4913006D6C495AD91FFCEB3FF8903A0F +FF81FFF06D90B55A01011580D9003F01FCC7FC020313C0384F7BCD43>48 +D<157815FC14031407141F14FF130F0007B5FCB6FCA2147F13F0EAF800C7FCB3B3B3A600 +7FB712FEA52F4E76CD43>II<91380FFFC091B512FC +0107ECFF80011F15E090263FF8077F9026FF800113FC4848C76C7ED803F86E7E491680D8 +07FC8048B416C080486D15E0A4805CA36C17C06C5B6C90C75AD801FC1680C9FC4C13005F +A24C5A4B5B4B5B4B13C04B5BDBFFFEC7FC91B512F816E016FCEEFF80DA000713E0030113 +F89238007FFE707E7013807013C018E07013F0A218F8A27013FCA218FEA2EA03E0EA0FF8 +487E487E487EB57EA318FCA25E18F891C7FC6C17F0495C6C4816E001F04A13C06C484A13 +80D80FF84A13006CB44A5A6CD9F0075BC690B612F06D5D011F1580010302FCC7FCD9001F +1380374F7ACD43>I<177C17FEA2160116031607160FA2161F163F167FA216FF5D5DA25D +5DED1FBFED3F3F153E157C15FCEC01F815F0EC03E01407EC0FC01580EC1F005C147E147C +5C1301495A495A5C495A131F49C7FC133E5B13FC485A5B485A1207485A485A90C8FC123E +127E5ABA12C0A5C96C48C7FCAF020FB712C0A53A4F7CCE43>II66 +D<932601FFFCEC01C0047FD9FFC013030307B600F81307033F03FE131F92B8EA803F0203 +DAE003EBC07F020F01FCC7383FF0FF023F01E0EC0FF94A01800203B5FC494848C9FC4901 +F8824949824949824949824949824990CA7E494883A2484983485B1B7F485B481A3FA248 +49181FA3485B1B0FA25AA298C8FC5CA2B5FCAE6C057FB712E0A280A36C94C7003FEBC000 +A36C7FA36C7FA27E6C7FA26C7F6C7FA26D7E6D7F6D7F6D6D5E6D7F6D01FC93B5FC6D13FF +6D6C6D5C6E01F0EC07FB020F01FEEC1FF10203903AFFF001FFE0020091B6EAC07F033FEE +001F030703FC1307DB007F02E01301040149CAFC5B5479D26A>71 +D73 +D80 +D85 DI97 D<913801FFF8021FEBFF8091B612F0010315 +FC010F9038C00FFE903A1FFE0001FFD97FFC491380D9FFF05B4817C048495B5C5A485BA2 +486F138091C7FC486F1300705A4892C8FC5BA312FFAD127F7FA27EA2EF03E06C7F17076C +6D15C07E6E140F6CEE1F806C6DEC3F006C6D147ED97FFE5C6D6CEB03F8010F9038E01FF0 +010390B55A01001580023F49C7FC020113E033387CB63C>99 D<4DB47E0407B5FCA5EE00 +1F1707B3A4913801FFE0021F13FC91B6FC010315C7010F9038E03FE74990380007F7D97F +FC0101B5FC49487F4849143F484980485B83485B5A91C8FC5AA3485AA412FFAC127FA36C +7EA37EA26C7F5F6C6D5C7E6C6D5C6C6D49B5FC6D6C4914E0D93FFED90FEFEBFF80903A0F +FFC07FCF6D90B5128F0101ECFE0FD9003F13F8020301C049C7FC41547CD24B>I<913803 +FFC0023F13FC49B6FC010715C04901817F903A3FFC007FF849486D7E49486D7E4849130F +48496D7E48178048497F18C0488191C7FC4817E0A248815B18F0A212FFA490B8FCA318E0 +49CAFCA6127FA27F7EA218E06CEE01F06E14037E6C6DEC07E0A26C6DEC0FC06C6D141F6C +6DEC3F806D6CECFF00D91FFEEB03FE903A0FFFC03FF8010390B55A010015C0021F49C7FC +020113F034387CB63D>II +I<137F497E000313E0487FA2487FA76C5BA26C5BC613806DC7FC90C8FCADEB3FF0B5FCA5 +12017EB3B3A6B612E0A51B547BD325>105 D107 DI110 D<913801FFE0021F13FE91B612C0010315F0010F9038807FFC903A1FFC000FFED9 +7FF86D6C7E49486D7F48496D7F48496D7F4A147F48834890C86C7EA24883A248486F7EA3 +007F1880A400FF18C0AC007F1880A3003F18006D5DA26C5FA26C5F6E147F6C5F6C6D4A5A +6C6D495B6C6D495B6D6C495BD93FFE011F90C7FC903A0FFF807FFC6D90B55A010015C002 +3F91C8FC020113E03A387CB643>I<90397FE003FEB590380FFF80033F13E04B13F09238 +FE1FF89139E1F83FFC0003D9E3E013FEC6ECC07FECE78014EF150014EE02FEEB3FFC5CEE +1FF8EE0FF04A90C7FCA55CB3AAB612FCA52F367CB537>114 D<903903FFF00F013FEBFE +1F90B7FC120348EB003FD80FF81307D81FE0130148487F4980127F90C87EA24881A27FA2 +7F01F091C7FC13FCEBFFC06C13FF15F86C14FF16C06C15F06C816C816C81C681013F1580 +010F15C01300020714E0EC003F030713F015010078EC007F00F8153F161F7E160FA27E17 +E07E6D141F17C07F6DEC3F8001F8EC7F0001FEEB01FE9039FFC00FFC6DB55AD8FC1F14E0 +D8F807148048C601F8C7FC2C387CB635>I<143EA6147EA414FEA21301A313031307A213 +0F131F133F13FF5A000F90B6FCB8FCA426003FFEC8FCB3A9EE07C0AB011FEC0F8080A26D +EC1F0015806DEBC03E6DEBF0FC6DEBFFF86D6C5B021F5B020313802A4D7ECB34>II E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fd cmbx12 12 22 +/Fd 22 121 df12 D44 D58 D66 D71 D<903801FFE0011F13FE017F6D7E48B612E03A03FE007FF84848EB1FFC6D6D7E48 +6C6D7EA26F7FA36F7F6C5A6C5AEA00F090C7FCA40203B5FC91B6FC1307013F13F19038FF +FC01000313E0000F1380381FFE00485A5B127F5B12FF5BA35DA26D5B6C6C5B4B13F0D83F +FE013EEBFFC03A1FFF80FC7F0007EBFFF86CECE01FC66CEB8007D90FFCC9FC322F7DAD36 +>97 DIIII103 +D<137C48B4FC4813804813C0A24813E0A56C13C0A26C13806C1300EA007C90C7FCAAEB7F +C0EA7FFFA512037EB3AFB6FCA518467CC520>105 D108 D<90277F8007FEEC0FFCB590263FFFC090387FFF8092B5D8F0 +01B512E002816E4880913D87F01FFC0FE03FF8913D8FC00FFE1F801FFC0003D99F009026 +FF3E007F6C019E6D013C130F02BC5D02F86D496D7EA24A5D4A5DA34A5DB3A7B60081B600 +03B512FEA5572D7CAC5E>I<90397F8007FEB590383FFF8092B512E0028114F8913987F0 +3FFC91388F801F000390399F000FFE6C139E14BC02F86D7E5CA25CA35CB3A7B60083B512 +FEA5372D7CAC3E>II<9039 +7FC00FF8B590B57E02C314E002CF14F89139DFC03FFC9139FF001FFE000301FCEB07FF6C +496D13804A15C04A6D13E05C7013F0A2EF7FF8A4EF3FFCACEF7FF8A318F017FFA24C13E0 +6E15C06E5B6E4913806E4913006E495A9139DFC07FFC02CFB512F002C314C002C091C7FC +ED1FF092C9FCADB67EA536407DAC3E>I<90387F807FB53881FFE0028313F0028F13F8ED +8FFC91389F1FFE000313BE6C13BC14F8A214F0ED0FFC9138E007F8ED01E092C7FCA35CB3 +A5B612E0A5272D7DAC2E>114 D<90391FFC038090B51287000314FF120F381FF003383F +C00049133F48C7121F127E00FE140FA215077EA27F01E090C7FC13FE387FFFF014FF6C14 +C015F06C14FC6C800003806C15806C7E010F14C0EB003F020313E0140000F0143FA26C14 +1F150FA27EA26C15C06C141FA26DEB3F8001E0EB7F009038F803FE90B55A00FC5CD8F03F +13E026E007FEC7FC232F7CAD2C>III120 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fe cmsy10 12 1 +/Fe 1 16 df<49B4FC010F13E0013F13F8497F48B6FC4815804815C04815E04815F0A248 +15F84815FCA3B712FEAA6C15FCA36C15F86C15F0A26C15E06C15C06C15806C15006C6C13 +FC6D5B010F13E0010190C7FC27267BAB32>15 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Ff cmr12 12 76 +/Ff 76 124 df<9239FFC001FC020F9038F80FFF913B3F803E3F03C0913BFC00077E07E0 +D903F890390FFC0FF0494890383FF81F4948EB7FF0495A494814E049C7FCF00FE0499139 +3FC0038049021F90C7FCAFB912F0A3C648C7D81FC0C7FCB3B2486CEC3FF0007FD9FC0FB5 +12E0A33C467EC539>11 D<4AB4FC020F13E091387F80F8903901FC001C49487FD907E013 +0F4948137F011FECFF80495A49C7FCA25B49EC7F00163E93C7FCACEE3F80B8FCA3C648C7 +FC167F163FB3B0486CEC7FC0007FD9FC1FB5FCA330467EC536>I<913801FFC0020FEBFB +8091387F803F903801FC00494813FFEB07E0EB1FC0A2495A49C7FC167F49143F5BAFB8FC +A3C648C7123FB3B2486CEC7FC0007FD9FC1FB5FCA330467EC536>I<121EEA7F80EAFFC0 +A9EA7F80ACEA3F00AB121EAC120CA5C7FCAA121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A +4778C61B>33 D<001EEB03C0397F800FF000FF131F01C013F8A201E013FCA3007F130F39 +1E6003CC0000EB000CA401E0131C491318A3000114384913300003147090C712604814E0 +000614C0000E130148EB038048EB070048130E0060130C1E1D7DC431>I<121EEA7F8012 +FF13C0A213E0A3127FEA1E601200A413E013C0A312011380120313005A1206120E5A5A5A +12600B1D78C41B>39 D<140C141C1438147014E0EB01C01303EB0780EB0F00A2131E5BA2 +5B13F85B12015B1203A2485AA3485AA348C7FCA35AA2123EA2127EA4127CA312FCB3A212 +7CA3127EA4123EA2123FA27EA36C7EA36C7EA36C7EA212017F12007F13787FA27F7FA2EB +0780EB03C01301EB00E014701438141C140C166476CA26>I<12C07E12707E7E7E120F6C +7E6C7EA26C7E6C7EA21378137C133C133E131E131FA2EB0F80A3EB07C0A3EB03E0A314F0 +A21301A214F8A41300A314FCB3A214F8A31301A414F0A21303A214E0A3EB07C0A3EB0F80 +A3EB1F00A2131E133E133C137C13785BA2485A485AA2485A48C7FC120E5A5A5A5A5A1664 +7BCA26>I<14F0A2805CA70078EC01E000FCEC03F0B4140FD87F80EB1FE0D83FC0EB3FC0 +3A0FF060FF003903F861FC3900FC63F090383F6FC0D90FFFC7FCEB03FCEB00F0EB03FCEB +0FFF90383F6FC09038FC63F03903F861FC390FF060FF3A3FC0F03FC0D87F80EB1FE0D8FF +00EB0FF000FC14030078EC01E0C790C7FCA7805CA2242B7ACA31>I<121EEA7F8012FF13 +C0A213E0A3127FEA1E601200A413E013C0A312011380120313005A1206120E5A5A5A1260 +0B1D78891B>44 DI<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00 +0A0A78891B>I<1618163C167CA2167816F8A216F01501A216E01503A216C01507A21680 +150FA2ED1F00A2151E153EA2153C157CA2157815F8A25D1401A24A5AA25D1407A25D140F +A292C7FC5CA2141E143EA2143C147CA25CA25C1301A25C1303A25C1307A25C130FA291C8 +FC5BA2133EA2133C137CA2137813F8A25B1201A25B1203A2485AA25B120FA290C9FC5AA2 +121E123EA2123C127CA2127812F8A25A126026647BCA31>I<14FF010713E090381F81F8 +90383E007C01FC133F4848EB1F8049130F4848EB07C04848EB03E0A2000F15F049130100 +1F15F8A2003F15FCA390C8FC4815FEA54815FFB3A46C15FEA56D1301003F15FCA3001F15 +F8A26C6CEB03F0A36C6CEB07E0000315C06D130F6C6CEB1F806C6CEB3F00013E137C9038 +1F81F8903807FFE0010090C7FC28447CC131>I<143014F013011303131F13FFB5FC13E7 +13071200B3B3B0497E497E007FB6FCA3204278C131>II<49B4FC010F13E0013F13FC9038FE01FE3A01F0007F80D803C0EB3FC0 +48C7EA1FE0120EED0FF0EA0FE0486C14F8A215077F5BA26C48130FEA03C0C813F0A3ED1F +E0A2ED3FC01680ED7F0015FE4A5AEC03F0EC1FC0D90FFFC7FC15F090380001FCEC007FED +3F80ED1FC0ED0FE016F0ED07F816FC150316FEA2150116FFA3121EEA7F80487EA416FE49 +1303A2007EC713FC00701407003015F80038140F6C15F06CEC1FE06C6CEB3FC0D803E0EB +7F803A01FE01FE0039007FFFF8010F13E0010190C7FC28447CC131>II<0006 +15C0D807C0130701FCEB7F8090B612005D5D5D15E0158026063FFCC7FC90C9FCAE14FF01 +0713C090381F01F090383800FC01F0137ED807C07F49EB1F8016C090C7120F000615E0C8 +EA07F0A316F81503A216FCA5123E127F487EA416F890C712075A006015F0A20070140F00 +3015E00038EC1FC07E001EEC3F806CEC7F006C6C13FE6C6C485A3901F807F039007FFFE0 +011F90C7FCEB07F826447BC131>II<14FF010713E0 +011F13F890387F00FE01FC133FD801F0EB1F804848EB0FC049EB07E00007EC03F0484813 +01A290C713F8481400A47FA26D130116F07F6C6CEB03E013FC6C6CEB07C09039FF800F80 +6C9038C01F006CEBF03EECF87839007FFEF090383FFFC07F01077F6D13F8497F90381E7F +FFD97C1F1380496C13C02601E00313E048486C13F000079038007FF84848EB3FFC48C712 +0F003EEC07FE150148140016FF167F48153FA2161FA56C151E007C153EA2007E153C003E +157C6C15F86DEB01F06C6CEB03E06C6CEB07C0D803F8EB1F80C6B4EBFF0090383FFFFC01 +0F13F00101138028447CC131>56 D<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FCB3A5 +121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A2B78AA1B>58 D<007FBAFCBB1280A26C1900 +CEFCB0007FBAFCBB1280A26C190041187BA44C>61 D<16C04B7EA34B7EA34B7EA34B7EA3 +ED19FEA3ED30FFA203707FED607FA203E07FEDC03FA2020180ED801FA2DA03007F160FA2 +0206801607A24A6D7EA34A6D7EA34A6D7EA20270810260147FA202E08191B7FCA2498202 +80C7121FA249C87F170FA20106821707A2496F7EA3496F7EA3496F7EA201788313F8486C +83D80FFF03037FB500E0027FEBFFC0A342477DC649>65 DIIIIIIII75 DIIIIIII<49B41303010FEBE007013F13F890 +39FE00FE0FD801F8131FD807E0EB079F49EB03DF48486DB4FC48C8FC4881003E81127E82 +127C00FC81A282A37E82A27EA26C6C91C7FC7F7FEA3FF813FE381FFFE06C13FE6CEBFFE0 +6C14FC6C14FF6C15C0013F14F0010F80010180D9001F7F14019138001FFF03031380816F +13C0167F163F161F17E000C0150FA31607A37EA36C16C0160F7E17806C151F6C16006C5D +6D147ED8FBC05CD8F9F0495AD8F07C495A90393FC00FE0D8E00FB51280010149C7FC39C0 +003FF02B487BC536>I<003FB912F8A3903BF0001FF8001F01806D481303003EC7150048 +187C0078183CA20070181CA30060180CA5481806A5C81600B3B3A54B7EED7FFE49B77EA3 +3F447DC346>II87 D<003FB500E0011FB5FCA3C691C7000713E0 +D93FFC020190C7FC6D4815FC010F6F5A6D6C15E0A26D6C4A5A6D6C5D4DC8FC6D6D5B6E6C +13065F6E6C131C6E6C13185F6E6C13706E6C13605F913803FE01DA01FF5B4CC9FC6E1387 +ED7FC616CCED3FFC6F5A5E6F7E6F7EA26F7E82A203067F150E92380C7FC04B6C7E153892 +38301FF04B6C7E15E04B6C7E4A486C7E14034B6C7E02066D7F140E020C6E7E4A6E7E1438 +02306E7E4A6E7E14E04A6E7E49486E7E130349C86C7E496F7F5B496C8201FF83000701E0 +020313F8B500F8021FEBFFF0A344447EC349>II91 D<01C01318000114384848137048C712E0000EEB01C000 +0C1480001C13030018140000385B003013060070130E0060130CA300E0131C481318A400 +CFEB19E039FFC01FF801E013FCA3007F130FA2003F130701C013F8390F0001E01E1D71C4 +31>II<13C01201EA0380EA0700 +120E120C121C12181238123012701260A312E05AA412CFEAFFC013E0A3127FA2123F13C0 +EA0F000B1D79C41B>96 DI +II<167FED3FFFA315018182B3EC7F80903803FF +F090380FC07C90383F000E017E1307496D5AD803F87F48487F5B000F81485AA2485AA212 +7FA290C8FC5AAB7E7FA2123FA26C7EA2000F5D7F6C6C5B00035C6C6C9038077F806C6C01 +0E13C0013F011C13FE90380FC0F8903803FFE09026007F0013002F467DC436>IIIIII<143C14FFA2491380A46D1300A2143C91C7 +FCADEC7F80EB3FFFA31300147F143FB3B3AA123E127F39FF807F00A2147EA25C6C485A38 +3C01F06C485A3807FF80D801FEC7FC195785C21E>IIII<3901FC01FE00FF903807FFC091381E07F0913838 +01F8000701707F0003EBE0002601FDC07F5C01FF147F91C7FCA25BA35BB3A8486CECFF80 +B5D8F83F13FEA32F2C7DAB36>II<3901FC +03FC00FF90380FFF8091383C07E091387001F83A07FDE000FE00010180137F01FFEC3F80 +91C7EA1FC04915E049140F17F0160717F8160317FCA3EE01FEABEE03FCA3EE07F8A217F0 +160F6D15E0EE1FC06D143F17806EEB7E00D9FDC05B9039FCF003F891383C0FE091381FFF +80DA03FCC7FC91C9FCAE487EB512F8A32F3F7DAB36>I<3903F803F000FFEB1FFCEC3C3E +EC707F0007EBE0FF3803F9C000015B13FBEC007E153C01FF13005BA45BB3A748B4FCB512 +FEA3202C7DAB26>114 D<90383FE0183901FFFC383907E01F78390F0003F8001E130148 +1300007C1478127800F81438A21518A27EA27E6C6C13006C7E13FC383FFFE06C13FC6C13 +FF6C14C06C14E0C614F0011F13F81300EC0FFC140300C0EB01FE1400157E7E153EA27EA3 +6C143C6C147C15786C14F86CEB01F039F38003E039F1F00F8039E07FFE0038C00FF01F2E +7DAC26>I<1306A5130EA4131EA3133E137EA213FE12011207001FB512F0B6FCA2C648C7 +FCB3A4150CAA017E131C017F1318A26D133890381F8030ECC070903807E0E0903801FFC0 +9038007F001E3E7EBC26>IIIIII<003FB612E0A29038C0003F90C713C0003CEC7F800038ECFF00A20030495A0070495A +A24A5A0060495AA24A5A4A5AA2C7485A4AC7FC5B5C495A13075C495A131F4A1360495A49 +5AA249C712C0485AA2485A485A1501485A48481303A24848EB07804848131F00FF14FF90 +B6FCA2232B7DAA2B>II E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fg cmbx12 17.28 31 +/Fg 31 121 df<16F04B7E1507151F153FEC01FF1407147F010FB5FCB7FCA41487EBF007 +C7FCB3B3B3B3007FB91280A6395E74DD51>49 D<913801FFF8021FEBFFC091B612F80103 +15FF010F16C0013F8290267FFC0114F89027FFE0003F7F4890C7000F7F48486E7FD807F8 +6E148048486E14C048486E14E048486F13F001FC17F8486C816D17FC6E80B56C16FE8380 +A219FFA283A36C5BA26C5B6C90C8FCD807FC5DEA01F0CA14FEA34D13FCA219F85F19F04D +13E0A294B512C019804C14004C5B604C5B4C5B604C13804C90C7FC4C5A4C5A4B13F05F4B +13804B90C8FC4B5AED1FF84B5A4B5A4B48143F4A5B4A48C8FC4A5A4A48157E4A5A4A5AEC +7F8092C9FC02FE16FE495A495A4948ED01FCD90FC0150749B8FC5B5B90B9FC5A4818F85A +5A5A5A5ABAFCA219F0A4405E78DD51>I<92B5FC020F14F8023F14FF49B712C04916F001 +0FD9C01F13FC90271FFC00077FD93FE001017F49486D8049C86C7F484883486C6F7F14C0 +486D826E806E82487FA4805CA36C5E4A5E6C5B6C5B6C495E011FC85A90C95CA294B55A61 +4C91C7FC604C5B4C5B4C5B4C5B047F138092260FFFFEC8FC020FB512F817E094C9FC17F8 +17FF91C7003F13E0040713F8040113FE707F717F7113E085717FA2717F85A285831A80A3 +1AC0EA03FCEA0FFF487F487F487FA2B57EA31A80A34D14005C7E4A5E5F6C495E49C8485B +D81FF85F000F5ED807FE92B55A6C6C6C4914806C01F0010791C7FC6C9026FF803F5B6D90 +B65A011F16F0010716C001014BC8FCD9001F14F0020149C9FC426079DD51>II<01C0EE01C0D801F816 +0F01FF167F02F0EC07FFDAFF8090B5FC92B7128019006060606060606095C7FC17FC5F17 +E0178004FCC8FC16E09026FC3FFCC9FC91CBFCADED3FFE0203B512F0020F14FE023F6E7E +91B712E001FDD9E00F7F9027FFFE00037F02F801007F02E06EB4FC02806E138091C8FC49 +6F13C04917E07113F0EA00F090C914F8A219FC83A219FEA419FFA3EA03F0EA0FFC487E48 +7E487FA2B57EA319FEA35C4D13FC6C90C8FC5B4917F8EA3FF001804B13F06D17E0001F5E +6C6C17C06D4B1380D807FC92B512006C6C4A5B6C6C6C01075B6C01E0011F5BD97FFE90B5 +5A6DB712C0010F93C7FC6D15FC010115F0D9003F1480020301F0C8FC406078DD51>II<4DB5 +ED03C0057F02F014070407B600FE140F047FDBFFC0131F4BB800F0133F030F05FC137F03 +3F9127F8007FFE13FF92B6C73807FF814A02F0020113C3020702C09138007FE74A91C900 +1FB5FC023F01FC16074A01F08291B54882490280824991CB7E4949844949844949844986 +5D49498490B5FC484A84A2484A84A24891CD127FA25A4A1A3F5AA348491A1FA44899C7FC +A25CA3B5FCB07EA380A27EA2F50FC0A26C7FA37E6E1A1F6C1D80A26C801D3F6C6E1A00A2 +6C6E616D1BFE6D7F6F4E5A7F6D6D4E5A6D6D4E5A6D6D4E5A6D6E171F6D02E04D5A6E6DEF +FF806E01FC4C90C7FC020F01FFEE07FE6E02C0ED1FF8020102F8ED7FF06E02FF913803FF +E0033F02F8013F1380030F91B648C8FC030117F86F6C16E004071680DC007F02F8C9FC05 +0191CAFC626677E375>67 D69 DI73 D82 DI85 D<913803FFFE027FEBFFF00103B612FE010F6F7E4916E090273FFE001F7FD97F +E001077FD9FFF801017F486D6D7F717E486D6E7F85717FA2717FA36C496E7FA26C5B6D5A +EB1FC090C9FCA74BB6FC157F0207B7FC147F49B61207010F14C0013FEBFE004913F048B5 +12C04891C7FC485B4813F85A5C485B5A5CA2B55AA45FA25F806C5E806C047D7F6EEB01F9 +6C6DD903F1EBFF806C01FED90FE114FF6C9027FFC07FC01580000191B5487E6C6C4B7E01 +1F02FC130F010302F001011400D9001F90CBFC49437CC14E>97 D<92380FFFF04AB67E02 +0F15F0023F15FC91B77E01039039FE001FFF4901F8010113804901E0010713C049018049 +13E0017F90C7FC49484A13F0A2485B485B5A5C5A7113E0485B7113C048701380943800FE +0095C7FC485BA4B5FCAE7EA280A27EA2806C18FCA26C6D150119F87E6C6D15036EED07F0 +6C18E06C6D150F6D6DEC1FC06D01E0EC7F806D6DECFF00010701FCEB03FE6D9039FFC03F +FC010091B512F0023F5D020F1580020102FCC7FCDA000F13C03E437BC148>99 +DI< +92380FFFC04AB512FC020FECFF80023F15E091B712F80103D9FE037F499039F0007FFF01 +1F01C0011F7F49496D7F4990C76C7F49486E7F48498048844A804884485B727E5A5C4871 +7EA35A5C721380A2B5FCA391B9FCA41A0002C0CBFCA67EA380A27EA27E6E160FF11F806C +183F6C7FF17F006C7F6C6D16FE6C17016D6C4B5A6D6D4A5A6D01E04A5A6D6DEC3FE00103 +01FC49B45A6D9026FFC01F90C7FC6D6C90B55A021F15F8020715E0020092C8FC030713F0 +41437CC14A>III<903807FF80B6FCA6C6FC7F7FB3A8EF1FFF94B5 +12F0040714FC041F14FF4C8193267FE07F7F922781FE001F7FDB83F86D7FDB87F07FDB8F +C0814C7F039FC78015BE03BC8003FC825DA25DA25DA45DB3B2B7D8F007B71280A651647B +E35A>II<90 +3807FF80B6FCA6C6FC7F7FB3B3B3B3ADB712E0A623647BE32C>108 +D<902607FF80D91FFFEEFFF8B691B500F00207EBFF80040702FC023F14E0041F02FF91B6 +12F84C6F488193267FE07F6D4801037F922781FE001F9027E00FF0007FC6DA83F86D9026 +F01FC06D7F6DD987F06D4A487F6DD98FC0DBF87EC7804C6D027C80039FC76E488203BEEE +FDF003BC6E4A8003FC04FF834B5FA24B5FA24B94C8FCA44B5EB3B2B7D8F007B7D8803FB6 +12FCA67E417BC087>I<902607FF80EB1FFFB691B512F0040714FC041F14FF4C8193267F +E07F7F922781FE001F7FC6DA83F86D7F6DD987F07F6DD98FC0814C7F039FC78015BE03BC +8003FC825DA25DA25DA45DB3B2B7D8F007B71280A651417BC05A>I<923807FFE092B6FC +020715E0021F15F8027F15FE494848C66C6C7E010701F0010F13E04901C001037F49496D +7F4990C87F49486F7E49486F7E48496F13804819C04A814819E048496F13F0A24819F8A3 +48496F13FCA34819FEA4B518FFAD6C19FEA46C6D4B13FCA36C19F8A26C6D4B13F0A26C19 +E06C6D4B13C0A26C6D4B13806C6D4B13006D6C4B5A6D6D495B6D6D495B010701F0010F13 +E06D01FE017F5B010090B7C7FC023F15FC020715E0020092C8FC030713E048437CC151> +I113 DI<913A3FFF8007800107B5EAF8 +1F011FECFE7F017F91B5FC48B8FC48EBE0014890C7121FD80FFC1407D81FF0801600485A +007F167F49153FA212FF171FA27F7F7F6D92C7FC13FF14E014FF6C14F8EDFFC06C15FC16 +FF6C16C06C16F06C826C826C826C82013F1680010F16C01303D9007F15E0020315F0EC00 +1F1500041F13F81607007C150100FC81177F6C163FA2171F7EA26D16F0A27F173F6D16E0 +6D157F6D16C001FEEDFF806D0203130002C0EB0FFE02FCEB7FFC01DFB65A010F5DD8FE03 +15C026F8007F49C7FC48010F13E035437BC140>II<902607FFC0ED3FFEB60207B5FCA6C6EE00076D82 +6D82B3B3A260A360A2607F60183E6D6D147E4E7F6D6D4948806D6DD907F0ECFF806D01FF +EB3FE06D91B55A6E1500021F5C020314F8DA003F018002F0C7FC51427BC05A>I<007FB6 +00C0017FB512F8A6D8001F01F8C70007EBF0006D040190C7FC6D6D5D6D6D4A5A6D6D4A5A +70495A6D4C5A6E7F6E6D495A6E6D495A7049C8FC6E4A5A6E6D485A6E6D485A6E13FFEF8F +F06EEC9FE06FEBFFC06F5C6F91C9FC5F6F5B816F7F6F7F8481707F8493B57E4B805D4B80 +DB0FF37FDB1FE17F04C080153F4B486C7F4B486C7F4A486D7F4A486D7F4A5A4B6D7F020F +6E7F4A486D7F4A486D804A5A4AC86C7F49486F7F4A6F7F0107707FEB3FFFB600F049B7FC +A650407EBF55>120 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fh cmr12 14.4 49 +/Fh 49 121 df<15E01401EC03C0EC0780EC0F00141E5C147C5C495A13035C495A130F5C +131F91C7FC133E137EA25BA2485AA25B1203A2485AA3120F5BA2121FA25BA2123FA290C8 +FCA35AA5127EA312FEB3A3127EA3127FA57EA37FA2121FA27FA2120FA27F1207A36C7EA2 +12017FA26C7EA2137EA2133E7F80130F8013076D7E8013016D7E147C143C8080EC0780EC +03C0EC01E014001B7974D92E>40 D<12E07E12787E7E7E6C7E7F6C7E6C7E7F1200137C13 +7E133E133F7F6D7E80A26D7EA26D7EA2130180A26D7EA380147EA2147FA280A21580A214 +1FA315C0A5140FA315E0B3A315C0A3141FA51580A3143FA21500A25CA2147EA214FE5CA3 +495AA25C1303A2495AA2495AA25C49C7FC5B133E137E137C5B12015B485A485A5B48C8FC +121E5A5A5A5A1B797AD92E>I<120FEA3FC0EA7FE012FF13F0A213F8A3127F123FEA0F38 +1200A513781370A313F013E0A2120113C0120313801207EA0F00121EA25A5A12300D2376 +8B21>44 DI<120FEA3FC0EA7FE0EAFFF0A6EA7FE0EA3FC0EA0F +000C0C768B21>I48 +D<14075C5C147F5C1307133F000FB5FCB6FC13F913C1EAF0011200B3B3B3A7497F010F13 +E0B712FEA4274F75CE3B>III<000316C001C0140301F8141F903AFFC003FF8091B612005E5E5E16E0 +16804BC7FC019F13F8018113800180C9FCB0EC0FF0ECFFFE01836D7E903987F01FE09039 +9F0007F801BE6D7E01F86D7E496D7E49EC7F805BEE3FC04915E0C9121F17F0A317F8160F +A317FCA5120EEA3F80487E12FF7FA217F85B161F5B48C813F012700078ED3FE0A26C16C0 +167F6CEDFF80001F16006C6C495A6C6C13036C6CEB07F8D801F8EB1FF06CB4EB7FE06DB5 +1280011F49C7FC010713F8010013C02E517ACE3B>53 DI<121EA2121F13F090B812C0A4481780A218005FA2003CC9123C00385E0078167017 +F000704B5A5F16034C5A94C7FC485D161E5EC9123816785E5E15014B5A5E15074BC8FCA2 +151E153E153C157C157815F8A24A5AA21403A25D1407A2140FA25D141FA3143FA3147F5D +A414FFA65BAC6D90C9FC143C32537AD03B>III<120FEA3FC0EA7FE0EAFFF0A6 +EA7FE0EA3FC0EA0F00C7FCB3A9120FEA3FC0EA7FE0EAFFF0A6EA7FE0EA3FC0EA0F000C33 +76B221>I64 DII70 DII<49B612FEA490C7003F138092 +380FFE001507B3B3B3A21206EA3FC0487E487EA44B5AA25B007F5D0180131F0078C75B6C +143F003E4A5A6C5D6C6C495A2707E003FEC7FC3901FC07FC6CB512F0013F13C0D907FCC8 +FC2F547BD13C>74 D77 DII82 DI<003FBB +12C0A449C79038F0000701F06E48130001C0183F48C8EE0FE0007E1907007C1903A20078 +1901A400701900A500F01AF0481A70A6C91700B3B3AC4C7E030313FC027FB712E0A44C51 +7CD055>I87 +D97 +DII<17FF4BB5FCA4ED0007160182B3A6EC0FF8EC7FFF49B512E0903907FC +03F090391FE0007C49487F49C7120F01FE80484880485A000781484880A2485AA2485AA2 +127FA35B12FFAB127FA27FA2123FA27F121FA26C6C5C00075D7F6C6C5C6C6C5C6C6C021E +7F6D6C017C13E0D91FC049EBFF8090390FF807E00103B512800100495ADA1FF091C7FC39 +547CD241>II<157F913803FFE0020F13F091383FC0 +F891387F01FC903901FE03FE903803FC0714F81307EB0FF0A290391FE003FCED01F892C7 +FC495AB3B612FEA426003FC0C7FCB3B3A580EBFFF0007FEBFFF8A427547DD324>III<1378EA01FE487E487F +A66C90C7FC6C5AEA007890C8FCB0EB7F80B5FCA41203C6FC137FB3B3A43801FFE0B61280 +A419507CCF21>II108 +D<01FFD907FEEC03FFB590261FFFC0010F13E0037F01F0013F13F8912701F80FFC9038FC +07FE913D03C003FE01E001FF000390260700019038038000C6010E6D6C48C76C7E6D48DA +7F8E6E7E4A159CA24ADA3FF86E7E02605D14E04A5DA34A5DB3AD2601FFE0DAFFF0EC7FF8 +B6D8C07F9026FFE03FB512F0A45C347CB363>I<01FFEB07FCB590383FFF8092B512E091 +3901F00FF8913903C007FC000349C66C7EC6010E13016D486D7E5C143002706E7E146014 +E05CA35CB3AD2601FFE0903801FFE0B600C0B612C0A43A347CB341>II<90397F8007FCB590387FFF800281B512E0913987F00FF891398F8003FC00 +0190399E0001FF6C01BC6D7FD97FF86E7E4A6E7E4A6E7E4A140F844A6E7EA2717EA3717E +A4711380AB4D1300A44D5AA24D5AA2606E140F4D5A6E5D6E4A5A6E4A5A02BC4AC7FC029E +495A028FEB07FC913987E01FF00281B512C0DA807F90C8FCED0FF892CAFCB13801FFE0B6 +12C0A4394B7DB341>I<01FFEB1F80B5EB7FF0913801FFF8913803E1FC91380783FE0003 +EB0F07C6131EEB7F1C1438143091387003FC91386000F0160014E05CA45CB3AA8048487E +B612F0A427347DB32E>114 DIII< +007FB5D8800FB51280A4C69026FC0003EBF000D93FF86D1380011F4BC7FC010F15F80107 +5D6D6C5C6E495A6D6C5C6D14076E6C48C8FCEDC01E6E6C5A021F133891380FF0786F5A91 +3807FDE002035BEC01FF5E80157F6F7E824B7E15FFEDE7F802017F913803C3FEEC07814A +C67E020E80021E6D7E4A133F4A6D7E4A80707E4948130749486D7E010781010F6E7E013F +8201FF8200076D010713F0B500F8011FEBFFE0A43B337FB23E>120 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fi cmr17 20.74 26 +/Fi 26 120 df46 D48 D50 +DI66 D70 DI78 D82 D<001FBE12F8A502F8C7000F01F0C7121F4801806E4902 +0113FC01FCC86C49EC003F491B1F01E01B07491B03491B0190C91800A2003E1D7CA2003C +1D3CA3481D1EA500701D0EA8481D07A6CA1900B3B3B3B14D7F4D7F057F13FE031FB812F8 +A568757BF473>84 D86 D<913803FF80021F13F891B512FE903A +03FC01FF80903A07E0003FE0D91F80EB0FF8013EC76C7E496E7E01F06E7E48486E7F717E +4848153F4982D807A06F7E13FC487E6D6F7E80A2717EA46C90C8FC6C5A6C5ACAFCA6EE07 +FF0303B5FC157F913903FFFE07021F138091387FF800903801FFC0010790C7FCEB1FFCEB +3FF0EBFFE0485B485B4890C8FC5B485A485AA2485A1A0E485AA312FF5B170FA4171FA26D +153F007F163B177B6DDBF1FE131C003F16E16C6C14016C6C912603C0FF13386C6CEC0F80 +6C6C6C903A1F007F80706C6D017CECE1E028007FF803F8EB3FFF011FB500E06D13800103 +91C7000713009026003FF8EC01FC474D79CB4F>97 D99 D101 D103 D<131EEB7F80497E487F487FA66C5B6C5B +6D5A011EC7FC90C8FCB3A7EB01F0EA07FFB5FCA51201EA007F133FA2131FB3B3B3A3497E +EBFFFEB612FCA51E727AF12A>105 D107 DIIII114 DI<1407 +A85CA65CA35CA35CA25CA25BA25B5B5B5B5B5B48B712FE120FB8FCA3D8000190C9FCB3B3 +A2EF01C0B0EF03806D7FA3027FEC0700815F6E6C130E021F141E6F131C6E6C5B6E6C13F8 +913901FF01F09139007FFFC0031F5BDB03FCC7FC326B7EE93D>I<02F8EE0F80D803FFEE +3FFFB5030FB5FCA5C6EE000F013F1603011F82A2010F82B3B3A660A460A3601307606E15 +0E0103161E606E4B7F010116706D6C03F07F6FD903E013F86E6C4948EBFFF8DA1FE0EB1F +00DA0FFE13FE0203B512F8DA007F13E0030790C7EBC0004D4C7ACA58>I119 D E +%EndDVIPSBitmapFont +end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%BeginPaperSize: a4 +a4 +%%EndPaperSize + +%%EndSetup +%%Page: 1 1 +1 0 bop 1440 951 a Fi(Release)53 b(Notice)950 1158 y(BlueGn)l(u)f(T)-13 +b(esting)52 b(F)-13 b(ramew)l(ork)1501 1366 y(V)g(ersion)53 +b(2.0.3)1297 1661 y Fh(Jan-Willem)36 b(Neurden)m(burg)1593 +1811 y(jotOmega)f(dsc)1379 1960 y(56)j(Brigham)d(Hill)j(Road)1303 +2110 y(Grafton)f(MA)78 b(01519-1135)1356 2259 y(neurden)m(burg)s +(j@acm.org)1444 2409 y(T)-10 b(el:)50 b(\(508\))37 b(839-0276)1430 +2558 y(F)-10 b(ax:)51 b(\(508\))37 b(839-7267)1442 2792 +y(Septem)m(b)s(er)g(19,)g(1999)324 3228 y Fg(1)161 b(In)l(tro)t +(duction)324 3448 y Ff(BlueGn)m(u)35 b(is)g(a)h(framew)m(ork)f(for)g +(testing)g(other)h(programs.)52 b(It)35 b(has)h(b)s(een)h(created)f(to) +324 3568 y(b)s(e)30 b(compatible)e(with)i(DejaGn)m(u.)42 +b(Its)31 b(purp)s(ose)f(is)g(to)g(pro)m(vide)g(a)g(single)f(fron)m(t)g +(end)i(for)324 3688 y(all)f(tests.)45 b(Bey)m(ond)34 +b(this,)e(BlueGn)m(u)h(o\013ers)g(sev)m(eral)g(adv)-5 +b(an)m(tages)33 b(for)f(testing:)469 3913 y Fe(\017)49 +b Ff(The)25 b(\015exibilit)m(y)e(and)i(consistency)h(of)e(the)h(BlueGn) +m(u)f(framew)m(ork)h(mak)m(es)g(it)f(easy)568 4033 y(to)k(write)g +(tests)h(for)f(an)m(y)h(program,)f(with)g(the)h(exception)g(of)e(GUI)i +(applications.)469 4236 y Fe(\017)49 b Ff(BlueGn)m(u)33 +b(pro)m(vides)h(a)f(la)m(y)m(er)h(of)e(abstraction,)h(whic)m(h)h(mak)m +(es)g(all)d(tests)k(\(if)d(cor-)568 4356 y(rectly)39 +b(written\))f(p)s(ortable)g(to)h(an)m(y)g(host)g(or)g(target)f(where)i +(a)f(program)e(m)m(ust)568 4477 y(b)s(e)32 b(tested.)469 +4679 y Fe(\017)49 b Ff(BlueGn)m(u)37 b(is)g(written)h(in)f([incr)g +(Tcl],)i(whic)m(h)f(in)f(turn)g(is)h(based)g(on)g(Tcl)f(\(T)-8 +b(o)s(ol)568 4800 y(Command)31 b(Language\).)43 b(The)34 +b(framew)m(ork)e(comprises)h(t)m(w)m(o)g(parts:)658 5002 +y(1.)48 b(the)33 b(testing)g(framew)m(ork,)1918 5251 +y(1)p eop +%%Page: 2 2 +2 1 bop 658 548 a Ff(2.)48 b(the)33 b(test-suites)h(or)e(test-sets)i +(themselv)m(es.)469 751 y Fe(\017)49 b Ff(BlueGn)m(u)31 +b(will)e(w)m(ork)j(with)f(an)m(y)h(Tcl)f(based)i(in)m(terpreter)e(as)h +(long)e(as)i([incr)f(Tcl])568 872 y(has)f(b)s(een)h(included.)42 +b(Y)-8 b(ou)30 b(can)h(include)e('exp)s(ect',)j('Tk',)g(and/or)e(other) +g(exten-)568 992 y(sions.)469 1196 y Fe(\017)49 b Ff(Includes)33 +b(DejaGn)m(u)f(release)h(1.6)324 1528 y Fg(2)161 b(Requiremen)l(ts)324 +1747 y Ff(The)47 b(follo)m(wing)d(mo)s(dules)i(should)g(ha)m(v)m(e)i(b) +s(een)g(installed,)g(b)s(efore)f(y)m(ou)g(can)g(install)324 +1868 y(and/or)32 b(use)h(BlueGn)m(u:)469 2096 y Fe(\017)49 +b Ff(Tcl)32 b(release)h(8.0)f(or)g(higher,)469 2299 y +Fe(\017)49 b Ff(incr)32 b(Tcl)g(release)h(3.0)f(or)g(higher.)470 +2528 y(An)m(y)g(other)f(extensions)i(that)d(is)h(compatible)e(with)h +(Tcl)h(release)g(8.0)g(can)g(b)s(e)g(used)324 2648 y(as)i(w)m(ell.)324 +2981 y Fg(3)161 b(Structure)51 b(and)j(Con)l(ten)l(ts)c(of)k(the)f +(Release)324 3200 y Ff(The)24 b(ro)s(ot)f(directory)g(of)g(the)h +(release)g(con)m(tains)g(the)g(README)g(\014les)f(with)g(installation) +324 3320 y(instructions)40 b(and)h(the)g(\014les)g(needed)h(to)e(build) +g(and)g(install)f(this)h(pro)s(duct.)68 b(It)41 b(also)324 +3441 y(con)m(tains)32 b(the)h(executable)h(scripts)f(of)f(the)h(BlueGn) +m(u)g(testing)f(framew)m(ork.)470 3561 y(The)i(top-lev)m(el)d +(directories)h(are)h(listed)f(b)s(elo)m(w:)324 3789 y +Fd(lib:)47 b Ff(the)28 b(pac)m(k)-5 b(ages)29 b(and)e(pro)s(cedures)i +(that)f(mak)m(e)f(the)h(BlueGn)m(u)g(and)f(DejaGn)m(u)g(test-)568 +3910 y(ing)k(framew)m(ork.)44 b(This)33 b(also)e(includes)i(the)g +(default)f(target)g(de\014nition)f(\014les.)324 4113 +y Fd(testsets:)48 b Ff(the)31 b(BlueGn)m(u)e(test-suites)i(and)f(test)g +(examples.)43 b(It)30 b(con)m(tains)g(the)g(follo)m(w-)568 +4234 y(ing)h(sub)s(directories.)568 4462 y Fd(BlueGn)m(u:)48 +b Ff(test)34 b(scripts)f(to)f(test)h(the)g(testing)f(framew)m(ork)h +(itself.)568 4624 y Fd(examples:)48 b Ff(test)34 b(suite)e(and)h(test)g +(script)g(examples.)568 4786 y Fd(con\014g,)38 b(lib,)e(to)s(ols:)48 +b Ff(curren)m(tly)41 b(empt)m(y)-8 b(,)42 b(but)f(can)f(b)s(e)g(used)i +(for)d(test-set)j(de-)782 4906 y(p)s(enden)m(t)34 b(con\014guration)e +(\014les,)h(library)e(\014les,)h(and)h(to)s(ols.)1918 +5251 y(2)p eop +%%Page: 3 3 +3 2 bop 324 548 a Fd(con\014g:)49 b Ff(curren)m(tly)33 +b(empt)m(y)-8 b(.)324 751 y Fd(do)s(c:)49 b Ff(the)28 +b(DejaGn)m(u)f(texinfo)g(source)i(and)e(the)h(do)s(cumen)m(tation)f(in) +g('info',)g('dvi',)i('ps',)568 872 y(and)42 b('p)s(df)7 +b(')43 b(represen)m(tation,)j(resp)s(ectiv)m(ely)e(dejagn)m(u.info*,)g +(dejagn)m(u.dvi,)i(de-)568 992 y(jagn)m(u.ps,)33 b(and)g(dejagn)m(u.p)s +(df.)44 b(A)32 b(DejaGn)m(u)h(man)e(page)i(is)f(also)g(a)m(v)-5 +b(ailable.)568 1154 y(It)37 b(also)g(con)m(tains)g(the)h(T)1493 +1175 y(E)1547 1154 y(X)g(v)m(ersion)g(\(README.tex\))h(of)e(this)g(do)s +(cumen)m(t)g(as)568 1274 y(w)m(ell)c(as)h(the)g('dvi',)h('ps')g('h)m +(tml',)e(and)h('p)s(df)7 b(')34 b(represen)m(tation,)h(resp)s(ectiv)m +(ely)g(no-)568 1395 y(tice.dvi,)d(notice.ps,)h(notice.h)m(tml,)e(and)i +(notice.p)s(df.)324 1598 y Fd(testsuite:)48 b Ff(con)m(tains)32 +b(a)g(mixture)g(of)g(DejaGn)m(u)h(and)f(BlueGn)m(u)h(test)g(scripts.) +324 1802 y Fd(con)m(trib:)47 b Ff(con)m(tains)33 b(examples)g(ho)m(w)g +(DejaGn)m(u)f(is)g(used)i(at)e(Cygn)m(us.)324 2005 y +Fd(example:)48 b Ff(con)m(tains)39 b(a)f(full)f(DejaGn)m(u)h(test)h +(framew)m(ork)f(example)g(for)g(testing)g(the)568 2125 +y(program)31 b('calc')h(whic)m(h)h(is)f(also)g(included.)324 +2458 y Fg(4)161 b(Installation)55 b(and)f(use)f(under)f(Unix)324 +2677 y Ff(Before)37 b(y)m(ou)h(can)f(install)d(and)k(use)f(BlueGn)m(u)g +(y)m(ou)h(need)g(to)f(ha)m(v)m(e)h(installed)d(the)i(fol-)324 +2798 y(lo)m(wing)31 b(three)i(pac)m(k)-5 b(ages:)469 +3001 y Fe(\017)49 b Ff(Tcl)32 b(v)m(ersion)h(8.0.3)469 +3204 y Fe(\017)49 b Ff(Tk)33 b(v)m(ersion)g(8.0.3)469 +3408 y Fe(\017)49 b Ff(incr)32 b(Tcl)g(v)m(ersion)h(3.0.1)324 +3611 y(The)42 b(source)g(for)e(these)i(pac)m(k)-5 b(ages)42 +b(should)f(all)e(b)s(e)i(lo)s(cated)f(in)g(one)h(directory)-8 +b(.)69 b(The)324 3732 y(sub)s(directory)33 b(in)f(the)h(directory)f +(should)h(b)s(e:)469 3935 y Fe(\017)49 b Ff(tcl8.0.3)469 +4138 y Fe(\017)g Ff(tk8.0.3)469 4342 y Fe(\017)g Ff(itcl3.0.1)470 +4545 y(The)27 b(follo)m(wing)d(examples)i(use)h(the)f(command)f +(`./con\014gure)i({pre\014x=/to)s(ols/...`.)324 4666 +y(This)33 b(will)e(install)g(all)g(pac)m(k)-5 b(ages)34 +b(in)e(a)h(directory)g(\\/to)s(ols".)43 b(When)35 b(y)m(ou)e(omit)f +(the)h(\\{)324 4786 y(pre\014x"-switc)m(h)26 b(then)g(the)g +(installation)c(default)j(will)e(b)s(e)j(the)g(directory)f(\\/usr/lo)s +(cal".)1918 5251 y(3)p eop +%%Page: 4 4 +4 3 bop 324 548 a Fc(4.1)135 b(Installation)47 b(of)e(needed)h(P)l(ac)l +(k)-7 b(ages)324 733 y Ff(When)33 b(y)m(ou)g(ha)m(v)m(e)h(not)e +(installed)f(Tcl)h(and)h(the)f(other)h(needed)h(extensions,)g(then)f(y) +m(ou)324 853 y(need)26 b(to)f(retriev)m(e)h(the)f(sources)i(from)d +(\\www.tcltk.com/itcl".)40 b(Y)-8 b(ou)25 b(need)h(to)f(`gunzip`)324 +973 y(the)31 b(\014les)g(and)g(do)g(a)g(`tar)g(xf`)g(of)g(all)e(these)j +(pac)m(k)-5 b(ages)32 b(in)e(one)h(directory)-8 b(,)32 +b(let's)f(call)e(this)324 1094 y(directory)j(\\TclTk".)470 +1214 y(F)-8 b(rom)38 b(the)i(directory)f(\\TclTk",)i(y)m(ou)f(should)g +(do)f(the)h(follo)m(wing)c(to)j(install)e(the)324 1335 +y(pac)m(k)-5 b(ages:)324 1563 y Fb(\045)51 b(cd)h(tcl8.0.3/unix)324 +1683 y(\045)f(./configure)k(--prefix=/tools/tcl8.0.3)i(--enable-gcc)e +(--enable-shared)324 1804 y(\045)c(make)324 1924 y(\045)g(mkdir)i +(/tools/tcl8.0.3)324 2044 y(\045)e(make)i(install)324 +2165 y(\045)e(cd)h(../../tk8.0.3/unix)324 2285 y(\045)f(./configure)k +(--prefix=/tools/tk8.0.3)i(--enable-gcc)d(--enable-shared)324 +2406 y(\045)d(make)324 2526 y(\045)g(mkdir)i(/tools/tk8.0.3)324 +2646 y(\045)e(make)i(install)324 2767 y(\045)e(cd)h(../../itcl3.0.1)324 +2887 y(\045)f(./configure)k(--prefix=/tools/itcl3.0.1)i(--enable-gcc)e +(--enable-shared)324 3007 y(\045)c(make)324 3128 y(\045)g(mkdir)i +(/tools/itcl3.0.1)324 3248 y(\045)e(make)i(install)324 +3537 y Fc(4.2)135 b(Installing)47 b(BlueGn)l(u)324 3722 +y Ff(Y)-8 b(ou)41 b(can)g(no)m(w)h(`gunzip`)f(and)g(`tar)g(xf`)g(the)h +(BlueGn)m(u)f(v)m(ersion)h(2.0.3)e(in)h(the)g(direc-)324 +3842 y(tory)f(\\Tc)m(kTk".)68 b(This)40 b(will)e(create)j(the)f +(directory)g(\\bluegn)m(u2.0.3".)66 b(No)m(w)40 b(do)g(the)324 +3963 y(follo)m(wing:)324 4191 y Fb(\045)51 b(cd)h(bluegnu2.0.3)324 +4311 y(\045)f(./configure)k(--prefix=/tools/bluegnu2.0.)q(3)324 +4432 y(\045)c(make)324 4552 y(\045)g(mkdir)i(/tools/bluegnu2.0.3)324 +4672 y(\045)e(make)i(install)470 4901 y Ff(This)33 b(will)d(install)g +(BlueGn)m(u)j(in)f(the)h(directories:)1918 5251 y(4)p +eop +%%Page: 5 5 +5 4 bop 469 548 a Fe(\017)49 b Ff(/to)s(ols/bluegn)m(u2.0.3/bin)469 +751 y Fe(\017)g Ff(/to)s(ols/bluegn)m(u2.0.3/lib/bluegn)m(u)469 +955 y Fe(\017)g Ff(/to)s(ols/bluegn)m(u2.0.3/info)469 +1158 y Fe(\017)g Ff(/to)s(ols/bluegn)m(u2.0.3/man)324 +1447 y Fc(4.3)135 b(Using)46 b(BlueGn)l(u)324 1632 y +Ff(When)39 b(y)m(ou)g(ha)m(v)m(e)h(installed)c([incr)i(Tcl])h(and)f +(BlueGn)m(u)h(and)f(y)m(ou)h(ha)m(v)m(e)h(the)f(resp)s(ec-)324 +1752 y(tiv)m(e)23 b(\\bin")f(directories)h(in)f(y)m(our)i(P)-8 +b(A)g(TH)24 b(v)-5 b(ariable,)23 b(then)h(y)m(ou)g(can)f(start)g +(running)g(some)324 1872 y(tests.)41 b(Y)-8 b(ou)21 b(can)h(go)g(in)m +(to)f(the)h(BlueGn)m(u)f(source)i(directory)f(\\bluegn)m +(u2.0.3/testsets/examples")324 1993 y(and)32 b(run)h(the)g(follo)m +(wing:)324 2221 y Fb(\045)51 b(bluegnu)i(versionTcl.itcl)324 +2342 y(\045)e(bluegnu)i(ts_001)324 2462 y(\045)e(bluegnu)i(ts_002)324 +2582 y(\045)e(bluegnu)i(ts_003)470 2811 y Ff(The)37 b(ab)s(o)m(v)m(e)f +(test)g(result)g(should)f(all)f(b)s(e)i(P)-8 b(ASS.)36 +b(The)h(follo)m(wing)c(test)j(will)d(giv)m(e)j(a)324 +2931 y(result)c(UNKNO)m(WN,)i(b)s(ecause)g(no)e(pass/fail)f +(instruction)h(ha)m(v)m(e)i(b)s(een)f(giv)m(en.)324 3159 +y Fb(\045)51 b(bluegnu)i(tc001)470 3388 y Ff(The)34 b(last)d(test)j(y)m +(ou)f(can)g(run)g(will)d(fail)g(in)i(its)g(simple)f(form:)324 +3616 y Fb(\045)51 b(bluegnu)i(tc002)470 3844 y Ff(But)33 +b(will)d(pass)k(if)d(y)m(ou)i(execute)i(the)e(test)g(as)g(follo)m(ws:) +324 4073 y Fb(\045)51 b(bluegnu)i(tc002[English])470 +4301 y Ff(This)46 b(is)g(b)s(ecause)i(the)e(test)h(scripts)g(need)g(a)f +(test)h(case)g(iden)m(ti\014er)f(to)f(\014nd)i(the)324 +4421 y(correct)33 b(b)s(enc)m(hmark)g(co)s(de.)1918 5251 +y(5)p eop +%%Page: 6 6 +6 5 bop 324 548 a Fg(5)161 b(Changes)324 796 y Fc(5.1)135 +b(V)-11 b(ersion)45 b(2.0.3)324 981 y Ff(This)37 b(b)s(eing)f(the)i +(\014rst)f(public)f(release)i(it)d(is)i(not)g(to)g(useful)g(to)f(list)g +(all)f(the)i(c)m(hanges.)324 1101 y(BlueGn)m(u)46 b(has)g(b)s(een)h(mo) +s(deled)e(after)h(DejaGn)m(u)g(and)g(is)g(a)g(complete)f(new)i(imple-) +324 1222 y(men)m(tation)31 b(whic)m(h)i(has)g(b)s(een)g(tested)g +(thoroughly)-8 b(.)43 b(When)33 b(do)s(cumen)m(tation)e(is)h(b)s(eing) +324 1342 y(written)e(more)f(c)m(hanges)j(will)c(b)s(e)i(made.)42 +b(An)31 b(example)e(of)h(some)g(of)f(these)j(c)m(hanges)f(as)324 +1462 y(a)k(result)f(of)h(this)g(do)s(cumen)m(tation)f(e\013ort)h(can)g +(b)s(e)g(found)g(in)f(the)i(test-suites)g(ts)p Fb(_)p +Ff(001,)324 1583 y(ts)p Fb(_)p Ff(002,)d(and)g(ts)p Fb(_)p +Ff(003.)45 b(The)34 b(\014rst)f(t)m(w)m(o)h(are)f(not)g(as)g(easy)h(to) +e(write)h(as)g(the)h(third.)44 b(The)324 1703 y(test)33 +b(suite)g(ts)p Fb(_)p Ff(001)f(is)g(a)g(script)h(implemen)m(tation)c +(of)k(the)g(command)e(line:)324 1906 y Fb(\045)51 b(cd)h +(bluegnu2.0.3/testsets)324 2027 y(\045)f(bluegnu)i +(examples/tc002[English=)q(B])k(\\)324 2147 y(>)51 b +("examples/tc002[Dutch=B])q(={M)q(SG=H)q(allo)58 b(Wereld}")324 +2351 y Ff(This)35 b(ma)m(y)g(b)s(e)g(useful)g(for)g(simple)e(tests)k +(but)e(when)h(y)m(ou)g(w)m(an)m(t)g(to)f(write)f(more)h(com-)324 +2471 y(plex)28 b(test-suite)f(scripts)i(y)m(ou)f(w)m(ould)g(lik)m(e)f +(some)g(more)g(\015exibilit)m(y)-8 b(,)27 b(so)h(t)m(w)m(o)g(pro)s +(cedures)324 2591 y(w)m(ere)39 b(in)m(tro)s(duced,)f(whic)m(h)g(are)g +(sho)m(wn)g(in)f(test-suite)h(ts)p Fb(_)p Ff(002.)58 +b(This)37 b(mak)m(es)h(writing)324 2712 y(rather)g(complex)g(so)h(the)g +(pro)s(cedures)h(ha)m(v)m(e)g(b)s(ecome)f(part)f(of)g(the)h(pro)s +(cedures)h('ap-)324 2832 y(p)s(endQueue',)32 b('prep)s(endQueue',)h +(and)d('run)m(test'.)44 b(The)30 b(resulting)f(script)h(is)f(sho)m(wn)i +(in)324 2953 y(test-suit)h(ts)p Fb(_)p Ff(003.)470 3073 +y(Changes)i(lik)m(e)e(this)g(will)e(b)s(e)j(made)f(in)g(the)h(future!) +324 3406 y Fg(6)161 b(F)-13 b(uture)52 b(Enhancemen)l(ts)324 +3625 y Ff(The)33 b(follo)m(wing)d(enhancemen)m(ts)35 +b(are)d(b)s(eing)g(planned:)469 3828 y Fe(\017)49 b Ff(T)-8 +b(arget)24 b(co)s(de)h(will)e(b)s(e)i(made)f(in)m(to)g(a)g(class)h +(with)f(metho)s(ds)h('start',)h('load',)f('exit',)568 +3949 y(and)d('v)m(ersion'.)40 b(Instead)23 b(of)e(the)h(curren)m(t)h(') +p Fa(<)p Ff(target)p Fa(>)p Fb(_)p Ff(start',)h(')p Fa(<)p +Ff(target)p Fa(>)p Fb(_)p Ff(load',)568 4069 y(')p Fa(<)p +Ff(target)p Fa(>)p Fb(_)p Ff(exit',)33 b(and)g(')p Fa(<)p +Ff(target)p Fa(>)p Fb(_)p Ff(v)m(ersion',)h(whic)m(h)g(ha)m(v)m(e)h(b)s +(een)f(tak)m(en)g(from)568 4189 y(DejaGn)m(u.)469 4393 +y Fe(\017)49 b Ff(Pro)s(cedures)34 b(will)d(b)s(e)i(created)h(that)f +(mak)m(e)g(it)f(easy)i(to)f(test)h(WEB)f(application)568 +4513 y(from)e(the)i(framew)m(ork.)469 4716 y Fe(\017)49 +b Ff(Other)34 b(enhancemen)m(ts)i(will)31 b(b)s(e)j(made)g(dep)s +(ending)g(on)g(the)g(use)h(of)f(the)g(frame-)568 4837 +y(w)m(ork)f(in)f(testing)g(di\013eren)m(t)h(applications.)1918 +5251 y(6)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/contrib/bluegnu2.0.3/example/Makefile.in b/contrib/bluegnu2.0.3/example/Makefile.in new file mode 100644 index 0000000..3fc31ac --- /dev/null +++ b/contrib/bluegnu2.0.3/example/Makefile.in @@ -0,0 +1,98 @@ +VPATH = @srcdir@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = $(exec_prefix)/bin +libdir = $(exec_prefix)/lib +tooldir = $(libdir)/$(target_alias) +datadir = $(exec_prefix)/lib/dejagnu +mandir = $(prefix)/man + +infodir = $(prefix)/info +includedir = $(prefix)/include +docdir = $(datadir)/doc +targetdir = $(datadir)/$(target_canonical) + +SHELL = /bin/sh + +# Examples don't get installed +INSTALL = +INSTALL_PROGRAM = $(INSTALL) +INSTALL_DATA = $(INSTALL) + +CC = @CC@ +CFLAGS = -g +SUBDIRS = @subdirs@ +RUNTEST = runtest +RUNTESTFLAGS = + +FLAGS_TO_PASS = \ + "CC=$(CC)" \ + "CFLAGS=$(CFLAGS)" \ + "INSTALL=$(INSTALL)" \ + "INSTALL_DATA=$(INSTALL_DATA)" \ + "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ + "LDFLAGS=$(LDFLAGS)" \ + "MAKEINFO=$(MAKEINFO)" \ + "RUNTEST=$(RUNTEST)" \ + "RUNTESTFLAGS=$(RUNTESTFLAGS)" \ + "exec_prefix=$(exec_prefix)" \ + "prefix=$(prefix)" \ + "tooldir=$(tooldir)" + +#### host, target, and site specific Makefile frags come in here. + +all: force + @$(MAKE) subdir_do DO=$@ $(FLAGS_TO_PASS) + +.PHONY: info install install-info check installcheck dvi +info: +install: +dvi: +install-info: +check: +installcheck: + +.NOEXPORT: +MAKEOVERRIDES= + +check: force + rootme=`pwd`; export rootme; $(MAKE) DO=check DODIRS=calc subdir_do + +subdir_do: force + @for i in $(SUBDIRS); do \ + echo "Making $(DO) in $${i}..." ; \ + if [ -d ./$$i ] ; then \ + if (rootme=`pwd`/ ; export rootme ; \ + rootsrc=`cd $(srcdir); pwd`/ ; export rootsrc ; \ + cd ./$$i; \ + $(MAKE) $(FLAGS_TO_PASS) $(DO)) ; then true ; \ + else exit 1 ; fi ; \ + else true ; fi ; \ + done +force: + +clean mostlyclean: + -rm -f \#* *~ core *.o a.out xgdb *.x + @$(MAKE) subdir_do DO=$@ $(FLAGS_TO_PASS) + +distclean maintainer-clean realclean: clean + @$(MAKE) subdir_do DO=$@ $(FLAGS_TO_PASS) + -rm -f *~ core + -rm -f Makefile *-init.exp site.* + -rm -f config.status config.log config.cache + -rm -fr *.log summary detail + +Makefile: $(srcdir)/Makefile.in $(host_makefile_frag) config.status + @echo "Rebuilding the Makefile..." + $(SHELL) ./config.status + +configure: $(srcdir)/configure.in $(srcdir)/Makefile.in $(srcdir)/../aclocal.m4 + @echo "Rebuilding configure..." + @cd ${srcdir} ;\ + autoconf --localdir=${srcdir}/.. + +config.status: + @echo "Rebuilding config.status..." + $(SHELL) ./config.status --recheck diff --git a/contrib/bluegnu2.0.3/example/calc/Makefile.in b/contrib/bluegnu2.0.3/example/calc/Makefile.in new file mode 100644 index 0000000..ecd1283 --- /dev/null +++ b/contrib/bluegnu2.0.3/example/calc/Makefile.in @@ -0,0 +1,112 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1994 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 1, 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. +# + +# target name +PROG= calc + +# compiler specifics +CC = @CC@ +CFLAGS = -g -I$(srcdir) -I. +CALC = calc + +# directory specifics +VPATH = @srcdir@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +# testsuite specifics +# Setup the testing framework, if you have one +# Flags that we pass when building the testsuite. +EXPECT = ` \ + if [ -f $${rootme}/../../../expect/expect ] ; then \ + echo $${rootme}/../../../expect/expect ; \ + else echo expect ; fi` + +RUNTEST = ` \ + if [ -f $${srcdir}/../../../dejagnu/runtest ] ; then \ + echo $${srcdir}/../../../dejagnu/runtest ; \ + else echo runtest ; fi` + +RUNTESTFLAGS= + +## --- NOTHING BELOW HERE SHOULD REQUIRE MODIFICATIONS --- ## + +SRCS= calc.c + +OBJS= calc.o + +all: ${PROG} + +calc.o: calc.c + +.c.o: + ${CC} ${CFLAGS} -I$(srcdir) -I. -c $< + +${PROG}: ${OBJS} ${DPADD} + ${CC} ${LDFLAGS} ${CFLAGS} -o $@ ${OBJS} ${DPADD} ${LDADD} + +check: site.exp all + rootme=`pwd`; export rootme; \ + srcdir=${srcdir} ; export srcdir ; \ + EXPECT=${EXPECT} ; export EXPECT ; \ + if [ -f $${rootme}/../../expect/expect ] ; then \ + TCL_LIBRARY=$${srcdir}/../../tcl/library ; \ + export TCL_LIBRARY ; fi ; \ + ${RUNTEST} ${RUNTESTFLAGS} --tool ${PROG} CALC=${PROG} --srcdir ${srcdir}/testsuite + +site.exp: ./config.status Makefile + @echo "Making a new config file..." + -@rm -f ./tmp? + @touch site.exp + + -@mv site.exp site.bak + @echo "## these variables are automatically generated by make ##" > ./tmp0 + @echo "# Do not edit here. If you wish to override these values" >> ./tmp0 + @echo "# add them to the last section" >> ./tmp0 + @echo "set tool calc" >> ./tmp0 + @echo "set srcdir ${srcdir}" >> ./tmp0 + @echo "set objdir `pwd`" >> ./tmp0 + @echo "## All variables above are generated by configure. Do Not Edit ##" >> ./tmp0 + @cat ./tmp0 > site.exp + @cat site.bak | sed \ + -e '1,/^## All variables above are.*##/ d' >> site.exp + -@rm -f ./tmp? + +install: ${PROG} + +clean mostlyclean: + -rm -f a.out [Ee]rrs tags mklog core ${OBJS} ${PROG} + +distclean maintainer-clean realclean: clean + -rm -f Makefile + -rm -f config.status config.log config.cache + -rm -f calc.h calc.log calc.plog calc.psum + -rm -f calc.sum site.exp + +Makefile: $(srcdir)/Makefile.in $(host_makefile_frag) config.status + @echo "Rebuilding the Makefile..." + $(SHELL) ./config.status + +configure: $(srcdir)/configure.in $(srcdir)/Makefile.in $(srcdir)/../../aclocal.m4 + @echo "Rebuilding configure..." + @cd ${srcdir} ;\ + autoconf --localdir=${srcdir}/../.. + +config.status: + @echo "Rebuilding config.status..." + $(SHELL) ./config.status --recheck diff --git a/contrib/bluegnu2.0.3/example/calc/calc.1 b/contrib/bluegnu2.0.3/example/calc/calc.1 new file mode 100644 index 0000000..ea60393 --- /dev/null +++ b/contrib/bluegnu2.0.3/example/calc/calc.1 @@ -0,0 +1,29 @@ +.\" +.TH SKEL 1 "28th Jan 1993" +.SH NAME +calc \- a very dumb calculator to demonstrate +.I deja-gnu +.SH SYNOPSIS +.B calc +.SH DESCRIPTION +.LP +.B calc +accepts the commands: +.TP +.B add #1 #2 +Add #1 and #2 and print the answer. +.TP +.B multiply #1 #2 +Multiply #1 and #2 and print the answer. +.TP +.B quit +.br +Exit +.TP +.B version +Print a version string. +.SH BUGS +.LP +.B multiply 2 n +gives the wrong answer (unless n == 0). + diff --git a/contrib/bluegnu2.0.3/example/calc/calc.c b/contrib/bluegnu2.0.3/example/calc/calc.c new file mode 100644 index 0000000..784e39b --- /dev/null +++ b/contrib/bluegnu2.0.3/example/calc/calc.c @@ -0,0 +1,65 @@ +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include "calc.h" + +static int words(); + +int main() +{ + char line[SIZE]; + int nword; + char *words[NWORD]; + + while(printf("calc: "), fflush(stdout), fgets(line,SIZE,stdin) != NULL) { + if((nword = split(line,words,NWORD)) == 0) continue; + if(strcmp(words[0],"add") == 0) { + if(nword != 3) { + printf("Usage: add #1 #2\n"); + } else { + printf("%d",atoi(words[1]) + atoi(words[2])); + } + } else if(strcmp(words[0],"multiply") == 0) { + if(nword != 3) { + printf("Usage: multiply #1 #2\n"); + } else { + int i1 = atoi(words[1]); + if(i1 == 2) i1 = 3; /* this is a bug */ + printf("%d",i1*atoi(words[2])); + } + } else if(strcmp(words[0],"quit") == 0) { + break; + } else if(strcmp(words[0],"version") == 0) { + printf("Version: %s",VERSION); + } else { + printf("Unknown command: %s",words[0]); + } + printf("\n"); + } + + return(0); +} + +int +split(line,words,nword) +char *line; +char **words; +int nword; /* number of elements in words */ +{ + int i; + + while(isspace(*line)) line++; + if(*line == '\0') return(0); + + for(i = 0;i < nword;i++) { + words[i] = line; + while(*line != '\0' && !isspace(*line)) line++; + if(*line == '\0') break; + *line++ = '\0'; + while(isspace(*line)) line++; + } + + return(i); +} diff --git a/contrib/bluegnu2.0.3/example/calc/calc.h.in b/contrib/bluegnu2.0.3/example/calc/calc.h.in new file mode 100644 index 0000000..1e420a7 --- /dev/null +++ b/contrib/bluegnu2.0.3/example/calc/calc.h.in @@ -0,0 +1,18 @@ +/* + * Check for headers + */ +#ifndef __CALC_H__ +#define __CALC_H__ + +#undef HAVE_STDLIB_H + +/* + * Check for functions + */ +#undef HAVE_STRCMP + +#define NWORD 10 +#define SIZE 100 +#define VERSION "1.0 Beta" + +#endif /* __CALC_H__ */ diff --git a/contrib/bluegnu2.0.3/example/calc/configure b/contrib/bluegnu2.0.3/example/calc/configure new file mode 100755 index 0000000..4d61f01 --- /dev/null +++ b/contrib/bluegnu2.0.3/example/calc/configure @@ -0,0 +1,812 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.4 +# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE + +# Initialize some other variables. +subdirs= + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -build | --build | --buil | --bui | --bu | --b) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=PREFIX install architecture-dependent files in PREFIX + [same as prefix] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +--enable and --with options recognized:$ac_help +EOF + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.4" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LANG+set}" = set; then LANG=C; export LANG; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=calc.c + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5' + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + +CC=${CC-cc} + +# +# Look for various header files +# +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +ac_safe=`echo "stdlib.h" | tr './\055' '___'` +echo $ac_n "checking for stdlib.h""... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +cat >> confdefs.h <<\EOF +#define HAVE_STDLIB_H 1 +EOF + +fi + + +# +# Look for various functions +# +echo $ac_n "checking for strcmp""... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_func_strcmp'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +char strcmp(); + +int main() { return 0; } +int t() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_strcmp) || defined (__stub___strcmp) +choke me +#else +strcmp(); +#endif + +; return 0; } +EOF +if eval $ac_link; then + rm -rf conftest* + eval "ac_cv_func_strcmp=yes" +else + rm -rf conftest* + eval "ac_cv_func_strcmp=no" +fi +rm -f conftest* + +fi +if eval "test \"`echo '$ac_cv_func_'strcmp`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_STRCMP 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + + +# +# Output Makefile with substitutions + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ + >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.4" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir + +trap 'rm -fr `echo "Makefile calc.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 + +# Protect against being on the right side of a sed subst in config.status. +sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g; + s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF +$ac_vpsub +$extrasub +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@CPP@%$CPP%g +s%@CC@%$CC%g + +CEOF +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust relative srcdir, etc. for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file +fi; done +rm -f conftest.subs + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +CONFIG_HEADERS=${CONFIG_HEADERS-"calc.h"} +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + cp $ac_given_srcdir/$ac_file_in conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. +# Maximum number of lines to put in a single here document. +ac_max_here_lines=12 + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + + + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/contrib/bluegnu2.0.3/example/calc/configure.in b/contrib/bluegnu2.0.3/example/calc/configure.in new file mode 100644 index 0000000..473e879 --- /dev/null +++ b/contrib/bluegnu2.0.3/example/calc/configure.in @@ -0,0 +1,19 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(calc.c) +AC_CONFIG_HEADER(calc.h) +CC=${CC-cc} + +# +# Look for various header files +# +AC_HEADER_CHECK(stdlib.h, ,AC_DEFINE(HAVE_STDLIB_H)) + +# +# Look for various functions +# +AC_FUNC_CHECK(strcmp, AC_DEFINE(HAVE_STRCMP)) + +# +# Output Makefile with substitutions +AC_SUBST(CC) +AC_OUTPUT(Makefile) diff --git a/contrib/bluegnu2.0.3/example/calc/testsuite/calc.test/calc.exp b/contrib/bluegnu2.0.3/example/calc/testsuite/calc.test/calc.exp new file mode 100644 index 0000000..73e99e4 --- /dev/null +++ b/contrib/bluegnu2.0.3/example/calc/testsuite/calc.test/calc.exp @@ -0,0 +1,60 @@ +set timeout 3 +# +# expectations that clean up in case of error. Note that `$test' is +# a purely local variable. +# +# The first of these is used to match any bad responses, and resynchronise +# things by finding a prompt. The second is a timeout error, and shouldn't +# ever be triggered. +# +expect_after { + -re "\[^\n\r\]*$prompt$" { + fail "$test (bad match)" + if { $verbose > 0 } { + regexp ".*\r\n(\[^\r\n\]+)(\[\r\n\])+$prompt$" \ + $expect_out(buffer) "" output + send_user "\tUnmatched output: \"$output\"\n" + } + } + timeout { + fail "$test (timeout)" + } +} +# +# Here are the tests +# +set test "version" +send "version\n" +expect { + -re "Version:.*$prompt$" { pass "version" } +} + +set test add1 +send "add 3 4\n" +expect { + -re "7+.*$prompt$" { pass "$test" } +} + +set test add2 +send "add 1 2 3\n" +expect { + -re "Usage: add #1 #2.*$prompt$" { pass "$test" } +} + +set test multiply1 +send "multiply 3 4\n" +expect { + -re "12.*$prompt$" { pass "$test" } +} + +set test multiply2 +send "multiply 2 4\n" +expect { + -re "8.*$prompt$" { pass "$test" } +} + +set test multiply3 +send "multiply 1 2 3\n" +expect { + -re "Usage: multiply #1 #2.*$prompt$" { pass "$test" } +} diff --git a/contrib/bluegnu2.0.3/example/calc/testsuite/config/unix.exp b/contrib/bluegnu2.0.3/example/calc/testsuite/config/unix.exp new file mode 100644 index 0000000..aec9f40 --- /dev/null +++ b/contrib/bluegnu2.0.3/example/calc/testsuite/config/unix.exp @@ -0,0 +1,49 @@ +if ![info exists prompt] then { + set prompt "calc: " +} +# +# calc_version -- extract and print the version number of calc +# + +proc calc_version {} { + global CALC + global prompt + set tmp [exec echo "version" | $CALC] + regexp "$prompt *(\[^\n\]*)\n.*" $tmp tmp version + clone_output "[which $CALC] version $version\n" +} +# +# calc_load -- loads the program +# +proc calc_load { arg } { + # +} + +# +# calc_exit -- quit and cleanup +# +proc calc_exit {} { + send "quit\n" +} + +# +# calc_start -- start calc running +# +proc calc_start {} { + global CALC + global prompt + global spawn_id + global verbose + + if { $verbose > 1 } { + send_user "starting $CALC\n" + } + spawn $CALC + expect { + -re "No such file.*" { perror "Can't start $CALC"; exit 1 } + -re "$prompt$" { } + timeout { perror "Failed to spawn $CALC (timeout)"; exit 1 } + } +} + +calc_start diff --git a/contrib/bluegnu2.0.3/example/configure b/contrib/bluegnu2.0.3/example/configure new file mode 100755 index 0000000..b9c061b --- /dev/null +++ b/contrib/bluegnu2.0.3/example/configure @@ -0,0 +1,697 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.4 +# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE + +# Initialize some other variables. +subdirs= + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -build | --build | --buil | --bui | --bu | --b) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=PREFIX install architecture-dependent files in PREFIX + [same as prefix] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +--enable and --with options recognized:$ac_help +EOF + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.4" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LANG+set}" = set; then LANG=C; export LANG; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=Makefile.in + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5' + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + +CC=${CC-cc} + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + +subdirs="calc" + + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ + >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +cat > conftest.defs <<\EOF +s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%-D\1=\2%g +s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g +s%\[%\\&%g +s%\]%\\&%g +s%\$%$$%g +EOF +DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` +rm -f conftest.defs + + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.4" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir + +trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 + +# Protect against being on the right side of a sed subst in config.status. +sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g; + s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF +$ac_vpsub +$extrasub +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@subdirs@%$subdirs%g +s%@CC@%$CC%g + +CEOF +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust relative srcdir, etc. for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file +fi; done +rm -f conftest.subs + + + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + +if test "$no_recursion" != yes; then + + # Remove --cache-file and --srcdir arguments so they do not pile up. + ac_sub_configure_args= + ac_prev= + for ac_arg in $ac_configure_args; do + if test -n "$ac_prev"; then + ac_prev= + continue + fi + case "$ac_arg" in + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + ;; + *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;; + esac + done + + for ac_config_dir in calc; do + + # Do not complain, so a configure script can configure whichever + # parts of a large source tree are present. + if test ! -d $srcdir/$ac_config_dir; then + continue + fi + + echo configuring in $ac_config_dir + + case "$srcdir" in + .) ;; + *) + if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :; + else + { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; } + fi + ;; + esac + + ac_popdir=`pwd` + cd $ac_config_dir + + case "$srcdir" in + .) # No --srcdir option. We are building in place. + ac_sub_srcdir=$srcdir ;; + /*) # Absolute path. + ac_sub_srcdir=$srcdir/$ac_config_dir ;; + *) # Relative path. + ac_sub_srcdir=../$srcdir/$ac_config_dir ;; + esac + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_sub_srcdir/configure; then + ac_sub_configure=$ac_sub_srcdir/configure + elif test -f $ac_sub_srcdir/configure.in; then + ac_sub_configure=$ac_configure + else + echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2 + ac_sub_configure= + fi + + # The recursion is here. + if test -n "$ac_sub_configure"; then + + # Make the cache file name correct relative to the subdirectory. + # A "../" for each directory in /$ac_config_dir. + ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` + case "$cache_file" in + /*) ac_sub_cache_file=$cache_file ;; + *) # Relative path. + ac_sub_cache_file="$ac_dots$cache_file" ;; + esac + + echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir" + # The eval makes quoting arguments work. + if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir + then : + else + { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; } + fi + fi + + cd $ac_popdir + done +fi + diff --git a/contrib/bluegnu2.0.3/example/configure.in b/contrib/bluegnu2.0.3/example/configure.in new file mode 100644 index 0000000..36f3f46 --- /dev/null +++ b/contrib/bluegnu2.0.3/example/configure.in @@ -0,0 +1,8 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(Makefile.in) +CC=${CC-cc} + +AC_CONFIG_SUBDIRS(calc) + +AC_SUBST(CC) +AC_OUTPUT(Makefile) diff --git a/contrib/bluegnu2.0.3/lib/BlueGnu_target.itcl b/contrib/bluegnu2.0.3/lib/BlueGnu_target.itcl new file mode 100644 index 0000000..e1a9363 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/BlueGnu_target.itcl @@ -0,0 +1,105 @@ +# +# This script create a BlueGnu Target object +# + +verbose "BlueGnu Target Information ****" 3 + +proc BlueGnu {args} { + global nspTestSuite auto_path env + global testCases + + verbose "@@@@@@@@@@@ BlueGnu Target Initialization Procedure @@@@@@@@@@@" + verbose " auto_path:\n >$auto_path<" 5 + # + # Create the BlueGnu Target Object, which need to be returned. + # + namespace eval $nspTestSuite { + set args [uplevel 1 set args] + verbose "Arguments: $args (are not used)" 3 + verbose "======= BlueGnu Procedure creates Target Object" 3 + + + # Check argument and remove the local argument from the list + # All argument that do not contain a equal sign are also removed + set i 0 + catch {unset rmList} + foreach arg $args { + if {!$i} { + if {[llength [split $arg "="]] == 1} { + uplevel set eInterface $arg + lappend rmList $i + } + } + if {[string compare [lindex [split $arg "="] 0] \ + "testCases"] == 0} { + uplevel set testCases [lindex [split $arg "="] 1] + lappend rmList $i + } + incr i + } + if {[info exists rmList]} { + #puts "rmList >$rmList<" + for {set i [expr [llength $rmList] - 1]} {$i >= 0} {incr i -1} { + set args [lreplace $args $i $i] + } + } + verbose "Arguments (passed): $args" 5 + + verbose "Arguments (used): $args" 3 + set target [eval [concat createTarget $args]] + if {! [string match ::* $target]} { + set target [namespace current]::$target + } + debug {Target name >$target<} 3 + + # Save all Environment Variables so they may be cleared! + # + [$target environment] saveEnv + } + + # Return the name of the Target Object that has been created + # This should be the last statement + return [namespace eval $nspTestSuite {set target}] +} + +proc BlueGnu_start {} { + verbose "@@@@@@@@@@@ Starting BlueGnu Environment @@@@@@@@@@@" +} + +proc BlueGnu_load {} { + verbose "@@@@@@@@@@@ Load BlueGnu Environment @@@@@@@@@@@" +} + +proc BlueGnu_exit {} { + verbose "@@@@@@@@@@@ Exit BlueGnu Environment @@@@@@@@@@@" +} + +proc BlueGnu_version {} { + verbose "@@@@@@@@@@@ Version BlueGnu Environment @@@@@@@@@@@" +} + +proc BlueGnu_overwrite {szNamespace} { + # Modify output procedures to return instead of doing output + # + uplevel #0 { + rename send_user send_user_saved + rename send_error send_error_saved + rename send_log send_log_saved + } + proc ::send_user args "set ${szNamespace}::sending(USER) 1" + proc ::send_error args "set ${szNamespace}::sending(ERROR) 1" + proc ::send_log args "set ${szNamespace}::sending(LOG) 1" +} + +proc BlueGnu_restore {} { + # Restore original procedures + # + uplevel #0 { + rename send_user "" + rename send_error "" + rename send_log "" + rename send_user_saved send_user + rename send_error_saved send_error + rename send_log_saved send_log + } +} diff --git a/contrib/bluegnu2.0.3/lib/Default_target.itcl b/contrib/bluegnu2.0.3/lib/Default_target.itcl new file mode 100644 index 0000000..f66b20a --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/Default_target.itcl @@ -0,0 +1,82 @@ +# +# This script create a Default Target object +# + +verbose "Default Target Information ****" 3 + +proc Default {args} { + global nspTestSuite auto_path env + global testCases + + verbose "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + verbose "@@@@@@@ Default Target Initialization Procedure" + verbose {@@@@@@@ auto_path:\n [join [split $auto_path] \ + "\n "]} 4 + # + # Create the Default Target Object, which need to be returned. + # + namespace eval $nspTestSuite { + set args [uplevel 1 set args] + verbose "Arguments: $args (are not used)" 3 + verbose "======= Default Procedure creates Target Object" 3 + + + # Check argument and remove the local argument from the list + # All argument that do not contain a equal sign are also removed + set i 0 + catch {unset rmList} + foreach arg $args { + if {!$i} { + if {[llength [split $arg "="]] == 1} { + uplevel set eInterface $arg + lappend rmList $i + } + } + if {[string compare [lindex [split $arg "="] 0] \ + "testCases"] == 0} { + uplevel set testCases [lindex [split $arg "="] 1] + lappend rmList $i + } + incr i + } + if {[info exists rmList]} { + #puts "rmList >$rmList<" + for {set i [expr [llength $rmList] - 1]} {$i >= 0} {incr i -1} { + set args [lreplace $args $i $i] + } + } + verbose "Arguments (passed): $args" 5 + + verbose "Arguments (used): $args" 3 + set target [eval [concat createTarget $args]] + if {! [string match ::* $target]} { + set target [namespace current]::$target + } + debug {Target name >$target<} 3 + + # Save all Environment Variables so they may be cleared! + # + [$target environment] saveEnv + } + + # Return the name of the Target Object that has been created + # This should be the last statement + return [namespace eval $nspTestSuite {set target}] +} + +proc Default_start {} { + verbose "@@@@@@@ Starting Default Environment" +} + +proc Default_load {} { + verbose "@@@@@@@ Load Default Environment" +} + +proc Default_exit {} { + verbose "@@@@@@@ Exit Default Environment" + verbose "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" +} + +proc Default_version {} { + verbose "@@@@@@@ Version Default Environment" +} diff --git a/contrib/bluegnu2.0.3/lib/Types.itcl b/contrib/bluegnu2.0.3/lib/Types.itcl new file mode 100644 index 0000000..e2ef2b4 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/Types.itcl @@ -0,0 +1,216 @@ +# -*-Tcl-*- +# +# This [incr Tcl] library script contains type definitions +# +# +# Type super class +# + +if {[string length [info commands debug]] == 0} { + proc debug {args} {} +} + +class Type { + variable _value + variable _valueSaved + variable _voidPtr + variable _bVoid + protected variable _currentNamespace + protected variable _lProc + protected variable _upLevel + + constructor args { + debug {======= Constructor: [info class] $this $args} 3 + # Go up in the inheritance tree + debug { Go up inheritance tree} 4 + set level 1 + if {[string compare [info class] ::Type] != 0} { + debug { level set to >1<} 5 + while {[string compare [info class] \ + [uplevel $level {namespace current}]] != 0} { + debug {>[info class]< != >[uplevel $level\ + {namespace current}]<} 5 + incr level + debug { level incrmented to >$level<} 5 + } + debug {>[info class]< == >[uplevel $level\ + {namespace current}]<} 5 + incr level + regsub {^::} [uplevel $level {namespace current}] "" currentNamespace + } else { + regsub {^::} [uplevel {namespace current}] "" currentNamespace + } + set upLevel [expr [info level] - $level] + set lProc [info level $upLevel] + debug { Called from level: >$upLevel<} 4 + debug { Called from : >$lProc<} 4 + debug { Current namespace: >$currentNamespace<} 4 + #catch {puts " [uplevel "info body [lindex $lProc 0]"]"} + set _bVoid 0 + set _voidPtr 0 + if {[llength $args] > 0} { + set _value [lindex $args 0] + } else { + set _value "" + } + if {$upLevel == 0} { + debug {Called from global} 4 + set $this $_value + debug {this variable: [set $this]} 4 + trace variable $this rwu traceType + } elseif {[string length $currentNamespace] && \ + [string length $lProc]} { + debug {Called from procedure in namespace} 4 + debug { this: >$this<} 4 + debug {set $this >$_value<} + catch { + uplevel #$upLevel set [namespace tail $this] \"$_value\" + uplevel #$upLevel trace variable [namespace tail $this] \ + rwu traceType + } szErrMsg; debug { szErrMsg: >$szErrMsg<} 4 + } elseif {[string length $currentNamespace]} { + debug {Called from namespace} 4 + debug {set $this >$_value<} + catch { + namespace eval ${currentNamespace} "set $this \"$_value\"\n\ + trace variable $this rwu traceType" + } szErrMsg + debug { TRACE set} 4 + debug { szErrMsg: >$szErrMsg<} 4 + } else { + debug {Called from procedure} 4 + set var [namespace tail $this] + uplevel "set $var $_value" + debug {this variable: [uplevel "set $var"]} 4 + uplevel "trace variable $var rwu traceType" + } + } + + destructor { + debug {======= destructor $this} 3 + set calledFrom [lindex [split [info level [expr [info level] - 1]]] 0] + debug { calledFrom: >$calledFrom<} 4 + debug { >[info level [expr [info level] - 1]]<} 4 + # just return when called from traceType + if {[string compare $calledFrom "traceType"] != 0} { + set var [namespace tail $this] + debug { var: >$var<} 4 + debug { >[join [trace vinfo $var]]<} 4 + debug { >[uplevel [join [trace vinfo $var]]]<} 4 + debug { >[join [uplevel "trace vinfo $var"]]<} 4 + catch { + debug {eval uplevel \"trace vdelete $var [join [uplevel "trace vinfo $var"]]\"} 4 + eval uplevel "trace vdelete $var [join [uplevel "trace vinfo $var"]]" + uplevel unset $var + } szErrMsg; debug { #### szErrMsg: >$szErrMsg<} 4 + } + } + + public method value {args} { + if {[llength $args] > 0} { + set _value [lindex $args 0] + } + return $_value + } + + public method setNull {{ptr 0}} { + set _voidPtr $ptr + set _bVoid 1 + } + + public method unsetNull {} { + set _bVoid 0 + } + + public method isNull {} { + return $_bVoid + } + + public method getNull {} { + return $_voidPtr + } +} + +proc traceType {name1 name2 ops} { + debug {======= traceType >$name1< >$name2< >$ops<} 3 + upvar $name1 var + set upLevel [expr [info level] - 1] + set lProc [info level $upLevel] + regsub {^::} [uplevel {namespace current}] "" currentNamespace + debug { Called from level: >$upLevel<} 4 + debug { level namespace : >[uplevel #$upLevel namespace current]<} 4 + debug { Called from : >$lProc<} 4 + debug { Current namespace: >$currentNamespace<} 4 + if {$upLevel == 0} { + debug {Called from global} 4 + switch $ops { + r { + set var [uplevel $name1 value] + } + w { + if [catch {$name1 value [set var]}] { + uplevel "$name1 value [set var]" + } + } + u { + uplevel delete object $name1 + } + } + } elseif {[string length $currentNamespace] && \ + [string length $lProc]} { + debug {Called from procedure in namespace} 4 + set var [uplevel ::itcl::find objects $name1] + debug { $name1 ->$var< = ><} 4 + switch $ops { + r { + uplevel set $name1 [uplevel $var value] + } + w { + if [catch {uplevel $var value [uplevel set $name1]} szErrMsg] { + debug {####### Error: $szErrMsg} 4 + + } + } + u { + uplevel delete object $name1 + } + } + } elseif {[string length $currentNamespace]} { + debug {Called from namespace} 4 + set var [uplevel "namespace which -variable $name1"] + debug { $name1 ->$var< = ><} 4 + switch $ops { + r { + set $var [$var value] + } + w { + if [catch {$var value [set $var]} szErrMsg] { + debug {####### Error: $szErrMsg} 4 + + } + } + u { + debug {Deleting >$name1<} 4 + debug { [namespace current]} 4 + catch {delete object $name1} + debug { DONE!} 4 + } + } + } else { + debug {Called from procedure} 4 + switch $ops { + r { + set $name1 [$name1 value] + } + w { + if [catch {$name1 value [uplevel set $name1]}] { + uplevel "$name1 value [set $name1]" + } + } + u { + delete object $name1 + } + } + } +} + diff --git a/contrib/bluegnu2.0.3/lib/bluegnu.itcl b/contrib/bluegnu2.0.3/lib/bluegnu.itcl new file mode 100644 index 0000000..da02c8b --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/bluegnu.itcl @@ -0,0 +1,22 @@ +#! iexpect +# +# This program is an Object Oriented version of the +# DejaGnu's runtest program and DejaGnu is a subset. +# +# BlueGnu implements a super set of a DejaGnu compatible test Framework +# +# Copyright (C) 1998 jotOmega dsc, Inc. + +#This file is part of the BlueGnu Test Framework. +# +# Load Application Framework Class and associated data +# +source $env(BLUEGNULIB)/testSessionApplication.itcl + +append auto_path " [pwd]/lib" + +set objApplication [::BlueGnu::Application #auto szName=BlueGnu] + +$objApplication processArguments argv + +$objApplication execute diff --git a/contrib/bluegnu2.0.3/lib/bug.exp b/contrib/bluegnu2.0.3/lib/bug.exp new file mode 100644 index 0000000..5d52182 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/bug.exp @@ -0,0 +1,125 @@ +# Copyright (C) 92, 93, 94, 95, 1996 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@welcomehome.org) + +#load_lib remote.exp + +# +# set target variables only if needed. +# +global targetname +global connectmode +global env + +if ![info exists targetname] { + if [info exists env(TARGETNAME)] { + set targetname $env(TARGETNAME) + } else { + puts stderr "ERROR: Need a target name for the board." + puts stderr " Use the --name option\n" + exit 1 + } +} + +# the default connect program to use +if ![info exists connectmode] { + set connectmode "tip" + warning "Using default of $connectmode for target communication." +} + +# +# Load a file into the bug monitor +# +proc bug_load { shell_id file } { + global OBJCOPY + global shell_prompt + + if { $shell_id < 0 } { + warning "$file not executed because there is no target." + return -1 + } + + # NOTE: this requires OBJCOPY to be tested first + catch "exec $OBJCOPY -O srec $file $file.srec" result + if ![string match "" $result] { + perror "Couldn't convert to srecord for downloading" + return -1 + } + + send -i $shell_id "lo 0\r" + expect { + -i $shell_id "lo 0*" { + verbose "Got load command echo" 0 + } + -i $shell_id timeout { + perror "Load command didn't echo back" + return -1 + } + } + + if { [download $file.srec $shell_id] < 0 } { + return -1 + } + + send -i $shell_id "\r\r" + expect { + -i $shell_id -re "$shell_prompt.*$" { + } + -i $shell_id timeout { + perror "Load command didn't echo back" + return -1 + } + } + + catch "exec rm -f $file.srec" + return 0 +} + +# +# Execute a program +# +proc bug_execute { shell_id addr } { + global shell_prompt + global exec_output + + set exec_output "" + + if { $shell_id < 0 } { + warning "$arg not executed because there is no target." + return -1 + } + send -i $shell_id "go $addr\r" + verbose "Sent execute command" + expect { + -i $shell_id "*Effective address: $addr" { + exp_continue + } + -i $shell_id -re "$shell_prompt.*$" { + set exec_output $expect_out(buffer) + return 0 + } + -i $shell_id timeout { + perror "Couldn't execute program (timed out)." + return 1 + } + } + +} + diff --git a/contrib/bluegnu2.0.3/lib/debugger.exp b/contrib/bluegnu2.0.3/lib/debugger.exp new file mode 100644 index 0000000..8dd0701 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/debugger.exp @@ -0,0 +1,252 @@ +# Copyright (C) 92, 93, 94, 95, 1996 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@welcomehome.org) + +# +# Dump the values of a shell expression representing variable +# names. +proc dumpvars { args } { + uplevel 1 [list foreach i [uplevel 1 "info vars $args"] { + if { [catch "array names $i" names ] } { + eval "puts \"${i} = \$${i}\"" + } else { + foreach k $names { + eval "puts \"$i\($k\) = \$$i\($k\)\"" + } + } + } + ] +} + +# +# dump the values of a shell expression representing variable +# names. +proc dumplocals { args } { + uplevel 1 [list foreach i [uplevel 1 "info locals $args"] { + if { [catch "array names $i" names ] } { + eval "puts \"${i} = \$${i}\"" + } else { + foreach k $names { + eval "puts \"$i\($k\) = \$$i\($k\)\"" + } + } + } + ] +} +# +# Dump the body of procedures specified by a regexp. +# +proc dumprocs { args } { + foreach i [info procs $args] { + puts "\nproc $i \{ [info args $i] \} \{ [info body $i]\}" + } +} + +# +# Dump all the current watchpoints +# +proc dumpwatch { args } { + foreach i [uplevel 1 "info vars $args"] { + set tmp "" + if { [catch "uplevel 1 array name $i" names] } { + set tmp [uplevel 1 trace vinfo $i] + if ![string match "" $tmp] { + puts "$i $tmp" + } + } else { + foreach k $names { + set tmp [uplevel 1 trace vinfo [set i]($k)] + if ![string match "" $tmp] { + puts "[set i]($k) = $tmp" + } + } + } + } +} + +# +# Trap a watchpoint for an array +# +proc watcharray { element type} { + upvar [set array]($element) avar + case $type { + "w" { puts "New value of [set array]($element) is $avar" } + "r" { puts "[set array]($element) (= $avar) was just read" } + "u" { puts "[set array]($element) (= $avar) was just unset" } + } +} + +proc watchvar { v type } { + upvar $v var + case $type { + "w" { puts "New value of $v is $var" } + "r" { puts "$v (=$var) was just read" } + "u" { puts "$v (=$var) was just unset" } + } +} + +# +# Watch when a variable is written +# +proc watchunset { arg } { + if { [catch "uplevel 1 array name $arg" names ] } { + if ![uplevel 1 info exists $arg] { + puts stderr "$arg does not exist" + return + } + uplevel 1 trace variable $arg u watchvar + } else { + foreach k $names { + if ![uplevel 1 info exists $arg] { + puts stderr "$arg does not exist" + return + } + uplevel 1 trace variable [set arg]($k) u watcharray + } + } +} + +# +# Watch when a variable is written +# +proc watchwrite { arg } { + if { [catch "uplevel 1 array name $arg" names ] } { + if ![uplevel 1 info exists $arg] { + puts stderr "$arg does not exist" + return + } + uplevel 1 trace variable $arg w watchvar + } else { + foreach k $names { + if ![uplevel 1 info exists $arg] { + puts stderr "$arg does not exist" + return + } + uplevel 1 trace variable [set arg]($k) w watcharray + } + } +} + +# +# Watch when a variable is read +# +proc watchread { arg } { + if { [catch "uplevel 1 array name $arg" names ] } { + if ![uplevel 1 info exists $arg] { + puts stderr "$arg does not exist" + return + } + uplevel 1 trace variable $arg r watchvar + } else { + foreach k $names { + if ![uplevel 1 info exists $arg] { + puts stderr "$arg does not exist" + return + } + uplevel 1 trace variable [set arg]($k) r watcharray + } + } +} + +# +# Delete a watch point +# +proc watchdel { args } { + foreach i [uplevel 1 "info vars $args"] { + set tmp "" + if { [catch "uplevel 1 array name $i" names] } { + catch "uplevel 1 trace vdelete $i w watchvar" + catch "uplevel 1 trace vdelete $i r watchvar" + catch "uplevel 1 trace vdelete $i u watchvar" + } else { + foreach k $names { + catch "uplevel 1 trace vdelete [set i]($k) w watcharray" + catch "uplevel 1 trace vdelete [set i]($k) r watcharray" + catch "uplevel 1 trace vdelete [set i]($k) u watcharray" + } + } + } +} + +# +# This file creates GDB style commands for the Tcl debugger +# +proc print { var } { + puts "$var" +} + +proc quit { } { + log_summary + exit +} + +proc bt { } { + puts "[w]" +} + +# +# create some stub procedures since we can't alias the command names +# +proc dp { args } { + uplevel 1 dumprocs $args +} + +proc dv { args } { + uplevel 1 dumpvars $args +} + +proc dl { args } { + uplevel 1 dumplocals $args +} + +proc dw { args } { + uplevel 1 dumpwatch $args +} + +proc q { } { + quit +} + +proc p { args } { + uplevel 1 print $args +} + +proc wu { args } { + uplevel 1 watchunset $args +} + +proc ww { args } { + uplevel 1 watchwrite $args +} + +proc wr { args } { + uplevel 1 watchread $args +} + +proc wd { args } { + uplevel 1 watchdel $args +} + + + + + + + diff --git a/contrib/bluegnu2.0.3/lib/dejagnu.itcl b/contrib/bluegnu2.0.3/lib/dejagnu.itcl new file mode 100644 index 0000000..35957cc --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/dejagnu.itcl @@ -0,0 +1,81 @@ +#! iexpect +# +# This program is a full compatible Object Oriented version of +# DejaGnu's runtest program +# +# Copyright (C) 1998 jotOmega dsc, Inc. + +#This file is part of BlueGnu. + +################################################################ +# Preemble +################################################################ +# Check Environment variables: +# +# BLUEGNULIBS +# TESTSUITEROOT +# + +if [info exists env(BLUEGNULIBS)] { + set szToolsLib $env(BLUEGNULIBS) +} else { + set szToolsLib [file dirname $argv0] + set PWD [pwd] + cd $szToolsLib + set szToolsLib [pwd] + cd $PWD + regsub {/bin$} $szToolsLib {/lib/bluegnu} szToolsLib + set env(BLUEGNULIBS) $szToolsLib +} + +if [info exists env(TESTSUITEROOT)] { + set szRootDir $env(TESTSUITEROOT) +} else { + set szRootDir [pwd] + set env(TESTSUITEROOT) $szRootDir +} +if [info exists env(DEBUG)] { + set bDebug 1 +} else { + set bDebug 0 +} + +# Make sure that the testsuite root directory is our working directory +# all tests name are relative to this directory +cd $szRootDir + +# set the default tool. All test are relative to this directory. +# +set szTool $szRootDir +catch {unset lTool} +lappend lTool $szTool + +# +# source basic utilities +# +source $szToolsLib/testSessionClasses.itcl +source $szToolsLib/testSessionFramework.itcl +#source $szToolsLib/testSessionUtils.itcl +# +verbose "Library : >$szToolsLib<" +verbose "TestSuite: >$szRootDir<" +verbose "$argv0 $argv" 5 +# +# from here we should use only defined utilities +################################################################ +################################################################ + +set szRootName [file rootname $argv0] +puts "RootName : >$szRootName<" + +::TestSession::Queue Q0 +::TestSession::DejaGnu E0; # will load dejagnu.tcl + +while {! [catch {Q0 pop} T]} { + clone_output "Q0 element: $T" + runtest E0 $T +} + +delete object Q0 +delete object E0 + diff --git a/contrib/bluegnu2.0.3/lib/dejagnu.tcl b/contrib/bluegnu2.0.3/lib/dejagnu.tcl new file mode 100644 index 0000000..f5b48bd --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/dejagnu.tcl @@ -0,0 +1,1130 @@ +# +# Procedures that are used within DejaGnu +# +puts "DejaGnu=======1.3" + +set frame_version 1.3 +if ![info exists argv0] { + send_error "Must use a version of Expect greater than 5.0\n" + exit 1 +} + +# +# trap some signals so we know whats happening. These definitions are only +# temporary until we read in the library stuff +# +trap { send_user "\nterminated\n"; exit 1 } SIGTERM +trap { send_user "\ninterrupted by user\n"; exit 1 } SIGINT +trap { send_user "\nsegmentation violation\n"; exit 1 } SIGSEGV +trap { send_user "\nsigquit\n"; exit 1 } SIGQUIT + + +# +# Initialize a few global variables used by all tests. +# `reset_vars' resets several of these, we define them here to document their +# existence. In fact, it would be nice if all globals used by some interface +# of dejagnu proper were documented here. +# +# Keep these all lowercase. Interface variables used by the various +# testsuites (eg: the gcc testsuite) should be in all capitals +# (eg: TORTURE_OPTIONS). +# +set mail_logs 0 ;# flag for mailing of summary and diff logs +set psum_file "latest" ;# file name of previous summary to diff against +set testcnt 0 ;# number of testcases that ran +set passcnt 0 ;# number of testcases that passed +set failcnt 0 ;# number of testcases that failed +set xfailcnt 0 ;# number of testcases expected to fail which did +set xpasscnt 0 ;# number of testcases that passed unexpectedly +set warncnt 0 ;# number of warnings +set errcnt 0 ;# number of errors +set unsupportedcnt 0 ;# number of testcases that can't run +set unresolvedcnt 0 ;# number of testcases whose result is unknown +set untestedcnt 0 ;# number of untested testcases +set exit_status 0 ;# exit code returned by this program +set xfail_flag 0 +set xfail_prms 0 +set sum_file "" ;# name of the file that contains the summary log +set base_dir "" ;# the current working directory +set logname "" ;# the users login name +set passwd "" +set prms_id 0 ;# GNATS prms id number +set bug_id 0 ;# optional bug id number +set dir "" ;# temp variable for directory names +set srcdir "." ;# source directory containing the test suite +set ignoretests "" ;# list of tests to not execute +set objdir "." ;# directory where test case binaries live +set makevars "" ;# FIXME: Is this used anywhere? +set reboot 0 +set configfile site.exp ;# (local to this file) +set multipass "" ;# list of passes and var settings +set target_abbrev "unix" ;# environment (unix, sim, vx, etc.). +set errno ""; ;# +# +# set communication parameters here +# +set netport "" +set targetname "" +set connectmode "" +set serialport "" +set baud "" +# +# These describe the host and target environments. +# +set build_triplet "" ;# type of architecture to run tests on +set build_os "" ;# type of os the tests are running on +set build_vendor "" ;# vendor name of the OS or workstation the test are running on +set build_cpu "" ;# type of the cpu tests are running on +set host_triplet "" ;# type of architecture to run tests on, sometimes remotely +set host_os "" ;# type of os the tests are running on +set host_vendor "" ;# vendor name of the OS or workstation the test are running on +set host_cpu "" ;# type of the cpu tests are running on +set target_triplet "" ;# type of architecture to run tests on, final remote +set target_os "" ;# type of os the tests are running on +set target_vendor "" ;# vendor name of the OS or workstation the test are running on +set target_cpu "" ;# type of the cpu tests are running on +set target_alias "" ;# standard abbreviation of target + +# +# some convenience abbreviations +# +if ![info exists hex] { + set hex "0x\[0-9A-Fa-f\]+" +} +if ![info exists decimal] { + set decimal "\[0-9\]+" +} + +# +# set the base dir (current working directory) +# +set base_dir [pwd] + +# +# These are tested in case they are not initialized in $configfile. They are +# tested here instead of the init module so they can be overridden by command +# line options. +# +if ![info exists all_flag] { + set all_flag 0 +} +if ![info exists binpath] { + set binpath "" +} +if ![info exists debug] { + set debug 0 +} +if 0 { + if ![info exists options] { + set options "" + } +} +if ![info exists outdir] { + set outdir "." +} +if ![info exists reboot] { + set reboot 1 +} +if ![info exists all_runtests] { + # FIXME: Can we create an empty array? + # we don't have to (JWN 20 March 1998) + #set all_runtests(empty) "" +} +if ![info exists tracelevel] { + set tracelevel 0 +} +if ![info exists verbose] { + set verbose 0 +} + +# +# verbose [-n] [-log] [--] message [level] +# +# Print MESSAGE if the verbose level is >= LEVEL. +# The default value of LEVEL is 1. +# "-n" says to not print a trailing newline. +# "-log" says to add the text to the log file even if it won't be printed. +# Note that the apparent behaviour of `send_user' dictates that if the message +# is printed it is also added to the log file. +# Use "--" if MESSAGE begins with "-". +# +# This is defined here rather than in framework.exp so we can use it +# while still loading in the support files. +# +proc verbose { args } { + global verbose + set newline 1 + set logfile 0 + + set i 0 + if { [string index [lindex $args 0] 0] == "-" } { + for { set i 0 } { $i < [llength $args] } { incr i } { + if { [lindex $args $i] == "--" } { + incr i + break + } elseif { [lindex $args $i] == "-n" } { + set newline 0 + } elseif { [lindex $args $i] == "-log" } { + set logfile 1 + } elseif { [string index [lindex $args $i] 0] == "-" } { + clone_output "ERROR: verbose: illegal argument: [lindex $args $i]" + return + } else { + break + } + } + if { [llength $args] == $i } { + clone_output "ERROR: verbose: nothing to print" + return + } + } + + set level 1 + if { [llength $args] > $i + 1 } { + set level [lindex $args [expr $i+1]] + } + set message [lindex $args $i] + + if { $verbose >= $level } { + # There is no need for the "--" argument here, but play it safe. + # We assume send_user also sends the text to the log file (which + # appears to be the case though the docs aren't clear on this). + if { $newline } { + send_user -- "$message\n" + } else { + send_user -- "$message" + } + } elseif { $logfile } { + if { $newline } { + send_log "$message\n" + } else { + send_log "$message" + } + } +} + +# +# Transform a tool name to get the installed name. +# target_triplet is the canonical target name. target_alias is the +# target name used when configure was run. +# +proc transform { name } { + global target_triplet + global target_alias + global host_triplet + + if [string match $target_triplet $host_triplet] { + return $name + } + if [string match "native" $target_triplet] { + return $name + } + if [string match "" $target_triplet] { + return $name + } else { + set tmp ${target_alias}-${name} + verbose "Transforming $name to $tmp" + return $tmp + } +} + +# +# findfile arg0 [arg1] [arg2] +# +# Find a file and see if it exists. If you only care about the false +# condition, then you'll need to pass a null "" for arg1. +# arg0 is the filename to look for. If the only arg, +# then that's what gets returned. If this is the +# only arg, then if it exists, arg0 gets returned. +# if it doesn't exist, return only the prog name. +# arg1 is optional, and it's what gets returned if +# the file exists. +# arg2 is optional, and it's what gets returned if +# the file doesn't exist. +# +proc findfile { args } { + # look for the file + verbose "Seeing if [lindex $args 0] exists." 2 + if [file exists [lindex $args 0]] { + if { [llength $args] > 1 } { + verbose "Found file, returning [lindex $args 1]" + return [lindex $args 1] + } else { + verbose "Found file, returning [lindex $args 0]" + return [lindex $args 0] + } + } else { + if { [llength $args] > 2 } { + verbose "Didn't find file, returning [lindex $args 2]" + return [lindex $args 2] + } else { + verbose "Didn't find file, returning [file tail [lindex $args 0]]" + return [transform [file tail [lindex $args 0]]] + } + } +} + +# +# load_file [-1] [--] file1 [ file2 ... ] +# +# Utility to source a file. All are sourced in order unless the flag "-1" +# is given in which case we stop after finding the first one. +# The result is 1 if a file was found, 0 if not. +# If a tcl error occurs while sourcing a file, we print an error message +# and exit. +# +# ??? Perhaps add an optional argument of some descriptive text to add to +# verbose and error messages (eg: -t "library file" ?). +# +proc load_file { args } { + set i 0 + set only_one 0 + if { [lindex $args $i] == "-1" } { + set only_one 1 + incr i + } + if { [lindex $args $i] == "--" } { + incr i + } + + set found 0 + foreach file [lrange $args $i end] { + verbose "Looking for $file" 2 + if [file exists $file] { + set found 1 + verbose "Found $file" + if { [catch "uplevel #0 source $file"] == 1 } { + send_error "ERROR: tcl error sourcing $file.\n" + global errorInfo + if [info exists errorInfo] { + send_error "$errorInfo\n" + } + exit 1 + } + if $only_one { + break + } + } + } + return $found +} + +# +# Parse the arguments the first time looking for these. We will ultimately +# parse them twice. Things are complicated because: +# - we want to parse --verbose early on +# - we don't want config files to override command line arguments +# (eg: $base_dir/$configfile vs --host/--target; $DEJAGNU vs --baud, +# --connectmode, and --name) +# - we need some command line arguments before we can process some config files +# (eg: --objdir before $objdir/$configfile, --host/--target before $DEJAGNU) +# The use of `arg_host_triplet' and `arg_target_triplet' lets us avoid parsing +# the arguments three times. +# + +set arg_host_triplet "" +set arg_target_triplet "" +set arg_build_triplet "" +set argc [ llength $argv ] +for { set i 0 } { $i < $argc } { incr i } { + set option [lindex $argv $i] + + # make all options have two hyphens + switch -glob -- $option { + "--*" { + } + "-*" { + set option "-$option" + } + } + + # split out the argument for options that take them + switch -glob -- $option { + "--*=*" { + set optarg [lindex [split $option =] 1] + } + "--ba*" - + "--bu*" - + "--co*" - + "--ho*" - + "--i*" - + "--m*" - + "--n*" - + "--ob*" - + "--ou*" - + "--sr*" - + "--st*" - + "--ta*" - + "--to*" { + incr i + set optarg [lindex $argv $i] + } + } + + switch -glob -- $option { + "--bu*" { # (--build) the build host configuration + set arg_build_triplet $optarg + continue + } + + "--ho*" { # (--host) the host configuration + set arg_host_triplet $optarg + continue + } + + "--ob*" { # (--objdir) where the test case object code lives + set objdir $optarg + continue + } + + "--sr*" { # (--srcdir) where the testsuite source code lives + set srcdir $optarg + continue + } + + "--ta*" { # (--target) the target configuration + set arg_target_triplet $optarg + continue + } + + "--to*" { # (--tool) specify tool name + set tool $optarg + continue + } + + "--v" - + "--verb*" { # (--verbose) verbose output + incr verbose + continue + } + } +} +verbose "Verbose level is $verbose" + +# +# get the users login name +# +if [string match "" $logname] { + if [info exists env(USER)] { + set logname $env(USER) + } else { + if [info exists env(LOGNAME)] { + set logname $env(LOGNAME) + } else { + # try getting it with whoami + catch "set logname [exec whoami]" tmp + if [string match "*couldn't find*to execute*" $tmp] { + # try getting it with who am i + unset tmp + catch "set logname [exec who am i]" tmp + if [string match "*Command not found*" $tmp] { + send_user "ERROR: couldn't get the users login name\n" + set logname "Unknown" + } else { + set logname [lindex [split $logname " !"] 1] + } + } + } + } +} +verbose "Login name is $logname" + +# +# Begin sourcing the config files. +# All are sourced in order. +# +# Search order: +# $HOME/.dejagnurc -> $base_dir/$configfile -> $objdir/$configfile +# -> installed -> $DEJAGNU +# +# ??? It might be nice to do $HOME last as it would allow it to be the +# ultimate override. Though at present there is still $DEJAGNU. +# +# For the normal case, we rely on $base_dir/$configfile to set +# host_triplet and target_triplet. +# + +load_file ~/.dejagnurc $base_dir/$configfile + +# +# If objdir didn't get set in $base_dir/$configfile, set it to $base_dir. +# Make sure we source $objdir/$configfile in case $base_dir/$configfile doesn't +# exist and objdir was given on the command line. +# + +if [expr [string match "." $objdir] || [string match $srcdir $objdir]] { + set objdir $base_dir +} else { + load_file $objdir/$configfile +} +verbose "Using test sources in $srcdir" +verbose "Using test binaries in $objdir" + +set execpath [file dirname $argv0] +set libdir [file dirname $execpath]/bluegnu +if [info exists env(BLUEGNULIBS)] { + set libdir $env(BLUEGNULIBS) +} +verbose "Using $libdir to find libraries" + +# +# If the host or target was given on the command line, override the above +# config files. We allow $DEJAGNU to massage them though in case it would +# ever want to do such a thing. +# +if { $arg_host_triplet != "" } { + set host_triplet $arg_host_triplet +} +if { $arg_build_triplet != "" } { + set build_triplet $arg_build_triplet +} + +# if we only specify --host, then that must be the build machne too, and we're +# stuck using the old functionality of a simple cross test +if [expr { $build_triplet == "" && $host_triplet != "" } ] { + set build_triplet $host_triplet +} +# if we only specify --build, then we'll use that as the host too +if [expr { $build_triplet != "" && $host_triplet == "" } ] { + set host_triplet $build_triplet +} +unset arg_host_triplet arg_build_triplet + +# +# If the build machine type hasn't been specified by now, use config.guess. +# + +if [expr { $build_triplet == "" && $host_triplet == ""} ] { + # find config.guess + foreach dir "$libdir $libdir/.. $srcdir/.. $srcdir/../.." { + verbose "Looking for $dir" 2 + if [file exists $dir/config.guess] { + set config_guess $dir/config.guess + verbose "Found $dir/config.guess" + break + } + } + + # get the canonical config name + if ![info exists config_guess] { + send_error "ERROR: Couldn't guess configuration.\n" + exit 1 + } + catch "exec $config_guess" build_triplet + case $build_triplet in { + { "No uname command or uname output not recognized" "Unable to guess system type" } { + verbose "WARNING: Uname output not recognized" + set build_triplet unknown + } + } + verbose "Assuming build host is $build_triplet" + if { $host_triplet == "" } { + set host_triplet $build_triplet + } + +} + +# +# Figure out the target. If the target hasn't been specified, then we have to assume +# we are native. +# +if { $arg_target_triplet != "" } { + set target_triplet $arg_target_triplet +} elseif { $target_triplet == "" } { + set target_triplet $build_triplet + verbose "Assuming native target is $target_triplet" 2 +} +unset arg_target_triplet +# +# Default target_alias to target_triplet. +# +if ![info exists target_alias] { + set target_alias $target_triplet +} + +# +# Find and load the global config file if it exists. +# The global config file is used to set the connect mode and other +# parameters specific to each particular target. +# These files assume the host and target have been set. +# + +if { [load_file -- $libdir/$configfile] == 0 } { + # If $DEJAGNU isn't set either then there isn't any global config file. + # Warn the user as there really should be one. + if { ! [info exists env(DEJAGNU)] } { + send_error "WARNING: Couldn't find the global config file.\n" + } +} + +if [info exists env(DEJAGNU)] { + if { [load_file -- $env(DEJAGNU)] == 0 } { + # It may seem odd to only issue a warning if there isn't a global + # config file, but issue an error if $DEJAGNU is erroneously defined. + # Since $DEJAGNU is set there is *supposed* to be a global config file, + # so the current behaviour seems reasonable. + send_error "ERROR: global config file $env(DEJAGNU) not found.\n" + exit 1 + } +} + +# +# parse out the config parts of the triplet name +# + +# build values +if { $build_cpu == "" } { + regsub -- "-.*-.*" ${build_triplet} "" build_cpu +} +if { $build_vendor == "" } { + regsub -- "^\[a-z0-9\]*-" ${build_triplet} "" build_vendor + regsub -- "-.*" ${build_vendor} "" build_vendor +} +if { $build_os == "" } { + regsub -- ".*-.*-" ${build_triplet} "" build_os +} + +# host values +if { $host_cpu == "" } { + regsub -- "-.*-.*" ${host_triplet} "" host_cpu +} +if { $host_vendor == "" } { + regsub -- "^\[a-z0-9\]*-" ${host_triplet} "" host_vendor + regsub -- "-.*" ${host_vendor} "" host_vendor +} +if { $host_os == "" } { + regsub -- ".*-.*-" ${host_triplet} "" host_os +} + +# target values +if { $target_cpu == "" } { + regsub -- "-.*-.*" ${target_triplet} "" target_cpu +} +if { $target_vendor == "" } { + regsub -- "^\[a-z0-9\]*-" ${target_triplet} "" target_vendor + regsub -- "-.*" ${target_vendor} "" target_vendor +} +if { $target_os == "" } { + regsub -- ".*-.*-" ${target_triplet} "" target_os +} + +# +# Parse the command line arguments. +# + +set argc [ llength $argv ] +for { set i 0 } { $i < $argc } { incr i } { + set option [ lindex $argv $i ] + + # make all options have two hyphens + switch -glob -- $option { + "--*" { + } + "-*" { + set option "-$option" + } + } + + # split out the argument for options that take them + switch -glob -- $option { + "--*=*" { + set optarg [lindex [split $option =] 1] + } + "--ba*" - + "--bu*" - + "--co*" - + "--ho*" - + "--i*" - + "--m*" - + "--n*" - + "--ob*" - + "--ou*" - + "--sr*" - + "--st*" - + + "--ta*" - + "--to*" { + incr i + set optarg [lindex $argv $i] + } + } + + switch -glob -- $option { + "--V*" - + "--vers*" { # (--version) version numbers + send_user "Expect version is\t[exp_version]\n" + send_user "Tcl version is\t\t[ info tclversion ]\n" + send_user "Framework version is\t$frame_version\n" + exit + } + + "--v*" { # (--verbose) verbose output + # Already parsed. + continue + } + + "--bu*" { # (--build) the build host configuration + # Already parsed (and don't set again). Let $DEJAGNU rename it. + continue + } + + "--ho*" { # (--host) the host configuration + # Already parsed (and don't set again). Let $DEJAGNU rename it. + continue + } + + "--ta*" { # (--target) the target configuration + # Already parsed (and don't set again). Let $DEJAGNU rename it. + continue + } + + "--a*" { # (--all) print all test output to screen + set all_flag 1 + verbose "Print all test output to screen" + continue + } + + "--ba*" { # (--baud) the baud to use for a serial line + set baud $optarg + verbose "The baud rate is now $baud" + continue + } + + "--co*" { # (--connect) the connection mode to use + set connectmode $optarg + verbose "Comm method is $connectmode" + continue + } + + "--d*" { # (--debug) expect internal debugging + if [file exists ./dbg.log] { + catch "exec rm -f ./dbg.log" + } + if { $verbose > 2 } { + exp_internal -f dbg.log 1 + } else { + exp_internal -f dbg.log 0 + } + verbose "Expect Debugging is ON" + continue + } + + "--D[01]" { # (-Debug) turn on Tcl debugger + verbose "Tcl debugger is ON" + continue + } + + "--m*" { # (--mail) mail the output + set mailing_list $optarg + set mail_logs 1 + verbose "Mail results to $mailing_list" + continue + } + + "--r*" { # (--reboot) reboot the target + set reboot 1 + verbose "Will reboot the target (if supported)" + continue + } + + "--ob*" { # (--objdir) where the test case object code lives + # Already parsed, but parse again to make sure command line + # options override any config file. + set objdir $optarg + verbose "Using test binaries in $objdir" + continue + } + + "--ou*" { # (--outdir) where to put the output files + set outdir $optarg + verbose "Test output put in $outdir" + continue + } + + "*.exp" { # specify test names to run + set all_runtests($option) "" + verbose "Running only tests $option" + continue + } + + "*.exp=*" { # specify test names to run + set j [string first "=" $option] + set tmp [list [string range $option 0 [expr $j - 1]] \ + [string range $option [expr $j + 1] end]] + set all_runtests([lindex $tmp 0]) [lindex $tmp 1] + verbose "Running only tests $option" + unset tmp j + continue + } + + "--i*" { # (--ignore) specify test names to exclude + set ignoretests $optarg + verbose "Ignoring test $ignoretests" + continue + } + + "--sr*" { # (--srcdir) where the testsuite source code lives + # Already parsed, but parse again to make sure command line + # options override any config file. + + set srcdir $optarg + continue + } + + "--st*" { # (--strace) expect trace level + set tracelevel $optarg + strace $tracelevel + verbose "Source Trace level is now $tracelevel" + continue + } + + "--n*" { # (--name) the target's name + # ??? `targetname' is a confusing word to use here. + set targetname $optarg + verbose "Target name is now $targetname" + continue + } + + "--to*" { # (--tool) specify tool name + set tool $optarg + verbose "Testing $tool" + continue + } + + "[A-Z]*=*" { # process makefile style args like CC=gcc, etc... + if [regexp "^(\[A-Z_\]+)=(.*)$" $option junk var val] { + if {0 > [lsearch -exact $makevars $var]} { + lappend makevars "$var" + set $var $val + } else { + set $var [concat [set $var] $val] + } + verbose "$var is now [set $var]" + #append makevars "set $var $val;" ;# FIXME: Used anywhere? + unset junk var val + } else { + send_error "Illegal variable specification:\n" + send_error "$option\n" + } + continue + } + + "--he*" { # (--help) help text + send_user "USAGE: runtest \[options...\]\n" + send_user "\t--all (-a)\t\tPrint all test output to screen\n" + send_user "\t--baud (-ba)\t\tThe baud rate\n" + send_user "\t--build \[string\]\t\tThe canonical config name of the build machine\n" + send_user "\t--host \[string\]\t\tThe canonical config name of the host machine\n" + send_user "\t--target \[string\]\tThe canonical config name of the target board\n" + send_user "\t--connect (-co)\t\[type\]\tThe type of connection to use\n" + send_user "\t--debug (-de)\t\tSet expect debugging ON\n" + send_user "\t--help (-he)\t\tPrint help text\n" + send_user "\t--ignore \[name(s)\]\tThe names of specific tests to ignore\n" + send_user "\t--mail \[name(s)\]\tWho to mail the results to\n" + send_user "\t--name \[name\]\t\tThe hostname of the target board\n" + send_user "\t--objdir \[name\]\t\tThe test suite binary directory\n" + send_user "\t--outdir \[name\]\t\tThe directory to put logs in\n" + send_user "\t--reboot \[name\]\t\tReboot the target (if supported)\n" + send_user "\t--srcdir \[name\]\t\tThe test suite source code directory\n" + send_user "\t--strace \[number\]\tSet expect tracing ON\n" + send_user "\t--tool\[name(s)\]\t\tRun tests on these tools\n" + send_user "\t--verbose (-v)\t\tEmit verbose output\n" + send_user "\t--version (-V)\t\tEmit all version numbers\n" + send_user "\t--D\[0-1\]\t\tTcl debugger\n" + send_user "\tscript.exp\[=arg(s)\]\tRun these tests only\n" + send_user "\tMakefile style arguments can also be used, ex. CC=gcc\n\n" + exit 0 + } + + default { + send_error "\nIllegal Argument \"$option\"\n" + send_error "try \"runtest --help\" for option list\n" + exit 1 + } + + } +} + +# +# check for a few crucial variables +# +if ![info exists tool] { + send_error "WARNING: No tool specified\n" + set tool "" +} + +# +# initialize a few Tcl variables to something other than their default +# +if { $verbose > 2 } { + log_user 1 +} else { + log_user 0 +} + +set timeout 10 + +# +# load_lib -- load a library by sourcing it +# +# If there a multiple files with the same name, stop after the first one found. +# The order is first look in the install dir, then in a parallel dir in the +# source tree, (up one or two levels), then in the current dir. +# +proc load_lib { file } { + global verbose libdir srcdir base_dir execpath tool + + # ??? We could use `load_file' here but then we'd lose the "library file" + # specific text in verbose and error messages. Worth it? + set found 0 + foreach dir "$libdir $libdir/lib [file dirname [file dirname $srcdir]]/bluegnu/lib $srcdir/lib . [file dirname [file dirname [file dirname $srcdir]]]/bluegnu/lib" { + verbose "Looking for library file $dir/$file" 2 + if [file exists $dir/$file] { + set found 1 + verbose "Loading library file $dir/$file" + if { [catch "uplevel #0 source $dir/$file"] == 1 } { + send_error "ERROR: tcl error sourcing library file $dir/$file.\n" + global errorInfo + if [info exists errorInfo] { + send_error "$errorInfo\n" + } + exit 1 + } + break + } + } + if { $found == 0 } { + send_error "ERROR: Couldn't find library file $file.\n" + exit 1 + } +} + +# +# load the testing framework libraries +# +load_lib utils.exp +load_lib framework.exp +load_lib debugger.exp +load_lib remote.exp +load_lib target.exp + +# +# open log files +# +open_logs + +# print the config info +clone_output "Test Run By $logname on [timestamp -format %c]" +if [is3way] { + clone_output "Target is $target_triplet" + clone_output "Host is $host_triplet" + clone_output "Build is $build_triplet" +} else { + if [isnative] { + clone_output "Native configuration is $target_triplet" + } else { + clone_output "Target is $target_triplet" + clone_output "Host is $host_triplet" + } +} + +clone_output "\n\t\t=== $tool tests ===\n" + +# +# Find the tool init file. This is in the config directory of the tool's +# testsuite directory. These used to all be named $target_abbrev-$tool.exp, +# but as the $tool variable goes away, it's now just $target_abbrev.exp. +# First we look for a file named with both the abbrev and the tool names. +# Then we look for one named with just the abbrev name. Finally, we look for +# a file called default, which is the default actions, as some tools could +# be purely host based. Unknown is mostly for error trapping. +# + +set found 0 +if ![info exists target_abbrev] { + set target_abbrev "unix" +} +foreach dir "${srcdir}/config ${srcdir}/../config ${srcdir}/../../config ${srcdir}/../../../config" { + foreach initfile "${target_abbrev}-${tool}.exp ${target_abbrev}.exp ${target_os}.exp default.exp unknown.exp" { + verbose "Looking for tool init file ${dir}/${initfile}" 2 + if [file exists ${dir}/${initfile}] { + set found 1 + verbose "Using ${dir}/${initfile} as tool init file." + if [catch "uplevel #0 source ${dir}/${initfile}"]==1 { + send_error "ERROR: tcl error sourcing tool init file ${dir}/${initfile}.\n" + if [info exists errorInfo] { + send_error "$errorInfo\n" + } + exit 1 + } + break + } + } + if $found { + break + } +} + +if { $found == 0 } { + send_error "ERROR: Couldn't find tool init file.\n" + exit 1 +} +unset found + +# +# Trap some signals so we know what's happening. These replace the previous +# ones because we've now loaded the library stuff. +# +if ![exp_debug] { + foreach sig "{SIGTERM {terminated}} \ + {SIGINT {interrupted by user}} \ + {SIGQUIT {interrupted by user}} \ + {SIGSEGV {segmentation violation}}" { + trap { send_error "Got a [trap -name] signal, [lindex $sig 1]\n"; \ + log_summary } [lindex $sig 0] + verbose "setting trap for [lindex $sig 0] to \"[lindex $sig 1]\"" 1 + } +} +unset sig + +# +# Setup for main test execution loop +# + +if [info exists errorInfo] { + unset errorInfo +} +reset_vars +# FIXME: The trailing '/' is deprecated and will go away at some point. +# Do not assume $srcdir has a trailing '/'. +append srcdir "/" +# make sure we have only single path delimiters +regsub -all "//*" $srcdir "/" srcdir + + +# If multiple passes requested, set them up. Otherwise prepare just one. +# The format of `MULTIPASS' is a list of elements containing +# "{ name var1=value1 ... }" where `name' is a generic name for the pass and +# currently has no other meaning. + +if { [info exists MULTIPASS] } { + set multipass $MULTIPASS +} +if { $multipass == "" } { + set multipass { "" } +} + +# Pass varaibale passed as arguments into the queue +# +foreach var $makevars { + if {[string compare $var "MULTIPASS"] != 0} { + appendQueue Q0 "./tools/setVariable.exp=$var=[set $var]" + } +} + +foreach pass $multipass { + # multipass_name is set for `record_test' to use (see framework.exp). + if { [lindex $pass 0] != "" } { + set multipass_name [lindex $pass 0] + clone_output "Running pass `$multipass_name' ..." + # Pass MULTIPASS into queue + appendQueue Q0 "./tools/setVariable.exp=MULTIPASS=$pass" + } else { + set multipass_name "" + } + set restore "" + foreach varval [lrange $pass 1 end] { + # FIXME: doesn't handle a=b=c. + set tmp [split $varval "="] + set var [lindex $tmp 0] + # Save previous value. + if [info exists $var] { + lappend restore "$var [list [eval concat \$$var]]" + } else { + lappend restore "$var" + } + # Handle "CFLAGS=$CFLAGS foo". + # FIXME: Do we need to `catch' this? + eval set $var \[concat [lindex $tmp 1]\] + verbose "$var is now [eval concat \$$var]" + unset tmp var + } + + # look for the top level testsuites. if $tool doesn't + # exist and there are no subdirectories in $srcdir, then + # we default to srcdir. + set test_top_dirs [lsort [getdirs ${srcdir} "$tool*"]] + if { ${test_top_dirs} == "" } { + set test_top_dirs ${srcdir} + } + verbose "Top level testsuite dirs are ${test_top_dirs}" 2 + foreach dir "${test_top_dirs}" { + foreach test_name [lsort [find ${dir} *.exp]] { + if { ${test_name} == "" } { + continue + } + # Ignore this one if asked to. + if ![string match "" ${ignoretests}] { + if { 0 <= [lsearch ${ignoretests} [file tail ${test_name}]]} { + continue + } + } + # Get the path after the $srcdir so we know the subdir we're in. + set subdir "" + regsub $srcdir [file dirname $test_name] "" subdir + if { "$srcdir" == "$subdir/" } { + set subdir "" + } + # Check to see if the range of tests is limited, + # set `runtests' to a list of two elements: the script name + # and any arguments ("" if none). + if { [array size all_runtests] > 0 } { + if { 0 > [lsearch [array names all_runtests] [file tail $test_name]]} { + continue + } + set runtests [list [file tail $test_name] $all_runtests([file tail $test_name])] + } else { + set runtests [list [file tail $test_name] ""] + } + clone_output "Running $test_name ..." + #################################################### + # + # Append test to queue + # + if {[string length [lindex $runtests 1]] == 0} { + appendQueue Q0 $test_name + } else { + appendQueue Q0 [join [list $test_name \ + [lindex $runtests 1]] "="] + } + # + #################################################### + } + } + + # Restore the variables set by this pass. + foreach varval $restore { + if { [llength $varval] > 1 } { + verbose "Restoring [lindex $varval 0] to [lindex $varval 1]" 4 + set [lindex $varval 0] [lindex $varval 1] + } else { + verbose "Restoring [lindex $varval 0] to `unset'" 4 + unset [lindex $varval 0] + } + } +} +# +# do quite a bit of cleaning +# +unset restore i +unset ignoretests +foreach var $makevars { + unset $var +} +catch {unset tmp} +catch {unset makevars} +catch {unset pass} +catch {unset multipass} +catch {unset var} +catch {unset varval} +puts "======= DejaGnu" diff --git a/contrib/bluegnu2.0.3/lib/dg.exp b/contrib/bluegnu2.0.3/lib/dg.exp new file mode 100644 index 0000000..64b3e32 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/dg.exp @@ -0,0 +1,881 @@ +# `dg' general purpose testcase driver. +# Copyright (C) 1994, 1995, 1996 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# dje@cygnus.com. + +# This file was written by Doug Evans (dje@cygnus.com). + +# This file is based on old-dejagnu.exp. It is intended to be more extensible +# without incurring the overhead that old-dejagnu.exp can. All test framework +# commands appear in the testcase as "{ dg-xxx args ... }". We pull them out +# with one grep, and then run the function(s) named by "dg-xxx". When running +# dg-xxx, the line number that it occurs on is always passed as the first +# argument. We also support different kinds of tools via callbacks. +# +# The currently supported options are: +# +# dg-prms-id N +# set prms_id to N +# +# dg-options "options ..." [{ target selector }] +# specify special options to pass to the tool (eg: compiler) +# +# dg-do do-what-keyword [{ target/xfail selector }] +# `do-what-keyword' is tool specific and is passed unchanged to +# ${tool}-dg-test. An example is gcc where `keyword' can be any of: +# preprocess|compile|assemble|link|run +# and will do one of: produce a .i, produce a .s, produce a .o, +# produce an a.out, or produce an a.out and run it (the default is +# compile). +# +# dg-error regexp comment [{ target/xfail selector } [{.|0|linenum}]] +# indicate an error message is expected on this line +# (the test fails if it doesn't occur) +# Linenum=0 for general tool messages (eg: -V arg missing). +# "." means the current line. +# +# dg-warning regexp comment [{ target/xfail selector } [{.|0|linenum}]] +# indicate a warning message is expected on this line +# (the test fails if it doesn't occur) +# +# dg-bogus regexp comment [{ target/xfail selector } [{.|0|linenum}]] +# indicate a bogus error message use to occur here +# (the test fails if it does occur) +# +# dg-build regexp comment [{ target/xfail selector }] +# indicate the build use to fail for some reason +# (errors covered here include bad assembler generated, tool crashes, +# and link failures) +# (the test fails if it does occur) +# +# dg-excess-errors comment [{ target/xfail selector }] +# indicate excess errors are expected (any line) +# (this should only be used sparingly and temporarily) +# +# dg-output regexp [{ target selector }] +# indicate the expected output of the program is +# (there may be multiple occurrences of this, they are concatenated) +# +# dg-final { tcl code } +# add some tcl code to be run at the end +# (there may be multiple occurrences of this, they are concatenated) +# (unbalanced braces must be \-escaped) +# +# "{ target selector }" is a list of expressions that determine whether the +# test succeeds or fails for a particular target, or in some cases whether the +# option applies for a particular target. If the case of `dg-do' it specifies +# whether the testcase is even attempted on the specified target. +# +# The target selector is always optional. The format is one of: +# +# { xfail *-*-* ... } - the test is expected to fail for the given targets +# { target *-*-* ... } - the option only applies to the given targets +# +# At least one target must be specified, use *-*-* for "all targets". +# At present it is not possible to specify both `xfail' and `target'. +# "native" may be used in place of "*-*-*". +# +# Example: +# +# [ ... some complicated code ... ] +# return a; /* { dg-build "fatal" "ran out of spill regs" { xfail i386-*-* } } */ +# +# In this example, the compiler use to crash on the "return a;" for some +# target and that it still does crash on i386-*-*. Admittedly, this is a +# contrived example. +# +# ??? It might be possible to add additional optional arguments by having +# something like: { dg-error ".*syntax.*" "syntax error" { { foo 1 } ... } } +# +# Callbacks +# +# ${tool}-dg-test testfile do-what-keyword extra-flags +# +# Run the test, be it compiler, assembler, or whatever. +# +# ${tool}-dg-prune target_triplet text +# +# Optional callback to delete output from the tool that can occur +# even in successful ("pass") situations and interfere with output +# pattern matching. This also gives the tool an opportunity to review +# the output and check for any conditions which indicate an "untested" +# or "unresolved" state. An example is if a testcase is too big and +# fills all available ram (which can happen for 16 bit cpus). The +# result is either the pruned text or +# "::untested|unresolved|unsupported::message" +# (eg: "::unsupported::memory full"). +# +# Notes: +# 1) All runnable testcases must return 0 from main() for success. +# You can't rely on getting any return code from target boards, and the +# `exec' command says a program fails if it returns non-zero. +# +# Language independence is (theoretically) achieved by: +# +# 1) Using global $tool to indicate the language (eg: gcc, g++, gas, etc.). +# This should only be used to look up other objects. We don't want to +# have to add code for each new language that is supported. If this is +# done right, no code needs to be added here for each new language. +# +# 2) Passing tool options in as arguments. +# +# Earlier versions of ${tool}_start (eg: gcc_start) would only take the name +# of the file to compile as an argument. Newer versions accept a list of +# one or two elements, the second being a string of *all* options to pass +# to the tool. We require this facility. +# +# 3) Callbacks. +# +# Try not to do anything else that makes life difficult. +# +# The normal way to write a testsuite is to have a .exp file containing: +# +# load_lib ${tool}-dg.exp +# dg-init +# dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/foo*]] ... +# dg-finish + +# Global state variables. +# The defaults are for GCC. + +# The default do-what keyword. +set dg-do-what-default compile + +# When dg-interpreter-batch-mode is 1, no execution test or excess error +# tests are performed. +set dg-interpreter-batch-mode 0 + +# Line number format. This is how line numbers appear in program output. +set dg-linenum-format ":%d:" +proc dg-format-linenum { linenum } { + global dg-linenum-format + return [format ${dg-linenum-format} $linenum] +} + +# Useful subroutines. + +# dg-get-options -- pick out the dg-xxx options in a testcase +# +# PROG is the file name of the testcase. +# The result is a list of options found. +# +# Example: For the following testcase: +# +# /* { dg-prms-id 1234 } */ +# int foo { return 0; } /* { dg-build fatal "some comment" } */ +# +# we return: +# +# { dg-prms-id 1 1234 } { dg-build 2 fatal "some comment" } + +proc dg-get-options { prog } { + set result "" + + set tmp [grep $prog "{\[ \t\]\+dg-\[-a-z\]\+\[ \t\]\+.*\[ \t\]\+}" line] + if ![string match "" $tmp] { + foreach i $tmp { + #send_user "Found: $i\n" + # FIXME: When to use "+" and "\+" isn't clear. + # Seems to me it took awhile to get this to work. + regexp "(\[0-9\]\+)\[ \t\]\+{\[ \t\]+(dg-\[-a-z\]+)\[ \t\]\+(.*)\[ \t\]+}\[^\}\]*(\n|$)" $i i line cmd args + #send_user "Found: $cmd $line $args\n" + append result " { $cmd $line $args }" + } + } + + #send_user "Returning: $result\n" + return $result +} + +# +# Process optional xfail/target arguments +# +# SELECTOR is "xfail target-triplet-1 ..." or "target target-triplet-1 ..." +# `target-triplet' may be "native". +# For xfail, the result is "F" (expected to Fail) if the current target is +# affected, otherwise "P" (expected to Pass). +# For target, the result is "S" (target is Selected) if the target is selected, +# otherwise "N" (target is Not selected). +# +proc dg-process-target { selector } { + global target_triplet + + set isnative [isnative] + set triplet_match 0 + + #send_user "dg-process-target: $selector\n" + + set selector [string trim $selector] + if [regexp "^xfail " $selector] { + set what xfail + } elseif [regexp "^target " $selector] { + set what target + } else { + # The use of error here and in other dg-xxx utilities is intentional. + # dg-test will catch them and do the right thing. + error "syntax error in target selector \"$selector\"" + } + + # ??? This should work but it doesn't. tcl bug? + #if [regexp "^${what}(( \[^ \]+-\[^ \]+-\[^ \]+)|( native))+$" $selector tmp selector] + if [regexp "^${what}( \[^ \]+-\[^ \]+-\[^ \]+| native)+$" $selector] { + regsub "^${what} " $selector "" selector + #send_user "selector: $selector\n" + foreach triplet $selector { + if [string match $triplet $target_triplet] { + set triplet_match 1 + } elseif { $isnative && $triplet == "native" } { + set triplet_match 1 + } + } + } else { + error "syntax error in target selector \"$selector\"" + } + + if { $triplet_match } { + return [expr { $what == "xfail" ? "F" : "S" }] + } else { + return [expr { $what == "xfail" ? "P" : "N" }] + } +} + +# Predefined user option handlers. +# The line number is always the first element. +# Note that each of these are varargs procs (they have an `args' argument). +# Tests for optional arguments are coded with ">=" to simplify adding new ones. + +proc dg-prms-id { args } { + global prms_id ;# this is a testing framework variable + + if { [llength $args] > 2 } { + error "[lindex $args 0]: too many arguments" + return + } + + set prms_id [lindex $args 1] +} + +# +# Set tool options +# +# Different options can be used for different targets by having multiple +# instances, selecting a different target each time. Since options are +# processed in order, put the default value first. Subsequent occurrences +# will override previous ones. +# + +proc dg-options { args } { + upvar dg-extra-tool-flags extra-tool-flags + + if { [llength $args] > 3 } { + error "[lindex $args 0]: too many arguments" + return + } + + if { [llength $args] >= 3 } { + switch [dg-process-target [lindex $args 2]] { + "S" { set extra-tool-flags [lindex $args 1] } + "N" { } + "F" { error "[lindex $args 0]: `xfail' not allowed here" } + "P" { error "[lindex $args 0]: `xfail' not allowed here" } + } + } else { + set extra-tool-flags [lindex $args 1] + } +} + +# +# Record what to do (compile/run/etc.) +# +# Multiple instances are supported (since we don't support target and xfail +# selectors on one line), though it doesn't make much sense to change the +# compile/assemble/link/run field. Nor does it make any sense to have +# multiple lines of target selectors (use one line). +# +proc dg-do { args } { + upvar dg-do-what do-what + + if { [llength $args] > 3 } { + error "[lindex $args 0]: too many arguments" + return + } + + set selected [lindex ${do-what} 1] ;# selected? (""/S/N) + set expected [lindex ${do-what} 2] ;# expected to pass/fail (P/F) + + if { [llength $args] >= 3 } { + switch [dg-process-target [lindex $args 2]] { + "S" { + set selected "S" + } + "N" { + # Don't deselect a target if it's been explicitly selected, + # but indicate a specific target has been selected (so don't + # do this testcase if it's not appropriate for this target). + # The user really shouldn't have multiple lines of target + # selectors, but try to do the intuitive thing (multiple lines + # are OR'd together). + if { $selected != "S" } { + set selected "N" + } + } + "F" { set expected "F" } + "P" { + # There's nothing to do for "P". We don't want to clobber a + # previous xfail for this target. + } + } + } else { + # Note: A previous occurrence of `dg-do' with target/xfail selectors + # is a user mistake. We clobber previous values here. + set selected S + set expected P + } + + switch [lindex $args 1] { + "preprocess" { } + "compile" { } + "assemble" { } + "link" { } + "run" { } + default { + error "[lindex $args 0]: syntax error" + } + } + set do-what [list [lindex $args 1] $selected $expected] +} + +proc dg-error { args } { + upvar dg-messages messages + + if { [llength $args] > 5 } { + error "[lindex $args 0]: too many arguments" + return + } + + set xfail "" + if { [llength $args] >= 4 } { + switch [dg-process-target [lindex $args 3]] { + "F" { set xfail "X" } + "P" { set xfail "" } + "N" { + # If we get "N", this error doesn't apply to us so ignore it. + return + } + } + } + + if { [llength $args] >= 5 } { + switch [lindex $args 4] { + "." { set line [dg-format-linenum [lindex $args 0]] } + "0" { set line "" } + "default" { set line [dg-format-linenum [lindex $args 4]] } + } + } else { + set line [dg-format-linenum [lindex $args 0]] + } + + lappend messages [list $line "${xfail}ERROR" [lindex $args 1] [lindex $args 2]] +} + +proc dg-warning { args } { + upvar dg-messages messages + + if { [llength $args] > 5 } { + error "[lindex $args 0]: too many arguments" + return + } + + set xfail "" + if { [llength $args] >= 4 } { + switch [dg-process-target [lindex $args 3]] { + "F" { set xfail "X" } + "P" { set xfail "" } + "N" { + # If we get "N", this warning doesn't apply to us so ignore it. + return + } + } + } + + if { [llength $args] >= 5 } { + switch [lindex $args 4] { + "." { set line [dg-format-linenum [lindex $args 0]] } + "0" { set line "" } + "default" { set line [dg-format-linenum [lindex $args 4]] } + } + } else { + set line [dg-format-linenum [lindex $args 0]] + } + + lappend messages [list $line "${xfail}WARNING" [lindex $args 1] [lindex $args 2]] +} + +proc dg-bogus { args } { + upvar dg-messages messages + + if { [llength $args] > 5 } { + error "[lindex $args 0]: too many arguments" + return + } + + set xfail "" + if { [llength $args] >= 4 } { + switch [dg-process-target [lindex $args 3]] { + "F" { set xfail "X" } + "P" { set xfail "" } + "N" { + # If we get "N", this message doesn't apply to us so ignore it. + return + } + } + } + + if { [llength $args] >= 5 } { + switch [lindex $args 4] { + "." { set line [dg-format-linenum [lindex $args 0]] } + "0" { set line "" } + "default" { set line [dg-format-linenum [lindex $args 4]] } + } + } else { + set line [dg-format-linenum [lindex $args 0]] + } + + lappend messages [list $line "${xfail}BOGUS" [lindex $args 1] [lindex $args 2]] +} + +proc dg-build { args } { + upvar dg-messages messages + + if { [llength $args] > 4 } { + error "[lindex $args 0]: too many arguments" + return + } + + set xfail "" + if { [ llength $args] >= 4 } { + switch [dg-process-target [lindex $args 3]] { + "F" { set xfail "X" } + "P" { set xfail "" } + "N" { + # If we get "N", this lossage doesn't apply to us so ignore it. + return + } + } + } + + lappend messages [list [lindex $args 0] "${xfail}BUILD" [lindex $args 1] [lindex $args 2]] +} + +proc dg-excess-errors { args } { + upvar dg-excess-errors-flag excess-errors-flag + + if { [llength $args] > 3 } { + error "[lindex $args 0]: too many arguments" + return + } + + if { [llength $args] >= 3 } { + switch [dg-process-target [lindex $args 2]] { + "F" { set excess-errors-flag 1 } + "S" { set excess-errors-flag 1 } + } + } else { + set excess-errors-flag 1 + } +} + +# +# Indicate expected program output +# +# We support multiple occurrences, but we do not implicitly insert newlines +# between them. +# +# Note that target boards don't all support this kind of thing so it's a good +# idea to specify the target all the time. If one or more targets are +# explicitly selected, the test won't be performed if we're not one of them +# (as long as we were never mentioned). +# +# If you have target dependent output and want to set an xfail for one or more +# of them, use { dg-output "" { xfail a-b-c ... } }. The "" won't contribute +# to the expected output. +# +proc dg-output { args } { + upvar dg-output-text output-text + + if { [llength $args] > 3 } { + error "[lindex $args 0]: too many arguments" + return + } + + # Allow target dependent output. + + set expected [lindex ${output-text} 0] + if { [llength $args] >= 3 } { + switch [dg-process-target [lindex $args 2]] { + "N" { return } + "S" { } + "F" { set expected "F" } + # Don't override a previous xfail. + "P" { } + } + } + + if { [llength ${output-text}] == 1 } { + # First occurrence. + set output-text [list $expected [lindex $args 1]] + } else { + set output-text [list $expected "[lindex ${output-text} 1][lindex $args 1]"] + } +} + +proc dg-final { args } { + upvar dg-final-code final-code + + if { [llength $args] > 2 } { + error "[lindex $args 0]: too many arguments" + return + } + + #send_user "dg-final: $args\n" + append final-code "[lindex $args 1]\n" +} + +# +# Set up our environment +# +# There currently isn't much to do, but always calling it allows us to add +# enhancements without having to update our callers. +# It must be run before calling `dg-test'. + +proc dg-init { } { + # If the tool has an "init" routine, call it. + global tool + if ![string match "" [info procs ${tool}_init]] { + ${tool}_init + } +} + +# dg-runtest -- simple main loop useful to most testsuites +# +# FLAGS is a set of options to always pass. +# DEFAULT_EXTRA_FLAGS is a set of options to pass if the testcase doesn't +# specify any (with dg-option). +# ??? We're flipping between "flag" and "option" here. + +proc dg-runtest { testcases flags default-extra-flags } { + global runtests + + foreach testcase $testcases { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $testcase] { + continue + } + verbose "Testing [file tail [file dirname $testcase]]/[file tail $testcase]" + dg-test $testcase $flags ${default-extra-flags} + } +} + +# +# Runs a new style DejaGnu test +# +# PROG is the full path name of the file to pass to the tool (eg: compiler). +# TOOL_FLAGS is a set of options to always pass. +# DEFAULT_EXTRA_TOOL_FLAGS are additional options if the testcase has none. + +proc dg-test { prog tool_flags default_extra_tool_flags } { + global dg-do-what-default dg-interpreter-batch-mode dg-linenum-format + global errorCode errorInfo + global comp_output exec_output + global tool + global srcdir ;# eg: /calvin/dje/devo/gcc/./testsuite/ + global host_triplet target_triplet + + set text "\[- A-Za-z0-9\.\;\"\_\:\'\`\(\)\!\#\=\+\?\&\*]*" + + regsub "^$srcdir/?" $prog "" name + # If we couldn't rip $srcdir out of `prog' then just do the best we can. + # The point is to reduce the unnecessary noise in the logs. Don't strip + # out too much because different testcases with the same name can confuse + # `test-tool'. + if [string match "/*" $name] { + set name "[file tail [file dirname $prog]]/[file tail $prog]" + } + + # Process any embedded dg options in the testcase. + + # Use "" for the second element of dg-do-what so we can tell if it's been + # explicitly set to "S". + set dg-do-what [list ${dg-do-what-default} "" P] + set dg-excess-errors-flag 0 + set dg-messages "" + set dg-extra-tool-flags $default_extra_tool_flags + set dg-final-code "" + + # `dg-output-text' is a list of two elements: pass/fail and text. + # Leave second element off for now (indicates "don't perform test") + set dg-output-text "P" + + # Define our own "special function" `unknown' so we catch spelling errors. + # But first rename the existing one so we can restore it afterwards. + catch {rename dg-save-unknown ""} + rename unknown dg-save-unknown + proc unknown { args } { + return -code error "unknown dg option: $args" + } + + set tmp [dg-get-options $prog] + foreach op $tmp { + verbose "Processing option: $op" 3 + set status [catch "$op" errmsg] + if { $status != 0 } { + if { 0 && [info exists errorInfo] } { + # This also prints a backtrace which will just confuse + # testcase writers, so it's disabled. + perror "$name: $errorInfo\n" + } else { + perror "$name: $errmsg for \"$op\"\n" + } + # ??? The call to unresolved here is necessary to clear `errcnt'. + # What we really need is a proc like perror that doesn't set errcnt. + # It should also set exit_status to 1. + unresolved "$name: $errmsg for \"$op\"" + return + } + } + + # Restore normal error handling. + rename unknown "" + rename dg-save-unknown unknown + + # If we're not supposed to try this test on this target, we're done. + if { [lindex ${dg-do-what} 1] == "N" } { + unsupported "$name" + verbose "$name not supported on this target, skipping it" 3 + return + } + + # Run the tool and analyze the results. + # The result of ${tool}-dg-test is in a bit of flux. + # Currently it is the name of the output file (or "" if none). + # If we need more than this it will grow into a list of things. + # No intention is made (at this point) to preserve upward compatibility + # (though at some point we'll have to). + + set output_file [${tool}-dg-test $prog [lindex ${dg-do-what} 0] "$tool_flags ${dg-extra-tool-flags}"] + + #send_user "\nold_dejagnu.exp: comp_output1 = :$comp_output:\n\n" + #send_user "\nold_dejagnu.exp: message = :$message:\n\n" + #send_user "\nold_dejagnu.exp: message length = [llength $message]\n\n" + + foreach i ${dg-messages} { + verbose "Scanning for message: $i" 4 + + # Remove all error messages for the line [lindex $i 0] + # in the source file. If we find any, success! + set line [lindex $i 0] + set pattern [lindex $i 2] + set comment [lindex $i 3] + #send_user "Before:\n$comp_output\n" + if [regsub -all "(^|\n)(\[^\n\]+$line\[^\n\]*($pattern)\[^\n\]*\n?)+" $comp_output "\n" comp_output] { + set comp_output [string trimleft $comp_output] + set ok pass + set uhoh fail + } else { + set ok fail + set uhoh pass + } + #send_user "After:\n$comp_output\n" + + # $line will either be a formatted line number or a number all by + # itself. Delete the formatting. + scan $line ${dg-linenum-format} line + switch [lindex $i 1] { + "ERROR" { + $ok "$name $comment (test for errors, line $line)" + } + "XERROR" { + x$ok "$name $comment (test for errors, line $line)" + } + "WARNING" { + $ok "$name $comment (test for warnings, line $line)" + } + "XWARNING" { + x$ok "$name $comment (test for warnings, line $line)" + } + "BOGUS" { + $uhoh "$name $comment (test for bogus messages, line $line)" + } + "XBOGUS" { + x$uhoh "$name $comment (test for bogus messages, line $line)" + } + "BUILD" { + $uhoh "$name $comment (test for build failure, line $line)" + } + "XBUILD" { + x$uhoh "$name $comment (test for build failure, line $line)" + } + "EXEC" { } + "XEXEC" { } + } + #send_user "\nold_dejagnu.exp: comp_output2= :$comp_output:\n\n" + } + #send_user "\nold_dejagnu.exp: comp_output3 = :$comp_output:\n\n" + + # Remove messages from the tool that we can ignore. + #send_user "comp_output: $comp_output\n" + set comp_output [prune_system_crud $host_triplet $comp_output] + + if { [info proc ${tool}-dg-prune] != "" } { + set comp_output [${tool}-dg-prune $target_triplet $comp_output] + switch -glob $comp_output { + "::untested::*" { + regsub "::untested::" $comp_output "" message + untested "$name: $message" + return + } + "::unresolved::*" { + regsub "::unresolved::" $comp_output "" message + unresolved "$name: $message" + return + } + "::unsupported::*" { + regsub "::unsupported::" $comp_output "" message + unsupported "$name: $message" + return + } + } + } + + # See if someone forgot to delete the extra lines. + regsub -all "\n+" $comp_output "\n" comp_output + regsub "^\n+" $comp_output "" comp_output + #send_user "comp_output: $comp_output\n" + + # Don't do this if we're testing an interpreter. + # FIXME: why? + if { ${dg-interpreter-batch-mode} == 0 } { + # Catch excess errors (new bugs or incomplete testcases). + if ${dg-excess-errors-flag} { + setup_xfail "*-*-*" + } + if ![string match "" $comp_output] { + fail "$name (test for excess errors)" + send_log "Excess errors:\n$comp_output\n" + } else { + pass "$name (test for excess errors)" + } + } + + # Run the executable image if asked to do so. + # FIXME: This is the only place where we assume a standard meaning to + # the `keyword' argument of dg-do. This could be cleaned up. + if { [lindex ${dg-do-what} 0] == "run" } { + if ![file exists $output_file] { + warning "$name compilation failed to produce executable" + } else { + set status -1 + set status [${tool}_load $output_file] + #send_user "After exec, status: $status\n" + if { [lindex ${dg-do-what} 2] == "F" } { + setup_xfail "*-*-*" + } + if { "$status" == "pass" } { + pass "$name execution test" + verbose "Exec succeeded." 3 + if { [llength ${dg-output-text}] > 1 } { + #send_user "${dg-output-text}\n" + if { [lindex ${dg-output-text} 0] == "F" } { + setup_xfail "*-*-*" + } + set texttmp [lindex ${dg-output-text} 1] + if { ![regexp $texttmp ${exec_output}] } { + fail "$name output pattern test, is ${exec_output}, should match $texttmp" + verbose "Failed test for output pattern $texttmp" 3 + } else { + pass "$name output pattern test, $texttmp" + verbose "Passed test for output pattern $texttmp" 3 + } + unset texttmp + } + } elseif { "$status" == "fail" } { + # It would be nice to get some info out of errorCode. + if [info exists errorCode] { + verbose "Exec failed, errorCode: $errorCode" 3 + } else { + verbose "Exec failed, errorCode not defined!" 3 + } + fail "$name execution test" + } else { + $status "$name execution test" + } + } + } + + # Are there any further tests to perform? + # Note that if the program has special run-time requirements, running + # of the program can be delayed until here. Ditto for other situations. + # It would be a bit cumbersome though. + + if ![string match ${dg-final-code} ""] { + regsub -all "\\\\(\[{}\])" ${dg-final-code} "\\1" dg-final-code + # Note that the use of `args' here makes this a varargs proc. + proc dg-final-proc { args } ${dg-final-code} + verbose "Running dg-final tests." 3 + verbose "dg-final-proc:\n[info body dg-final-proc]" 4 + if [catch "dg-final-proc $prog" errmsg] { + perror "$name: error executing dg-final: $errmsg" + # ??? The call to unresolved here is necessary to clear `errcnt'. + # What we really need is a proc like perror that doesn't set errcnt. + # It should also set exit_status to 1. + unresolved "$name: error executing dg-final: $errmsg" + } + } + + # Do some final clean up. + # When testing an interpreter, we don't compile something and leave an + # output file. + if { ${dg-interpreter-batch-mode} == 0 } { + catch "exec rm -f $output_file" + } +} + +# +# Do any necessary cleanups +# +# This is called at the end to undo anything dg-init did (that needs undoing). +# +proc dg-finish { } { + # Reset this in case caller wonders whether s/he should. + global prms_id + set prms_id 0 + + # The framework doesn't like to see any error remnants, so remove them. + global errorInfo + if [info exists errorInfo] { + unset errorInfo + } + + # If the tool has a "finish" routine, call it. + # There may be a bit of duplication (eg: resetting prms_id), leave it. + # Let's keep these procs robust. + global tool + if ![string match "" [info procs ${tool}_finish]] { + ${tool}_finish + } +} diff --git a/contrib/bluegnu2.0.3/lib/foo.itcl b/contrib/bluegnu2.0.3/lib/foo.itcl new file mode 100644 index 0000000..cd2c6f0 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/foo.itcl @@ -0,0 +1,21 @@ + +source lib/testSessionClasses.itcl +source lib/testSessionFramework.itcl +source lib/testSessionUtils.itcl + + +namespace TestSession { + Environment E0 + + #E0 saveEnv + E0 clearEnv + puts [join [E0 <<] "\n"] + + exit + + foreach obj [info objects] { + puts "$obj - [$obj <<]" + } +} + +::TestSession::clone_output "ERROR: testing" diff --git a/contrib/bluegnu2.0.3/lib/framework.exp b/contrib/bluegnu2.0.3/lib/framework.exp new file mode 100644 index 0000000..2018c4a --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/framework.exp @@ -0,0 +1,677 @@ +# Copyright (C) 92, 93, 94, 95, 1996 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@welcomehome.org) + +# These variables are local to this file. +# This or more warnings and a test fails. +set warning_threshold 3 +# This or more errors and a test fails. +set perror_threshold 1 + +proc mail_file { file to subject } { + if [file readable $file] { + catch "exec mail -s \"$subject\" $to < $file" + } +} + +# +# Open the output logs +# +proc open_logs { } { + global outdir + global tool + global sum_file + + if { ${tool} == "" } { + set tool testrun + } + catch "exec rm -f $outdir/$tool.sum" + set sum_file [open "$outdir/$tool.sum" w] + catch "exec rm -f $outdir/$tool.log" + log_file -a "$outdir/$tool.log" + verbose "Opening log files in $outdir" + if { ${tool} == "testrun" } { + set tool "" + } +} + + +# +# Close the output logs +# +proc close_logs { } { + global sum_file + + catch "close $sum_file" +} + +# +# Check build host triplet for pattern +# +# With no arguments it returns the triplet string. +# +proc isbuild { args } { + global build_triplet + global host_triplet + + if ![info exists build_triplet] { + set build_triplet ${host_triplet} + } + if [string match "" $args] { + return $build_triplet + } + verbose "Checking pattern \"$args\" with $build_triplet" 2 + + if [string match "$args" $build_triplet] { + return 1 + } else { + return 0 + } +} + +# +# If this is a canadian (3 way) cross. This means the tools are +# being built with a cross compiler for another host. +# +proc is3way {} { + global host_triplet + global build_triplet + + if ![info exists build_triplet] { + set build_triplet ${host_triplet} + } + verbose "Checking $host_triplet against $build_triplet" 2 + if { "$build_triplet" == "$host_triplet" } { + return 0 + } + return 1 +} + +# +# Check host triplet for pattern +# +# With no arguments it returns the triplet string. +# +proc ishost { args } { + global host_triplet + + if [string match "" $args] { + return $host_triplet + } + verbose "Checking pattern \"$args\" with $host_triplet" 2 + + if [string match "$args" $host_triplet] { + return 1 + } else { + return 0 + } +} + +# +# Check target triplet for pattern +# +# With no arguments it returns the triplet string. +# Returns 1 if the target looked for, or 0 if not. +# +proc istarget { args } { + global target_triplet + + # if no arg, return the config string + if [string match "" $args] { + if [info exists target_triplet] { + return $target_triplet + } else { + perror "No target configuration names found." + } + } + + # now check against the cannonical name + if [info exists target_triplet] { + verbose "Checking \"$args\" against \"$target_triplet\"" 2 + if [string match "$args" $target_triplet] { + return 1 + } + } + + # nope, no match + return 0 +} + +# +# Check to see if we're running the tests in a native environment +# +# Returns 1 if running native, 0 if on a target. +# +proc isnative { } { + global target_triplet + global build_triplet + + if [string match $build_triplet $target_triplet] { + return 1 + } + return 0 +} + +# +# unknown -- called by expect if a proc is called that doesn't exist +# +proc unknown { args } { + global errorCode + global errorInfo + + clone_output "ERROR: (DejaGnu) proc \"$args\" does not exist." + if [info exists errorCode] { + send_error "The error code is $errorCode\n" + } + if [info exists errorInfo] { + send_error "The info on the error is:\n$errorInfo\n" + } + + log_summary +} + +# +# Print output to stdout (or stderr) and to log file +# +# If the --all flag (-a) option was used then all messages go the the screen. +# Without this, all messages that start with a keyword are written only to the +# detail log file. All messages that go to the screen will also appear in the +# detail log. This should only be used by the framework itself using pass, +# fail, xpass, xfail, warning, perror, note, untested, unresolved, or +# unsupported procedures. +# +proc clone_output { message } { + global sum_file + global all_flag + + puts $sum_file "$message" + case [lindex $message 0] in { + {"PASS:" "XFAIL:" "UNRESOLVED:" "UNSUPPORTED:" "UNTESTED:"} { + if $all_flag { + send_user "$message\n" + return "$message" + } else { + send_log "$message\n" + } + } + {"ERROR:" "WARNING:" "NOTE:"} { + send_error "$message\n" + return "$message" + } + default { + send_user "$message\n" + return "$message" + } + } +} + +# +# Reset all globally used variables +# +proc reset_vars {} { + # test result counters + global testcnt + global failcnt + global passcnt + global xfailcnt + global xpasscnt + global untestedcnt + global unresolvedcnt + global unsupportedcnt + + # other miscellaneous variables + global prms_id + global bug_id + + # reset them all + set prms_id 0 + set bug_id 0 + set testcnt 0 + set failcnt 0 + set passcnt 0 + set xfailcnt 0 + set xpasscnt 0 + set untestedcnt 0 + set unresolvedcnt 0 + set unsupportedcnt 0 + + # Variables local to this file. + global warning_threshold perror_threshold + set warning_threshold 3 + set perror_threshold 1 +} + +# +# Print summary of all pass/fail counts +# +# Calling this exits. +# +proc log_summary {} { + global tool + global sum_file + global exit_status + global failcnt + global passcnt + global testcnt + global xfailcnt + global xpasscnt + global untestedcnt + global unresolvedcnt + global unsupportedcnt + global mail_logs + global outdir + global mailing_list + + clone_output "\n\t\t=== $tool Summary ===\n" + + # If the tool set `testcnt', it wants us to do a sanity check on the + # total count, so compare the reported number of testcases with the + # expected number. Maintaining an accurate count in `testcnt' isn't easy + # so it's not clear how often this will be used. + if { $testcnt > 0 } { + # total all the testcases reported + set totlcnt [expr $failcnt+$passcnt+$xfailcnt+$xpasscnt] + set totlcnt [expr $totlcnt+$untestedcnt+$unresolvedcnt+$unsupportedcnt] + + if { $testcnt>$totlcnt || $testcnt<$totlcnt } { + if { $testcnt > $totlcnt } { + set mismatch "unreported [expr $testcnt-$totlcnt]" + } + if { $testcnt < $totlcnt } { + set mismatch "misreported [expr $totlcnt-$testcnt]" + } + } else { + verbose "# of testcases run $testcnt" + } + + if [info exists mismatch] { + clone_output "### ERROR: totals do not equal number of testcases run" + clone_output "### ERROR: # of testcases expected $testcnt" + clone_output "### ERROR: # of testcases reported $totlcnt" + clone_output "### ERROR: # of testcases $mismatch\n" + } + } + + if { $passcnt > 0 } { + clone_output "# of expected passes $passcnt" + } + if { $xfailcnt > 0 } { + clone_output "# of expected failures $xfailcnt" + } + if { $xpasscnt > 0 } { + clone_output "# of unexpected successes $xpasscnt" + } + if { $failcnt > 0 } { + clone_output "# of unexpected failures $failcnt" + } + if { $unresolvedcnt > 0 } { + clone_output "# of unresolved testcases $unresolvedcnt" + } + if { $untestedcnt > 0 } { + clone_output "# of untested testcases $untestedcnt" + } + if { $unsupportedcnt > 0 } { + clone_output "# of unsupported tests $unsupportedcnt" + } + # extract version number + if {[info procs ${tool}_version] != ""} { + if {[catch "${tool}_version" output]} { + warning "${tool}_version failed:\n$output" + } + } + close_logs + cleanup + if $mail_logs { + mail_file $outdir/$tool.sum $mailing_list "Dejagnu Summary Log" + } + exit $exit_status +} + +# +# Close all open files, remove temp file and core files +# +proc cleanup {} { + global sum_file + global exit_status + global done_list + global base_dir + global subdir + + #catch "exec rm -f [glob xgdb core *.x *.o *_soc a.out]" + #catch "exec rm -f [glob -nocomplain $subdir/*.o $subdir/*.x $subdir/*_soc]" +} + +# +# Setup a flag to control whether a failure is expected or not +# +# Multiple target triplet patterns can be specified for targets +# for which the test fails. A decimal number can be specified, +# which is the PRMS number. +# +proc setup_xfail { args } { + global xfail_flag + global xfail_prms + + set xfail_prms 0 + set argc [ llength $args ] + for { set i 0 } { $i < $argc } { incr i } { + set sub_arg [ lindex $args $i ] + # is a prms number. we assume this is a number with no characters + if [regexp "^\[0-9\]+$" $sub_arg] { + set xfail_prms $sub_arg + continue + } + if [istarget $sub_arg] { + set xfail_flag 1 + continue + } + } +} + +# +# Clear the xfail flag for a particular target +# +proc clear_xfail { args } { + global xfail_flag + global xfail_prms + + set argc [ llength $args ] + for { set i 0 } { $i < $argc } { incr i } { + set sub_arg [ lindex $args $i ] + case $sub_arg in { + "*-*-*" { # is a configuration triplet + if [istarget $sub_arg] { + set xfail_flag 0 + set xfail_prms 0 + } + continue + } + } + } +} + +# +# Record that a test has passed or failed (perhaps unexpectedly) +# +# This is an internal procedure, only used in this file. +# +proc record_test { type message } { + global passcnt failcnt xpasscnt xfailcnt + global untestedcnt unresolvedcnt unsupportedcnt + global exit_status + global prms_id bug_id + global xfail_flag xfail_prms + global errcnt warncnt + global warning_threshold perror_threshold + + # If we have too many warnings or errors, + # the output of the test can't be considered correct. + if { $warning_threshold > 0 && $warncnt >= $warning_threshold + || $perror_threshold > 0 && $errcnt >= $perror_threshold } { + # Reset these first to prevent infinite recursion. + set warncnt 0 + set errcnt 0 + unresolved $message + return + } + + switch $type { + PASS { + incr passcnt + if $prms_id { + set message [concat $message "\t(PRMS $prms_id)"] + } + } + FAIL { + incr failcnt + set exit_status 1 + if $prms_id { + set message [concat $message "\t(PRMS $prms_id)"] + } + } + XPASS { + incr xpasscnt + set exit_status 1 + if { $xfail_prms != 0 } { + set message [concat $message "\t(PRMS $xfail_prms)"] + } + } + XFAIL { + incr xfailcnt + if { $xfail_prms != 0 } { + set message [concat $message "\t(PRMS $xfail_prms)"] + } + } + UNTESTED { + incr untestedcnt + # The only reason we look at the xfail stuff is to pick up + # `xfail_prms'. + if { $xfail_flag && $xfail_prms != 0 } { + set message [concat $message "\t(PRMS $xfail_prms)"] + } elseif $prms_id { + set message [concat $message "\t(PRMS $prms_id)"] + } + } + UNRESOLVED { + incr unresolvedcnt + set exit_status 1 + # The only reason we look at the xfail stuff is to pick up + # `xfail_prms'. + if { $xfail_flag && $xfail_prms != 0 } { + set message [concat $message "\t(PRMS $xfail_prms)"] + } elseif $prms_id { + set message [concat $message "\t(PRMS $prms_id)"] + } + } + UNSUPPORTED { + incr unsupportedcnt + # The only reason we look at the xfail stuff is to pick up + # `xfail_prms'. + if { $xfail_flag && $xfail_prms != 0 } { + set message [concat $message "\t(PRMS $xfail_prms)"] + } elseif $prms_id { + set message [concat $message "\t(PRMS $prms_id)"] + } + } + default { + perror "record_test called with bad type `$type'" + set errcnt 0 + return + } + } + + if $bug_id { + set message [concat $message "\t(BUG $bug_id)"] + } + + global multipass_name + if { $multipass_name != "" } { + clone_output "$type: $multipass_name: $message" + } else { + clone_output "$type: $message" + } + + # Reset these so they're ready for the next test case. We don't reset + # prms_id or bug_id here. There may be multiple tests for them. Instead + # they are reset in the main loop after each test. It is also the + # testsuite driver's responsibility to reset them after each testcase. + set warncnt 0 + set errcnt 0 + set xfail_flag 0 + set xfail_prms 0 +} + +# +# Record that a test has passed +# +proc pass { message } { + global xfail_flag + + if $xfail_flag { + record_test XPASS $message + } else { + record_test PASS $message + } +} + +# +# Record that a test has failed +# +proc fail { message } { + global xfail_flag + + if $xfail_flag { + record_test XFAIL $message + } else { + record_test FAIL $message + } +} + +# +# Record that a test has passed unexpectedly +# +proc xpass { message } { + record_test XPASS $message +} + +# +# Record that a test has failed unexpectedly +# +proc xfail { message } { + record_test XFAIL $message +} + +# +# Set warning threshold +# +proc set_warning_threshold { threshold } { + set warning_threshold $threshold +} + +# +# Get warning threshold +# +proc get_warning_threshold { } { + return $warning_threshold +} + +# +# Prints warning messages +# These are warnings from the framework, not from the tools being tested. +# It takes a string, and an optional number and returns nothing. +# +proc warning { args } { + global warncnt + global errno + + if { [llength $args] > 1 } { + set warncnt [lindex $args 1] + } else { + incr warncnt + } + set message [lindex $args 0] + + clone_output "WARNING: $message" + set errno "WARNING: $message" + + global errorInfo + if [info exists errorInfo] { + unset errorInfo + } +} + +# +# Prints error messages +# These are errors from the framework, not from the tools being tested. +# It takes a string, and an optional number and returns nothing. +# +proc perror { args } { + global errcnt + global errno + + if { [llength $args] > 1 } { + set errcnt [lindex $args 1] + } else { + incr errcnt + } + set message [lindex $args 0] + + clone_output "ERROR: $message" + set errno "ERROR: $message" + + global errorInfo + if [info exists errorInfo] { + unset errorInfo + } +} + +# +# Prints informational messages +# +# These are messages from the framework, not from the tools being tested. +# This means that it is currently illegal to call this proc outside +# of dejagnu proper. +# +proc note { message } { + clone_output "NOTE: $message" + + # ??? It's not clear whether we should do this. Let's not, and only do + # so if we find a real need for it. + #global errorInfo + #if [info exists errorInfo] { + # unset errorInfo + #} +} + +# +# untested -- mark the test case as untested +# +proc untested { message } { + record_test UNTESTED $message +} + +# +# Mark the test case as unresolved +# +proc unresolved { message } { + record_test UNRESOLVED $message +} + +# +# Mark the test case as unsupported +# +# Usually this is used for a test that is missing OS support. +# +proc unsupported { message } { + record_test UNSUPPORTED $message +} + + +# +# Create an exp_continue proc if it doesn't exist +# +# For compatablity with old versions. +# +global argv0 +if ![info exists argv0] { + proc exp_continue { } { + continue -expect + } +} diff --git a/contrib/bluegnu2.0.3/lib/libgloss.exp b/contrib/bluegnu2.0.3/lib/libgloss.exp new file mode 100644 index 0000000..7e54e8d --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/libgloss.exp @@ -0,0 +1,225 @@ +# Copyright (C) 92, 93, 94, 95, 1996 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@welcomehome.org) + +# +# Find the linker script for the current target. Returns a string +# suitable to pass to $CC or $CXX to use a liblgoss based linker script, +# or NULL if there is no support. +# +proc libgloss_script { } { + global srcdir + global target_cpu + global LDFLAGS + global CFLAGS + global CXXFLAGS + global target_info + + # sanity check + if ![info exists LDFLAGS] { + set LDFLAGS "" + } + if ![info exists CFLAGS] { + set CFLAGS "" + } + + if ![info exists CXXFLAGS] { + set CXXFLAGS "" + } + + # find the linker script. first we look at the config + # data and hope to find it all ready for us to use. if + # that fails, then look in the LDFLAGS and CFLAGS variables that + # get set in the global site.exp file. + if [info exists target_info(target,name)] { + set script $target_info(target,name).ld + } else { + if [regexp -- "-T.*\.ld" ${LDFLAGS} script] { + string trimleft ${script} "-T" + } + if [regexp -- "-T.*\.ld" ${CFLAGS} script] { + string trimleft ${script} "-T" + } + if [regexp -- "-T.*\.ld" ${CXXFLAGS} script] { + string trimleft ${script} "-T" + } + } + + if ![info exists script] { + warning "Couldn't find the linker script name for target" + return "" + } + + # if we're on a remote host, we can't search for the file, so use the + # linker script in the path. + if [is3way] { + return "-T${script}" + } + + # search for the general directories + foreach i ".. ../.. ../../.. ../../../.." { + verbose "Looking for a ${srcdir}/${i}/libgloss/${target_cpu}/${script}" 2 + if [file exists ${srcdir}/$i/libgloss/${target_cpu}/${script} ] { + verbose "Found ${srcdir}/${i}/libgloss/${target_cpu}/${script}." 3 + return "-T${srcdir}/${i}/libgloss/${target_cpu}/${script}" + } + } + + # we didn't find the script, so we have to hope it's installed + return "-T${script}" +} + +# +# Find all the pieces of libgloss for testing the GNU development tools +# needed to use $CC or $CXX. It returns a string suitable to pass to +# $CC or $CXX to get a fully linked binary for the target. +# +proc libgloss_flags { } { + global target_alias + global target_cpu + global srcdir + global base_dir + + # libgloss doesn't work native + if [isnative] { + return "" + } + + # if we're on a remote host, we can't search for the file, so we can only + # use an installed compiler, so we don't add any paths here. + if [is3way] { + return "[libgloss_script]" + } + + # search for the general directories + foreach i ".. ../.. ../../.. ../../../.." { + if [file exists ${base_dir}/${i}/${target_alias}/libgloss/${target_cpu} ] { + verbose "Found ${base_dir}/${i}/${target_alias}/libgloss/${target_cpu}." 3 + return "-L${base_dir}/${i}/${target_alias}/libgloss/${target_cpu} [libgloss_script]" + } + } + + # we didn't find any support at all + return "[libgloss_script]" +} + +# +# Find the C libraries +# +proc newlib_flags { } { + global base_dir + global srcdir + global target_alias + + # if we're on a remote host, we can't search for the file, so use the + # newlib already installed. + if [is3way] { + return "" + } + + # search for the general directories + foreach i ".. ../.. ../../.. ../../../.." { + verbose "Looking for a ${base_dir}/${i}/${target_alias}/newlib/targ-include" 2 + if [file exists ${base_dir}/${i}/${target_alias}/newlib/targ-include ] { + verbose "Found ${base_dir}/${i}/${target_alias}/newlib/targ-include." 3 + set incls1 "-I${base_dir}/${i}/${target_alias}/newlib/targ-include" + } + verbose "Looking for a ${srcdir}/${i}/newlib/libc/include" 2 + if [file exists ${srcdir}/${i}/newlib/libc/include ] { + verbose "Found ${srcdir}/${i}/newlib/libc/include." 3 + set incls2 "-I${srcdir}/${i}/newlib/libc/include" + } + } + + # search for the general directories + foreach i ".. ../.. ../../.. ../../../.." { + verbose "Looking for a ${base_dir}/${i}/newlib" 2 + if [file exists ${base_dir}/${i}/newlib ] { + verbose "Found ${base_dir}/${i}/newlib." 3 + return "-B${base_dir}/${i}/newlib/ ${incls1} ${incls2}" + } + } + return "" +} + +# +# Find all the pieces of libgloss for testing the GNU development tools +# needed to use $LD. This gets fun cause we have to guess the name of the +# BSP for this target. If returns a string suitable to pass to LD to get +# a fully linked binary for the target. It also sets two global variables, +# CRT0 is the path to the startup file, and +# BSP is the path to the support library. +# +proc libgloss_ld {} { +#proc gloss_ld {} { + global target_cpu + global srcdir + global base_dir + global CRT0 + global BSP + + # libgloss doesn't work native + if [isnative] { + return "" + } + +# set ldflags "" + # search for the general directories + foreach i ".. ../.. ../../.. ../../../.." { + if ![info exists gloss_srcdir] { + if [file exists ${srcdir}/$i/libgloss/${target_cpu} ] { + verbose "Found ${srcdir}/$i/libgloss/${target_cpu}." 3 + set gloss_srcdir "$i/libgloss/${target_cpu}" + } + } + if ![info exists gloss_objdir] { + if [file exists ${base_dir}/$i/libgloss/${target_cpu} ] { + verbose "Found ${base_dir}/$i/libgloss/${target_cpu}." 3 + set gloss_objdir "$i/libgloss/${target_cpu}" + append ldflags " -L${gloss_objdir} " + } + } + } + + # find the crt0 + if [file exists ${gloss_objdir}/crt0.o] { + verbose "Found ${base_dir}/$i/libgloss/${target_cpu}." 3 + set CRT0 "$i/libgloss/${target_cpu}" + append ldflags " ${gloss_objdir}/crt0.o " + } else { + perror "No crt0.o built for this target" + } + + # find the BSP (currently an object, it may become an archive soon) + foreach i "[list_targets]" { + if [info exists target_info($i,name}] { + if [file exists ${gloss_objdir}/${target_info}($i,name).o ] { + set BSP "${target_info}($i,name).o" + append ldflags " -lc -l ${target_info}($i,name).o -lc " + } + } + } + if [expr ![info exists gloss_srcdir] || ![info exists gloss_srcdir]] { + warning "No libgloss support in build tree" + return "" + } else { + return "${ldflags}" + } +} diff --git a/contrib/bluegnu2.0.3/lib/nonexpect.itcl b/contrib/bluegnu2.0.3/lib/nonexpect.itcl new file mode 100644 index 0000000..230f411 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/nonexpect.itcl @@ -0,0 +1,74 @@ +# +# The following procedures are creted to replace the +# procedures defined in expect incase expect is not used as the +# test framework +# + +proc send_user args { + set newline 1 + set logfile 0 + set i 0 + if { [string index [lindex $args 0] 0] == "-" } { + for { set i 0 } { $i < [llength $args] } { incr i } { + if { [lindex $args $i] == "--" } { + incr i + break + } elseif { [lindex $args $i] == "-n" } { + set newline 0 + } elseif { [lindex $args $i] == "-log" } { + set logfile 1 + } elseif { [string index [lindex $args $i] 0] == "-" } { + ::BlueGnu::clone_output "ERROR: verbose:\ + illegal argument: [lindex $args $i]" + return + } else { + break + } + } + if { [llength $args] == $i } { + ::BlueGnu::clone_output "ERROR: send_user: nothing to print" + return + } + } + puts -nonewline [lindex $args $i] +} + +proc send_error msg { + puts -nonewline stderr $msg +} + +proc send_log msg { + global log_file + + if {[info exists log_file]} { + puts -nonewline $log_file $msg + } else { + send_user "####### No log file has been defined\n" + puts -nonewline stderr $msg + } +} + +proc log_file {args} { + global log_file + if {[info exists log_file]} { + catch {close $log_file} + unset log_file + } + set eAppend w + foreach arg $args { + switch -- $arg { + -a { + set eAppend a + } + default { + set log_file $arg + } + } + } + if {[info exist log_file]} { + set log_file [open $log_file $eAppend] + } else { + set log_file stderr + } +} + diff --git a/contrib/bluegnu2.0.3/lib/remote.exp b/contrib/bluegnu2.0.3/lib/remote.exp new file mode 100644 index 0000000..1b80617 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/remote.exp @@ -0,0 +1,896 @@ +# Copyright (C) 92, 93, 94, 95, 1996 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@welcomehome.org) + +# these just need to be initialized +# FIXME: This is deprecated (we should have no knowledge of global `shell_id'). +# Remove at some point. +set shell_id 0 + +# +# Open a connection to a remote host or target. This requires the target_info +# array be filled in with the proper info to work. The old variables are also +# still functional. +# +# type is either "host" or "target". The default is target if no type is supplied. +# It returns the spawn id of the process that is the connection. +# +proc remote_open { args } { + global target_info + global connectmode + global targetname + global serialport + global netport + global reboot + global shell_id + global spawn_id + + if { [llength $args] == 0 } { + set type "target" + } else { + set type $args + } + + # set the current connection + if [info exists target_info(${type},name)] { + if { $target_info(${type},name) != "" } { + if { [info proc push_$type] != "" } { + push_$type $target_info(${type},name) + } + } else { + warning "Couldn't push target, name was NULL" + } + } + + if [info exists target_info(${type},connect)] { + set connect_prog $target_info(${type},connect) + } else { + if [info exists connectmode] { + set connect_prog $connectmode + } else { + perror "No connectmode specified" + set shell_id -1 + return $shell_id + } + } + + # reboot the machine if we neeed to, typically by using an x10 controller. + if $reboot { + if { [info procs "reboot_hook"] != "" } { + reboot_hook + } + } + + set shell_id [$connect_prog $type] + + if [info exists target_info] { + set target_info(${type},fileid) $shell_id + if [info exists target_info(${type},name)] { + set target_info($target_info(${type},name),fileid) $shell_id + } + } + return $shell_id +} + +# +# Close the remote connection. +# shell_id - This is the id number returned by the any of the connection +# procedures, or an index into one of the arrays. +# +proc remote_close { arg } { + # get the type of connection, host or target + if [expr [string match "host" $arg] || [string match "target" $arg]] { + set type $arg + if [info exists target_info(${type},fileid)] { + set shell_id $target_info(${type},fileid) + } else { + perror "No shell id for to close" + } + } else { + set shell_id $arg + } + + verbose "Closing the remote shell $shell_id" 2 + catch "close -i $shell_id" + catch "wait -i $shell_id" + + return 0 +} + + +# Most of these procedures try to establish the connection 3 times before +# returning. If $verbose is set to a value of 2 or greater, then error +# messages will appear for each attempt. If there is an error that +# can't be recovered from, it returns a -1. If the connection is +# established, it returns the shell's process number returned by the +# tcl command spawn. +# Hostname refers to the entry in /etc/hosts for this target. The +# procedure's name is the same as its unix counterpart. +# The final argument is the type of connection to establish, the default +# is the target. This can also be passed as the second arg or the third. + +# +# Connect using telnet. This takes two arguments. The first one is the +# hostname, and the second is the optional port number. This sets +# the fileid field in the config array, and returns -1 for error, or the +# spawn id. +# +proc telnet { args } { + global verbose + global connectmode + global shell_prompt + global spawn_id + global timeout + global errno + + set hostname [lindex $args 0] + + # get the port number + if { [llength $args] > 1 } { + set port [lindex $args 1] + } else { + set port 23 + } + + # get the hostname and port number from the config array + if [expr [string match "host" $hostname] || [string match "target" $hostname]] { + set type $hostname + set hosttmp [split $target_info($type,netport) ":"] + set hostname [lindex $hosttmp 0] + if { [llength $hosttmp] > 1 } { + set port [lindex $hosttmp 1] + } + unset hosttmp + if [info exists target_info($type,prompt)] { + set shell_prompt $target_info($type,prompt) + } + } else { + set type target + } + if ![info exists shell_prompt] { # if no prompt, then set it to something generic + set shell_prompt ".*> " + } + + set tries 0 + set result -1 + verbose "Starting a telnet connection to $hostname:$port" 2 + spawn telnet $hostname $port + exp_send "\r\n" + while { $tries <= 3 } { + catch expect { + "ogin:" { + perror "telnet: need to login" + break + } + "assword:" { + perror "telnet: need a password" + break + } + -re ".*$shell_prompt.*$" { + verbose "Got prompt\n" + set result 0 + } + "Connected to" { + exp_continue + } + -re "\[\r\n\]*" { + exp_continue + } + "unknown host" { + exp_send "\003" + perror "telnet: unknown host" + break + } + "Escape character is" { + exp_send "\r\n" + exp_continue + } + "has logged on from" { + exp_continue + } + "You have no Kerberos tickets" { + warning "telnet: no kerberos Tickets, please kinit" + break + } + -re "Connection refused.*$" { + exp_send "\003" + warning "telnet: connection refused." + } + -re "Sorry, this system is engaged.*" { + exp_send "\003" + warning "telnet: already connected." + } + "Connection closed by foreign host.*$" { + warning "telnet: connection closed by foreign host." + break + } + timeout { + exp_send "\003" + warning "telnet: timed out trying to connect." + } + eof { + perror "telnet: got unexpected EOF from telnet." + break + } + } + incr tries + } + # we look for this hear again cause it means something went wrong, and + # it doesn't always show up in the expect in buffer till the server times out. + if [info exists expect_out(buffer)] { + if [regexp "assword:|ogin:|" $expect_out(buffer)] { + perror "telnet: need to supply a login and password." + } + } + if { $result < 0 } { + catch close + catch wait +# perror "telnet: couldn't connect after $tries tries." + set spawn_id -1 + } + set target_info(target,fileid) $spawn_id + if [info exists target_info(target,name)] { + set target_info($target_info(target,name),fileid) $spawn_id + } + return $spawn_id +} + +# +# Connect to hostname using rlogin. The global RLOGIN +# is the name of the actual rlogin program. This is for systems +# using rlogin to braindead targets that don't support kerboros. +# It returns either the spawn_id or a -1. +# The final argument is the type of connection to establish, the default +# is the target. This can also be passed as the second arg or the third. +# +proc rlogin { arg } { + global spawn_id + global target_info + global RLOGIN + global errno + + set tries 0 + set result -1 + + # get the hostname and port number from the config array + if [expr [string match "host" $arg] || [string match "target" $arg]] { + set type $arg + set hostname [lindex [split $target_info(${type},netport) ":"] 0] + if [info exists target_info($type,prompt)] { + set shell_prompt $target_info($type,prompt) + } + } else { + set hostname $arg + set type target + } + if ![info exists shell_prompt] { # if no prompt, then set it to something generic + set shell_prompt ".*> " + } + + # get the right version of rlogin + if ![info exists RLOGIN] { + set RLOGIN rlogin + } + + # start connection and store the spawn_id + verbose "Opening a $RLOGIN connection to $hostname" 2 + spawn $RLOGIN $hostname + if { $spawn_id < 0 } { + perror "invalid spawn id from rlogin" + return + } + set target_info(${type},fileid) $spawn_id + if [info exists target_info($type,name)] { + set target_info($target_info($type,name),fileid) $spawn_id + } + + # try to connect to the target. We give up after 3 attempts. At one point + # we used to look for the prompt, but we may not know what it looks like. + while { $tries <= 3 } { + expect { + -re ".*$shell_prompt.*$" { + verbose "Got prompt\n" + set result 0 + break + } + -re "TERM = .*\\)\[ ]*$" { + send "dumb\r\n" + expect { + "Terminal type is*$" { + verbose "rlogin: set the terminal to dumb" 2 + } + default { + warning "rlogin: couldn't set terminmal type" + } + } + set result 10 + break + } + "unknown host" { + perror "rlogin: unknown host" + break + } + "has logged on from" { + exp_continue + } + "Terminal type is" { + verbose "rlogin: connected, got terminal prompt" 2 + set result 0 + break + } + -re "Maximum number of users already logged in.*$" { + warning "rlogin: maximum number of users already logged in" + } + -re "Sorry, shell is locked.*Connection closed.*$" { + warning "rlogin: lready connected." + } + -re "Sorry, this system is engaged.*Connection closed.*$" { + warning "rlogin: system engaged." + } + -re "Kerberos rcmd failed.*$" { + warning "rlogin: Kerberos rcmd failed, please kinit" + catch close + catch wait + break + } + -re "trying normal rlogin.*$" { + warning "rlogin: trying normal rlogin." + catch close + catch wait + break + } + -re "unencrypted connection.*$" { + warning "rlogin: unencrypted connection, please kinit" + catch close + catch wait + break + } + -re "isn't registered for Kerberos.*service.*$" { + warning "rsh: isn't registered, please kinit" + catch close + catch wait + break + } + -re "You have no Kerberos tickets.*$" { + warning "rlogin: No kerberos Tickets, please kinit" + catch close + catch wait + break + } + timeout { + warning "rlogin: timed out trying to connect." + } + eof { + perror "rlogin: got EOF while trying to connect." + break + } + } + incr tries + } + + # if the error was fatal, there's nothing to send to + catch { send "\r\n" } tmp + if [string match "*invalid spawn id*" $tmp] { + perror "Couldn't rlogin to $hostname, fatal error." + catch "close $spawn_id" + set target_info(${type},fileid) $spawn_id + if [info exists target_info(${type},name)] { + set target_info($target_info(${type},name),fileid) $spawn_id + } + return $spawn_id + } + expect { + "\r\n*$" { + exp_continue + } + -re "\[- A-Za-z0-9\.\;\"\_\:\'\`\(\)\!\#\=\+\?\&\*]+.*$" { + # this is kinda gross, but if we get most any legit ascii + # text we figure we connected. Others tests later will + # determine if the connection actually works. + verbose "We got some text" 2 + } + } + + # see if we maxed out on errors + if { $result < 0 } { + catch close + catch wait +# perror "rlogin: couldn't rlogin to $hostname, Too many errors" + catch "close $spawn_id" + set spawn_id -1 + set target_info(${type},fileid) $spawn_id + if [info exists target_info(${type},name)] { + set target_info($target_info(${type},name),fileid) $spawn_id + } + } else { + verbose "rlogin: connected to $hostname" 2 + } + + return $spawn_id +} + +# +# Connect to hostname using rsh +# +proc rsh { arg } { + global spawn_id + global target_info + global RSH + global errno + + set tries 0 + set result -1 + + # get the hostname and port number from the config array + if [expr [string match "host" $arg] || [string match "target" $arg]] { + set type $arg + set hostname [lindex [split $target_info(${type},netport) ":"] 0] + if [info exists target_info(${type},prompt)] { + set shell_prompt $target_info(${type},prompt) + } + } else { + set hostname $arg + set type target + } + if ![info exists shell_prompt] { # if no prompt, then set it to something generic + set shell_prompt ".*> " + } + + if ![info exists RSH] { + set RSH rsh + } + spawn $RSH $hostname + if { $spawn_id < 0 } { + perror "invalid spawn id from rsh" + return + } + set target_info(${type},fileid) $spawn_id + if [info exists target_info(${type},name)] { + set target_info($target_info(${type},name),fileid) $spawn_id + } + if [info exists target_info(${type},prompt)] { + set prompt $target_info(${type},prompt) + } + send "\r\n" + while { $tries <= 3 } { + expect { + -re ".*$shell_prompt.*$" { + verbose "Got prompt\n" + set result 0 + break + } + -re "TERM = .*$" { + warning "Setting terminal type to vt100" + set result 0 + send "vt100\n" + break + } + "unknown host" { + exp_send "\003" + perror "telnet: unknown host" + break + } + "has logged on from" { + exp_continue + } + -re "isn't registered for Kerberos.*service.*$" { + warning "rsh: isn't registered for Kerberos, please kinit" + catch close + catch wait + break + } + -re "Kerberos rcmd failed.*$" { + warning "rsh: Kerberos rcmd failed, please kinit" + catch close + catch wait + break + } + -re "You have no Kerberos tickets.*$" { + warning "rsh: No kerberos Tickets, please kinit" + catch close + catch wait + break + } + "Terminal type is" { + verbose "rsh: connected, got terminal prompt" 2 + set result 0 + break + } + -re "trying normal rlogin.*$" { + warning "rsh: trying normal rlogin." + catch close + catch wait + break + } + -re "unencrypted connection.*$" { + warning "rsh: unencrypted connection, please kinit" + catch close + catch wait + break + } + -re "Sorry, shell is locked.*Connection closed.*$" { + warning "rsh: already connected." + } + timeout { + warning "rsh: timed out trying to connect." + } + eof { + perror "rsh: got EOF while trying to connect." + break + } + } + incr tries + } + + if { $result < 0 } { +# perror "rsh: couldn't connect after $tries tries." + set spawn_id -1 + } + set target_info(${type},fileid) $spawn_id + if [info exists target_info(${type},name)] { + set target_info($target_info(${type},name),fileid) $spawn_id + } + return $spawn_id +} + +# +# Download an executable to a network neighbor +# +# DEST is assumed to already contain the nodename. +# Returns the status returned by the rcp command. +# +proc rcp_download { src dest } { + set status [catch "exec rcp $src $dest" output] + if { $status == 0 } { + verbose "Copied $src to $dest" 2 + } else { + verbose "Download to $dest failed, $output." + } + return $status +} + +# +# This proc is deprecated. Please use `execute_anywhere' instead. +# +# Execute a program on the remote system using rsh +# +# SYSTEM is the host name of the system to run the program on. +# CMD is the program to run (including path) and any arguments. +# The result is a list of two elements. +# First element: 0 for success, 1 for failure, -1 for comms failure. +# Second element: program output (success/failure) or error message (comms). +# +proc rsh_exec { system cmd } { + verbose "Executing $system:$cmd" 3 + # If CMD sends any output to stderr, exec will think it failed. More often + # than not that will be true, but it doesn't catch the case where there is + # no output but the exit code is non-zero. The "2>&1" is done on the + # remote system and is not a special flag for `exec'. + set status [catch "exec rsh $system $cmd 2>&1 \\; echo XYZ$?ZYX" output] + # `status' doesn't mean much here other than rsh worked ok. + # What we want is whether $cmd ran ok. + if { $status != 0 } { + regsub "XYZ(\[0-9\]*)ZYX\n?" $output "" output + return [list -1 "rsh to $system failed for $cmd, $output"] + } + regexp "XYZ(\[0-9\]*)ZYX" $output junk status + verbose "rsh_exec: status:$status text:$output" 4 + if { $status == "" } { + return [list -1 "Couldn't parse rsh output, $output."] + } + regsub "XYZ(\[0-9\]*)ZYX\n?" $output "" output + # Delete one trailing \n because that is what `exec' will do and we want + # to behave identical to it. + regsub "\n$" $output "" output + return [list [expr $status != 0] $output] +} + +# +# Connect to using tip +# port - must be a name from /etc/remote, or "host" or "target". +# returns -1 if it failed, the spawn_id if it worked +# +proc tip { arg } { + global verbose + global shell_prompt + global target_info + global spawn_id + + set tries 0 + set result -1 + + if [expr [string match "host" $arg] || [string match "target" $arg]] { + set port $target_info(${type},target) + if [info exists target_info(${type},prompt)] { + set shell_prompt $target_info(${type},prompt) + } + } else { + set port $arg + } + if ![info exists shell_prompt] { # if no prompt, then set it to something generic + set shell_prompt ".*> " + } + + spawn tip -v $port + if { $spawn_id < 0 } { + perror "invalid spawn id from tip" + return -1 + } + set target_info(target,fileid) $spawn_id + set target_info($target_info(target,name),fileid) $spawn_id + expect { + -re ".*connected.*$" { + send "\r\n" + expect { + -re ".*$shell_prompt.*$" { + verbose "Got prompt\n" + set result 0 + incr tries + } + timeout { + warning "Never got prompt." + set result -1 + incr tries + if $tries<=2 { + exp_continue + } + } + } + } + -re "all ports busy.*$" { + set result -1 + perror "All ports busy." + incr tries + if { $tries <= 2 } { + exp_continue + } + } + -re "Connection Closed.*$" { + perror "Never connected." + set result -1 + incr tries + if { $tries <= 2 } { + exp_continue + } + } + -re ".*: Permission denied.*link down.*$" { + perror "Link down." + set result -1 + incr tries + } + timeout { + perror "Timed out trying to connect." + set result -1 + incr tries + if { $tries <= 2 } { + exp_continue + } + } + eof { + perror "Got unexpected EOF from tip." + set result -1 + incr tries + } + } + + send "\n~s" + expect { + "~\[set\]*" { + verbose "Setting verbose mode" 1 + send "verbose\n\n\n" + } + } + + if { $result < 0 } { + perror "Couldn't connect after $tries tries." + set target_info(${type},fileid) -1 + set target_info($target_info(${type},name),fileid) -1 + return -1 + } else { + set target_info(${type},fileid) $spawn_id + set target_info($target_info(${type},name),fileid) $spawn_id + return $spawn_id + } +} + +# +# Downloads using the ~put command under tip +# arg - is a full path name to the file to download +# returns 1 if an error occured, otherwise it returns +# the spawn_id. +# +proc tip_download { shell_id file } { + global verbose + global decimal + global shell_prompt + global expect_out + + set result 1 + if ![file exists $file] { + perror "$file doesn't exist." + return 1 + } + + send -i $shell_id "\n~p" + expect { + -i $shell_id "~\[put\]*" { + verbose "Downloading $file, please wait" 1 + send -i $shell_id "$file\n" + set timeout 50 + expect { + -i $shell_id -re ".*$file.*$" { + exp_continue + } + -i $shell_id -re ".*lines transferred in.*minute.*seconds.*$shell_prompt.*$" { + verbose "Download $file successfully" 1 + set result 0 + } + -i $shell_id -re ".*Invalid command.*$shell_prompt$" { + warning "Got an Invalid command to the monitor" + } + -i $shell_id -re ".*$decimal\r" { + if [info exists expect_out(buffer)] { + verbose "$expect_out(buffer)" + exp_continue + } + } + -i $shell_id timeout { + perror "Timed out trying to download." + set result 1 + } + } + } + timeout { + perror "Timed out waiting for response to put command." + } + } + set timeout 10 + return $result +} + +# +# Connect to using kermit +# args - first is the device name, ie. /dev/ttyb +# second is the optional baud rate. If this is "host" or "target" the +# config array is used instead. +# returns -1 if it failed, otherwise it returns +# the spawn_id. +# +proc kermit { args } { + global verbose + global shell_prompt + global spawn_id + + if { [llength $args] == 1 } { + set baud 9600 + } else { + set baud [lindex $args 1] + } + + if [expr [string match "host" [lindex $args 0]] || [string match "target" [lindex $arg 0]]] { + set device $target_info(${type},serial) + if [info exists target_info(${type},baud)] { + set baud $target_info(${type},baud) + } + } else { + set device [lindex $args 0] + } + + set tries 0 + set result -1 + spawn kermit -l $device -b $baud + if { $spawn_id < 0 } { + perror "invalid spawn id from kermit" + return -1 + } + set target_info(${type},fileid) $spawn_id + set target_info($target_info(${type},name),fileid) $spawn_id + expect { + -re ".*ermit.*>.*$" { + send "c\n" + expect { + -re ".*Connecting to $port.*Type the escape character followed by C to.*$" { + verbose "Got prompt\n" + set result 0 + incr tries + } + timeout { + warning "Never got prompt." + set result -1 + incr tries + if { $tries <= 2 } { + exp_continue + } + } + } + } + -re "Connection Closed.*$" { + perror "Never connected." + set result -1 + incr tries + if { $tries <= 2 } { + exp_continue + } + } + timeout { + warning "Timed out trying to connect." + set result -1 + incr tries + if { $tries<=2 } { + exp_continue + } + } + } + + if { $result < 0 } { + perror "Couldn't connect after $tries tries." + set target_info(${type},fileid) -1 + set target_info($target_info(${type},name),fileid) -1 + return -1 + } else { + set target_info(${type},fileid) $spawn_id + set target_info($target_info(${type},name),fileid) $spawn_id + return $spawn_id + } +} + +# +# exit the remote shell +# +# ??? This proc is deprecated. Please use `remote_close' instead. +proc exit_remote_shell { shell_id } { + return [remote_close $shell_id] +} + +# +# Download a file using stdin. This will download a file +# regardless of whether rlogin, telnet, tip, or kermit was +# used to establish the connection. +# +proc download { args } { + global spawn_id + global verbose + + set file [lindex $args 0] + + if { [llength $args] > 1 } { + set shellid [lindex $args 1] + } else { + set shellid $spawn_id + } + + set lines 0 + set fd [open $file r] + while { [gets $fd cur_line] >= 0 } { + set errmess "" + catch "send -i $shellid \"$cur_line\"" errmess + if [string match "write\(spawn_id=\[0-9\]+\):" $errmess] { + perror "sent \"$command\" got expect error \"$errmess\"" + catch "close $fd" + return -1 + } + verbose "." 2 + verbose "Sent $cur_line" 3 + incr lines + } + verbose "$lines lines downloaded" + close $fd + return 0 +} diff --git a/contrib/bluegnu2.0.3/lib/serverUtils.itcl b/contrib/bluegnu2.0.3/lib/serverUtils.itcl new file mode 100644 index 0000000..7e7c8bb --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/serverUtils.itcl @@ -0,0 +1,51 @@ +# +# +# + +proc EvalServer {port {interp {}} {openCmd EvalOpenProc}} { + puts "in EvalServer" + socket -server [list EvalAccept $interp $openCmd] $port +} + +proc EvalAccept {interp openCmd newsock addr port} { + global eval + + puts "in EvalAccept" + set eval(cmdbuf,$newsock) {} + puts "[fconfigure $newsock]" + fconfigure $newsock -buffering line + fileevent $newsock readable [list EvalRead $newsock $interp] + puts "in EvalAccept: got fileevent" + if [catch { + interp eval $interp $openCmd $newsock $addr $port + }] { + close $newsock + } +} + +proc EvalOpenProc {sock addr port} { + puts "in EvalOpenProc" + # dummy +} + +proc EvalRead {sock interp} { + global eval errorInfo errorCode + + puts "in EvalRead" + if [eof $sock] { + close $sock + } else { + gets $sock line + append eval(cmdbuf,$sock) "$line\n" + if {[string length $eval(cmdbuf,$sock)] && \ + [info complete $eval(cmdbuf,$sock)]} { + puts ">$eval(cmdbuf,$sock)<" + } + set reply "Done\n" + puts $sock 1 + puts -nonewline $sock $reply + flush $sock + set eval(cmdbuf,$sock) {} + } +} + diff --git a/contrib/bluegnu2.0.3/lib/target.exp b/contrib/bluegnu2.0.3/lib/target.exp new file mode 100644 index 0000000..1454dad --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/target.exp @@ -0,0 +1,520 @@ +# Copyright (C) 92, 93, 94, 95, 1996 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@welcomehome.org) + +# a hairy pattern to recognize text +set text "\[- A-Za-z0-9\.\;\"\_\:\'\`\(\)\!\#\=\+\?\&\*]" + +# +# this is a collection of support procs for the target data +# structures. We use a named array, since Tcl has no real data +# structures. Here's the special index words for the array: +# Required fields are: +# name - the name of the target. (mostly for error messages) This +# should also be the string used for this target's array. +# It should also be the same as the linker script so we +# can find them dynamically. +# Optional fields are: +# ldflags - the flags required to produce a fully linked executable. +# config - the target canonical for this target. This is a regexp +# as passed to istarget or isnative. +# cflags - the flags required to produce an object file from a +# source file. +# connect - the connectmode for this target. This is for both IP and +# serial connections. +# target - the hostname of the target. This is for TCP/IP based connections, +# and is also used for version of tip that use /etc/remote. +# serial - the serial port. This is typically /dev/tty? or com?:. +# netport - the IP port. +# baud - the baud rate for a serial port connection. +# x10 - parameters for the x10 controller (used to reboot) +# fileid - the fileid or spawn id of of the connection. +# prompt - a regexp for matching the prompt. +# abbrev - abbreviation for tool init files. +# ioport - the port for I/O on dual port systems. +# +# there are three main arrays, indexed in with "target", "build", and "host". +# all other targets are indexed with a name usually based on the linker script +# like "idp", or "ex93x.ld". +# + +# +# Set the elements of the target data structure +# The order of the values is name, ldflags, config, cflags, connect, target, serial, +# netport, baud, x10, fileid, prompt, abbrev, ioport. +# FIXME: I'm not entirely sure this proc is a good idea... +proc set_target_info { args } { + global target_info + + set name [lindex $args 0] + + # process the linker arguments + if { [llength $args] > 0 } { + set target_info($name,ldflags) [lindex $args 1] + } else { + set target_info($name,ldflags) "" + } + + # process the config string + if { [llength $args] > 1 } { + set target_info($name,config) [lindex $args 2] + } else { + set target_info($name,config) "" + } + + # process the compiler arguments + if { [llength $args] > 2 } { + set target_info($name,cflags) [lindex $args 3] + } else { + set target_info($name,cflags) "" + } + + # process the connection mode + if { [llength $args] > 3 } { + set target_info($name,connect) [lindex $args 3] + } else { + set target_info($name,connect) "" + } + + # process the target's hostname + if { [llength $args] > 4 } { + set target_info($name,target) [lindex $args 3] + } else { + set target_info($name,target) "" + } + + # process the serial port + if { [llength $args] > 5 } { + set target_info($name,serial) [lindex $args 3] + } else { + set target_info($name,serial) "" + } + + # process the netport + if { [llength $args] > 6 } { + set target_info($name,netport) [lindex $args 3] + } else { + set target_info($name,netport) "" + } + + # process the baud + if { [llength $args] > 7 } { + set target_info($name,baud) [lindex $args 3] + } else { + set target_info($name,baud) "" + } + + # process the x10 unit number. + if { [llength $args] > 8 } { + set target_info($name,x10) [lindex $args 3] + } else { + set target_info($name,x10) "" + } + + # process the fileid + if { [llength $args] > 9 } { + set target_info($name,fileid) [lindex $args 3] + } else { + set target_info($name,fileid) "" + } + + # process the prompt + if { [llength $args] > 10 } { + set target_info($name,prompt) [lindex $args 3] + } else { + set target_info($name,prompt) "" + } + + # process the abbrev + if { [llength $args] > 10 } { + set target_info($name,connect) [lindex $args 3] + } else { + set target_info($name,connect) "" + } + + # process the ioport + if { [llength $args] > 11 } { + set target_info($name,ioport) [lindex $args 3] + } else { + set target_info($name,ioport) "" + } +} + +# +# Set the target connection. +# +proc push_target { name } { + pop_config target + push_config target $name +} + +# +# Set the host connnection. +# +proc push_host { name } { + pop_config host + push_config host $name +} + +# +# Set the config for the current host or target connection. +# +proc push_config { type name } { + global target_info + + if [info exists target_info(${name},name)] { + set target_info($type,name) $name + } + if [info exists target_info(${name},ldflags)] { + set target_info($type,ldflags) $target_info(${name},ldflags) + } + if [info exists target_info(${name},config)] { + set target_info($type,config) $target_info(${name},config) + } + if [info exists target_info(${name},cflags)] { + set target_info($type,cflags) $target_info(${name},cflags) + } + if [info exists target_info(${name},connect)] { + set target_info($type,connect) $target_info(${name},connect) + } + if [info exists target_info(${name},target)] { + set target_info($type,target) $target_info(${name},target) + } + if [info exists target_info(${name},serial)] { + set target_info($type,serial) $target_info(${name},serial) + } + if [info exists target_info(${name},netport)] { + set target_info($type,netport) $target_info(${name},netport) + } + if [info exists target_info(${name},baud)] { + set target_info($type,baud) $target_info(${name},baud) + } + if [info exists target_info(${name},x10)] { + set target_info($type,x10) $target_info(${name},x10) + } + if [info exists target_info(${name},fileid)] { + set target_info($type,fileid) $target_info(${name},fileid) + } + if [info exists target_info(${name},prompt)] { + set target_info($type,prompt) $target_info(${name},prompt) + } + if [info exists target_info(${name},abbrev)] { + set target_info($type,abbrev) $target_info(${name},abbrev) + } + if [info exists target_info(${name},ioport)] { + set target_info($type,ioport) $target_info(${name},ioport) + } +} + +# +# Set the current connection for target or host. +# +proc pop_config { type } { + global target_info + + set target_info(${type},name) "" + set target_info(${type},ldflags) "" + set target_info(${type},config) "" + set target_info(${type},cflags) "" + set target_info(${type},connect) "" + set target_info(${type},target) "" + set target_info(${type},serial) "" + set target_info(${type},netport) "" + set target_info(${type},baud) "" + set target_info(${type},x10) "" + set target_info(${type},fileid) "" + set target_info(${type},prompt) "" + set target_info(${type},abbrev) "" + set target_info(${type},ioport) "" +} + +# +# Unset the target connection. +# +proc pop_target { } { + pop_config target +} + + +# +# Unset the host connection. +# +proc pop_host { } { + pop_config host +} + +# +# list all the configured targets. +# returns: +# "" if there are no targets. +# else it returns a list of unique names. +# +proc list_targets { } { + global target_info + + if ![info exists target_info] { + return "" + } + + set j "" + set targs "" + foreach i "[lsort [array names target_info]]" { + set i "[lindex [split $i ","] 0]" + if { $i == $j } { + continue + } else { + lappend targs "[lindex [split $i ","] 0]" + set j $i + } + } + return $targs +} + +# +# Remove extraneous warnings we don't care about +# +proc prune_warnings { text } { + # remove the \r part of "\r\n" so we don't break all the patterns + # we want to match. + regsub -all -- "\r" $text "" text + + # This is from sun4's. Do it for all machines for now. + # The "\\1" is to try to preserve a "\n" but only if necessary. + if [ishost "sparc-*-sunos"] { + regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text + } + + # See Brendan for the raison d'etre of this one. + if [ishost "alpha*-*-*"] { + regsub -all "(^|\n)(/usr/(ucb|bin)/ld.*without exceptions was\[^\n\]+\n?)" $text "\\1" text + } + + + # Ignore these. + regsub -all "(^|\n)\[^\n\]*linker input file unused since linking not done" $text "" text + regsub -all "(^|\n)\[^\n\]*file path prefix \[^\n\]* never used" $text "" text + + # It might be tempting to get carried away and delete blank lines, etc. + # Just delete *exactly* what we're ask to, and that's it. + return $text +} + +# +# Invoke the compiler. This gets interesting cause the compiler may +# not be on the same machine we're running DejaGnu on. +# +proc compile { arg } { + global target_info + global comp_output + global CC + + if [info exists target_info(target,cflags)] { + lappend options "$target_info(target,cflags)" + } + + append options " $arg" + + verbose "Invoking the compiler as $CC $options" + set comp_output [prune_warnings [execute_anywhere "$CC $options"]] + return ${comp_output} +} + +# +# Invoke the archiver. +# +proc archive { arg } { + global target_info + global comp_output + global AR + + if [info exists target_info(target,arflags)] { + lappend options "$target_info(target,arflags)" + } + append options "$arg" + + verbose "Invoking the archiver as $AR $options" + set comp_output [prune_warnings [execute_anywhere "$AR $options"]] + return ${comp_output} +} + +proc ranlib { arg } { + global target_info + global comp_output + global RANLIB + + append options "$arg" + + verbose "Invoking the archiver as $RANLIB $options" + set comp_output [prune_warnings [execute_anywhere "$RANLIB $options"]] + return ${comp_output} +} + +# +# Link a few objects together. This gets interesting cause the +# objects may not be on the same machine we're running DejaGnu on. +# +proc link_objects { arg } { + global target_info + global comp_output + global LD + + set options "$arg" + if [info exists target_info(target,ldlags)] { + lappend options "$target_info(target,ldlags)" + } + + set comp_output [execute_anywhere "$LD $args"] + return [ prune_warnings $comp_output] +} + +# +# Remotely execute something. This gets fun cause we can't expect an +# Unix machine on the other end. We'll use expect instead so we can +# connect using $connectmode. This is really designed for executing +# the tools to be tested, rather than the test cases. +# +proc execute_anywhere { cmdline } { + global exec_output + global target_info + + if ![info exists target_info(current,prompt)] { + set prompt "" + } else { + set prompt $target_info(current,prompt) + } + + # if we're running stuff that's hosted on the same machine + if ![is3way] { + verbose -log "Executing on local host: ${cmdline}" 2 + set status [catch "exec ${cmdline}" exec_output] + if ![string match "" ${exec_output}] { + # FIXME: This should be done below, after `else'. + verbose -log -- "${exec_output}" 2 + } + return ${exec_output} + } else { + verbose -log "Executing on remote host: ${cmdline}" 2 + # open the connection + verbose "Connecting to remote host" 2 + set shellid [remote_open "host"] + if { $shellid < 0 } { + perror "Can't open connection to remote host" + return REMOTERROR + } +# stty -echo + send -i $shellid "echo START ; $cmdline ; echo END\r\n" + expect { + -i $shellid "echo START \; $cmdline \; echo END" { + } + default { + warning "Never got command echo" + } + } + expect { + -i $shellid "START" { + exp_continue + } + -i $shellid "END" { + regsub -all "\]" $expect_out(buffer) "" exec_output + regsub "END" $exec_output "" exec_output + } default { + set exec_output $i + } + } + } + + if [info exists exec_output] { + verbose "EXEC_OUTPUT = \"$exec_output\"" 2 + } + + +# stty echo + # close the connection + remote_close $shellid + + if [info exists exec_output] { + return $exec_output + } else { + return REMOTERROR + } +} + +# +# Get something resembling a prompt We can't grab more +# than the last word cause we have no real idea how long +# the prompt is. We also get the full prompt, but it's +# kinda useless as it might contain command numbers or +# paths that change. If we can't return a prompt, return +# null. so at least other patterns won't break. +# +proc getprompt { shellid } { + global spawn_id + + if { $shellid < 0 } { + perror "Invalid spawn id" + return "" + } + + set tries 0 + set text "" + + while { $tries <=3 } { + verbose "Trying to get the remote host's prompt" + send -i $shellid "ACK\r\n" + expect { + -i $shellid -re "Kerberos rcmd failed.*$" { + perror "Need to kinit" + return "" + } + -i $shellid -re "$text*\[\r\n\]*" { + return [lindex [split $expect_out(buffer) "\r\n"] 5] + break + } + -i $shellid -re "Terminal type is.*tty.*\>" { + return [lindex [split $expect_out(buffer) "\r\n"] 5] + break + } + -i $shellid "" { + warning "No prompt" + } + -i $shellid timeout { + perror "Couldn't sync with the remote system" + } + -i $shellid eof { + perror "Got EOF instead of a prompt" + } + } + incr tries + } + + # see if we maxed out on errors + if { $tries >= 3 } { + warning "Couldn't get the prompt" + return "" + } +} + + +# +# +# +proc make { args } { + perror "Unimplemented" +} diff --git a/contrib/bluegnu2.0.3/lib/tclIndex b/contrib/bluegnu2.0.3/lib/tclIndex new file mode 100644 index 0000000..7b09971 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/tclIndex @@ -0,0 +1,21 @@ +# Tcl autoload index file: each line identifies a Tcl + +doCmd testSessionFramework.itcl + +send_user nonexpect.itcl +send_error nonexpect.itcl +send_log nonexpect.itcl +log_file nonexpect.itcl + +::BlueGnu::Application testSessionApplication.itcl +::BlueGnu::Environment testSessionClasses.itcl +::BlueGnu::Target testSessionClasses.itcl +::BlueGnu::Test testSessionClasses.itcl +::BlueGnu::Queue testSessionClasses.itcl +::BlueGnu::Error testSessionClasses.itcl + +Default Default_target.itcl +BlueGnu BlueGnu_target.itcl + +# Types +Type Types.itcl diff --git a/contrib/bluegnu2.0.3/lib/testSessionApplication.itcl b/contrib/bluegnu2.0.3/lib/testSessionApplication.itcl new file mode 100644 index 0000000..3d57722 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/testSessionApplication.itcl @@ -0,0 +1,314 @@ +# +# This file defines the Application Class +# + +source $env(BLUEGNULIB)/testSessionFramework.itcl +source $env(BLUEGNULIB)/testSessionClasses.itcl + +namespace eval ::BlueGnu { + class Application { + protected variable szName "Default" + protected variable lTargets {} + protected variable lTests + protected variable szCurrentTarget + protected variable objCurrentTarget + protected variable objEnvironment + protected variable szOutDir + + constructor {args} { + debug {======= Doing Application construction} 3 + set szOutDir "..." + foreach varval $args { + set varval [split $varval "="] + if {[llength $varval] != 2} { + error "Missing = pair" + } + set var [lindex $varval 0] + set val [lindex $varval 1] + set variables {} + foreach v [lsort [info variable]] { + regexp {[^:]+$} $v v + lappend variables $v + } + if {[lsearch -exact $variables $var] >= 0} { + set $var $val + } else { + error "$var does not exists in Class [info class]" + } + } + } + + destructor { + } + + public method execute {} { + debug {======= Starting with Execution of the Application} 3 + debug { list of indexes for lTests is [array names lTests]} 4 + set iTarget 0 + set objEnvironment [uplevel #0 \ + "::BlueGnu::Environment #auto \ + szName=$szName"] + debug { objEnvironment = >$objEnvironment<} 3 + debug { +++ [infoWhich $objEnvironment] +++} 4 + debug { === [::itcl::find objects] ===} 4 + uplevel #0 set objCurrentEnvironment $objEnvironment + foreach target $lTargets { + set szTargetName [lindex [split $target "="] 0] + open_logs $szTargetName + incr iTarget + # set current Test Suite Namespace + uplevel #0 set nspTestSuite "::TestSuite[format %.5d $iTarget]" + debug { Processing target: >$target< in Test Suite\ + [uplevel set nspTestSuite]} 3 + namespace eval [uplevel set nspTestSuite] { + debug { Context is >[namespace current]<} 3 + variable iTestNr 0 + proc autoTest {} { + variable iTestNr + + incr iTestNr + debug {iTestNr = $iTestNr} 5 + debug {namespace current = >[namespace current]<} 5 + debug {format = >T[format %.5d $iTestNr]<} 5 + return [namespace current]::T[format %.5d $iTestNr] + } + + set target [uplevel set target] + debug { In namespace eval [namespace current]\ + for target: >$target<} 3 + if {! [catch { + if {[string length $target] == 0} { + # Create a default Target Object + # + debug { Create a default Target Object} 3 + uplevel #0 set objCurrentTarget \ + [infoWhich \ + [::BlueGnu::Target #auto \ + szID=default \ + szName=default \ + objQueue=[infoWhich [::BlueGnu::Queue #auto]] \ + objEnvironment=[uplevel set objEnvironment]]] + } else { + # Call the Target Procedure + # This procedure should return a Target Object. + # Arguments are passed to this procedure. + debug { Create target: >$target<} 3 + set list [split $target "="] + uplevel #0 set objCurrentTarget \ + [infoWhich \ + [eval [lindex $list 0] \ + [join [lrange $list 1 end] "="] \ + objEnvironment=[uplevel set objEnvironment]]] + } + } szErrMsg]} { + debug { Current Target is\ + >[set target \ + [uplevel #0 set objCurrentTarget]]<} 3 + + debug { Working with target index\ + [uplevel set iTarget]} 4 + if {[uplevel {info exists lTests($iTarget)}]} { + foreach test [uplevel {set lTests($iTarget)}] { + debug { test: $test} 3 + $target queue append $test + } + } + $target start + $target runTests + $target exit + + # report results of the testing + # + debug { #### All Objects: [::itcl::find objects]} 3 + foreach T [lsort [::itcl::find objects T*]] { + debug { #### Deleting Object $T\ + ([$T info class])} 0 + delete object $T + } + # remove constructed objects + # + debug { Removing Target Class Object $target} 3 + delete object $target + } else { + global errorCode errorInfo + perror "Couldn't create target >$target$target< defined!\ + \n errorMsg : >$szErrMsg<\ + \n errorInfo: >$errorInfo<\ + \n errorCode: >$errorCode<" + debug { error info:\n$errorInfo} 3 + } + } + namespace delete [uplevel set nspTestSuite] + close_logs + } + debug { objects: >[::itcl::find objects]<} 4 + debug {####### deleting Object Environment >$objEnvironment<} 4 + delete object $objEnvironment + } + + public method processArguments {arguments} { + upvar $arguments argv + global szCurrentTestDirectory + + set state NORMAL + set iTarget 0 + foreach arg $argv { + switch -regexp -- $arg { + {^-a(l(l)?)?$} { + debug { all_flag set to TRUE} 4 + set ::BlueGnu::all_flag 1 + } + {^-o(u(t(d(i(r)?)?)?)?)?$} { + debug { Output Directory is next argument} 4 + set state OUTDIR + } + {^--o(u(t(d(i(r)?)?)?)?)?=.*} { + set components [split $arg "="] + debug { Processing Output Directory >$arg<} 4 + set szOutDir [lindex $components 1] + set state NORMAL + } + {^-[-]?t(a(r(g(e(t)?)?)?)?)?([=].*|$)} { + set components [split $arg "="] + if {[llength $components] == 1} { + debug { Target is next argument} 4 + set state TARGET + } else { + debug { Processing Target >$arg<} 4 + setTarget iTarget \ + [join [lrange $components 1 end] "="] + set state NORMAL + } + } + default { + debug { Processing argument: >$arg<} 3 + switch $state { + OUTDIR { + set szOutDir $arg + set state NORMAL + } + TARGET { + setTarget iTarget $arg + set state NORMAL + } + NORMAL { + set components [split $arg "="] + regexp {([^[]*)(.*)} [lindex $components 0] \ + dummy szFileName szCaseArgs + append szCaseArgs "=[join \ + [lrange $components 1 end] "="]" + debug { arg: >$arg<} 3 + debug { components: >$components<} 3 + debug { case+args: >$szCaseArgs<} 3 + debug { Test Script: >$szFileName<} 3 + debug { : >$szCurrentTestDirectory<} 3 + set szDname [file dirname $szFileName] + set szFname [file tail $szFileName] + + if {[file exist [set test [file join \ + $szCurrentTestDirectory \ + $szFileName]]]} { + # file should be a test + debug { is a test: >$test[file join \ + $szCurrentTestDirectory \ + $arg] 0} { + foreach test $tests { + if {[file exists $test]} { + # file should be a test + debug { is a test:\ + >$test$test$szCaseArgs$test< can't\ + be found" + } + } + } else { + perror "$szFileName is not a test!\ + Does not exists!" + } + } + } + } + } + } + debug { ==== Found tests:} 3 + foreach index [lsort [array names lTests]] { + debug { lTests($index) = $lTests($index)} 4 + } + debug { Targets are: $lTargets} 4 + } + private method setTarget {index target} { + upvar $index iTarget + + incr iTarget + if {[string length $target] == 0} { + set szCurrentTarget "Default" + lappend lTargets $szCurrentTarget + debug { Default Current Target} 3 + } else { + set szCurrentTarget $target + lappend lTargets $szCurrentTarget + debug { Current target: >$szCurrentTarget<} 3 + } + debug { Found target >$szCurrentTarget<} 3 + } + + private method open_logs {target} { + global env + + set target [string trim $target] + if {[string compare $szOutDir "..."] == 0} { + debug { No Output directory defined, creating one} 3 + set szOutDir \ + "logs/$env(USER)_${target}_[exec date +%Y%m%d]_" + set szI [format "%.4d" [set i 0]] + while {[file isdirectory $szOutDir$szI]} { + set szI [format "%.4d" [incr i]] + } + set szOutDir $szOutDir$szI + } + if {! [file isdirectory $szOutDir]} { + exec mkdir -p $szOutDir + } + if {[string length $target] == 0} { + set szTool testrun + } else { + set szTool $target + } + catch "exec rm -f $szOutDir/$szTool.sum" + namespace eval ::BlueGnu \ + "set ::BlueGnu::sum_file [open "$szOutDir/$szTool.sum" w]" + puts $::BlueGnu::sum_file "# $szOutDir/$szTool.sum" + catch "exec rm -f $szOutDir/$szTool.log" + log_file -a "$szOutDir/$szTool.log" + send_log "# $szOutDir/$szTool.log\n" + debug { Opening log and summary files in $szOutDir} 3 + } + private method close_logs {} { + } + public method outDir {} { + return $szOutDir + } + } +} diff --git a/contrib/bluegnu2.0.3/lib/testSessionClasses.itcl b/contrib/bluegnu2.0.3/lib/testSessionClasses.itcl new file mode 100644 index 0000000..a9428af --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/testSessionClasses.itcl @@ -0,0 +1,1341 @@ +# +# This [incr Tcl] source file contains the class specifications +# for the testSession of BlueGnu +# +namespace eval ::BlueGnu { + variable lArgs {} + + variable errcnt 0 + variable errno "NONE" + variable warncnt 0 + variable xfail_flag 0 + + class Common { + # arguments passed to the constructor are always in the form: + # = + # + constructor {args} { + debug {Constructor for >$this< [info level] [info class]} 9 + foreach varval $args { + set varval [split $varval "="] + if {[llength $varval] != 2} { + error "Missing = pair" + } + set var [lindex $varval 0] + set val [lindex $varval 1] + set variables {} + foreach v [lsort [info variable]] { + regexp {[^:]+$} $v v + lappend variables $v + } + if {[lsearch -exact $variables $var] >= 0} { + set $var $val + } else { + perror "variable >$var< does not exists in Class\ + [info class]\n \ + (was passed as argument and is ignored!)" + } + } + } + + public method << {} { + set lResult {} + foreach var [lsort [info variable]] { + regexp {[^:]+$} $var v + debug {Found variable: >$v<} 9 + if [array exists $v] { + debug { is an array} 9 + foreach index [lsort [array names $v]] { + lappend lResult "${v}($index)=[set ${v}($index)]" + } + } else { + debug { is simple variable} 9 + if {[string compare [set value [info variable $var -value]] \ + ""] != 0} { + switch $v { + this - + text {} + default { + lappend lResult [list $v $value] + } + } + } + } + } + set lResult + } + } + + class Test { + inherit Common + + protected variable szID + protected variable bTestCase + protected variable szTestCase + protected variable szTestCaseID + protected variable szTestCaseArgs + protected variable szName + protected variable szTool + protected variable eType + protected variable eResult + protected variable szScriptName + protected variable lArguments + protected variable szHostName + protected variable iPassed + protected variable iFailed + protected variable iXPassed + protected variable iXFailed + protected variable iCrashed + protected variable iError + protected variable iWarning + protected variable iUnresolved + protected variable iUntested + protected variable iUnsupported + protected variable i + protected variable benchmarkObject + protected variable benchmarkClassName + + constructor testScript { + set szTool [uplevel #0 set szCurrentTestDirectory] + debug {======= Global Default Test Directory is\ + >$szTool<} 5 + + set lArguments {} + # remove all multiple spaces/tabs into one space + # and parse the argument list + # ::= ?[test case ID]?= + # ::= + # ::= | = + debug { testScript(1) is >$testScript<} 5 + regsub -all "(\[ \t\]+)" [string trim $testScript] " " testScript + debug { testScript(2) is >$testScript<} 5 + # + # Split testScript into script, test case ID, and arguments + regexp {^([^[=]+)([[]([^]]+)[]])?(=(.*))?$} $testScript dummy \ + script tc tcID argT argL + debug { script: >$script<} 5 + debug { tc: >$tc<} 5 + debug { tcID: >$tcID<} 5 + debug { argT: >$argT<} 5 + debug { argL: >$argL<} 5 + if {[set i [string first {=} $testScript]] >= 0} { + set testScriptArgs [string range $testScript \ + [expr $i + 1] end] + set testScript [string range $testScript 0 [expr $i - 1]] + } else { + set testScriptArgs {} + } + set testScript $script + set szTestCase $tcID + if {[string length $szTestCase] > 0} { + set bTestCase 1 + } else { + set bTestCase 0 + } + set szTestCaseID [lindex [split $szTestCase "="] 0] + set szTestCaseArgs [join [lrange [split $szTestCase "="] 1 end] \ + "="] + debug {szTestCase == >$szTestCase<} 5 + debug {szTestCaseID == >$szTestCaseID<} 5 + debug {szTestCaseArgs == >$szTestCaseArgs<} 5 + set testScriptArgs $argL + debug {testScript(3) is >$testScript<} 5 + debug {testScriptArgs(1) is >$testScriptArgs<} 5 + set lArguments [eval list $testScriptArgs] + set i 0 + foreach arg $lArguments { + debug {arg($i) is >$arg<} 5 + set lArguments [lreplace $lArguments $i $i [split $arg "="]] + incr i + } + debug {Test script >$testScript<, test case >$szTestCase<} 3 + debug { pathtype is [file pathtype $testScript]} 3 + switch [file pathtype $testScript] { + relative { + error "Test Script name >$testScript<\ + should not be relative" + } + absolute { + debug {Absolute reference in $this to Test Script\ + >$testScript<} 3 + set szScriptName $testScript + } + } + debug {Default Test Directory is >$szTool<} + if {[file exists $testScript]} { + debug {Test script >$testScript< exists!} + set szName [file tail $testScript] + set szID [file rootname $szName] + set szPWD [pwd] + set szTool [file dirname $testScript] + cd $szTool + set szTool [pwd] + cd $szPWD + set szScriptName [file join $szTool [file tail $testScript]] + regsub {.} [string toupper [file extension $szName]] {} eType + set eResult INITIALIZED + } else { + debug {Test script >$testScript< does NOT exists!} + set szRoot "" + set szID "" + set szName "" + set szTool "" + uplevel #0 set szCurrentTestDirectory "\"$szTool\"" + set eType "NONE" + set szScriptName "$testScript" + set lArguments {} + set eResult EMPTY + } + set szHostName [info host] + set iPassed 0 + set iFailed 0 + set iXPassed 0 + set iXFailed 0 + set iCrashed 0 + set iError 0 + set iWarning 0 + set iUnresolved 0 + set iUntested 0 + set iUnsupported 0 + debug {Default Test Directory is >$szTool<} + debug {Global Default Test Directory is\ + >[uplevel #0 set szCurrentTestDirectory]<} + + debug {Target: >[[uplevel #0 set objCurrentTarget] <<]<} + + while {1} { + # Create Benchmark Class Object + # + # First initialize + # + set szTargetID [[uplevel #0 set objCurrentTarget] ID] + regsub -all {[^a-zA-Z0-9_]} $szTargetID "_" szTargetID + regsub -all {[^a-zA-Z0-9_]} $szID "_" szTmpID + regsub -all {[^a-zA-Z0-9_]} $szTestCaseID "_" szTmpTestCaseID + # + # First try Benchmark Class in namespace for Target + # and test case ID if exists otherwise test script ID + # + set benchmarkClassName ::$szTargetID + if {$bTestCase} { + append benchmarkClassName ::$szTmpTestCaseID + } else { + append benchmarkClassName ::$szTmpID + } + debug {=== Trying benchmark: $benchmarkClassName} 3 + if [catch { + set benchmarkObject \ + [eval $benchmarkClassName #auto $szTestCaseArgs] + if {! [string match ::* $benchmarkObject]} { + set benchmarkObject \ + [namespace current]::$benchmarkObject + } + debug {benchmarkObject: >$benchmarkObject<} 3 + } errMsg] { + debug {Error Msg: >>>$errMsg<<<} 3 + debug { info: >>>[uplevel #0 set errorInfo]<<<} 4 + } else { + break + } + # + # Now try Benchmark class for test script name + # with test case ID or Benchmark + # + set benchmarkClassName ::$szTmpID + if {$bTestCase} { + append benchmarkClassName ::$szTmpTestCaseID + } else { + append benchmarkClassName ::Benchmark + } + debug {=== Trying benchmark: $benchmarkClassName} 3 + if [catch { + set benchmarkObject [infoWhich \ + [eval $benchmarkClassName #auto $szTestCaseArgs]] + } errMsg] { + debug {Error Msg: >>>$errMsg<<<} 3 + debug { info: >>>[uplevel #0 set errorInfo]<<<} 4 + } else { + break + } + # + # Now try target ID and benchmark + # + set benchmarkClassName ::${szTargetID}::Benchmark + debug {=== Trying benchmark: $benchmarkClassName} 3 + debug { namespace: >[namespace current]<} 3 + if [catch { + set benchmarkObject [infoWhich \ + [eval $benchmarkClassName #auto $szTestCaseArgs] \ + [namespace current]] + } errMsg] { + debug {Error Msg: >>>$errMsg<<<} 3 + debug { info: >>>[uplevel #0 set errorInfo]<<<} 4 + } else { + break + } + # + # Now try the generic BlueGnu benchmark function + # + set benchmarkClassName ::BlueGnu::Benchmark + debug {=== Trying benchmark: $benchmarkClassName} 3 + if [catch { + set benchmarkObject [infoWhich \ + [eval $benchmarkClassName #auto $szTestCaseArgs]] + debug {[warning "Default Benchmark Class\ + is being used!"]} + } errMsg] { + warning "NO Benchmark Class >$benchmarkClassName<\ + defined" + debug {[warning "Class: >$benchmarkClassName<\ + has not been defined.\n ### Error Msg:\ + $errMsg"]} + set benchmarkObject "" + break + } + debug { benchmark: $benchmarkClassName\ + ($benchmarkObject)} 3 + uplevel #0 { + set errorInfo NONE + } + break + } + } + + destructor { + setResult + switch $eResult { + PASSED { + printResult + if {! $bTestCase} { + ::BlueGnu::clone_output " Statistics :\ + $iPassed (PASS),\ + $iXFailed (XFAIL)" + } + } + FAILED { + printResult + if {! $bTestCase} { + ::BlueGnu::clone_output " Statistics :\ + $iPassed (PASS),\ + $iXFailed (XFAIL)" + ::BlueGnu::clone_output " :\ + $iFailed (FAIL),\ + $iXPassed (XPASS)" + } + } + UNKNOWN { + } + default { + printResult + if {! $bTestCase} { + ::BlueGnu::clone_output " Statistics :\ + $iPassed (PASS),\ + $iXFailed (XFAIL)" + ::BlueGnu::clone_output " :\ + $iFailed (FAIL),\ + $iXPassed (XPASS)" + if {$iUntested} { + ::BlueGnu::clone_output " :\ + $iUntested (UNTESTED)" + } + if {$iUnresolved} { + ::BlueGnu::clone_output " :\ + $iUnresolved (UNRESOLVED)" + } + if {$iUnsupported} { + ::BlueGnu::clone_output " :\ + $iUnsupported (UNSUPPORTED)" + } + if {$iCrashed} { + ::BlueGnu::clone_output " :\ + $iCrashed (CRASHED)" + } + if {$iError} { + ::BlueGnu::clone_output " :\ + $iError (ERROR)" + } + if {$iWarning} { + ::BlueGnu::clone_output " :\ + $iWarning (WARNING)" + } + } + } + } + # remove benchmark Class Object + # + if {$benchmarkObject != ""} { + debug {#### Benchmark Object: >$benchmarkObject<\ + ([catch {$benchmarkObject info class}])} 3 + debug {#### Benchmark Class : >$benchmarkClassName<} 3 + catch {delete object $benchmarkObject} + if {$benchmarkClassName != "::BlueGnu::Benchmark"} { + catch {delete class $benchmarkClassName} + } + } + ::BlueGnu::clone_output "" + } + + private method printResult {} { + if {$bTestCase} { + ::BlueGnu::clone_output "******* Result :\ + [format "%-12s" $eResult] for test case :\ + >$szTestCase<" + } else { + ::BlueGnu::clone_output "******* Result :\ + [format "%-12s" $eResult] for test script :\ + >$szID<" + } + } + + public method ID {} { + return $szID + } + + public method testCase {} { + return $szTestCase + } + + public method testCaseID {} { + return $szTestCaseID + } + + public method testCaseArgs {} { + return $szTestCaseArgs + } + + public method benchmarkObject {} { + return $benchmarkObject + } + + public method benchmarkClassName {} { + return $benchmarkClassName + } + + public method name {args} { + if {[llength $args] == 1} { + set szName [lindex $args 0] + } + return $szName + } + + public method result {} { + return $eResult + } + + public method arguments {} { + return $lArguments + } + + public method pass {szMsg} { + global objCurrentEnvironment + if {[namespace eval ::BlueGnu {set xfail_flag}]} { + incr iXPassed + $objCurrentEnvironment record_test XPASS $szMsg + } else { + incr iPassed + $objCurrentEnvironment record_test PASS $szMsg + } + setResult + } + public method fail {szMsg} { + global objCurrentEnvironment + if {[namespace eval ::BlueGnu {set xfail_flag}]} { + incr iXFailed + $objCurrentEnvironment record_test XFAIL $szMsg + } else { + incr iFailed + $objCurrentEnvironment record_test FAIL $szMsg + } + setResult + } + + public method perror {szMsg} { + global objCurrentEnvironment + incr iError + $objCurrentEnvironment record_test ERROR $szMsg + setResult + } + + public method crashed {szMsg} { + global objCurrentEnvironment + incr iCrashed + $objCurrentEnvironment record_test CRASHED $szMsg + setResult + } + + public method warning {szMsg} { + global objCurrentEnvironment + incr iWarning + $objCurrentEnvironment record_test WARNING $szMsg + setResult + } + + public method note {szMsg} { + global objCurrentEnvironment + $objCurrentEnvironment record_test NOTE $szMsg + } + + public method unresolved {szMsg} { + global objCurrentEnvironment + incr iUnresolved + $objCurrentEnvironment record_test UNRESOLVED $szMsg + } + public method untested {szMsg} { + global objCurrentEnvironment + incr iUntested + $objCurrentEnvironment record_test UNTESTED $szMsg + } + public method unsupported {szMsg} { + global objCurrentEnvironment + incr iUnsupported + $objCurrentEnvironment record_test UNSUPPORTED $szMsg + } + + private method setResult {} { + if {$iUnresolved || \ + $iError || $iCrashed || \ + ($iWarning > [namespace eval ::BlueGnu { \ + set warning_threshold}] && \ + 0 < [namespace eval ::BlueGnu { \ + set warning_threshold}])} { + set eResult UNRESOLVED + } elseif {$iUntested} { + set eResult UNTESTED + } elseif {$iUnsupported} { + set eResult UNSUPPORTED + } elseif {($iPassed > 0 || $iXFailed > 0) && \ + $iFailed == 0 && $iXPassed == 0} { + set eResult "PASSED" + } elseif {$iFailed || $iXPassed} { + set eResult "FAILED" + } elseif {$iPassed == 0 && $iXPassed && \ + $iFailed == 0 && $iXFailed && $iCrashed == 0 && \ + $iError == 0 && $iWarning == 0} { + set eResult ACTIVATED + } else { + set eResult UNKNOWN + } + } + + public method getResult {} { + setResult + return $eResult + } + + public method tool {} { + return $szTool + } + + public method scriptName {} { + return $szScriptName + } + + public method << {} { + if 0 { + lappend lResult [list ID $szID] + lappend lResult [list name $szName] + lappend lResult [list tool $szTool] + lappend lResult [list type $eType] + lappend lResult [list result $eResult] + lappend lResult [list root $szRoot] + lappend lResult [list script $szScriptName] + lappend lResult [list arguments $lArguments] + lappend lResult [list host $szHostName] + + return $lResult + } else { + eval [info function Common::<< -body] + } + } + + public method runtest {} { + global objCurrentEnvironment + setResult + + if {$bTestCase} { + ::BlueGnu::clone_output "####### Begin test case :\ + >$szTestCase<" + debug { [scriptName]\n \ + [name]=[arguments]} + } else { + ::BlueGnu::clone_output "####### Begin test script :\ + >$szID<" + debug { [scriptName]\n \ + [name]=[arguments]} + } + verbose { Full Pathname : $szScriptName} 1 + debug {=== Running test in $this: $szScriptName} 3 + debug {[join [<<] "\n"]} 9 + catch {debug {Global Default Test Directory is\ + >[uplevel #0 set szCurrentTestDirectory]<}} + catch {debug {Default Test Directory is >$szTool<}} + + if [catch { + uplevel #0 set szCurrentTestDirectory "$szTool" + uplevel #0 lappend lTool {$szCurrentTestDirectory} + uplevel #0 set objCurrentTest $this + uplevel #0 lappend lTestName {$objCurrentTest} + uplevel 1 variable bTestCase $bTestCase + uplevel 1 variable szTestCase \"$szTestCase\" + uplevel 1 variable szTestCaseID \"$szTestCaseID\" + uplevel 1 variable szTestCaseArgs \"$szTestCaseArgs\" + uplevel 1 variable iArgs [llength $lArguments] + uplevel 1 variable lArgs [concat {[list} $lArguments {]}] + uplevel 1 variable szID $szID + uplevel 1 variable szScriptName $szScriptName + uplevel 1 variable szName $szName + uplevel 1 variable szTool $szTool + } szErrMsg] { + debug {Error Msg:>>>$szErrmsg<<<} 0 + } + if {[catch {uplevel 1 source $szScriptName} szErrMsg]} { + global errorInfo errorCode + crashed ">$szErrMsg<\ + \n in script: >$szScriptName<\ + \n errorInfo: >$errorInfo<\ + \n errorCode: >$errorCode<" + } + setResult + $objCurrentEnvironment reportTestResult $eResult + + uplevel #0 {set lTestName [lreplace $lTestName end end]} + uplevel #0 {set objCurrentTest [lrange $lTestName end end]} + uplevel #0 {set lTool [lreplace $lTool end end]} + uplevel #0 {set szCurrentTestDirectory [lrange $lTool end end]} + + catch {debug {Default Test Directory is >$szTool<} 3} + catch {debug {Global Default Test Directory is\ + >[uplevel #0 set szCurrentTestDirectory]<} 3} + debug {=== Done with test in $this: $szScriptName ($bTestCase)} 3 + if {$bTestCase} { + ::BlueGnu::clone_output "####### End test case :\ + >$szTestCase<" + } else { + ::BlueGnu::clone_output "####### End test script :\ + >$szID<" + } + return $this + } + } + + class Queue { + inherit Common + + protected variable lTestNames + + constructor {} { + set lTestNames {} + } + + public method append args { + set testName [join $args] + debug { queue appending >$testName<} 3 + lappend lTestNames $testName + debug { DONE} 3 + } + + public method prepend args { + #set testName [join $args] + debug {Queue::prepend $args} 3 + foreach arg $args { + debug { append >$arg< to comList} 3 + lappend comList $arg + } + debug { queue prepending comList: >$comList<} 3 + debug { [llength $comList] elements in comList} 3 + #set lTestNames [linsert $lTestNames 0 "$testName"] + debug { [llength $lTestNames] elements in lTestNames} 3 + set lTestNames [concat $comList $lTestNames] + debug { [llength $lTestNames] elements in lTestNames} 3 + debug { DONE} 3 + } + + public method pop {} { + if {[llength $lTestNames] == 0} { + return -code error -errorinfo "Empty Queue" {} + } + if {[llength $lTestNames] == 1} { + set testName [lindex $lTestNames 0] + set lTestNames {} + return $testName + #return -code error $testName + } + set testName [lindex $lTestNames 0] + set lTestNames [lrange $lTestNames 1 end] + return $testName + } + + public method << {} { + #lappend lResult [list tests $lTestNames] + + #return $lResult + eval [info function Common::<< -body] + } + } + + class Environment { + inherit Common + + protected variable szName "Default" + + protected variable iPassCnt 0 + protected variable iFailCnt 0 + protected variable iXPassCnt 0 + protected variable iXFailCnt 0 + protected variable iUntestedCnt 0 + protected variable iUnresolvedCnt 0 + protected variable iUnsupportedCnt 0 + protected variable iCrashedCnt 0 + protected variable iErrorCnt 0 + protected variable iWarningCnt 0 + protected variable iCnt 0 + + protected variable iWarningThreshold 0 + protected variable iErrorThreshold 0 + + protected variable bXFailFlag 0 + protected variable bExitStatus 0 + + protected variable eResult UNKNOWN + protected variable iUntested 0 + protected variable iUnsupported 0 + protected variable iUnresolved 0 + protected variable iPassed 0 + protected variable iFailed 0 + + + protected variable ENV + protected variable bSaved 0 + common defaultEnvironment [list PATH FPATH \ + BLUEGNULIB TESTSUITEROOT TESTSETS TMPDIR \ + DISPLAY EDITOR EMACSFONT HOME LANG LOGIN LOGNAME SHELL \ + TERM USER WINDOWID DEBUG LPDEST \ + ORGANIZATION OSTYPE PAGER \ + PARM_SEARCH_PATH \ + ] + + constructor {args} { + debug {Level in Constructor: [info level]} 9 + eval [info function Common::constructor -body] + setResult + } + + destructor { + global objCurrentTarget + debug {******* [info class]::destructor} 3 + + ::BlueGnu::clone_output "******* Result :\ + [format "%-12s" $eResult]\ + for test session : >$szName<" + switch $eResult { + PASSED { + ::BlueGnu::clone_output " Statistics :\ + $iPassed (PASS)" + ::BlueGnu::clone_output "******* Cumulative statistics\ + for all test script!" + ::BlueGnu::clone_output " Statistics Totals :\ + $iPassCnt (PASS),\ + $iXFailCnt (XFAIL)" + if {$iUntested} { + ::BlueGnu::clone_output " :\ + $iUntested (UNTESTED)" + } + if {$iWarningCnt} { + ::BlueGnu::clone_output " :\ + $iWarningCnt (WARNING)" + } + } + UNKNOWN - + default { + ::BlueGnu::clone_output " Statistics :\ + $iPassed (PASS)" + ::BlueGnu::clone_output " :\ + $iFailed (FAIL)" + if {$iUntested} { + ::BlueGnu::clone_output " :\ + $iUntested (UNTESTED)" + } + if {$iUnresolved} { + ::BlueGnu::clone_output " :\ + $iUnresolved (UNRESOLVED)" + } + if {$iUnsupported} { + ::BlueGnu::clone_output " :\ + $iUnsupported (UNSUPPORTED)" + } + ::BlueGnu::clone_output "******* Cumulative statistics\ + for all test script!" + ::BlueGnu::clone_output " Statistics Totals :\ + $iPassCnt (PASS),\ + $iXFailCnt (XFAIL)" + ::BlueGnu::clone_output " :\ + $iFailCnt (FAIL),\ + $iXPassCnt (XPASS)" + if {$iUntestedCnt} { + ::BlueGnu::clone_output " :\ + $iUntestedCnt (UNTESTED)" + } + if {$iUnresolvedCnt} { + ::BlueGnu::clone_output " :\ + $iUnresolvedCnt (UNRESOLVED)" + } + if {$iUnsupportedCnt} { + ::BlueGnu::clone_output " :\ + $iUnsupportedCnt (UNSUPPORTED)" + } + if {$iCrashedCnt} { + ::BlueGnu::clone_output " :\ + $iCrashedCnt (CRASHED)" + } + if {$iErrorCnt} { + ::BlueGnu::clone_output " :\ + $iErrorCnt (ERROR)" + } + if {$iWarningCnt} { + ::BlueGnu::clone_output " :\ + $iWarningCnt (WARNING)" + } + } + } + if {$::BlueGnu::errcnt} { + ::BlueGnu::clone_output "####### Encountered\ + $::BlueGnu::errcnt System Errors!" + } + ::BlueGnu::clone_output "###########################\n" + } + + public method name {} { + return $szName + } + + public method record_test {type message} { + debug {******* ${this}::record_test \n \ + $type $message} 3 + if {$iWarningThreshold > 0 && \ + $iWarningCnt >= $iWarningThreshold \ + || \ + $iErrorThreshold > 0 && \ + $iErrorCnt >= $iErrorThreshold} { + # Reset these first to prevent infinite recursion. + set iWarningCnt 0 + set iErrorCnt 0 + ::unresolved $message + return + } + + debug { switching on type >$type<} + switch $type { + PASS { + incr iPassCnt + } + FAIL { + incr iFailCnt + set bExitStatus 1 + } + XPASS { + incr iXPassCnt + } + XFAIL { + incr iXFailCnt + } + UNTESTED { + incr iUntestedCnt + } + UNRESOLVED { + incr iUnresolvedCnt + } + UNSUPPORTED { + incr iUnsupportedCnt + } + ERROR { + incr iErrorCnt + } + CRASHED { + incr iCrashedCnt + } + NOTE { + } + WARNING { + incr iWarningCnt + } + default { + debug {record_test called with bad type >$type<} -1 + set iErrorCnt 0 + return + } + } + + ::BlueGnu::clone_output "$type: $message" + + # reset variables here + namespace eval ::BlueGnu { + set xfail_flag 0 + set xfail_prms {} + } + } + + private method setResult {} { + if {$iUnresolved} { + set eResult UNRESOLVED + } elseif {$iPassed > 0 && $iFailed == 0} { + set eResult "PASSED" + } elseif {$iFailed} { + set eResult "FAILED" + } elseif {$iPassed == 0 && $iFailed == 0 && \ + $iUntested && $iUnsupported == 0 && \ + $iUnresolved == 0} { + set eResult ACTIVATED + } else { + set eResult UNKNOWN + } + } + + public method reportTestResult {eTestResult} { + switch $eTestResult { + "PASSED" { + incr iPassed + } + "FAILED" { + incr iFailed + } + "UNSUPPORTED" { + incr iUnsupported + } + "UNTESTED" { + incr iUntested + } + "UNRESOLVED" { + incr iUnresolved + } + } + setResult + } + + public method saveEnv {} { + global env + + set bSaved 1 + foreach index [lsort [array names env]] { + debug {ENV($index) := $env($index)} 5 + #set ENV($index) $env($index) + array set ENV [list $index $env($index)] + } + } + + public method clearEnv {} { + global env + + set bSaved 1 + #debug {removing ENV} 5 + #catch {unset ENV} + foreach index [array names env] { + debug {removing env($index) := $env($index)} 5 + if {0 > [lsearch -exact $defaultEnvironment $index]} { + debug { removed} 5 + unset env($index) + } else { + debug { kept} 5 + if {[string compare $index PATH] == 0} { + # Do not touch PATH + #set env(PATH) \ + "/etc:/usr/lib:/usr/ucb:/bin:/usr/bin:/usr/bin/X11:/usr/lpp/X11/Xamples/bin:/usr/local/bin" + } + #set ENV($index) $env($index) + } + } + } + + public method restoreEnv {} { + global env + + if {$bSaved} { + catch {unset env} + foreach index [array names ENV] { + debug {env($index) := $ENV($index)} 5 + #set ENV($index) $env($index) + array set env [list $index $ENV($index)] + } + } else { + debug {Environment had not been saved!} + } + } + + public method runTest args { + global nspTestSuite + debug {======= runTest $args} 3 + + set iRuntest 0 + set elResult [list] + + set iRun 0 + foreach arg $args { + debug {======= runTest $arg} 3 + incr iRun + + # Create name for namespace for the test + # and check if already exist + # + set szRuntest runtest$iRuntest + set namespaceCurrent [namespace current] + debug { szRuntest: >$szRuntest<} 4 + debug { namespace current : >$namespaceCurrent<} 4 + debug { namespace current children:\ + >[namespace children $namespaceCurrent]<} 4 + while {[string compare \ + [namespace children $namespaceCurrent \ + ${namespaceCurrent}::$szRuntest] ""] != 0} { + incr iRuntest + set szRuntest runtest$iRuntest + } + # now we have a unique namespace name for the running + # of the test + # + debug { runTest namespace: >$szRuntest<} 4 + set szScript $arg + # create a Test Class object + if {! [catch {::BlueGnu::Test [${nspTestSuite}::autoTest] \ + $szScript} testObject]} { + if [catch { + uplevel #0 set objCurrentTest \ + [namespace current]::$testObject + debug {[join [$testObject <<] "\n"]} 9 + namespace eval $szRuntest { + if [catch {[uplevel set testObject] runtest} \ + szErrMsg] { + uplevel set szErrMsg "\{$szErrMsg\}" + uplevel { + global errorInfo errorCode + record_test CRASHED ">$szErrMsg<\ + \n in script: >$szScript<\ + \n errorInfo: >$errorInfo<\ + \n errorCode: >$errorCode<" + } + } + } + debug {[join [$testObject <<] "\n"]} 9 + uplevel "lappend elResult [$testObject getResult]" + delete object $testObject + } szErrMsg] { + global errorInfo errorCode + record_test CRASHED ">$szErrMsg<\ + \n in script: >$szScript<\ + \n errorInfo: >$errorInfo<\ + \n errorCode: >$errorCode<" + } + } else { + global errorInfo errorCode + record_test CRASHED ">$testObject<\ + \n in script: >$szScript<\ + \n errorInfo: >$errorInfo<\ + \n errorCode: >$errorCode<" + } + namespace delete $szRuntest + uplevel #0 {debug {argv: [set argv]} 3} + } + if {$iRun == 0} { + warning "No tests have been passed to runTest method!" + } + return $elResult + } + + public method << {} { + debug {in $this method} 5 + eval [info function Common::<< -body] + #lappend lResult [list ENV [array get ENV]] + } + } + + # The following is a class definition for the target implementation + # in DejaGnu (see lib/target.exp for more detail) + # + class Target { + inherit Common + + protected variable szID + protected variable szName + protected variable szApplication + protected variable objEnvironment + protected variable objQueue + + protected variable connect + protected variable target + protected variable serial + protected variable netport + protected variable baud + protected variable X10 + protected variable ioport + + protected variable fileid + protected variable prompt + protected variable abbrev + protected variable config + protected variable cflags + protected variable ldflags + + protected variable X + + # a hairy pattern to recognize text + common text "\[- A-Za-z0-9\.\;\"\_\:\'\`\(\)\!\#\=\+\?\&\*]" + + + constructor {args} { + eval [info function Common::constructor -body] + } + + destructor { + delete object $objQueue + } + + public method name {args} { + if {[llength $args] == 0} { + return $szName + } else { + set szName [lindex $args 0] + } + } + + public method ID {args} { + if {[llength $args] == 0} { + return $szID + } else { + set szID [lindex $args 0] + } + } + + public method << {} { + eval [info function Common::<< -body] + } + + public method environment {} { + return $objEnvironment + } + + public method start {} { + if {[string length [uplevel #0 info procs ${szID}_start]] != 0} { + uplevel #0 ${szID}_start + } + } + + public method load {args} { + if {[string length [uplevel #0 info procs ${szID}_load]] != 0} { + eval uplevel #0 ${szID}_load $args + } + } + + public method exit {} { + if {[string length [uplevel #0 info procs ${szID}_exit]] != 0} { + uplevel #0 ${szID}_exit + } + } + + public method version {} { + if {[string length [uplevel #0 info procs ${szID}_version]] != 0} { + uplevel #0 ${szID}_version + } + } + + public method runTests {} { + debug {======= ${this}::runTest} 3 + set elResult [list] + # if an application has been defined we run all the test + # inside that application + # + if {[string compare [info variable szApplication] ""] != 0 && \ + [string compare [info variable szApplication -value] \ + ""] != 0} { + debug {Application specified >[info variable \ + szApplication -value]<} + # build argument list + debug {>>[<<]<<} + } else { + # We just run all the tests in the currently running + # [incr Tcl/?Expect?] interpreter. + # + # set the current Queue and Environment + # + uplevel #0 set objCurrentQueue [infoWhich $objQueue] + uplevel #0 set objCurrentEnvironment \ + [infoWhich $objEnvironment] + # + # Pop a test from the queue and run it in the environment + ::BlueGnu::clone_output "###########################" + ::BlueGnu::clone_output "####### Begin test session:\ + [[infoWhich $objEnvironment] name] >$objEnvironment<" + while {! [catch {$objQueue pop} T]} { + debug {test: $T} 3 + set elResult [$objEnvironment runTest $T] + } + ::BlueGnu::clone_output "####### End test session :\ + [[infoWhich $objEnvironment] name]" + } + return $elResult + } + + public method queue {function element} { + switch $function { + append { + $objQueue append $element + } + prepend { + $objQueue prepend $element + } + } + } + } + + class Target2 { + inherit Target + + protected variable XYZ + + constructor {args} { + eval [info function Common::constructor -body] + } + + public method << {} { + eval [info function Common::<< -body] + } + } + + + class DejaGnu { + inherit Environment + + constructor {} { + debug {Level in Constructor DejaGnu: [info level]} 9 + uplevel #0 {debug {argc = $argc: $argv} 9} + # source always in global space + # + uplevel #0 source {$env(BLUEGNULIBS)/dejagnu.tcl} + } + + destructor { + ##################################################################### + # This comes from the original runtest + # all done, cleanup + # + uplevel #0 { + if { [info procs ${tool}_exit] != "" } { + if {[catch "${tool}_exit" tmp]} { + # ??? We can get away with calling `warning' + # here without ensuring + # `warncnt' isn't changed because we're about to exit. + warning "${tool}_exit failed:\n$tmp" + } + } + log_summary + } + } + + + public method runTest {args} { + global nspTestSuite + + foreach arg $args { + debug {******* DejaGnu running test: >$arg<} + debug {set szTestName \[Test \[${nspTestSuite}::autoTest\] $arg\]} 3 + debug {set testName >[${nspTestSuite}::autoTest]<} 3 + uplevel #0 set szTestName [Test [${nspTestSuite}::autoTest] $arg] + uplevel #0 { + debug $szTestName 3 + debug [join [$szTestName <<] "\n"] 5 + set test_name {[$szTestName scriptName]} + catch {unset tmp}; set tmp {} + foreach arg [$szTestName arguments] { + lappend tmp [join $arg "="] + } + set runtests [list [$szTestName name] $tmp] + debug {args = >[$szTestName arguments]<} 3 + source [$szTestName scriptName] + catch {eval unset [info vars __*]} + } + } + } + } + + class DejaGnu2 { + inherit DejaGnu + + protected variable currentTool + + constructor {} { + debug {Level in Constructor DejaGnu2: [info level]} 9 + set currentTool {} + uplevel #0 {debug {argc = $argc: $argv} 9} + # source always in global space + # + uplevel #0 source {$env(BLUEGNULIBS)/dejagnu2.tcl} + } + + public method tool {args} { + if {[llength $args] == 1} { + set currentTool [lindex $args 0] + } + return $currentTool + } + } + + class Benchmark { + protected variable bResult 0 + protected variable DATA + protected variable FORMAT + protected variable ARG + + protected constructor {args} { + debug {======= Constructing class [info class] =======} 3 + debug {======= ::BlueGnu::Benchmark::constructor $args} 4 + set i 0 + foreach arg $args { + debug { ARG($i): >$arg<} 5 + set ARG($i) [split $arg "="] + incr i + } + } + protected destructor { + debug {======= [info class]::destructor} 3 + } + + protected method benchmark {benchmarkFunction args} { + warning "Method >benchmark< has not been implemented for\ + Class >[info class]<" + return $bResult + } + + protected method warningNoBenchmarkArguments {} { + warning "NO argument have been supplies for\n the benchmark\ + method in class [info class]" + } + protected method warningNoBenchmarkFunction {} { + warning "NO benchmark function >[uplevel set benchmarkFunction]<\ + defined for\n the benchmark method in class [info class]" + } + } + + class Error { + private variable _errorCode + private variable _errorMsg + private variable _errorInfo + + public constructor {errorCode errorMsg errorInfo} { + set _errorCode $errorCode + set _errorMsg $errorMsg + set _errorInfo $errorInfo + } + + public method errorCode {} { + return $_errorCode + } + public method errorMsg {} { + return $_errorMsg + } + public method errorInfo {} { + return $_errorInfo + } + public method why {} { + return $_errorMsg + } + public method verboseWhy {} { + return $_errorInfo + } + } +} diff --git a/contrib/bluegnu2.0.3/lib/testSessionFramework.itcl b/contrib/bluegnu2.0.3/lib/testSessionFramework.itcl new file mode 100644 index 0000000..7f96880 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/testSessionFramework.itcl @@ -0,0 +1,1386 @@ +# +# +# +# +# unknown -- called by expect if a proc is called that doesn't exist +# + +# Set auto_load to take BLUEGNULIB first on search path +# +set auto_path "$env(BLUEGNULIB) $auto_path" + +# find tclIndex file in the test suite directory structure +# $env(TESTSUITEROOT) and in the path up to the root +# +if {! [info exists env(TESTSUITEROOT)]} { + set env(TESTSUITEROOT) [exec /bin/sh -c pwd] +} +set PWD $env(TESTSUITEROOT) + +if {[info exists env(TESTSETS)]} { + if {[lsearch -exact [split $env(TESTSETS) ":"] $PWD] < 0} { + set env(TESTSETS) $PWD:$env(TESTSETS) + } +} else { + set env(TESTSETS) $PWD +} +cd $PWD + + +# First thing to do is calculate the verbose level and the debug flag +# as well as the definition of the associated procedures: +# verbose and debug. +# +# Check the Debug level +if [info exists env(DEBUG)] { + switch -regexp [string toupper $env(DEBUG)] { + 1 - ^T(R(U(E)?)?)?$ - ^Y(E(S)?)?$ { + set bDebug 1 + } + default { + set bDebug 0 + } + } +} else { + set bDebug 0 +} + +# Calculate verbose level +# Complete a first path over the argument list +# Calculate the Verbose Level +set verbose 0 +foreach __arg $argv { + switch -regexp -- $__arg { + {^-[-]?v(e(r(b(o(s(e)?)?)?)?)?)?$} { + incr verbose + } + default { + lappend __lArgs $__arg + } + } +} +if {[catch {set argv $__lArgs}]} { + set argv {} +} + +# Define the procedures: verbose & debug +# +# verbose [-n] [-log] [--] message [level] +# +# Print MESSAGE if the verbose level is >= LEVEL. +# The default value of LEVEL is 1. +# "-n" says to not print a trailing newline. +# "-log" says to add the text to the log file even if it won't be printed. +# Note that the apparent behaviour of `send_user' dictates that if the message +# is printed it is also added to the log file. +# Use "--" if MESSAGE begins with "-". +# +# This is defined here rather than in framework.exp so we can use it +# while still loading in the support files. +# +proc verbose {args} { + debug {======= verbose $args} 3 + global verbose + + set newline 1 + set logfile 0 + + set i 0 + if {[string index [lindex $args 0] 0] == "-"} { + for { set i 0 } { $i < [llength $args] } { incr i } { + if { [lindex $args $i] == "--" } { + incr i + break + } elseif { [lindex $args $i] == "-n" } { + set newline 0 + } elseif { [lindex $args $i] == "-log" } { + set logfile 1 + } elseif { [string index [lindex $args $i] 0] == "-" } { + return [::BlueGnu::clone_output "ERROR: verbose:\ + illegal argument: [lindex $args $i]"] + } else { + break + } + } + } + if {[llength $args] == $i} { + return [::BlueGnu::clone_output "ERROR: verbose: nothing to print"] + } + + + set level 1 + if {[llength $args] == $i + 2} { + if [catch {set level [expr [lindex $args [expr $i+1]]]} szErrMsg] { + return [::BlueGnu::clone_output "ERROR: verbose: level number\ + >$szErrMsg<"] + } + } elseif {[llength $args] > $i + 2} { + return [::BlueGnu::clone_output "ERROR: verbose: Too many arguments"] + } + set message [lindex $args $i] + + if {$level <= $verbose} { + # There is no need for the "--" argument here, but play it safe. + # We assume send_user also sends the text to the log file (which + # appears to be the case though the docs aren't clear on this). + if 0 { + if {[string compare \ + [namespace eval ::BlueGnu \ + {set ::BlueGnu::sum_file}] stdout] != 0} { + set szCmd [list uplevel puts [namespace eval ::BlueGnu \ + {set ::BlueGnu::sum_file}]] + lappend szCmd "\"$message\"" + debug {==## 1 >$szCmd<} 9 + if {[catch {eval $szCmd}]} { + puts [namespace eval ::BlueGnu \ + {set ::BlueGnu::sum_file}] $message + } + } + } + if [catch {set message \ + "[uplevel set __szTmp \"$message\"]"} szErrMsg] { + set message "$message == ERROR: >$szErrMsg<" + } + if {$newline} { + #append message "\n" + } + debug {$message} 0 + return [::BlueGnu::clone_output "$message"] + } elseif {$logfile} { + if [catch {set message \ + "[uplevel set __szTmp \"$message\"]"} szErrMsg] { + set message "$message == ERROR: >$szErrMsg<" + } + if {$newline} { + append message "\n" + } + debug {$message} 0 + return [send_log $message] + } + return "" +} + +if {$bDebug} { + proc debug {text {level 1}} { + global verbose + + if {$level <= $verbose} { + set szCmd [list uplevel ::BlueGnu::clone_output] + set szA $level; set iMax [uplevel info level] + for {set i 0} {$i < $iMax} \ + {incr i} {append szA ">"} + lappend szCmd "\"$szA$text\"" + eval $szCmd + } + } +} else { + proc debug {text {level 1}} { + } +} + +# This procedure will find a file in the directory structure +# any where below the current working directory +# any where on the search path +# or up the directory tree +# +proc locateFile {szFileName {szSubDirectory "."}} { + debug {======= locateFile $szFileName $szSubDirectory} 3 + global env + # remove a trailing "/" from sub directory name + regexp {(.*)/$} $szSubDirectory dummy szSubDirectory + + set newList {} + set searchList {.} + set tmpDir [pwd] + while {[string compare [set dir [file dirname $tmpDir]] "/"] != 0} { + lappend searchList $dir + set tmpDir $dir + } + foreach dir [split $env(TESTSETS) ":"] { + lappend searchList $dir + } + foreach dirList $searchList { + foreach test [searchForFile $szFileName $dirList $szSubDirectory] { + # only files that are readable and + # not a directory, symbolic link or device + # are added to the list + if {[file isfile $test] && [file readable $test]} { + # add only if not already exists in list + if {[lsearch -exact $newList $test] < 0} { + lappend newList $test + } + } + } + } + debug {======= returning newList: >$newList<} 4 + return $newList +} + +proc locateDir {szFileName {szSubDirectory "."}} { + debug {======= locateDir $szFileName $szSubDirectory} 3 + global env + # remove a trailing "/" from sub directory name + regexp {(.*)/$} $szSubDirectory dummy szSubDirectory + + set newList {} + set searchList {.} + set tmpDir [pwd] + while {[string compare [set dir [file dirname $tmpDir]] "/"] != 0} { + lappend searchList $dir + set tmpDir $dir + } + foreach dir [split $env(TESTSETS) ":"] { + lappend searchList $dir + } + foreach dirList $searchList { + foreach test [searchForFile $szFileName $dirList $szSubDirectory] { + # only files that are directories + # are added to the list + if {[file isdirectory $test]} { + # add only if not already exists in list + if {[lsearch -exact $newList $test] < 0} { + lappend newList $test + } + } + } + } + debug {======= returning newList: >$newList<} 4 + return $newList +} + +proc searchForFile {szFileName dirList szSubDirectory} { + debug {======= searchForFile $szFileName $dirList $szSubDirectory} 3 + # find sub directory in or below the current working directory + set szDirSrc "" + foreach file [file split $szSubDirectory] { + if {[string compare $file "."] == 0} { + if {! [info exists newList]} { + set newList {} + } + continue + } else { + foreach dir $dirList { + catch {unset newList} + foreach newDir [findFile $dir $file] { + lappend newList $newDir + } + } + } + if {[catch {set dirList $newList}]} { + set dirList {} + } + } + debug { dirList = >$dirList<} 4 + set fileList {} + foreach dir $dirList { + set newList [findFile $dir $szFileName] + if {[llength $newList] > 0} { + set fileList [concat $fileList $newList] + } + } + debug { fileList = >$fileList<} 4 + if {[llength $fileList] != 0} { + # NO test found, next step in searching + #return $fileList + } + + set newList {} + set PWD [pwd] + foreach dir $fileList { + debug { dir = >$dir<} 4 + cd [file dirname $dir] + lappend newList "[pwd]/[file tail $dir]" + cd $PWD + } + + debug { newList = >$newList<} 4 + return $newList +} + +proc findFile {szDirectory szFileName} { + global locatedFile env + + debug {======= findFile $szDirectory $szFileName} 3 + if {! [info exists locatedFile($szDirectory/$szFileName)]} { + if {[file readable $szDirectory/$szFileName]} { + set locatedFile($szDirectory/$szFileName) $szDirectory/$szFileName + } else { + if {$szDirectory == "." || \ + [lsearch -exact [split $env(TESTSETS) ":"] \ + $szDirectory] >= 0} { + set locatedFile($szDirectory/$szFileName) \ + [split [exec find $szDirectory -name $szFileName \ + -print] "\n"] + } else { + return {} + } + } + } + return $locatedFile($szDirectory/$szFileName) +} + +# appendArguments +# +# This procedure will append the string pathed in arguments to every +# element of fileList +# return a list with the same number of element in which each +# element has the arguments appended +# +proc appendArguments {fileList arguments} { + set newList {} + debug {======= appendArguments $fileList $arguments} 3 + debug { length argument list: >[llength $arguments]<} 4 + if {[string length $arguments] > 0} { + foreach file $fileList { + regexp {([^[=]+)([[][^]]*[]])?(.*)} $file dummy szT szID szA + debug {dummy: >$dummy<} 4 + debug {szT : >$szT<} 4 + if {[string length $szID] > 0} { + #regexp {[[]([^]]+)[]]} $szID dummy szID + } + debug {szID : >$szID<} 4 + if {[string length $szA] > 0} { + regexp {=(.*)} $szA dummy szA + } + debug {szA : >$szA<} 4 + #set lFile [split $file "="] + if {[string length $szA] > 0} { + set szSep " " + } else { + set szSep "=" + } + lappend newList ${file}${szSep}$arguments + } + return $newList + } + return $fileList +} + +# appendTestCaseID +# +# This procedure will append the string pathed in arguments to every +# element of fileList +# return a list with the same number of element in which each +# element has the arguments appended +# +proc appendTestCaseID {fileList {szTestCaseID ""}} { + set newList {} + debug {======= appendTestCaseID $fileList >$szTestCaseID<} 3 + set bMultiFiles [expr [llength $fileList] > 1] + set i 1 + foreach file $fileList { + regexp {([^[=]+)([[][^]]*[]])?(.*)} $file dummy szT szID szA + debug {dummy: >$dummy<} 4 + debug {szT : >$szT<} 4 + if {[string length $szID] > 0} { + regexp {[[]([^]]+)[]]} $szID dummy szID + } + debug {szID : >$szID<} 4 + if {[string length $szA] > 0} { + #regexp {=(.*)} $szA dummy szA + } + debug {szA : >$szA<} 4 + if {[string length $szID] > 0} { + set szID [string trim "${szID}${szTestCaseID}"] + } else { + set szID ${szTestCaseID} + } + if {[llength [split $szID "="]] > 1} { + set szSep " " + } else { + set szSep "=" + } + if {[string length $szID] == 0} { + lappend newList "${szT}$szA" + continue + } + if {$bMultiFiles} { + set szI [format "${szSep}seqNr=%03d" $i] + } else { + set szI "" + } + lappend newList "${szT}\[${szID}${szI}\]$szA" + incr i + } + return $newList +} + +# processArgs +# +# This procedure expect all optional arguments to be name=value pairs +# It will set all variable named to the value given within +# the procedure body +# It will return an empty list or a list of all remaining not name=value +# pair in the argument list +# +proc processArgs {args} { + debug {======= processArgs $args} 3 + + set llArgs $args + set args {} + + # set default errorCode=NONE + uplevel set errorCode NONE + # now process all name=value pair arguments + ####### There may be a better way to do this see pre 8.0 code + foreach lArgs $llArgs { + foreach arg $lArgs { + set NVP [split $arg "="] + if {[llength $NVP] > 1} { + debug {uplevel set [lindex $NVP 0] \ + [list [join [lrange $NVP 1 end] "="]]} 3 + uplevel set [lindex $NVP 0] \ + [list [join [lrange $NVP 1 end] "="]] + } else { + lappend args $arg + } + } + } + debug { processArgs returns: $args} 3 + return $args +} + +# processInternalArgs +# +# This procedure expect all optional arguments to be {name value} pairs +# It will set all variable named to the value given within +# the procedure body +# It will return an empty list or a list of all remaining not name=value +# pair in the argument list +# +proc processInternalArgs {lArgs} { + debug {======= processInternalArgs $lArgs} 3 + set arglist {} + + # set default errorCode=NONE + uplevel set errorCode NONE + # now process all {name value} pair arguments + foreach arg $lArgs { + if {[llength $arg] == 2} { + debug {uplevel set [lindex $arg 0] \ + [list [join [lrange $arg 1 end] "="]]} 3 + uplevel set [lindex $arg 0] \ + [list [join [lrange $arg 1 end] "="]] + } else { + lappend arglist $arg + } + } + debug {processInternalArgs returns: $arglist} 3 + return $arglist +} + +# processTestScriptArgs +# +# This procedure expect all optional arguments to be {name value} pairs +# It will set all variable named to the value given within +# the procedure body +# It will return an empty list or a list of all remaining not name=value +# pair in the argument list +# +# This is a copy of the procedure "processInternalArgs" without an argument +# however this procedure may become different +# +# +proc processTestScriptArgs {} { + upvar lArgs lArgs + set arglist {} + + # set default errorCode=NONE + uplevel set errorCode NONE + debug {======= processTestScriptArgs $lArgs} 3 + # now process all {name value} pair arguments + foreach arg $lArgs { + if {[llength $arg] == 2} { + debug {uplevel set [lindex $arg 0] \ + [list [join [lrange $arg 1 end] "="]]} 4 + uplevel set [lindex $arg 0] \ + [list [join [lrange $arg 1 end] "="]] + } else { + lappend arglist $arg + } + } + debug { processInternalArgs returns: $arglist} 4 + return $arglist +} + +# Command execution command +# This command is like the catch command, however it can do some additional +# testing and in case of an error it will return a error class. +# +proc doCmd {szCmd args} { + global errorInfo errorCode + if {! [info exists errorInfo]} { + set errorInfo "" + } + + debug {======= doCmd >$szCmd< >$args<} 3 + foreach arg $args { + set vv [split $arg "="] + if {[llength $vv] == 2} { + debug { ==>> Expected value: [lindex $vv 0]=[eval list \ + [lindex $vv 1]]} 5 + set [lindex $vv 0] [eval list [lindex $vv 1]] + } elseif {[llength $vv] == 1} { + if {! [info exists errorObj]} { + debug { ==>> upvar $vv errorObj} 5 + if "! [uplevel info exists $vv]" { + debug { ==>> creating: $vv (uplevel)} 5 + uplevel [list set $vv {}] + } + upvar $vv errorObj + } + } + } + if {[catch {uplevel 1 $szCmd} szErrMsg]} { + debug {======= ErrMsg : \n$szErrMsg\n======= from:\n$szCmd} 5 + set errorObj "" + if {[string compare $errorCode NONE] == 0} { + set errorCode UNDEFINED + } + set errorInfoSave $errorInfo + set errorCodeSave $errorCode + catch {set errorObj [uplevel infoWhich \{$szErrMsg\}]} + set errorInfo $errorInfoSave + set errorCode $errorCodeSave + debug { ==>> errorObj: >$errorObj<} 5 + if {[string compare $errorObj ""] == 0} { + set errorObj [uplevel \ + ::BlueGnu::Error #auto \{$errorCode\} \ + \{$szErrMsg\} \{$errorInfo\}] + debug {errorObj: >$errorObj<} 5 + set errorObj [uplevel infoWhich \{$errorObj\}] + debug {errorObj: >$errorObj<} 5 + debug {Command: [string trim $szCmd]} 5 + debug {ErrMsg : \n$szErrMsg} 5 + debug {====================} 5 + global errorInfo + debug {ErrInfo: $errorInfo\n====================} 5 + } + set bReturn 1 + if {[info exists errorCode]} { + debug { errorCode= $errorCode} 5 + debug { Class= [$errorObj info class]} 5 + catch {debug { isa BC_RTN= [$errorObj isa BC_RTN]} 5} + catch {debug { isa ERROR= [$errorObj isa Error]} 5} + catch { + if [$errorObj isa BC_RTN] { + if {[set i \ + [lsearch -exact $errorCode \ + [list [$errorObj SEVERITY] \ + [$errorObj FACILITY] [$errorObj CODE]]]] >= 0} { + setup_xfail + set bReturn 0 + } + fail "Expected errorCode=$errorCode, got:\ + [$errorObj getShortMsg]\ + \{[$errorObj SEVERITY] [$errorObj FACILITY]\ + [$errorObj CODE]\} for >$szCmd<" + #verbose { errorCode: [$errorObj errorCode]} + #verbose { why: [$errorObj why]} + #verbose {verboseWhy: [$errorObj verboseWhy]} 2 + } + } + catch { + if [$errorObj isa Error] { + debug { Error= [$errorObj errorCode]} 5 + if {[set i \ + [lsearch -exact $errorCode \ + [$errorObj errorCode]]] >= 0} { + setup_xfail + set bReturn 0 + } + fail "Expected errorCode=$errorCode, got:\ + [$errorObj errorCode] for >$szCmd<" + verbose { errorCode: [$errorObj errorCode]} + verbose { why: [$errorObj why]} + verbose {verboseWhy: [$errorObj verboseWhy]} 2 + } + } + } + return $bReturn + } else { + set bReturn 0 + set NOT "" + if {[info exists errorCode]} { + if {[lsearch -exact $errorCode "NONE"] < 0} { + setup_xfail + set NOT "not " + set bReturn 1 + } + pass "errorCode=NONE ${NOT}found in expected set\ + of errorCodes=\{$errorCode\} for >$szCmd<" + } + if {[info exists return]} { + debug {Return: >$return<} 3 + set bResult 0 + set iFalse 0 + set iFalseFound 0 + set iTrue 0 + set iTrueFound 0 + foreach lResult $return { + if {[llength $lResult] == 2} { + set bFlag [string toupper [lindex $lResult 0]] + set szResult [lindex $lResult 1] + } else { + set bFlag "" + set szResult [lindex $lResult 0] + } + debug {Checking >$szErrMsg< against $bFlag >$szResult<} 3 + switch $bFlag { + 0 - NOT - NO - FALSE { + # no matches allowed + incr iFalse + debug {Should not match >$szErrMsg< != >$szResult<} 4 + if {[string compare $szErrMsg $szResult] != 0} { + pass "The NOT Expected Result >$szResult<\ + was not found for >$szCmd<" + incr iFalseFound + } else { + fail "The NOT Expected Result >$szResult<\ + was found for >$szCmd<" + } + } + 1 - {} - YES - TRUE { + # only one match allowed + incr iTrue + debug {Should match >$szErrMsg< == >$szResult<} 4 + if {[string compare $szErrMsg $szResult] == 0} { + pass "Expected Result >$szResult<\ + found for >$szCmd<" + incr iTrueFound + } + } + default { + perror "doCmd result flag: 1, 0, ,\ + NOT, YES, NO, TRUE, FALSE" + } + } + } + set bResult [expr $iFalse == $iFalseFound] + if {$iTrue > 0} { + set bResult [expr $bResult && ($iTrueFound == 1)] + } + if {! $bResult} { + fail "Expected Result(s) >$return<\n \ + did not match with: >$szErrMsg< for >$szCmd<" + set bReturn 1 + } + } + if {[info exists errorObj]} { + set errorObj $szErrMsg + } + } + return $bReturn +} + + +# deleteObjects +# +# This procedure takes multiple arguments each can be a single object +# or a list of objects +# it will delete all these object +# No return value +# +proc deleteObjects {args} { + debug {======= deleteObjects $args} 3 + foreach arg $args { + foreach object $arg { + debug " delete object >$object<" 4 + delete object $object + } + } + return {} +} + +# isObject +# This procedure accepts a fully qualified object name as argument +# and checks if that object exists +proc isObject {object} { + debug {======= isObject $object} 3 + set tmp [namespace tail $object] + return [expr [lsearch [namespace eval [namespace qualifier $object] { + ::itcl::find objects + } + ] $tmp] >= 0] +} + +# checkObject +# This procedure takes an object and a class name is argument +# It checks if the object exists, has a counter part in C++ and +# is of the correct class +# +proc checkObject {object szClassName} { + debug {======= checkObject $object $szClassName} 3 + if {! [catch { + set class [uplevel "$object info class"] + if {[catch {[findObject $object] isa $szClassName} bCl]} { + if {[string compare [namespace tail $class] \ + [namespace tail $szClassName]] == 0} { + debug {Class [namespace tail $szClassName]\ + match class of object} 4 + } else { + error "Miss match" + } + } elseif {! $bCl} { + error 1 + } + } iRet]} { + return 1 + } + + set obj [findObject $object] + set class [findClass $szClassName] + if {[string length $obj] > 0 && [string length $class] > 0} { + debug { ==>> object and class passed do exists} 4 + if {[catch {set bISA [$obj isa $class]}]} { + debug {Class $szClassName is not inscope to match $object} 4 + return 0 + } + if {! $bISA} { + debug {$object is not of Class $szClassName} 4 + return 0 + } + } else { + debug {$object and/or $szClassName have not been found!} 4 + return 0 + } + return 1 +} + +# findObject +# This procedure take the name of an object, possibly without any qualifier +# and search all namespaces to find the object. +# When a qualifier is specified, it will check if it is complete +# The procedure return the fully qualified name of the object if it exists or +# an empty string otherwise. +# +proc findObject {object {namespace ::}} { + debug {======= findObject $object $namespace} 3 + set ns [namespace qualifier $object] + set obj [namespace tail $object] + set objs [namespace eval $namespace {::itcl::find objects}] + if {[lsearch $objs $obj] >= 0} { + regsub "::$" $namespace "" namespace + return ${namespace}::$obj + } else { + set result "" + foreach cns [namespace children $namespace] { + set result [findObject $obj $cns] + if {[string length $result] > 0} break + } + } + return $result +} + +# findClass +# This procedure take the name of an class, possibly without any qualifier +# and search all namespaces to find the class. +# When a qualifier is specified, it will check if it is complete +# The procedure return the fully qualified name of the Class if it exists or +# an empty string otherwise. +# +proc findClass {class {namespace ::}} { + debug {======= findClass $class $namespace} 3 + set ns [namespace qualifier $class] + set obj [namespace tail $class] + set objs [namespace eval $namespace {::itcl::find classes}] + if {[lsearch $objs $obj] >= 0} { + regsub "::$" $namespace "" namespace + return ${namespace}::$obj + } else { + set result "" + foreach cns [namespace children $namespace] { + set result [findClass $obj $cns] + if {[string length $result] > 0} break + } + } + return $result +} + +# The parseTest command will validate the argument as an existing +# test including testCaseID and arguments. +# It will return a list of all acceptable test script +# +proc parseTest {args} { + global szCurrentTestDirectory + debug {======= parseTest $args} 3 + + foreach arg $args { + foreach szTest $arg { + regexp {([^[=]+)([[][^]]*[]])?(.*)} $szTest dummy szT szID szA + debug {dummy: >$dummy<} 4 + debug {szT : >$szT<} 4 + if {[string length $szID] > 0} { + #regexp {[[]([^]]+)[]]} $szID dummy szID + } + debug {szID : >$szID<} 4 + if {[string length $szA] > 0} { + #regexp {=(.*)} $szA dummy szA + } + debug {szA : >$szA<} 4 + set szFileName $szT + set szDname [file dirname $szFileName] + set szFname [file tail $szFileName] + + if {[file exist [set test [file join \ + $szCurrentTestDirectory \ + $szFileName]]]} { + # file should be a test + debug { is a test: >$test 0} { + foreach test $tests { + if {[file exists $test]} { + # file should be a test + debug { is a test: >$test$test< can't be found" + } + } + } else { + perror "$szFileName is not a test!\ + Does not exists!" + } + } + } + if [info exists testList] { + if [llength $testList] { + return $testList + } + } + return [list] +} + +# The global available runtest procedure +# this procedure will find the current environment +# and execute the runTest procedure in that environment + +proc runtest {args} { + global objCurrentEnvironment szCurrentTestDirectory + debug {======= runtest $args} 3 + set elResult [list] + + if {[llength $args] > 0} { + set Env [lindex $args 0] + debug { Checking for environment: >$Env<} 3 + debug { >[infoWhich $Env]<} 5 + debug { Current Test Directory: >$szCurrentTestDirectory<} 5 + if {[string compare [infoWhich $Env] ""] == 0} { + debug { not an environment} 4 + if {[info exist objCurrentEnvironment] && \ + [string compare \ + [infoWhich $objCurrentEnvironment] ""] != 0} { + debug { Found Current Environment\ + >$objCurrentEnvironment<} 5 + set Env $objCurrentEnvironment + } else { + error "NO default environent" + } + } else { + debug { is an environment} 3 + set args [lrange $args 1 end] + } + set T [lindex $args 0] + set A [lindex $args 1] + set I [lindex $args 2] + foreach t [appendTestCaseID [appendArguments [parseTest $T] $A] $I] { + debug { ==>> $objCurrentEnvironment\ + runTest $t} 3 + lappend elResult \ + [$Env runTest $t] + } + } else { + warning "No tests have been passed to runtest procedure!" + } + return $elResult +} + +proc appendQueue {args} { + global objCurrentQueue szCurrentTestDirectory + debug {======= appendQueue $args} 3 + + set iRun 0 + set Queue [lindex $args 0] + if {[string compare [infoWhich $Queue] ""] == 0} { + if {[info exist objCurrentQueue]} { + set Queue $objCurrentQueue + } else { + error "NO default queue" + } + } else { + set args [lrange $args 1 end] + } + set T [lindex $args 0] + set A [lindex $args 1] + set I [lindex $args 2] + foreach t [appendTestCaseID [appendArguments [parseTest $T] $A] $I] { + debug { ==>> $Queue append $t} 3 + incr iRun + $Queue append $t + } + if {$iRun == 0} { + warning "NO argument to appendQueue have been processed" + } +} + +proc prependQueue {args} { + global objCurrentQueue szCurrentTestDirectory + debug {======= prependQueue $args} 3 + + set iRun 0 + set Queue [lindex $args 0] + if {[string compare [infoWhich [lindex $args 0]] ""] == 0} { + if {[info exist objCurrentQueue]} { + set Queue $objCurrentQueue + } else { + error "NO default queue" + } + } else { + set args [lrange $args 1 end] + } + set T [lindex $args 0] + set A [lindex $args 1] + set I [lindex $args 2] + foreach t [appendTestCaseID [appendArguments [parseTest $T] $A] $I] { + incr iRun + lappend comList $t + } + debug { ==>> $Queue prepend $comList} 3 + eval $Queue prepend $comList + + if {$iRun == 0} { + warning "NO argument to appendQueu have been processed" + } +} + +proc perror {args} { + global errorInfo + global objCurrentTest + global objCurrentEnvironment + + # save errorInfo + set errorInfoSave $errorInfo + + if { [llength $args] > 1 } { + set $::BlueGnu::errcnt [lindex [uplevel set args] 1] + } else { + incr ::BlueGnu::errcnt + } + + while 1 { + set szMsg [lindex $args 0] + + if {[catch {$objCurrentTest perror $szMsg} \ + szErrMsg]} { + if {[info exists objCurrentTest]} { + debug {No current test: >$szErrMsg<:\ + current test >$objCurrentTest< message:\n \ + $szMsg} 3 + } else { + debug {PERROR: No current test: >$szErrMsg<:\ + current test >DOES NOT EXIST< message:\n \ + $szMsg} 3 + debug { info: >>>$errorInfo<<<} 4 + } + } else { + break + } + catch { + set szCmd [concat \"$objCurrentEnvironment\" record_test \ + ERROR \$szMsg] + } + if {[catch {eval $szCmd} szErrMsg]} { + verbose {No current environment (ERROR): >$szErrMsg<} 3 + } else { + break + } + + ::BlueGnu::clone_output "ERROR: $szMsg" + namespace eval ::BlueGnu { + set errno "ERROR: [uplevel set szMsg]" + } + break + } + + # restore errorInfo + set errorInfo $errorInfoSave +} + +proc warning {args} { + global errorInfo + global objCurrentTest + global objCurrentEnvironment + + # save errorInfo + set errorInfoSave $errorInfo + + if { [llength $args] > 1 } { + namespace eval ::BlueGnu { + set warncnt [lindex [uplevel set args] 1] + } + } else { + namespace eval ::BlueGnu { + incr warncnt + } + } + + while 1 { + set szMsg [lindex $args 0] + + if {[catch {$objCurrentTest warning $szMsg} \ + szErrMsg]} { + if {[info exists objCurrentTest]} { + verbose {No current test: >$szErrMsg<:\ + current test >$objCurrentTest< message:\n \ + $szMsg} 3 + } else { + verbose {WARNING: No current test: >$szErrMsg<:\ + current test >DOES NOT EXIST< message:\n \ + $szMsg} 3 + } + } else { + break + } + catch { + set szCmd [concat \"$objCurrentEnvironment\" record_test \ + WARNING \$szMsg] + } + if {[catch {eval $szCmd} szErrMsg]} { + verbose {No current environment (WARNING): >$szErrMsg<} 3 + } else { + break + } + + set szMsg [lindex $args 0] + ::BlueGnu::clone_output "WARNING: $szMsg" + namespace eval ::BlueGnu { + set errno "WARNING: [uplevel set szMsg]" + } + break + } + if 0 { + uplevel #0 { + verbose {uplevel #0 to remove errorInfo} + if [info exists errorInfo] { + unset errorInfo + } + } + } + # restore errorInfo + set errorInfo $errorInfoSave +} + +proc note {szMsg} { + global objCurrentTest + + $objCurrentTest note $szMsg +} + +proc pass {szMsg} { + global objCurrentTest + + $objCurrentTest pass $szMsg +} + +proc fail {szMsg} { + global objCurrentTest + + $objCurrentTest fail $szMsg +} + +proc unresolved {szMsg} { + global objCurrentTest + + $objCurrentTest unresolved $szMsg +} + +proc untested {szMsg} { + global objCurrentTest + + $objCurrentTest untested $szMsg +} + +proc unsupported {szMsg} { + global objCurrentTest + + $objCurrentTest unsupported $szMsg +} + +proc get_warning_threshold {} { + return [namespace eval ::BlueGnu {set warning_threshold}] +} + +proc set_warning_threshold {threshold} { + namespace eval ::BlueGnu { + set warning_threshold [uplevel set threshold] + } +} + +proc setup_xfail {args} { + namespace eval ::BlueGnu {set xfail_flag 1} +} + +proc clear_xfail {args} { + namespace eval ::BlueGnu {set xfail_flag 0} +} + +proc benchmark {benchmarkFunction args} { + debug {======= benchmark $benchmarkFunction $args} + global objCurrentTest + global errorInfo + + if 0 { + debug {[foreach var [info vars] { + verbose {local var: >$var<}}] + } + uplevel { + debug {[foreach var [info vars] { + verbose {uplevel local var: >$var<}}] + } + } + debug {[foreach var [info globals] { + verbose {global var: >$var<}}] + } + } + + set errorInfo "" + set szID [$objCurrentTest ID] + set szTestCaseID [$objCurrentTest testCaseID] + set benchmarkObject [$objCurrentTest benchmarkObject] + set benchmarkClassName [$objCurrentTest benchmarkClassName] + debug { ==>> test ID: >$szID<} 3 + debug { test case ID: >$szTestCaseID<} 3 + debug { check test object: >$benchmarkObject<} 3 + if {$benchmarkObject == ""} { + warning "NO Benchmark Class defines for >$benchmarkClassName<" + set bResult 0 + } else { + if [catch { + set bResult [eval $benchmarkObject benchmark \ + $benchmarkFunction $args] + } errMsg] { + warning "NO checking has been done for\ + ${benchmarkClassName}::benchmark $benchmarkFunction $args" + debug {[perror "BenchmarkFunction: >$benchmarkFunction<\ + has not been defined\ + in class $benchmarkClassName\n### Error Msg: $errMsg"]} 0 + debug {### Error Info: $errorInfo} 0 + set bResult 0 + } + } + return $bResult +} + +proc envPATH {szAction szDir} { + debug {======= envPATH $szAction $szDir} 3 + + global env + if [file isdirectory $szDir] { + # remove directory from Path if it exists + set envPATH $env(PATH) + while {[regsub :?$szDir:? $envPATH {:} envPATH]} { + } + regsub {^:} $envPATH {} envPATH + regsub {:$} $envPATH {} envPATH + set env(PATH) $envPATH + switch $szAction { + prefix - + prepend { + set env(PATH) "$szDir:$env(PATH)" + } + append { + append env(PATH) ":$szDir" + } + default { + } + } + } +} + +# replacement for info which commaond +# +proc infoWhich {name {namespace ::}} { + debug {======= infoWhich $name $namespace} 3 + if [catch {uplevel set infoWhich__name $name} szErrMsg] { + debug { error: $szErrMsg} + return "" + } + uplevel { + debug { objects: >[::itcl::find objects]<} 4 + debug { namespace: >[namespace current]<} 4 + infoWhichYYY + } + set name [uplevel set infoWhich__name] + uplevel unset infoWhich__name + debug {infoWhich return: >$name<} 4 + return $name +} +proc infoWhichXXX {} { + uplevel { + set i [lsearch -regexp [::itcl::find objects] "[namespace tail \ + $infoWhich__name]"] + if {$i < 0} { + set infoWhich__name "" + } else { + set infoWhich__name [lindex [::itcl::find objects] $i] + if {! [string match ::* $infoWhich__name]} { + set infoWhich__name [namespace current]::$infoWhich__name + } + regsub "^::::" $infoWhich__name "::" infoWhich__name + } + } +} +proc infoWhichYYY {} { + uplevel { + if [catch {infoWhichXXX} szErrMsg] { + verbose "infoWhichYYY error Msg: $szErrMsg" + set infoWhich__name "" + } + } +} + +namespace eval ::BlueGnu { + variable warning_threshold 0 + + variable sum_file stdout + variable all_flag 0 + + variable xfail_flag 0 + variable xfail_prms {} + # + # Print output to stdout (or stderr) and to log file + # + # If the --all flag (-a) option was used then all messages + # go the the screen. + # Without this, all messages that start with a keyword are + # written only to the + # detail log file. All messages that go to the screen will + # also appear in the + # detail log. This should only be used by the framework itself using pass, + # fail, xpass, xfail, warning, perror, note, untested, unresolved, or + # unsupported procedures. + # + proc clone_output {message} { + variable sum_file + variable all_flag + + #everything goes in the summary file + # + puts $sum_file "$message" + + # Depending on the type of message, the message is send + # to other resources + # + case [lindex [split $message] 0] in { + {"FAIL:" "XPASS:" "UNRESOLVED:" "UNSUPPORTED:" "UNTESTED:"} { + send_user "$message\n" + send_log "$message\n" + } + {"PASS:" "XFAIL:"} { + if $all_flag { + send_user "$message\n" + } + send_log "$message\n" + } + "ERROR:" { + #send_user "$message\n" + send_error "$message\n" + send_log "$message\n" + } + {"WARNING:" "NOTE:"} { + if $all_flag { + send_error "$message\n" + } + send_log "$message\n" + } + "*******" { + send_user "$message\n" + #send_log "$message\n" + #send_error "$message\n" + } + default { + send_user "$message\n" + } + } + + # we always return turn the message unchanged + # + return "$message" + } +} + +proc createTarget {args} { + verbose {In: createTarget >$args<} 3 + set szCmd "::BlueGnu::Target #auto " + set bID 0 + set bEnv 0 + set bQueue 0 + foreach item $args { + if {[string compare \ + [lindex [split $item "="] 0] szID] == 0} { + set bID 1 + } + if {[string compare \ + [lindex [split $item "="] 0] objEnvironment] == 0} { + set bEnv 1 + } + if {[string compare \ + [lindex [split $item "="] 0] objQueue] == 0} { + set bQueue 1 + } + append szCmd "\{$item\} " + } + if {! $bID} { + append szCmd "szID=Default " + } + if {! $bEnv} { + append szCmd "objEnvironment=[infoWhich \ + [::BlueGnu::Environment #auto]] " + } + if {! $bQueue} { + append szCmd "objQueue=[infoWhich [::BlueGnu::Queue #auto]] " + } + verbose {Command: >$szCmd<} 3 + set target [uplevel #0 "eval $szCmd"] + verbose {Created target: >$target<} 3 + verbose { >>>[$target <<]<<<} 4 + verbose { >>>[[infoWhich $target] <<]<<<} 4 + verbose { == [join [$target <<] "\n == "]} 3 + return [infoWhich $target] +} + +# Initialize all global variables not yet initialized +# +set szCurrentTestDirectory $env(TESTSUITEROOT) + +# Remove all temporary variables from the global space +catch {eval unset [info globals __*]} +debug {Global variables available:\ + \n [join [lsort [info globals]] "\n "]} 9 +debug {Global procedures available:\ + \n [join [lsort [info procs]] "\n "]} 9 + +foreach dir [split $env(TESTSETS) ":"] { + if {[string compare $dir $PWD] == 0} { + foreach indexFile [locateFile tclIndex] { + set indexDir [file dirname $indexFile] + if {[lsearch -exact [split $auto_path] $indexDir] < 0} { + set auto_path "$indexDir $auto_path" + } + } + foreach indexFile [locateFile tclIndex lib] { + set indexDir [file dirname $indexFile] + if {[lsearch -exact [split $auto_path] $indexDir] < 0} { + set auto_path "$indexDir $auto_path" + } + } + } else { + if {[file exists $dir/tclIndex]} { + set auto_path "$dir $auto_path" + } + } +} +debug {auto_path has been intialize to:\n [join $auto_path "\n "]} 3 +verbose {TESTSETS: >$env(TESTSETS)<} 3 diff --git a/contrib/bluegnu2.0.3/lib/testSessionUtils.itcl b/contrib/bluegnu2.0.3/lib/testSessionUtils.itcl new file mode 100644 index 0000000..4c960c4 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/testSessionUtils.itcl @@ -0,0 +1,26 @@ +# +# Procedures and other definitions for application: +# +# testSession +# + + + +proc popQueue {args} { + global szDefaultQueue + + if {[llength $args] == 1} { + set Queue [lindex $args 0] + if {[string compare [infoWhich $Queue] ""] == 0} { + error "NOT a queue >$args<" + } else { + eval [concat [infoWhich $Queue] pop] + } + } else { + if {[info exist szDefaultQueue]} { + eval [concat $szDefaultQueue pop] + } else { + error "NO default queue" + } + } +} diff --git a/contrib/bluegnu2.0.3/lib/udi.exp b/contrib/bluegnu2.0.3/lib/udi.exp new file mode 100644 index 0000000..b8c940e --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/udi.exp @@ -0,0 +1,213 @@ +# Copyright (C) 92, 93, 94, 95, 1996 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@welcomehome.org) + +# +# set target variables only if needed. +# +global targetname +global connectmode +global env + +if ![info exists targetname] { + if [info exists env(TARGETNAME)] { + set targetname $env(TARGETNAME) + } else { + puts stderr "ERROR: Need a target name for the udi target." + puts stderr " Use the --name option\n" + exit 1 + } +} + +# the default connect program to use +if ![info exists connectmode] { + set connectmode "mondfe" + warning "Using default of $connectmode for target communication." + if {[which mondfe] == 0} { + perror "\"mondfe\" does not exist. Check your path." + exit 1 + } +} + +# +# Connect to udi using mondfe +# +# HOSTNAME can be `iss' to talk to the simulator. +# The result is the value of `spawn_id' or -1 for failure. +# +proc mondfe { hostname } { + global shell_prompt + global spawn_id + + set retries 0 + set result -1 + + verbose "Attempting to connect to $hostname via mondfe." + spawn mondfe -D -TIP $hostname + + expect { + "$shell_prompt" { + verbose "Got prompt" + set result 0 + } + "*server bind*failed: Address already in use*" { + warning "Socket file already exists." + incr retries + if { $retries <= 2 } { + continue -expect + } + } + -indices -re ".*(UDIERROR\[^\r\n\]*)\[\r\n\]" { + warning "$expect_out(1,string)" + continue -expect + } + -indices -re ".*(DFEERROR\[^\r\n\]*)\[\r\n\]" { + warning "$expect_out(1,string)" + continue -expect + } + timeout { + warning "Timed out trying to connect." + set result -1 + incr retries + if { $retries <= 2 } { + send -i $spawn_id "\n" + continue -expect + } + } + } + + if { $result < 0 } { + perror "Couldn't connect after $retries retries." + return -1 + } else { + return $spawn_id + } +} + +# +# Downloads using the y (yank) command in mondfe +# +# SHELL_ID is the from the result of `mondfe'. +# ARG is a full path name to the file to download. +# Returns 1 if an error occured, 0 otherwise. +# +proc mondfe_download { shell_id arg } { + global decimal ;# ??? What is this? + global shell_prompt + + if ![file exists $arg] { + perror "$arg doesn't exist." + return 1 + } + + verbose "Downloading $arg." 2 + set result 1 + send -i $shell_id "y $arg\n" + expect { + -i $shell_id "y $arg*loading $arg*" { + continue -expect + } + -i $shell_id -re "Loading *TEXT section from\[^\r\]*\r" { + verbose -n "." 2 + continue -expect + } + -i $shell_id -re "Loaded *TEXT section from\[^\n\]*\n" { + verbose " TEXT section loaded." 2 + continue -expect + } + -i $shell_id -re "Loading *LIT section from\[^\r\]*\r" { + verbose -n "." 2 + continue -expect + } + -i $shell_id -re "Loaded *LIT section from\[^\n\]*\n" { + verbose " LIT section loaded." 2 + continue -expect + } + -i $shell_id -re "Loading *DATA section from\[^\r\]*\r" { + verbose -n "." 2 + continue -expect + } + -i $shell_id -re "Loaded *DATA section from\[^\n\]*\n" { + verbose " DATA section loaded." 2 + continue -expect + } + -i $shell_id -re "Clearing *BSS section from\[^\r\]*\r" { + verbose -n "." 2 + continue -expect + } + -i $shell_id -re ".*Cleared *BSS section from.*$shell_prompt$" { + verbose " BSS section cleared." 2 + verbose "Downloaded $arg successfully." 2 + set result 0 + } + -i $shell_id -re "DFEWARNING: $decimal : EMMAGIC: Bad COFF file magic number.*Command failed.*$shell_prompt$" { + warning "Bad COFF file magic number" + set result 1 + } + -i $shell_id -re ".*Ignoring COMMENT section \($decimal bytes\).*$shell_prompt$" { + verbose "Ignoring COMMENT section" 2 + verbose "Downloaded $arg successfully." 2 + set result 0 + } + -i $shell_id timeout { + perror "Timed out trying to download $arg." + set result 1 + } + } + +# FIXME: the following keeps the download from working +# "Could not read COFF section" { +# perror "Couldn't read COFF section." +# set result 1 +# } + + if { $result && [info exists expect_out(buffer)] } { + send_log $expect_out(buffer) + } + return $result +} + +# +# Exit the remote shell +# +proc exit_mondfe { shell_id } { + send -i $shell_id "q\n" + expect { + -i $shell_id "Goodbye." { + verbose "Exited mondfe $shell_id" + } + timeout { + warning "mondfe didn't exit cleanly" + } + } + + catch "close -i $shell_id" + return 0 +} + +# +# Exit the remote shell +# +proc exit_montip { shell_id } { + verbose "exiting montip $shell_id" + + catch "close -i $shell_id" + return 0 +} diff --git a/contrib/bluegnu2.0.3/lib/util-defs.exp b/contrib/bluegnu2.0.3/lib/util-defs.exp new file mode 100644 index 0000000..17fcf1a --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/util-defs.exp @@ -0,0 +1,110 @@ +# Copyright (C) 92, 93, 94, 95, 1996 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@welcomehome.org) + +# +# 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 +} + +# +# add some basic error trapping. These mostly catch programming error's +# within the tests themselves +# +expect_before { + buffer_full { perror "Internal buffer is full" } + "can't open 'nmtest'" { perror "Can't open test file" } +} diff --git a/contrib/bluegnu2.0.3/lib/utils.exp b/contrib/bluegnu2.0.3/lib/utils.exp new file mode 100644 index 0000000..2372264 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/utils.exp @@ -0,0 +1,454 @@ +# Copyright (C) 92, 93, 94, 95, 1996 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@welcomehome.org) + +# +# Most of the procedures found here mimic their unix counter-part. +# This file is sourced by runtest.exp, so they are usable by any test case. +# + +# +# Gets the directories in a directory +# args: the first is the dir to look in, the next +# is the pattern to match. It +# defaults to *. Patterns are csh style +# globbing rules +# returns: a list of dirs or NULL +# +proc getdirs { args } { + set path [lindex $args 0] + if { [llength $args] > 1} { + set pattern [lindex $args 1] + } else { + set pattern "*" + } + verbose "Looking in ${path} for directories that match \"${pattern}\"" 3 + catch "glob ${path}/${pattern}" tmp + if { ${tmp} != "" } { + foreach i ${tmp} { + if [file isdirectory $i] { + switch -- "[file tail $i]" { + "testsuite" - + "config" - + "lib" - + "CVS" - + "RCS" - + "SCCS" { + verbose "Ignoring directory [file tail $i]" 3 + continue + } + default { + if [file readable $i] { + verbose "Found directory [file tail $i]" 3 + lappend dirs $i + } + } + } + } + } + } else { + perror "$tmp" + return "" + } + + if ![info exists dirs] { + return "" + } else { + return $dirs + } +} + +# +# Finds all the files recursively +# rootdir - this is the directory to start the search +# from. This is and all subdirectories are search for +# filenames. Directory names are not included in the +# list, but the filenames have path information. +# pattern - this is the pattern to match. Patterns are csh style +# globbing rules. +# returns: a list or a NULL. +# +proc find { rootdir pattern } { + # first find all the directories + set dirs "$rootdir " + while 1 { + set tmp $rootdir + set rootdir "" + if [string match "" $tmp] { + break + } + foreach i $tmp { + set j [getdirs $i] + if ![string match "" $j] { + append dirs "$j " + set rootdir $j + unset j + } else { + set rootdir "" + } + } + set tmp "" + } + + # find all the files that match the pattern + foreach i $dirs { + verbose "Looking in $i" 3 + set tmp [glob -nocomplain $i/$pattern] + if { [llength $tmp] != 0 } { + foreach j $tmp { + if ![file isdirectory $j] { + lappend files $j + verbose "Adding $j to file list" 3 + } + } + } + } + + if ![info exists files] { + lappend files "" + } + return $files +} + +# +# Search the path for a file. This is basically a version +# of the BSD-unix which utility. This procedure depends on +# the shell environment variable $PATH. It returns 0 if $PATH +# does not exist or the binary is not in the path. If the +# binary is in the path, it returns the full path to the binary. +# +proc which { file } { + global env + + # strip off any extraneous arguments (like flags to the compiler) + set file [lindex $file 0] + + # if it exists then the path must be OK + # ??? What if $file has no path and "." isn't in $PATH? + if [file exists $file] { + return $file + } + if [info exists env(PATH)] { + set path [split $env(PATH) ":"] + } else { + return 0 + } + + foreach i $path { + verbose "Checking against $i" 3 + if [file exists $i/$file] { + if [file executable $i/$file] { + return $i/$file + } else { + warning "$i/$file exists but is not an executable" + } + } + } + # not in path + return 0 +} + +# +# Looks for a string in a file. +# return:list of lines that matched or NULL if none match. +# args: first arg is the filename, +# second is the pattern, +# third are any options. +# Options: line - puts line numbers of match in list +# +proc grep { args } { + + set file [lindex $args 0] + set pattern [lindex $args 1] + + verbose "Grepping $file for the pattern \"$pattern\"" 3 + + set argc [llength $args] + if { $argc > 2 } { + for { set i 2 } { $i < $argc } { incr i } { + append options [lindex $args $i] + append options " " + } + } else { + set options "" + } + + set i 0 + set fd [open $file r] + while { [gets $fd cur_line]>=0 } { + incr i + if [regexp -- "$pattern" $cur_line match] { + if ![string match "" $options] { + foreach opt $options { + case $opt in { + "line" { + lappend grep_out [concat $i $match] + } + } + } + } else { + lappend grep_out $match + } + } + } + close $fd + unset fd + unset i + if ![info exists grep_out] { + set grep_out "" + } + return $grep_out +} + +# +# Remove elements based on patterns. elements are delimited by spaces. +# pattern is the pattern to look for using glob style matching +# list is the list to check against +# returns the new list +# +proc prune { list pattern } { + foreach i $list { + verbose "Checking pattern \"$pattern\" against $i" 3 + if ![string match $pattern $i] { + lappend tmp $i + } else { + verbose "Removing element $i from list" 3 + } + } + return $tmp +} + +# +# Attempt to kill a process that you started +# +proc slay { name } { + set in [open [concat "|ps"] r] + while {[gets $in line]>-1} { + if ![string match "*expect*slay*" $line] { + if [string match "*$name*" $line] { + set pid [lindex $line 0] + catch "exec kill -9 $pid]" + verbose "Killing $name, pid = $pid\n" + } + } + } + close $in +} + +# +# Convert a relative path to an absolute one +# +proc absolute { path } { + if [string match "." $path] { + return [pwd] + } + + set basedir [pwd] + cd $path + set path [pwd] + cd $basedir + return $path +} + +# +# Source a file and trap any real errors. This ignores extraneous +# output. returns a 1 if there was an error, otherwise it returns 0. +# +proc psource { file } { + global errorInfo + global errorCode + + unset errorInfo + if [file exists $file] { + catch "source $file" + if [info exists errorInfo] { + send_error "ERROR: errors in $file\n" + send_error "$errorInfo" + return 1 + } + } + return 0 +} + +# +# Check if a testcase should be run or not +# +# RUNTESTS is a copy of global `runtests'. +# +# This proc hides the details of global `runtests' from the test scripts, and +# implements uniform handling of "script arguments" where those arguments are +# file names (ie: the "foo" in make check RUNTESTFLAGS="bar.exp=foo"). +# "glob" style expressions are supported as well as multiple files (with +# spaces between them). +# Eg: RUNTESTFLAGS="bar.exp=foo1.c foo2.c foo3*.c bar*.c" +# +proc runtest_file_p { runtests testcase } { + if [string length [lindex $runtests 1]] { + set testcase [file tail $testcase] + foreach ptn [lindex $runtests 1] { + if [string match $ptn $testcase] { + return 1 + } + } + return 0 + } + return 1 +} + +# +# Delete various system verbosities from TEXT on SYSTEM +# +# An example is: +# ld.so: warning: /usr/lib/libc.so.1.8.1 has older revision than expected 9 +# +# SYSTEM is typical $target_triplet or $host_triplet. +# +# This is useful when trying to do pattern matches on program output. +# Sites with particularily verbose os's may wish to override this in site.exp. +# +# We get loaded after site.exp so only define this if not already defined. +# + +if { [info procs prune_system_crud] == "" } { + proc prune_system_crud { system text } { + # This is from sun4's. Do it for all machines for now. + # The "\\1" is to try to preserve a "\n" but only if necessary. + regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text + + # This happens when compiling on Alpha OSF/1 with cc -g -O. + regsub -all "(^|\n)(\n*uopt: Warning: file not optimized; use -g3 if both optimization and debug wanted\n?)+" $text "\\1" text + + # This happens when compiling on Alpha OSF using gas. + regsub -all "(^|\n)(/usr/ucb/ld:\nWarning: Linking some objects which contain exception information sections\n\tand some which do not. This may cause fatal runtime exception handling\n\tproblems\[^\n\]*\n?)+" $text "\\1" text + + # This happens on SunOS with cc -g -O. + regsub -all "(^|\n)(cc: Warning: -O conflicts with -g. -O turned off.\n?)+" $text "\\1" text + + # This happens when using g++ on a DWARF system. + regsub -all "(^|\n)(cc1plus: warning: -g option not supported for C\\+\\+ on systems using the DWARF debugging format\n?)+" $text "\\1" text + + # It might be tempting to get carried away and delete blank lines, etc. + # Just delete *exactly* what we're ask to, and that's it. + return $text + } +} + +# +# Compares two files line-by-line +# returns 1 it the files match, +# returns 0 if there was a file error, +# returns -1 if they didn't match. +# +proc diff { file_1 file_2 } { + set eof -1 + set differences 0 + + if [file exists ${file_1}] { + set file_a [open ${file_1} r] + } else { + warning "${file_1} doesn't exist" + return 0 + } + + if [file exists ${file_2}] { + set file_b [open ${file_2} r] + } else { + warning "${file_2} doesn't exist" + return 0 + } + + verbose "# Diff'ing: ${file_1} ${file_2}\n" 1 + + while { [gets ${file_a} line] != ${eof} } { + if [regexp "^#.*$" ${line}] { + continue + } else { + lappend list_a ${line} + } + } + close ${file_a} + + while { [gets ${file_b} line] != ${eof} } { + if [regexp "^#.*$" ${line}] { + 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}] { + verbose "line #${i}\n" 2 + verbose "\< ${line_a}\n" 2 + verbose "\> ${line_b}\n" 2 + + send_log "line #${i}\n" + send_log "\< ${line_a}\n" + send_log "\> ${line_b}\n" + + set differences -1 + } + } + + if { [llength ${list_a}] != [llength ${list_b}] } { + verbose "Files not the same" 2 + set differences -1 + } else { + verbose "Files are the same" 2 + set differences 1 + } + return ${differences} +} + +# +# Set an environment variable +# +proc setenv { var val } { + global env + + set env($var) $val +} + +# +# Unset an environment variable +# +proc unsetenv { var } { + global env + unset env($var) +} + +# +# Get a value from an environment variable +# +proc getenv { var } { + global env + + if [info exists env($var)] { + return $env($var) + } else { + return "" + } +} + diff --git a/contrib/bluegnu2.0.3/lib/vrtx.exp b/contrib/bluegnu2.0.3/lib/vrtx.exp new file mode 100644 index 0000000..91be6c5 --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/vrtx.exp @@ -0,0 +1,334 @@ +# Copyright (C) 92, 93, 94, 95, 1996 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@welcomehome.org) + +# these just need to be initialized +# FIXME: The usage of `shell_id' as a global here seems wrong. Most targets +# have it local to the file of our caller. See for example udi.exp. +set shell_id 0 + +# +# set default values +# + +global env +if ![info exists env(SPECTRA)] { + perror "SPECTRA environment variable is not set." + exit 1 +} else { + set SPECTRA $env(SPECTRA) + append CFLAGS " -I $SPECTRA/target/include" +} + +# the hostname of the target board + +global targetname +if ![info exists targetname] { + puts stderr "ERROR: Need a target name for Spectra." + puts stderr " Use the --target option\n" + exit 1 +} + +# the default connect program to use +global connectmode +if ![info exists connectmode] { + set connectmode "xsh" + warning "Using default of $connectmode for target communication." +} + +# +# Connect to Spectra (VTRX) using xsh +# +proc xsh { hostname } { + global verbose + global hex + global connectmode + global shell_prompt + global spawn_id + global shell_id + global spawn_id + global env + global target_triplet + + set retries 0 + set result 0 + if {[which xsh] != 0} { + spawn xsh + } else { + warning "Can't find xsh in path" + return + } + + set shell_id $spawn_id + + # start the shell + expect { + "*Spectra Cross-Development Shell version*$shell_prompt" { + verbose "Got prompt" + set result 0 + } + timeout { + warning "Timed out trying to connect." + set result -1 + incr retries + if { $retries <= 2 } { + exp_continue + } + } + } + + # connect to the shell + set retries 0 + send "connect $hostname\n" + expect { + "connect $hostname*$hostname connected \(non-os mode\)*\n" { + set shell_prompt "$hostname> " + verbose "Connected to $hostname" + } + "*connect: not attached*" { + warning "Couldn't attach target" + set result -1 + } + -re ".* reset on target.*$" { + send_user "Spectra was reset\n" + exp_continue + } + -re "\[0-9A-Fa-f\]+\[ 0x\]+\[0-9A-Fa-f\]+.*$" { + exp_continue + } + "$hostname> " { + #send "\n" + } + timeout { + warning "Timed out trying to connect after $expect_out(seconds) seconds." + set result -1 + incr retries + if { $retries <= 2 } { + exp_continue + } + } + } + + send "\n\n\n" + expect { + "*$hostname*$hostname" { + verbose "Cleared reset messages" 1 + } + timeout { + warning "Couldn't clear reset messages" + set result 1 + } + } + + # load to operating system + set timeout 20 + set retries 0 + if {[xsh_load $env(SPECTRA)/${target_triplet}-os.o {-e sys_start_crt0}]!=0} { + perror "Couldn't load Spectra into target" + return -1 + } + + set timeout 10 + # start the OS running + set retries 0 + send "go\n" + expect { + -re ".*Multithreading on target darkstar.*$" { + verbose "Spectra has been started..." 1 + set result 0 + } + -re ".*reset on target.*$" { + verbose "Spectra was reset" + exp_continue + } + -re "\[0-9A-Fa-f\]+\[ 0x\]+\[0-9A-Fa-f\]+.*$" { + #send "\n" + exp_continue + } + -re "go\n" { exp_continue } + "$shell_prompt" { exp_continue } + timeout { + perror "Spectra wouldn't start" + set result -1 + incr retries + if { $retries <= 2 } { + send "go\r" + exp_continue + } + } + } + + if { $result < 0 } { + perror "Couldn't connect after $retries retries.\n" + return -1 + } else { + return $spawn_id + } +} + +# +# Downloads using the load command in Spectra +# arg - is a full path name to the file to download +# returns 1 if a spectra error occured, +# -1 if an internal error occured, +# 0 otherwise. +# +proc xsh_load { args } { + global verbose + global shell_id + global decimal + global hex + global shell_prompt + global expect_out + + set result 1 + set retries 0 + + if { [llength $args] == 1 } { + set opts "" + } else { + set opts [lindex $args 1] + } + set file [lindex $args 0] + + if ![file exists $file] { + perror "$file doesn't exist." + return 1 + } + + verbose "Downloading $file..." + + send -i $shell_id "load $opts $file\r" + set force 0 + expect { + -i $shell_id -re "\[0-9A-Fa-f\]+\[ 0x\]+\[0-9A-Fa-f\]+\r\n" { + set timeout 1 + send "dout\n" + while $force<2 { + expect { + "dout*undefined kernel symbol*$shell_prompt" { + verbose "Attempted to flush I/O buffers" 1 + } + timout { + incr force + flush stdout + } + } + } + set timeout 20 + exp_continue + } + -i $shell_id "load $opts $file*\r" { + verbose "Loading a.out..." + exp_continue + } + -i $shell_id "Warm reset on target*\n" { + verbose "Spectra did a warm reset" + exp_continue + } + -i $shell_id "Cold reset on target*\n" { + verbose "Spectra did a cold reset" + exp_continue + } + -i $shell_id "loading a.out*\r" { + verbose "Loading a.out..." + exp_continue + } + -i $shell_id "reading symbols*\r" { + verbose "Reading symbols..." + exp_continue + } + -i $shell_id "defining symbols*\r" { + verbose "defining symbols..." + exp_continue + } + -i $shell_id "*loading image*\r" { + verbose "Loading image..." + exp_continue + } + -i $shell_id -re ".*bytes loaded:.*$decimal.*$" { + verbose "$expect_out(buffer)" + exp_continue + } + -i $shell_id "*loading done*\r" { + verbose "Loading done..." + exp_continue + } + -i $shell_id "*setting PC*\r" { + verbose "Setting PC..." + exp_continue + } + -i $shell_id "*resolving symbols*\r" { + verbose "Resolving symbols..." + exp_continue + } + -i $shell_id -re ".*load module id = $decimal.*$" { + verbose "" + } + } + -i $shell_id -re ".*load: undefined symbols.*$" { + perror "undefined symbols, make sure os is loaded and running" + set result -1 + } + -i $shell_id "$shell_prompt" { + set result 0 + exp_continue + } + -i $shell_id "load: no default target" { + perror "default target isn't set" + return -1 + } + -i $shell_id timeout { + perror "Timed out trying to download after $expect_out(seconds) seconds." + incr retries + set result 1 + if { $retries <= 2 } { + exp_continue + } + } + } + + set timeout 10 + if [info exists expect_out(buffer)] { + send_log $expect_out(buffer) + } + return $result +} + +# +# Exit the remote shell +# +proc xsh_exit { shell_id } { + global verbose + global connectmode + global targetname + global shell_prompt + global shell_id + + send -i $shell_id "exit\n" + + verbose "Exiting shell." + set shell_id 0 + return 0 +} + + + + diff --git a/contrib/bluegnu2.0.3/lib/vxworks.exp b/contrib/bluegnu2.0.3/lib/vxworks.exp new file mode 100644 index 0000000..cf7c3bd --- /dev/null +++ b/contrib/bluegnu2.0.3/lib/vxworks.exp @@ -0,0 +1,265 @@ +# Copyright (C) 92, 93, 94, 95, 1996 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@welcomehome.org) + +# +# set target variables only if needed. +# +global targetname +global connectmode +global env +global checktask + +if ![info exists targetname] { + if [info exists env(TARGETNAME)] { + set targetname $env(TARGETNAME) + } else { + puts stderr "ERROR: Need a target name for the vxworks board." + puts stderr " Use the --name option\n" + exit 1 + } +} + +# The default connect program to use. +if ![info exists connectmode] { + set connectmode "telnet" + warning "Using default of $connectmode for target communication." +} + +if ![info exists checktask] { + set checktask "fp" +} + +# +# Compute a path to vxworks' value for it +# +# We use a default ftp device called "filesys" to load files from. +# This way it works without NFS. +# This proc may be overridden by the user. The typical thing to do is use +# a different name for the device, but it might also return a different path +# to PROG. +# +# ??? This is experimental. This kind of thing can't be specified on the +# command line, but neither can specifying the kinds of transformations that +# one might want to do without actually passing tcl code at which point it +# makes just as much sense to stick it in a config file. +# +if { [info procs vxworks_transform_path] == "" } { + proc vxworks_transform_path { prog } { + return "filesys:$prog" + } +} + +# +# Load a file into vxworks +# +# The result is: +# 0 - success +# 1 - failed (eg: link failed so testcase should fail) +# -1 - unresolved (eg: timeout, bad passwd) +# -2 - unsupported (not used) +# -3 - untested (not used) +# +proc vxworks_ld { shell_id prog } { + global shell_prompt + global expect_out + global logname + global passwd + global decimal hex + + set timeout 100 ;# for this call only + set result -7 ;# -7 is a local value meaning "not done" + set tries 0 + set maxtries 3 + + set prog [vxworks_transform_path $prog] + + if { $passwd != "" } { + send -i $shell_id "iam \"$logname\",\"$passwd\"\r" + } else { + send -i $shell_id "iam \"$logname\"\r" + } + expect { + -i $shell_id "iam*value = 0 = 0x0*$shell_prompt" { + verbose "Set default user." 2 + } + -i $shell_id timeout { + # ??? This is really an error. It's not clear whether `perror' + # or `warning' should be used here. There are *lots* of other + # cases like this. + perror "Couldn't set default user." + set result -1 + } + } + + # We always want to exit the program via the code at the end. + # If the load fails we want `expect_out' stored in the log and this + # saves duplicating that code. + + while { $result == -7 } { + verbose "Loading $prog into vxworks." + send -i $shell_id "ld < $prog\r" + incr tries + expect { + -i $shell_id "Login incorrect." { + if { $tries == $maxtries } { + perror "Login failed." + set result -1 + break + } + if [string match "" $passwd] { + stty -echo + warning "Login failed for default user" + send_user "Type in password (for $logname) please: " + expect_user -re "(.*)\n" + send_user "\n" + set passwd "$expect_out(1,string)" + stty echo + } + send -i $shell_id "iam \"$logname\",\"$passwd\"\r" + expect { + -i $shell_id "iam*value = 0 = 0x0*$shell_prompt " { + verbose "Set new user and password" 2 + } + -i $shell_id timeout { + perror "Couldn't set user and password (timed out)." + set result -1 + } + } + } + -i $shell_id -re "USER.*command not understood" { + perror "Need to set the user and password." + set result -1 + } + -i $shell_id -re "ld <.*undefined symbol:.*$shell_prompt $" { + # This is an error in the testcase, don't call perror. + warning "Undefined symbol, $prog not loaded." + set result 1 + } + -i $shell_id -re "ld <.*can't open input.*$shell_prompt $" { + perror "Can't access $prog." + set result -1 + } + -i $shell_id -re "ld <.*value = ${decimal} = ${hex}.*$shell_prompt $" { + verbose "Loaded $prog into vxworks." + set result 0 + } + -i $shell_id -re "ld <\[^\r\]*\r(.*)$shell_prompt $" { + warning "Load failed: $expect_out(1,string)" + set result -1 + } + -i $shell_id timeout { + warning "Timed out trying load $prog." + set result -1 + } + } + } + + if { $result && [info exists expect_out(buffer)] } { + send_log "$expect_out(buffer)" + } + return $result +} + +# +# Start a thread (process) executing +# +# The result is: +# 0 - success +# 1 - failed (eg: testcase aborted) +# -1 - unresolved (eg: timeout) +# -2 - unsupported (not used) +# -3 - untested (not used) +# +proc vxworks_spawn { shell_id function } { + global shell_prompt + global checktask + + # There isn't a command to wait for a thread to finish, so we have to keep + # polling. Bummer. + + set timeout 20 ;# for this call only + + send -i $shell_id "sp $function\r" + expect { + -i $shell_id -re "sp $function.*task spawned:.*name = (\[a-z0-9\]+).*value = (\[0-9\]+).*$shell_prompt $" { + set name $expect_out(1,string) + set value $expect_out(2,string) + verbose "$function running, name $name, value $value" + set tries 0 + set maxtries 100 ;# Don't hang on testcases with infinite loops. + set result -7 ;# "not done" + while { $result == -7 } { + # Get the task's frame pointer. + # VxWorks will return -1 if the task isn't running. + send -i $shell_id "$checktask \"$name\"\r" + incr tries + expect { + -i $shell_id -re "task $value - aborted.*$shell_prompt $" { + # FIXME: It's not clear we'll ever get here. + verbose "$function aborted" + set result 1 + } + -i $shell_id -re ".*AbOrT.*$shell_prompt $" { + # This requires support from the environment to + # redefine abort() to print this. + verbose "$function aborted" + set result 1 + } + # This is here to try to cope with apparently flaky h/w. + -i $shell_id -re ".*Bus Error.*$" { + # This is potentially an error in the testcase, + # don't call perror. + warning "Bus Error." + # Delete the task (it's still around). + send -i $shell_id "td $name\r" + set result 1 + } + -i $shell_id -re "value = \[0-9\]+.*$shell_prompt $" { + # Task is still running. + if { $tries == $maxtries } { + warning "$function started, won't stop" + set result -1 + } else { + catch "exec sleep 1" + } + } + -i $shell_id -re "value = -1.*$shell_prompt $" { + # Task is no longer running. + set result 0 + } + -i $shell_id timeout { + warning "$function started, can't determine status (timed out)" + set result -1 + } + } + } + } + -i $shell_id timeout { + warning "Couldn't run $function (timed out)" + set result -1 + } + } + + if { $result && [info exists expect_out(buffer)] } { + send_log "$expect_out(buffer)" + } + return $result +} diff --git a/contrib/bluegnu2.0.3/testsets/BlueGnu/appendQueue.itcl b/contrib/bluegnu2.0.3/testsets/BlueGnu/appendQueue.itcl new file mode 100644 index 0000000..fcdf33d --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/BlueGnu/appendQueue.itcl @@ -0,0 +1,9 @@ +# +# Test script for appendQueue command +# + +#appendQueue [list namespaceVariables.itcl namespaceVariables.itcl \ + namespaceVariables.itcl] "arg1 arg2 arg3" append + +appendQueue [list namespaceVariables.itcl namespaceVariables.itcl \ + namespaceVariables.itcl] diff --git a/contrib/bluegnu2.0.3/testsets/BlueGnu/clone_output.itcl b/contrib/bluegnu2.0.3/testsets/BlueGnu/clone_output.itcl new file mode 100644 index 0000000..56ff9cb --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/BlueGnu/clone_output.itcl @@ -0,0 +1,156 @@ +# +# This test check the BlueGnu command clone_output +# + +verbose "all_flag: >$::BlueGnu::all_flag<" + +BlueGnu_overwrite [namespace current] + +set szCurrent [::BlueGnu::clone_output "namespace: >[namespace current]<"] + +set szSendUser [::BlueGnu::clone_output "send_user: >[info body ::send_user]<"] + +# Checking default messages +# +catch {unset sending} +::BlueGnu::clone_output "Hello there!" +::BlueGnu::clone_output " [array names sending]" +if [catch { + if {$sending(USER) && ([llength [array names sending]] == 1)} { + pass "Default message" + } else { + fail "Default Message: [array names sending]" + } +} szErrMsg] { + ::BlueGnu::clone_output "####### $szErrMsg\n \ + sending([join [array names sending] ")\n sending("])" + perror "Missing sending array elements" +} + +# Checking the PASS type messages +# +foreach szMsg {"PASS: hello there!" "XFAIL: hello there!"} { + catch {unset sending} + ::BlueGnu::clone_output $szMsg + if {$::BlueGnu::all_flag} { + if [catch { + if {$sending(USER) && $sending(LOG) && \ + ([llength [array names sending]] == 2)} { + pass "PASS message" + } else { + fail "PASS Message: [array names sending]" + } + } szErrMsg] { + ::BlueGnu::clone_output "####### $szErrMsg\n \ + sending([join [array names sending] ")\n \ + sending("])" + perror "Missing sending array elements" + } + } else { + if [catch { + if {$sending(LOG) && ([llength [array names sending]] == 1)} { + pass "PASS message" + } else { + fail "PASS Message: [array names sending]" + } + } szErrMsg] { + ::BlueGnu::clone_output "####### $szErrMsg\n \ + sending([join [array names sending] ")\n \ + sending("])" + perror "Missing sending array elements" + } + } +} + +# Checking the fail type messages +# +foreach szMsg {"FAIL: Hallo daar!" "XPASS: Hallo daar!" \ + "UNRESOLVED: Hello unresolved!" "UNSUPPORTED: Hello unsupported!" \ + "UNTESTED: not tested!"} { + catch {unset sending} + ::BlueGnu::clone_output $szMsg + if [catch { + if {$sending(USER) && $sending(LOG) && \ + ([llength [array names sending]] == 2)} { + pass "PASS message" + } else { + fail "PASS Message: [array names sending]" + } + } szErrMsg] { + ::BlueGnu::clone_output "####### $szErrMsg\n \ + sending([join [array names sending] ")\n sending("])" + perror "Missing sending array elements" + } +} + +# Checking ERROR type messages +# +catch {unset sending} +::BlueGnu::clone_output "ERROR: hallo daar!" +if [catch { + if {$sending(LOG) && $sending(ERROR) && \ + ([llength [array names sending]] == 2)} { + pass "PASS message" + } else { + fail "PASS Message: [array names sending]" + } +} szErrMsg] { + ::BlueGnu::clone_output "####### $szErrMsg\n \ + sending([join [array names sending] ")\n sending("])" + perror "Missing sending array elements" +} + +# Checking WARNING type message +# +foreach szMsg {"WARNING: Hello there!" "NOTE: Hello there!"} { + catch {unset sending} + ::BlueGnu::clone_output $szMsg + if {$::BlueGnu::all_flag} { + if [catch { + if {$sending(ERROR) && $sending(LOG) && \ + ([llength [array names sending]] == 2)} { + pass "PASS message" + } else { + fail "PASS Message: [array names sending]" + } + } szErrMsg] { + ::BlueGnu::clone_output "####### $szErrMsg\n \ + sending([join [array names sending] ")\n \ + sending("])" + perror "Missing sending array elements" + } + } else { + if [catch { + if {$sending(LOG) && ([llength [array names sending]] == 1)} { + pass "PASS message" + } else { + fail "PASS Message: [array names sending]" + } + } szErrMsg] { + ::BlueGnu::clone_output "####### $szErrMsg\n \ + sending([join [array names sending] ")\n \ + sending("])" + perror "Missing sending array elements" + } + } +} + +# Checking ******* type messages +# +catch {unset sending} +::BlueGnu::clone_output "******* Ik zie sterretjes!" +if [catch { + if {$sending(USER) && ([llength [array names sending]] == 1)} { + pass "PASS message" + } else { + fail "PASS Message: [array names sending]" + } +} szErrMsg] { + ::BlueGnu::clone_output "####### $szErrMsg\n \ + sending([join [array names sending] ")\n sending("])" + perror "Missing sending array elements" +} + +catch {unset sending} + +BlueGnu_restore \ No newline at end of file diff --git a/contrib/bluegnu2.0.3/testsets/BlueGnu/locateFile.itcl b/contrib/bluegnu2.0.3/testsets/BlueGnu/locateFile.itcl new file mode 100644 index 0000000..9f629e9 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/BlueGnu/locateFile.itcl @@ -0,0 +1,46 @@ +# +# Unit test for command: locateFile +# + +note "[locateFile A.itcl]" + + +if {[regexp {verbose.itcl$} [locateFile verbose.itcl]]} { + pass "Found verbose.itcl as >[locateFile verbose.itcl]<" +} else { + fail "Couldn't find verbose.itcl" +} +if {[regexp {lib/bug.exp$} [locateFile bug.exp lib]]} { + pass "Found bug.exp as >[locateFile bug.exp lib]<" +} else { + fail "Couldn't find bug.exp" +} +if {[regexp {testsuite/T/test_004.exp$} \ + [locateFile test_004.exp testsuite/T]]} { + pass "Found test_004.exp as >[locateFile test_004.exp testsuite/T]<" +} else { + fail "Couldn't find test_004.exp as\ + >\[locateFile test_004.exp testsuite/T\]<" +} +if {[regexp {testsuite/T/test_004.exp$} \ + [locateFile test_004.exp testsuite]]} { + pass "Found test_004.exp as >[locateFile test_004.exp testsuite]<" +} else { + fail "Couldn't find test_004.exp as\ + >\[locateFile test_004.exp testsuite\]<" +} +if {[regexp {testsuite/T/test_004.exp$} \ + [locateFile test_004.exp T]]} { + pass "Found test_004.exp as >[locateFile test_004.exp T]<" +} else { + fail "Couldn't find test_004.exp as\ + >\[locateFile test_004.exp T\]<" +} +if {[regexp {testsuite/T/test_004.exp$} \ + [locateFile test_004.exp]]} { + pass "Found test_004.exp as >[locateFile test_004.exp]<" +} else { + fail "Couldn't find test_004.exp as\ + >\[locateFile test_004.exp testsuite\]<" +} + diff --git a/contrib/bluegnu2.0.3/testsets/BlueGnu/namespaceVariables.itcl b/contrib/bluegnu2.0.3/testsets/BlueGnu/namespaceVariables.itcl new file mode 100644 index 0000000..c1143dc --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/BlueGnu/namespaceVariables.itcl @@ -0,0 +1,36 @@ +# +# This test script prints the namespace variables +# pass the the test script when available varibale matches the expected +# and visa versa +# + +proc checkVars {} { + set lExpectedVars [list \ + bTestCase \ + iArgs lArgs \ + szID szName \ + szScriptName szTool \ + szTestCase szTestCaseID szTestCaseArgs \ + ] + set lVars [uplevel info vars] + note "Available Variable:" + foreach v [lsort $lVars] { + if {[lsearch [info globals] $v] < 0} { + note "[format %15s $v] = >[uplevel set $v]<" + if {[lsearch $lExpectedVars $v] >= 0} { + pass "Available variable >$v< in list of expected" + } else { + fail "Available variable >$v< NOT in list of expected" + } + } + } + foreach v $lExpectedVars { + if {[lsearch $lVars $v] >= 0} { + pass "Expected variable >$v< in list of available" + } else { + fail "Expected variable >$v< NOT in list of available" + } + } +} + +checkVars diff --git a/contrib/bluegnu2.0.3/testsets/BlueGnu/prependQueue.itcl b/contrib/bluegnu2.0.3/testsets/BlueGnu/prependQueue.itcl new file mode 100644 index 0000000..66bf2ab --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/BlueGnu/prependQueue.itcl @@ -0,0 +1,6 @@ +# +# Test script for prependQueue command +# + +prependQueue [list namespaceVariables.itcl namespaceVariables.itcl \ + namespaceVariables.itcl] arg2 prepend diff --git a/contrib/bluegnu2.0.3/testsets/BlueGnu/runtest.itcl b/contrib/bluegnu2.0.3/testsets/BlueGnu/runtest.itcl new file mode 100644 index 0000000..0768026 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/BlueGnu/runtest.itcl @@ -0,0 +1,19 @@ +# +# This script is testing the runtest command +# + +#runtest [list A.itcl\[1\]=arg A.itcl\[2\]=arg] +runtest [list namespaceVariables.itcl namespaceVariables.itcl] + +#note "test scripts: >>>>\n[join [parseTest A.itcl A.itcl\[2=x=y\]=arg2 \ + [list A.itcl\[1\] A.itcl]] "\n"]<<<<" +#note "test scripts: >>>>\n[join [appendTestCaseID [appendArguments \ + [parseTest A.itcl A.itcl\[2=x=y\]=arg2 \ + [list A.itcl\[1\] A.itcl]] XYZ=abc] DEF] "\n"]<<<<" + +#note "test scripts: >[appendTestCaseID \ + [list A.itcl\[DEF\]=xyz=100 A.itcl\[GHI\]=xyz=200] =SSN=00101001]<" + +#note "test scripts: >[appendArguments \ + [list A.itcl A.itcl=SSN=001010001 \ + A.itcl\[1\] A.itcl\[2\]=SSN=001010001] BODS=ABC]<" \ No newline at end of file diff --git a/contrib/bluegnu2.0.3/testsets/BlueGnu/testNaming.itcl b/contrib/bluegnu2.0.3/testsets/BlueGnu/testNaming.itcl new file mode 100644 index 0000000..af13995 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/BlueGnu/testNaming.itcl @@ -0,0 +1,19 @@ +# +# This test script test the commands: +# appendArguments +# appendTestCaseID +# + + +note "[appendTestCaseID A ID]" +note "[appendTestCaseID [list A B C] ID]" +note "[appendTestCaseID A ID=arg1=100]" +note "[appendTestCaseID [list A B C] ID=arg2]" +note "[appendTestCaseID [appendArguments A arg1] ID]" +note "[appendArguments [appendTestCaseID B ID] arg1]" +note "[appendTestCaseID [appendArguments [list A B C] arg1] ID]" +note "[appendArguments [appendTestCaseID [list X Y Z] ID] arg1]" +note "[appendTestCaseID [appendArguments [list A B C] \ + "arg1=1 arg2 arg3=100"] ID]" +note "[appendArguments [appendTestCaseID [list X Y Z] ID] \ + "arg1=1 arg2 arg3=100"]" diff --git a/contrib/bluegnu2.0.3/testsets/BlueGnu/ts001/A.itcl b/contrib/bluegnu2.0.3/testsets/BlueGnu/ts001/A.itcl new file mode 100644 index 0000000..b3ac5f9 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/BlueGnu/ts001/A.itcl @@ -0,0 +1 @@ +note "ts001/A.itcl" diff --git a/contrib/bluegnu2.0.3/testsets/BlueGnu/ts002/A.itcl b/contrib/bluegnu2.0.3/testsets/BlueGnu/ts002/A.itcl new file mode 100644 index 0000000..9d61374 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/BlueGnu/ts002/A.itcl @@ -0,0 +1 @@ +note "ts002/A.itcl" diff --git a/contrib/bluegnu2.0.3/testsets/BlueGnu/types.itcl b/contrib/bluegnu2.0.3/testsets/BlueGnu/types.itcl new file mode 100644 index 0000000..0911f9c --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/BlueGnu/types.itcl @@ -0,0 +1,55 @@ +# -*-Tcl-*- +# +# Checking Type definition +# + +verbose "auto_path: >[set auto_path]<" + +verbose [Type A 100] +verbose [set A] +verbose $A +verbose [A value] + +namespace eval TN { + verbose [Type B 200] + verbose [set B] + verbose $B + verbose [B value] + verbose [::itcl::find objects] +} + +verbose [::itcl::find objects] + +namespace eval TN { + verbose [::itcl::find objects] +} + +proc Y {} { + proc YY {} { + puts "in YY" + } + set Tmp 100 + verbose {[Type C 200]} + verbose {[set C]} + verbose {$C} + verbose {[C value]} + verbose {[set C 400]} + verbose {[set C]} + verbose {Locals: >[info locals]<} + verbose {Globals: >[info globals]<} + verbose {Vars: >[info vars]<} + verbose {Commands: >[lsort [split [info commands]]]<} + verbose {[::itcl::find objects]} + verbose {A: >[A value]<} +} + +verbose "################################ Doing Y" +Y +YY +rename Y "" +YY + +verbose {[::itcl::find objects]} + +verbose [Type Z text] +delete object Z diff --git a/contrib/bluegnu2.0.3/testsets/BlueGnu/verbose.itcl b/contrib/bluegnu2.0.3/testsets/BlueGnu/verbose.itcl new file mode 100644 index 0000000..90d208f --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/BlueGnu/verbose.itcl @@ -0,0 +1,562 @@ +# +# test for verbose levels +# +# + +global verbose + +verbose "verbose level: >$verbose<" 0 + +# Modify output procedures to return instead of doing output +# +uplevel #0 { + rename send_user send_user_saved + rename send_error send_error_saved + rename send_log send_log_saved + proc send_user args { + eval return "\{USER: [join $args]\}" + } + proc send_error args { + eval return "\{ERROR: [join $args]\}" + } + proc send_log args { + eval return "\{LOG: [join $args]\}" + } +} + +# Checkin verbose with out any swicthes +# +foreach level {0 1} { + set szV [verbose "some text" $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + pass "$szV" + } else { + fail "Expected NL at end of >$szV<" + } + } + } else { + fail "Didn't used send_user" + } + } + } + + set szV [verbose {[set l some text]} $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + pass "$szV" + } else { + fail "Expected NL at end of >$szV<" + } + } else { + fail "Didn't detect ERROR in commands >$szV<" + } + } else { + fail "Didn't used send_user" + } + } + } + + set szV [verbose {[set l "some text"]} $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + pass "$szV" + } else { + fail "Expected NL at end of >$szV<" + } + } + } else { + fail "Didn't used send_user" + } + } + } +} + +# checking verbose -- +# +foreach level {0 1} { + set szV [verbose -- "some text" $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + pass "$szV" + } else { + fail "Expected NL at end of >$szV<" + } + } + } else { + fail "Didn't used send_user" + } + } + } + + set szV [verbose -- {[set l some text]} $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + pass "$szV" + } else { + fail "Expected NL at end of >$szV<" + } + } else { + fail "Didn't detect ERROR in commands >$szV<" + } + } else { + fail "Didn't used send_user" + } + } + } + + set szV [verbose -- {[set l "some text"]} $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + pass "$szV" + } else { + fail "Expected NL at end of >$szV<" + } + } + } else { + fail "Didn't used send_user" + } + } + } +} + +# Checking verbose -n (Suppress NL) +# +foreach level {0 1} { + set szV [verbose -n "some text" $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + fail "Didn't expected NL at end of >$szV<" + } else { + pass "$szV" + } + } + } else { + fail "Didn't used send_user" + } + } + } + + set szV [verbose -n {[set l some text]} $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + fail "Didn't expected NL at end of >$szV<" + } else { + pass "$szV" + } + } else { + fail "Didn't detect ERROR in commands >$szV<" + } + } else { + fail "Didn't used send_user" + } + } + } + + set szV [verbose -n {[set l "some text"]} $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + fail "Didn't expected NL at end of >$szV<" + } else { + pass "$szV" + } + } + } else { + fail "Didn't used send_user" + } + } + } +} + +# checking verbose -log +# +foreach level {0 1} { + set szV [verbose -log "some text" $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if {$level > $verbose} { + if [regexp "^LOG:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + pass "$szV" + } else { + fail "Expected NL at end of >$szV<" + } + } + } else { + fail "Didn't used send_user" + } + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + pass "$szV" + } else { + fail "Expected NL at end of >$szV<" + } + } + } else { + fail "Didn't used send_user" + } + } + } + } + + set szV [verbose -log {[set l some text]} $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if {$level > $verbose} { + if [regexp "^LOG:" $szV] { + if [regexp "ERROR:" $szV] { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + pass "$szV" + } else { + fail "Expected NL at end of >$szV<" + } + } else { + fail "Didn't detect ERROR in commands >$szV<" + } + } else { + fail "Didn't used send_user" + } + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + pass "$szV" + } else { + fail "Expected NL at end of >$szV<" + } + } else { + fail "Didn't detect ERROR in commands >$szV<" + } + } else { + fail "Didn't used send_user" + } + } + } + } + + set szV [verbose -log {[set l "some text"]} $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if {$level > $verbose} { + if [regexp "^LOG:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + pass "$szV" + } else { + fail "Expected NL at end of >$szV<" + } + } + } else { + fail "Didn't used send_user" + } + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + pass "$szV" + } else { + fail "Expected NL at end of >$szV<" + } + } + } else { + fail "Didn't used send_user" + } + } + } + } +} + +# checking verbose -n -log +# +foreach level {0 1} { + set szV [verbose -n -log "some text" $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if {$level > $verbose} { + if [regexp "^LOG:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + fail "Didn't expected NL at end of >$szV<" + } else { + pass "$szV" + } + } + } else { + fail "Didn't used send_user" + } + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + fail "Didn't expected NL at end of >$szV<" + } else { + pass "$szV" + } + } + } else { + fail "Didn't used send_user" + } + } + } + } + + set szV [verbose -log -n {[set l some text]} $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if {$level > $verbose} { + if [regexp "^LOG:" $szV] { + if [regexp "ERROR:" $szV] { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + fail "Didn't expected NL at end of >$szV<" + } else { + pass "$szV" + } + } else { + fail "Didn't detect ERROR in commands >$szV<" + } + } else { + fail "Didn't used send_user" + } + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + fail "Didn't expected NL at end of >$szV<" + } else { + pass "$szV" + } + } else { + fail "Didn't detect ERROR in commands >$szV<" + } + } else { + fail "Didn't used send_user" + } + } + } + } + + set szV [verbose -n -log -- {[set l "some text"]} $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, output expected" + } else { + if {[string length $szV] == 0} { + pass "No output expected" + } else { + if {$level > $verbose} { + if [regexp "^LOG:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + fail "Didn't expected NL at end of >$szV<" + } else { + pass "$szV" + } + } + } else { + fail "Didn't used send_user" + } + } else { + if [regexp "^USER:" $szV] { + if [regexp "ERROR:" $szV] { + fail "Did detect ERROR in commands >$szV<" + } else { + if {[string compare \ + [string range $szV end end] "\n"] == 0} { + fail "Didn't expected NL at end of >$szV<" + } else { + pass "$szV" + } + } + } else { + fail "Didn't used send_user" + } + } + } + } +} + +if {$verbose >= 1} { + set szV [verbose -n -BB -log -- {[set l "some text"]} $level] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, ERROR output expected" + } else { + if [regexp "^ERROR:.*illegal argument:" $szV] { + setup_xfail + } + fail "$szV" + } + + set szV [verbose] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, ERROR output expected" + } else { + if [regexp "^ERROR:.*nothing to print$" $szV] { + setup_xfail + } + fail "$szV" + } + + set szV [verbose -n --] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, ERROR output expected" + } else { + if [regexp "^ERROR:.*nothing to print$" $szV] { + setup_xfail + } + fail "$szV" + } + + set szV [verbose -n -- ABC def 100] + if {[string length $szV] == 0 && $level <= $verbose} { + fail "verbose level $level, ERROR output expected >$szV<" + } else { + if [regexp "^ERROR:.*Too many arguments$" $szV] { + setup_xfail + } + fail "$szV" + } +} else { + warning "NO verbose error returns tester, verbose level < 1" +} + +# Restore original procedures +# +uplevel #0 { + rename send_user "" + rename send_error "" + rename send_log "" + rename send_user_saved send_user + rename send_error_saved send_error + rename send_log_saved send_log +} diff --git a/contrib/bluegnu2.0.3/testsets/examples/lib/benchmark.itcl b/contrib/bluegnu2.0.3/testsets/examples/lib/benchmark.itcl new file mode 100644 index 0000000..b8f589c --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/examples/lib/benchmark.itcl @@ -0,0 +1,64 @@ +# +# + +namespace eval ::tc002 { + if {[::itcl::find classes Benchmark] != "Benchmark"} { + class Benchmark { + inherit ::BlueGnu::Benchmark + + public constructor {args} { + } + + public method benchmark {benchmarkFunction args} { + verbose {******* ${this}::benchmark\ + $benchmarkFunction $args} + verbose "Length Args is >[llength $args]<" 2 + set bResult 0 + switch -exact $benchmarkFunction { + English { + set bResult 1 + } + Dutch { + set bResult 1 + } + } + if $bResult { + pass "[info class]::benchmark\ + $benchmarkFunction $args" + } else { + fail "[info class]::benchmark\ + $benchmarkFunction $args" + } + return $bResult + } + } + + class English { + inherit ::tc002::Benchmark + + public constructor {args} { + eval ::BlueGnu::Benchmark::constructor $args + ::tc002::Benchmark::constructor + } { + verbose "******* Initialize Priority Benchmark Values" + foreach i [lsort [array names ARG]] { + verbose { ARG($i): >$ARG($i)<} 2 + } + } + } + + class Dutch { + inherit ::tc002::Benchmark + + public constructor {args} { + eval ::BlueGnu::Benchmark::constructor $args + ::tc002::Benchmark::constructor + } { + verbose "******* Initialize Priority Benchmark Values" + foreach i [lsort [array names ARG]] { + verbose { ARG($i): >$ARG($i)<} 2 + } + } + } + } +} \ No newline at end of file diff --git a/contrib/bluegnu2.0.3/testsets/examples/tc001 b/contrib/bluegnu2.0.3/testsets/examples/tc001 new file mode 100644 index 0000000..bc76f0d --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/examples/tc001 @@ -0,0 +1,3 @@ +set MSG "Hello World" +processTestScriptArgs +note $MSG diff --git a/contrib/bluegnu2.0.3/testsets/examples/tc002 b/contrib/bluegnu2.0.3/testsets/examples/tc002 new file mode 100644 index 0000000..1ec0192 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/examples/tc002 @@ -0,0 +1,3 @@ +set MSG "Hello World" +processTestScriptArgs +benchmark $szTestCaseID $MSG diff --git a/contrib/bluegnu2.0.3/testsets/examples/ts_001 b/contrib/bluegnu2.0.3/testsets/examples/ts_001 new file mode 100644 index 0000000..354941c --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/examples/ts_001 @@ -0,0 +1,2 @@ +appendQueue examples/tc002\[English=B\] +appendQueue examples/tc002\[Dutch=B\]={MSG=Hallo Wereld} diff --git a/contrib/bluegnu2.0.3/testsets/examples/ts_002 b/contrib/bluegnu2.0.3/testsets/examples/ts_002 new file mode 100644 index 0000000..ff5ccc0 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/examples/ts_002 @@ -0,0 +1,4 @@ +appendQueue [appendTestCaseID \ + [locateFile tc002 examples] English=A] +appendQueue [appendArguments [appendTestCaseID \ + [locateFile tc002 examples] Dutch=A] "{MSG=Hallo Wereld}"] diff --git a/contrib/bluegnu2.0.3/testsets/examples/ts_003 b/contrib/bluegnu2.0.3/testsets/examples/ts_003 new file mode 100644 index 0000000..146b551 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/examples/ts_003 @@ -0,0 +1,2 @@ +appendQueue tc002 {} English=B +appendQueue tc002 {MSG=Hallo Wereld} Dutch=B diff --git a/contrib/bluegnu2.0.3/testsets/examples/versionTcl.itcl b/contrib/bluegnu2.0.3/testsets/examples/versionTcl.itcl new file mode 100644 index 0000000..94c9b82 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/examples/versionTcl.itcl @@ -0,0 +1,8 @@ +if [doCmd {set tcl_version} errorCode=NONE \ + return=[list [list 1 8.0]] V] { + # code when failure: + # variable tcl_version does not exists or + # does not return 8.0 +} else { + # variable V will contain 8.0 +} diff --git a/contrib/bluegnu2.0.3/testsets/tclIndex b/contrib/bluegnu2.0.3/testsets/tclIndex new file mode 100644 index 0000000..70fa126 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsets/tclIndex @@ -0,0 +1,5 @@ +# Tcl autoload index file: each line identifies a Tcl + +::tc002::Benchmark examples/lib/benchmark.itcl +::tc002::English examples/lib/benchmark.itcl +::tc002::Dutch examples/lib/benchmark.itcl diff --git a/contrib/bluegnu2.0.3/testsuite/Makefile.in b/contrib/bluegnu2.0.3/testsuite/Makefile.in new file mode 100644 index 0000000..405ca3d --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/Makefile.in @@ -0,0 +1,100 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1994, 1995 Free Software Foundation, Inc. +# Copyright (C) 1998 jotOmega dsc, 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 1, 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. +# + +# directory specifics +VPATH = @srcdir@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +host = @host@ + +.PHONY: info install-info check installcheck dvi install +info: +install: +dvi: +install-info: +check: +installcheck: +.NOEXPORT: +TCLHDIR = @TCLHDIR@ + +BLUEGNUFLAGS = +EXPECT = ` \ + if [ -f $${rootme}/../../expect/expect ] ; then \ + echo $${rootme}/../../expect/expect ; \ + else echo expect ; fi` + +BLUEGNU = ` \ + if [ -f ${srcdir}/../bluegnu ] ; then \ + echo ${srcdir}/../bluegnu ; \ + else echo bluegnu ; fi` + + +all: + +check: site.exp all + rootme=`pwd`; export rootme; \ + srcdir=${srcdir} ; export srcdir ; \ + EXPECT=${EXPECT} ; export EXPECT ; \ + if [ -f $${rootme}/../../expect/expect ] ; then \ + TCL_LIBRARY=`echo @TCLHDIR@ | sed -e 's/-I//' -e 's/generic/library/'` ; \ + export TCL_LIBRARY ; fi ; \ + ${BLUEGNU} ${BLUEGNUFLAGS} BLUEGNU=${BLUEGNU} --tool bluegnu --srcdir ${srcdir} + +site.exp: ./config.status Makefile + @echo "Making a new config file..." + -@rm -f ./tmp? + @touch site.exp + -@mv site.exp site.bak + @echo "## these variables are automatically generated by make ##" > ./tmp0 + @echo "# Do not edit here. If you wish to override these values" >> ./tmp0 + @echo "# add them to the last section" >> ./tmp0 + @echo "set tool bluegnu" >> ./tmp0 + @echo "set srcdir ${srcdir}" >> ./tmp0 + @echo "set objdir `pwd`" >> ./tmp0 + @echo "set host_triplet ${host}" >> ./tmp0 + @echo "set tmpdir `pwd`/tmpdir" >> ./tmp0 + @echo "## All variables above are generated by configure. Do Not Edit ##" >> ./tmp0 + @cat ./tmp0 > site.exp + @cat site.bak | sed \ + -e '1,/^## All variables above are.*##/ d' >> site.exp + -@rm -f ./tmp? + +clean mostlyclean: + -rm -f \#* *~ core *.o a.out xgdb *.x + -rm -f [Ee]rrs tags mklog ${OBJS} ${PROG} x.* xXx.* + +distclean maintainer-clean realclean: clean + -rm -f Makefile + -rm -f config.status config.log config.cache + -rm -f calc.h calc.log calc.plog calc.psum confdefs.h + -rm -f calc.sum site.exp + -rm -rf tmpdir + +Makefile: $(srcdir)/Makefile.in $(host_makefile_frag) config.status + @echo "Rebuilding the Makefile..." + $(SHELL) ./config.status + +configure: $(srcdir)/configure.in $(srcdir)/Makefile.in $(srcdir)/../aclocal.m4 + @echo "Rebuilding configure..." + @cd ${srcdir} ;\ + autoconf --localdir=${srcdir}/.. + +config.status: + @echo "Rebuilding config.status..." + $(SHELL) ./config.status --recheck diff --git a/contrib/bluegnu2.0.3/testsuite/T/env.exp b/contrib/bluegnu2.0.3/testsuite/T/env.exp new file mode 100644 index 0000000..ce48f79 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/T/env.exp @@ -0,0 +1,12 @@ + +uplevel #0 { + foreach var [lsort [info globals]] { + if {[array exists $var]} { + foreach index [lsort [array names $var]] { + puts "${var}($index)=[set ${var}($index)]" + } + } else { + puts "$var=[set $var]" + } + } +} diff --git a/contrib/bluegnu2.0.3/testsuite/T/env.iexp b/contrib/bluegnu2.0.3/testsuite/T/env.iexp new file mode 100644 index 0000000..ca29e5f --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/T/env.iexp @@ -0,0 +1,48 @@ + +puts "======= Environment (Start) =======" + +foreach item [lsort [array names env]] { + if [catch {puts " env($item)=$env($item)"} szErrMsg] { + puts "******* >> msg : $szErrMsg" + puts "******* >> errorInfo: [uplevel #0 set errorInfo]" + puts "******* >> errorCode: [uplevel #0 set errorCode]" + } +} + +foreach info [list {info locals} \ + {info globals} {uplevel #0 info globals} \ + {info vars}] { + puts "=== Command: $info" + foreach item [lsort [eval $info]] { + if [catch {puts " $item=>[eval set $item]<"} szErrMsg] { + if [regexp "variable is array" $szErrMsg] { + foreach elem [lsort [array names $item]] { + puts " ${item}($elem)=>[set ${item}($elem)]<" + } + } else { + puts "******* >> msg : $szErrMsg" + puts "******* >> errorInfo: [uplevel #0 set errorInfo]" + puts "******* >> errorCode: [uplevel #0 set errorCode]" + } + } + } +} + +foreach info [list {namespace all} \ + {namespace children} {namespace parent} \ + classes commands context level library locals \ + objects patchlevel procs script tclversion] { + puts "=== info $info" + foreach item [lsort [eval info $info]] { + puts " $item" + } +} + +puts "argv: [set argv]" +puts "szTestName: [set szTestName]" +catch {puts "lTestName : $lTestName"} +$szTestName pass +puts [$szTestName <<] + +#runtest ::E0 env.iexp +puts "======= Environment (End) =======" diff --git a/contrib/bluegnu2.0.3/testsuite/T/foo.exp b/contrib/bluegnu2.0.3/testsuite/T/foo.exp new file mode 100644 index 0000000..c5f9770 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/T/foo.exp @@ -0,0 +1,5 @@ +appendQueue env.iexp +appendQueue ../tools/env.exp +appendQueue env.iexp +appendQueue ../tools/env.exp +appendQueue ../tools/foo.exp diff --git a/contrib/bluegnu2.0.3/testsuite/T/subT/test_002.exp b/contrib/bluegnu2.0.3/testsuite/T/subT/test_002.exp new file mode 100644 index 0000000..a887fc9 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/T/subT/test_002.exp @@ -0,0 +1,20 @@ + +puts "Test test_002.exp: level [info level]" +puts "szTestName: [set szTestName]" +puts "lTestName : $lTestName" + +namespace ::Common { + if [info exists i] { + if {[expr $i % 2]} { + puts " Remainder is 1 >$i<" + incr i + return + } else { + puts " Zero remainder >$i<" + incr i + } + puts " === End: $env(SHELL)" + } else { + puts "#### i doesn't exists" + } +} diff --git a/contrib/bluegnu2.0.3/testsuite/T/test_000.exp b/contrib/bluegnu2.0.3/testsuite/T/test_000.exp new file mode 100644 index 0000000..9548c1c --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/T/test_000.exp @@ -0,0 +1,8 @@ + +namespace Common { + private variable iCount 0 +} + +verbose "prepeding test_001.exp" +prependQueue test_001.exp +pass "test_000.exp" diff --git a/contrib/bluegnu2.0.3/testsuite/T/test_001.exp b/contrib/bluegnu2.0.3/testsuite/T/test_001.exp new file mode 100644 index 0000000..0ecd02b --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/T/test_001.exp @@ -0,0 +1,19 @@ + +verbose "Test test_001.exp: level [info level]" +verbose "Global tools: [uplevel #0 set szCurrentTestDirectory]" + +appendQueue test_003.exp=1 +prependQueue test_003.exp=2 test_003.exp=3 +verbose "Context: [info context]" +runtest test_003.exp=R0 +appendQueue test_003.exp=A0 +prependQueue test_003.exp=A2 test_003.exp=A3 + +namespace Common { + incr iCount + verbose "Counter is $iCount" + if {$iCount < 5} { + prependQueue test_001.exp + } + pass "test_001.exp: iCount - $iCount" +} diff --git a/contrib/bluegnu2.0.3/testsuite/T/test_002.exp b/contrib/bluegnu2.0.3/testsuite/T/test_002.exp new file mode 100644 index 0000000..e1a185a --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/T/test_002.exp @@ -0,0 +1,22 @@ + +verbose "Test test_002.exp: level [info level]" +verbose "szTestName: [set szTestName]" +verbose "lTestName : $lTestName" +pass +namespace ::Common { + if [info exists i] { + if {[expr $i % 2]} { + verbose " Remainder is 1 >$i<" + incr i + pass "karel" + return + } else { + verbose " Zero remainder >$i<" + fail "pieter" + incr i + } + verbose " === End: $env(SHELL)" + } else { + verbose "#### i doesn't exists" + } +} diff --git a/contrib/bluegnu2.0.3/testsuite/T/test_003.exp b/contrib/bluegnu2.0.3/testsuite/T/test_003.exp new file mode 100644 index 0000000..32c0481 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/T/test_003.exp @@ -0,0 +1,3 @@ + +verbose "t003.exp == $lArgs" +pass "t003.exp == $lArgs" \ No newline at end of file diff --git a/contrib/bluegnu2.0.3/testsuite/T/test_004.exp b/contrib/bluegnu2.0.3/testsuite/T/test_004.exp new file mode 100644 index 0000000..6cda091 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/T/test_004.exp @@ -0,0 +1,3 @@ + +puts " in test 4" +pass "test 4" \ No newline at end of file diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/clone_output.test b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/clone_output.test new file mode 100644 index 0000000..2b5178f --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/clone_output.test @@ -0,0 +1,68 @@ +# test clone_output + +set srcdir [lindex $argv 0] +set subdir [lindex $argv 1] +set objdir [lindex $argv 2] + +if [ file exists $objdir/setval.tmp ] { + source $objdir/setval.tmp +} else { + puts "ERROR: $objdir/setval.tmp doesn't exist" +} +if [ file exists $srcdir$subdir/default_procs.tcl ] { + source "$srcdir$subdir/default_procs.tcl" +} else { + puts "ERROR: $srcdir$subdir/default_procs.tcl doesn't exist" +} +if [ file exists $srcdir/../lib/framework.exp] { + source $srcdir/../lib/framework.exp +} else { + puts "ERROR: $srcdir/../lib/framework.exp doesn't exist" +} + +set all_flag 0 +global all_flag +set errno "" + +# stuff that shouldn't print anything without all_flag set +set all_flag 0 +set tests { + { "lib_pat_test" "clone_output" "PASS: Foo" "" "clone_output(pass) without all_flag set" } + { "lib_pat_test" "clone_output" "UNRESOLVED: Foo" "" "clone_output(unresolved) without all_flag set" } + { "lib_pat_test" "clone_output" "UNSUPPORTED: Foo" "" "clone_output(unsupported) without all_flag set" } + { "lib_pat_test" "clone_output" "UNTESTED: Foo" "" "clone_output(untested) without all_flag set" } + { "lib_pat_test" "clone_output" "ERROR: Bar" "ERROR: Bar" "clone_output(error) without all_flag set" } + { "lib_pat_test" "clone_output" "WARNING: Bar" "WARNING: Bar" "clone_output(warning) without all_flag set" } + { "lib_pat_test" "clone_output" "NOTE: Bar" "NOTE: Bar" "clone_output(note) without all_flag set" } +} + +run_tests $tests + +# tests for all_flag set to 1 +set all_flag 1 +set tests { + { "lib_pat_test" "clone_output" "PASS: Foo" "PASS: Foo" "clone_output(pass) with all_flag set" } + { "lib_pat_test" "clone_output" "XFAIL: Foo" "XFAIL: Foo" "clone_output(xfail) with all_flag set" } + { "lib_pat_test" "clone_output" "UNRESOLVED: Foo" "UNRESOLVED: Foo" "clone_output(unresolved) with all_flag set" } + { "lib_pat_test" "clone_output" "UNSUPPORTED: Foo" "UNSUPPORTED: Foo" "clone_output(unsupported) with all_flag set" } + { "lib_pat_test" "clone_output" "UNTESTED: Foo" "UNTESTED: Foo" "clone_output(untested) with all_flag set" } + { "lib_pat_test" "clone_output" "ERROR: Foo" "ERROR: Foo" "clone_output(error) with all_flag set" } + { "lib_pat_test" "clone_output" "WARNING: Foo" "WARNING: Foo" "clone_output(warning) with all_flag set" } + { "lib_pat_test" "clone_output" "NOTE: Foo" "NOTE: Foo" "clone_output(note) with all_flag set" } +} + +run_tests $tests + + + + + + + + + + + + + + diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/config.test b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/config.test new file mode 100644 index 0000000..3d70572 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/config.test @@ -0,0 +1,138 @@ +# test clone_output + +set srcdir [lindex $argv 0] +set subdir [lindex $argv 1] +set objdir [lindex $argv 2] + +if [ file exists $objdir/setval.tmp ] { + source $objdir/setval.tmp +} else { + puts "ERROR: $objdir/setval.tmp doesn't exist" +} +if [ file exists $srcdir$subdir/default_procs.tcl ] { + source "$srcdir$subdir/default_procs.tcl" +} else { + puts "ERROR: $srcdir$subdir/default_procs.tcl doesn't exist" +} +if [ file exists $srcdir/../lib/framework.exp] { + source $srcdir/../lib/framework.exp +} else { + puts "ERROR: $srcdir/../lib/framework.exp doesn't exist" +} + +set all_flag 1 + +set host_triplet i586-unknown-linux +set target_triplet i586-unknown-linux +set target_cpu i586 +set target_os linux +set build_triplet i586-unknown-linux + +# FIXME: should use run_tests here, but due to Tcl's weird scoping rules, I get +# problems. + +# +# Tests for a native configuration +# +if [isbuild $build_triplet] { + puts "PASSED: isbuild, native" +} else { + puts "FAILED: isbuild, native" +} + +if [isbuild $target_cpu-*-$target_os ] { + puts "PASSED: isbuild, native regexp" +} else { + puts "FAILED: isbuild, native regexp" +} + +if [isbuild hppa-ibm-macos ] { + puts "FAILED: isbuild, native bogus config string" +} else { + puts "PASSED: isbuild, native bogus config string" +} + +# ishost tests +if [ishost $host_triplet] { + puts "PASSED: ishost, native" +} else { + puts "FAILED: ishost, native" +} + +if [ishost $target_cpu-*-$target_os] { + puts "PASSED: ishost, native regexp" +} else { + puts "FAILED: ishost, native regexp" +} + +if [ishost hppa-ibm-macos] { + puts "FAILED: ishost, native bogus config string" +} else { + puts "PASSED: ishost, native bogus config string" +} + +# istarget tests +if [istarget $target_triplet] { + puts "PASSED: istarget, native" +} else { + puts "FAILED: istarget, native" +} + +if [istarget $target_cpu-*-$target_os] { + puts "PASSED: istarget, native regexp" +} else { + puts "FAILED: istarget, native regexp" +} + +if [istarget hppa-ibm-macos] { + puts "FAILED: istarget, native bogus config string" +} else { + puts "PASSED: istarget, native bogus config string" +} + +# native tests +if [isnative] { + puts "PASSED: isnative, native" +} else { + puts "FAILED: isnative, native" +} + +if [is3way] { + puts "FAILED: is3way, native" +} else { + puts "PASSED: is3way, native" +} + +# +# Tests for a normal cross configuration +# +set target_triplet m68k-unknown-elf +if [isnative] { + puts "FAILED: isnative, cross" +} else { + puts "PASSED: isnative, cross" +} + +if [is3way] { + puts "FAILED: is3way, cross" +} else { + puts "PASSED: is3way, cross" +} + +# +# Tests for a canadian cross configuration +# +set host_triplet i386-unknown-winnt +if [isnative] { + puts "FAILED: isnative, canadian cross" +} else { + puts "PASSED: isnative, canadian cross" +} + +if [is3way] { + puts "PASSED: is3way, canadian cross" +} else { + puts "FAILED: is3way, canadian cross" +} + + diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/default_procs.tcl b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/default_procs.tcl new file mode 100644 index 0000000..a0e6f88 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/default_procs.tcl @@ -0,0 +1,94 @@ +set sum_file [open .tmp w] +set reboot 0 +set errno "" + +# this tests a proc for a returned pattern +proc lib_pat_test { cmd arg pattern } { + catch "$cmd \"$arg\"" result + puts "CMD(lib_pat_test) was: $cmd \"$arg\"" + puts "RESULT(lib_pat_test) was: \"${result}\" for pattern \"$pattern\"." + if [ regexp -- "with too many" $result ] { + return -1 + } + if [ string match "$pattern" $result ] { + return 1 + } else { + return 0 + } +} + +# this tests a proc for a returned value +proc lib_ret_test { cmd arg val } { + catch "$cmd \"$arg\"" result +# catch "set result [$cmd $arg]" output +# set result "$cmd [eval $arg] + puts "CMD(lib_ret_test) was: $cmd $arg" + puts "RESULT(lib_ret_test) was: $result" +# puts "OUTPUT(lib_ret_test) was: $output" + + if { $result == $val } { + return 1 + } else { + return 0 + } +} + +# +# This runs a standard test for a proc. The list is set up as: +# |test proc|proc being tested|args|pattern|message| +# test proc is something like lib_pat_test or lib_ret_test. +# +proc run_tests { tests } { + foreach i "$tests" { + set result [ [lindex $i 0] "[lindex $i 1]" "[lindex $i 2]" "[lindex $i 3]" ] + switch -- $result { + "-1" { + puts "ERRORED: [lindex $i 4]" + } + "1" { + puts "PASSED: [lindex $i 4]" + } + "0" { + puts "FAILED: [lindex $i 4]" + } + default { + puts "BAD VALUE: [lindex $i 4]" + } + } + } +} + +proc send_log { msg } { + # this is just a stub for testing +} + +proc pass { msg } { + puts "PASSED: $msg" +} + +proc fail { msg } { + puts "FAILED: $msg" +} + +proc perror { msg } { + global errno + puts "ERRORED: $msg" + set errno "$msg" +} + +proc warning { msg } { + global errno + puts "WARNED: $msg" + set errno "$msg" +} + +proc untested { msg } { + puts "NOTTESTED: $msg" +} + +proc unsupported { msg } { + puts "NOTSUPPORTED: $msg" +} +proc verbose { args } { + puts "[lindex $args 0]" +} diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/libs.exp b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/libs.exp new file mode 100644 index 0000000..77f96b5 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/libs.exp @@ -0,0 +1,73 @@ +load_lib libsup.exp + +proc process_test { test } { + global srcdir + global subdir + global objdir + global EXPECT + + verbose "Executing test case $test" + set text "\[- A-Za-z0-9\,\.\;\"\_\:\'\`\(\)\!\#\=\+\?\&\*]*" + + set timeout 150 + + if [file exists $test] { + verbose "Processing test $test" 2 + spawn -open [open "|$EXPECT $test $srcdir $subdir [pwd]" r] + expect { + "No such file or directory" { + perror "$test wouldn't run" 0 + } + -re "\[\r\n\]*NOTSUPPORTED: $text\[\r\n\]*" { + unsupported "[lrange $expect_out(0,string) 1 end]" + exp_continue + } + -re "\[\r\n\]*NOTTESTED: $text\[\r\n\]*" { + untested "[lrange $expect_out(0,string) 1 end]" + exp_continue + } + -re "\[\r\n\]*PASSED: $text\[\r\n\]*" { + pass "[lrange $expect_out(0,string) 1 end]" + exp_continue + } + -re "\[\r\n\]*FAILED: $text\[\r\n\]*" { + fail "[lrange $expect_out(0,string) 1 end]" + exp_continue + } + -re "\[\r\n\]*WARNED: $text\[\r\n\]*" { + verbose "$expect_out(0,string)" 2 + exp_continue + } + -re "\[\r\n\]*ERRORED: $text\[\r\n\]*" { + verbose "$expect_out(0,string)" 2 + exp_continue + } + timeout { + perror "$test timed out" 0 + exp_continue + } + eof { + verbose "All Done" 3 + } + } + } else { + perror "$test doesn't exist" 0 + } +} + +if ![info exists EXPECT] { + set EXPECT [findfile $base_dir/../../expect/expect "$base_dir/../../expect/expect" expect] + verbose "EXPECT defaulting to $EXPECT" 2 +} + +make_defaults_file [pwd]/setval.tmp + +foreach i [glob $srcdir/$subdir/*.test] { + process_test $i +} + + + + + + diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/options.exp b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/options.exp new file mode 100644 index 0000000..87777fa --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/options.exp @@ -0,0 +1,91 @@ +# Copyright (C) 1988, 90-92, 1994, 1995 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@welcomehome.org) + +load_lib util-defs.exp + +# move the site.exp file so we have no default to confuse us. +#if [file exists $objdir/site.exp] { +# catch "exec mv -f $objdir/site.exp $objdir/site.ignore" +#} +set fd [open site.exp w] +puts ${fd} "set host_triplet $host_triplet" +puts ${fd} "set srcdir $srcdir/.." +puts ${fd} "set objdir $objdir/.." +puts ${fd} "set tmpdir $objdir/../tmpdir" +close $fd + +# +# Set up the list. +# 1st field is the command line option. +# 2nd field is the pattern to match. +# NOTE - No variable substitutions can be used. +# 3rd field is an optional message to print with PASS/FAIL. +# + + +set tests { + { "" "WARNING: No tool specified" "No arguments" } + { "-v --tool xXx" "Found.*site\..*Loading.*utils\.exp" "Loading library files" } + { "-v --tool xXx" "Expect binary is.*Using.*main test driver" "Loading basic packages" } + { "--F --tool x" "Illegal Argument \"--F\"" "Bad argument" } + { "--tool x" "Couldn't find tool init file" "Bad tool name" } + { "--help" "USAGE:*" "Display help" } + { "-v -v -v" "Verbose level is 3" "Verbose set correctly" } + { "-V" "Expect version is.*Tcl version is.*Framework version is*" "--version" } + { "-v --target m68k-vxworks" "Target is m68k-vxworks" "--target option" } + { "-v --host sparc-sun-sunos4.1.9" "Native configuration is sparc-sun-sunos4.1.9" "--host option" } + { "-v -a" "Print all test output to screen" "--all option" } + { "-v --objdir xXx" "Using test binaries in xXx" "--objdir option" } + { "-v --baud 666" "The baud rate is now 666" "--baud option" } + { "-v --tool xXx" "Testing xXx" "--tool option" } + { "-v --debug" "Expect Debugging is ON" "--debug option" } + { "-v --D0" "Tcl debugger is ON" "--D0 option" } + { "-v --strace 1" "Source Trace level is now 1.* 1 if" "--strace option" } +} + +# Old tests not used anymore +# { "-v --build sparc-sun-sunos4.1.9" "Native configuration is sparc-sun-sunos4.1.9" "--build option" } +# { "-v --srcdir xXx" "Using test sources in xXx" "--srcdir option" } + +foreach i $tests { + if [util_test "$RUNTEST" "[lindex $i 0]" "" "[lindex $i 1]"] { + fail "[lindex $i 2]" + } else { + pass "[lindex $i 2]" + } +} + + +set fd [open site.exp w] +puts ${fd} "set host_triplet $host_triplet" +puts ${fd} "set tool runtest" +puts ${fd} "set srcdir $srcdir" +puts ${fd} "set objdir $objdir" +puts ${fd} "set tmpdir $objdir/tmpdir" +close $fd + +# clean up log files left by the child runtest +if [file exists $objdir/x.sum] { + exec rm -f $objdir/x.* +} +if [file exists $objdir/xXx.sum] { + exec rm -f $objdir/xXx.* +} diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/remote.test b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/remote.test new file mode 100644 index 0000000..9df5e56 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/remote.test @@ -0,0 +1,217 @@ +set srcdir [lindex $argv 0] +set subdir [lindex $argv 1] +set objdir [lindex $argv 2] + +if [ file exists $objdir/setval.tmp ] { + source $objdir/setval.tmp +} else { + puts "ERROR: $objdir/setval.tmp doesn't exist" +} +if [ file exists $srcdir$subdir/default_procs.tcl ] { + source "$srcdir$subdir/default_procs.tcl" +} else { + puts "ERROR: $srcdir$subdir/default_procs.tcl doesn't exist" +} + +set file $srcdir/../lib/remote.exp +if [ file exists $file] { + source $file +} else { + puts "ERROR: $file doesn't exist" +} + +global errno "" + +# +# Create a false target config array +# +set target_info(idp,name) "idp" +set target_info(idp,ldflags) "-Tidp.ld" +set target_info(idp,config) m68k-unknown-aout +set target_info(idp,cflags) "" +set target_info(idp,connect) telnet +set target_info(idp,target) "s12" +set target_info(idp,serial) "tstty12" +set target_info(idp,netport) "localhost:23" +set target_info(idp,baud) "9600" +# MVME target +set target_info(mvme,name) "mvme" +set target_info(mvme,ldflags) "-Tmvme.ld" +set target_info(mvme,config) m68k-unknown-aout +set target_info(mvme,cflags) "" +set target_info(mvme,connect) telnet +set target_info(mvme,target) "s12" +set target_info(mvme,serial) "tstty8" +set target_info(mvme,netport) "localhost:23" +set target_info(mvme,baud) "9600" + +# Test remote open. We try not to use any of the support procs in +# target.exp to for isolation testing. "target" is the name of the +# default array setup by the procs in target.exp. + +set timeout 100 +set errno "" + +# +# Force connection errors +# + +# force an rlogin error +if { [rlogin foobar.barfoo.com] < 0 } { + puts "PASSED: rlogin bogus host" +} else { + puts "FAILED: rlogin bogus" +} + +# force an rsh error +if { [rsh foobar.barfoo.com] < 0 } { + puts "PASSED: rsh bogus host" +} else { + puts "FAILED: rsh bogus" +} + +# force a telnet error +if { [telnet foobar.barfoo.com] < 0 } { + puts "PASSED: telnet bogus host" +} else { + puts "FAILED: telnet bogus" +} + +# +# Connect to localhost +# + +# localhost rlogin test +if { [rlogin localhost] < 0 } { + if [string match "*unencrypted connection" $errno] { + NOTTESTED "rlogin localhost" + } else { + puts "FAILED: rlogin localhost" + } +} else { + puts "PASSED: rlogin localhost" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# localhost rsh test +if { [rsh localhost] < 0 } { + if [string match "*kinit" $errno] { + puts "NOTTESTED: rsh localhost" + } else { + puts "FAILED: rsh localhost" + } +} else { + puts "PASSED: rsh localhost" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# localhost telnet test. In this case it will return +# an error cause we get prompted for a password or login. For +# now this is considered an error, as we usually only +# telnet to a terminal server. +if { [telnet localhost] < 0 } { + if [string match "*password." $errno] { + puts "NOTTESTED: telnet localhost" + } else { + puts "FAILED: telnet localhost" + } +} else { + puts "PASSED: telnet localhost" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# +# Connect to the configured target +# +set target_info(target,netport) $target_info(idp,netport) +set target_info(target,target) localhost +set target_info(target,connect) rlogin +if { [rlogin target] < 0 } { + if [ string match "*kinit" $errno] { + puts "NOTTESTED: rlogin target" + } else { + puts "FAILED: rlogin target" + } +} else { + puts "PASSED: rlogin target" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# test remote_open +if { [rsh target] < 0 } { + if [ string match "*kinit" $errno] { + puts "NOTTESTED: rsh target" + } else { + puts "FAILED: rsh target" + } +} else { + puts "PASSED: rsh target" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# telnet to host +# FIXME: This won't work till we figure out how to telnet and +# not get a password prompt. + +# +# Connect to the configured host +# +set target_info(host,connect) rlogin +set target_info(host,netport) $target_info(idp,netport) +set target_info(host,target) localhost + +# rlogin to host +if { [rlogin host] < 0 } { + if [ string match "*kinit*" $errno] { + puts "NOTTESTED: rlogin host" + } else { + puts "FAILED: rlogin host" + } +} else { + puts "PASSED: rlogin host" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# rsh to host +if { [rsh host] < 0 } { + if [ string match "*kinit*" $errno] { + puts "NOTTESTED: rsh host" + } else { + puts "FAILED: rsh host" + } +} else { + puts "PASSED: rsh host" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# telnet to host +# FIXME: This won't work till we figure out how to telnet and +# not get a password prompt. + +# tip port +# remote_close args +# rcp_download src dest +# tip_download shell_id file +# kermit args +# download args + + + + + + + diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/stats-sub.exp b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/stats-sub.exp new file mode 100644 index 0000000..966bb75 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/stats-sub.exp @@ -0,0 +1,16 @@ +# Subordinate to stats.exp. + +# If not called by stats.exp, quit now. +if { ![info exists STATS_TEST] } { + return +} + +switch $STATS_TEST { + pass { pass "pass test" } + fail { fail "fail test" } + xpass { xpass "xpass test" } + xfail { xfail "xfail test" } + untested { untested "untested test" } + unresolved { unresolved "unresolved test" } + unsupported { unsupported "unsupported test" } +} \ No newline at end of file diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/stats.exp b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/stats.exp new file mode 100644 index 0000000..3b30f9d --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/stats.exp @@ -0,0 +1,49 @@ +# Copyright (C) 1995 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 tests pass/fail/etc. +# The way we do this is to recursively invoke ourselves on a small testsuite +# and analyze the results. + +load_lib util-defs.exp + +if ![file isdirectory $tmpdir] { + catch "exec mkdir $tmpdir" +} + +set tests { + { pass "expected passes\[ \t\]+1\n" } + { fail "unexpected failures\[ \t\]+1\n" } + { xpass "unexpected successes\[ \t\]+1\n" } + { xfail "expected failures\[ \t\]+1\n" } + { untested "untested testcases\[ \t\]+1\n" } + { unresolved "unresolved testcases\[ \t\]+1\n" } + { unsupported "unsupported tests\[ \t\]+1\n" } +} + +foreach t $tests { + if [util_test "$RUNTEST" \ + "--outdir $tmpdir STATS_TEST=[lindex $t 0] stats-sub.exp" \ + "" \ + [lindex $t 1]] { + fail [lindex $t 0] + } else { + pass [lindex $t 0] + } +} diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/target.test b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/target.test new file mode 100644 index 0000000..8c18980 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/target.test @@ -0,0 +1,247 @@ +set srcdir [lindex $argv 0] +set subdir [lindex $argv 1] +set objdir [lindex $argv 2] + +if [ file exists $objdir/setval.tmp ] { + source $objdir/setval.tmp +} else { + puts "ERROR: $objdir/setval.tmp doesn't exist" +} +if [ file exists $srcdir$subdir/default_procs.tcl ] { + source "$srcdir$subdir/default_procs.tcl" +} else { + puts "ERROR: $srcdir$subdir/default_procs.tcl doesn't exist" +} + +set file $srcdir/../lib/target.exp +if [ file exists $file] { + source $file +} else { + puts "ERROR: $file doesn't exist" +} +# we load framework so we can use stuff like is3way +set file $srcdir/../lib/framework.exp +if [ file exists $file] { + source $file +} else { + puts "ERROR: $file doesn't exist" +} +# we load the remote stuff so we can test execute_anywhere +set file $srcdir/../lib/remote.exp +if [ file exists $file] { + source $file +} else { + puts "ERROR: $file doesn't exist" +} + +# +# Create a false target config array +# +set target_info(idp,name) "idp" +set target_info(idp,ldflags) "-Tidp.ld" +set target_info(idp,config) m68k-unknown-aout +set target_info(idp,cflags) "" +set target_info(idp,connect) "telnet" +set target_info(idp,target) "s12" +set target_info(idp,serial) "tstty12" +set target_info(idp,netport) "localhost:23" +set target_info(idp,baud) "9600" +# MVME target +set target_info(mvme,name) "mvme" +set target_info(mvme,ldflags) "-Tmvme.ld" +set target_info(mvme,config) m68k-unknown-aout +set target_info(mvme,cflags) "" +set target_info(mvme,connect) "telnet" +set target_info(mvme,target) "s12" +set target_info(mvme,serial) "tstty8" +set target_info(mvme,netport) "localhost:23" +set target_info(mvme,baud) "9600" + +# Test remote open. We try not to use any of the support procs in +# target.exp to for isolation testing. "target" is the name of the +# default array setup by the procs in target.exp. + +set timeout 100 + +# test list_target + +if { [list_targets] == "idp mvme" } { + puts "PASSED: list_targets" +} else { + puts "FAILED: list_targets" +} +push_config target idp +set matches 0 +if { $target_info(target,name) == "idp" } { + incr matches +} +if { $target_info(target,ldflags) == "-Tidp.ld" } { + incr matches +} +if { $target_info(target,config) == "m68k-unknown-aout" } { + incr matches +} +if { $target_info(target,cflags) == "" } { + incr matches +} +if { $target_info(target,connect) == "telnet" } { + incr matches +} +if { $target_info(target,target) == "s12" } { + incr matches +} +if { $target_info(target,serial) == "tstty12" } { + incr matches +} +if { $target_info(target,netport) == "localhost:23" } { + incr matches +} +if { $target_info(target,baud) == "9600" } { + incr matches +} +if { $matches == 9 } { + puts "PASSED: push_config target" +} else { + puts "FAILED: push_config target" +} + +# test pop_config target +pop_config target +set matches 0 +if { $target_info(target,name) == "" } { + incr matches +} +if { $target_info(target,ldflags) == "" } { + incr matches +} +if { $target_info(target,config) == "" } { + incr matches +} +if { $target_info(target,cflags) == "" } { + incr matches +} +if { $target_info(target,connect) == "" } { + incr matches +} +if { $target_info(target,target) == "" } { + incr matches +} +if { $target_info(target,serial) == "" } { + incr matches +} +if { $target_info(target,netport) == "" } { + incr matches +} +if { $target_info(target,baud) == "" } { + incr matches +} +if { $matches == 9 } { + puts "PASSED: pop_config target" +} else { + puts "FAILED: pop_config target" +} + +push_config host idp +set matches 0 +if { $target_info(host,name) == "idp" } { + incr matches +} +if { $target_info(host,ldflags) == "-Tidp.ld" } { + incr matches +} +if { $target_info(host,config) == "m68k-unknown-aout" } { + incr matches +} +if { $target_info(host,cflags) == "" } { + incr matches +} +if { $target_info(host,connect) == "telnet" } { + incr matches +} +if { $target_info(host,target) == "s12" } { + incr matches +} +if { $target_info(host,serial) == "tstty12" } { + incr matches +} +if { $target_info(host,netport) == "localhost:23" } { + incr matches +} +if { $target_info(host,baud) == "9600" } { + incr matches +} +if { $matches == 9 } { + puts "PASSED: push_config target" +} else { + puts "FAILED: push_config target" +} + +# test pop_config host +pop_config host +set matches 0 +if { $target_info(host,name) == "" } { + incr matches +} +if { $target_info(host,ldflags) == "" } { + incr matches +} +if { $target_info(host,config) == "" } { + incr matches +} +if { $target_info(host,cflags) == "" } { + incr matches +} +if { $target_info(host,connect) == "" } { + incr matches +} +if { $target_info(host,target) == "" } { + incr matches +} +if { $target_info(host,serial) == "" } { + incr matches +} +if { $target_info(host,netport) == "" } { + incr matches +} +if { $target_info(host,baud) == "" } { + incr matches +} +if { $matches == 9 } { + puts "PASSED: pop_config host" +} else { + puts "FAILED: pop_config host" +} + +# test execute_anywhere for a native environment +set host_triplet i586-unknown-linux +set target_triplet i586-unknown-linux +set build_triplet i586-unknown-linux +if { [string match "*setval.tmp*" [execute_anywhere "ls"]] } { + puts "PASSED: execute_anywhere, native" +} else { + puts "FAILED: execute_anywhere, native" +} + +# test execute_anywhere for a normal cross +set target_triplet m68k-unknown-coff +if { [string match "*testsuite" [execute_anywhere "pwd"]] } { + puts "PASSED: execute_anywhere, normal cross" +} else { + puts "FAILED: execute_anywhere, normal cross" +} + +# test execute_anywhere for a canadian cross +set build_triplet m68k-test-test +set target_info(host,connect) rlogin +set target_info(host,netport) $target_info(idp,netport) +set target_info(host,target) localhost +if { [string match "*FooBar*" [execute_anywhere "echo FooBar"]] } { + puts "PASSED: execute_anywhere, canadian cross" +} else { + puts "FAILED: execute_anywhere, canadian cross" +} + +# compile arg +# archive arg +# ranlib arg +# link_objects arg diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir1/subfile1 b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir1/subfile1 new file mode 100644 index 0000000..8397fe3 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir1/subfile1 @@ -0,0 +1 @@ +# just so we don't look empty. diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir1/subfile2 b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir1/subfile2 new file mode 100644 index 0000000..7d1d836 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir1/subfile2 @@ -0,0 +1,2 @@ +# just so we don't look empty. + diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir1/subsubdir1/subsubfile1 b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir1/subsubdir1/subsubfile1 new file mode 100644 index 0000000..7d1d836 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir1/subsubdir1/subsubfile1 @@ -0,0 +1,2 @@ +# just so we don't look empty. + diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir2/subfile2 b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir2/subfile2 new file mode 100644 index 0000000..7d1d836 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/topdir/subdir2/subfile2 @@ -0,0 +1,2 @@ +# just so we don't look empty. + diff --git a/contrib/bluegnu2.0.3/testsuite/bluegnu.all/utils.test b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/utils.test new file mode 100644 index 0000000..864c797 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/bluegnu.all/utils.test @@ -0,0 +1,118 @@ +set srcdir [lindex $argv 0] +set subdir [lindex $argv 1] +set objdir [lindex $argv 2] + +if [ file exists $objdir/setval.tmp ] { + source $objdir/setval.tmp +} else { + puts "ERROR: $objdir/setval.tmp doesn't exist" +} +if [ file exists $srcdir$subdir/default_procs.tcl ] { + source "$srcdir$subdir/default_procs.tcl" +} else { + puts "ERROR: $srcdir$subdir/default_procs.tcl doesn't exist" +} + +set file $srcdir/../lib/utils.exp +if [ file exists $file] { + source $file +} else { + puts "ERROR: $file doesn't exist" +} + +# +# getdirs tests +# +if [lib_pat_test "getdirs" "${srcdir}/runtest.all" "runtest.all/topdir" ] { + puts "FAILED: getdirs toplevel, no arguments" +} else { + puts "PASSED: getdirs toplevel, no arguments" +} + +if [lib_pat_test "getdirs" "${srcdir}/runtest.all top*" "runtest.all/topdir" ] { + puts "FAILED: getdirs toplevel, one subdir" +} else { + puts "PASSED: getdirs toplevel, one subdir" +} + +if [lib_pat_test "getdirs" "${srcdir}/runtest.all/topdir" "subdir1*subdir2" ] { + puts "FAILED: getdirs toplevel, two subdirs" +} else { + puts "PASSED: getdirs toplevel, two subdirs" +} + +# +# find tests +# +if [string match "*/subdir2/subfile2" "[find ${srcdir}/runtest.all/topdir/subdir2 sub*]"] { + puts "PASSED: find, only one level deep" +} else { + puts "FAILED: find, only one level deep" +} + +#set path ${srcdir}/runtest.all/topdir/subdir1 +#exp_test "find ${path} sub*" "Adding */subdir1/subsubdir1/subsubfile1" "find, two levels deep" + +if [string match "*/subdir1/subsubdir1/subsubfile1" "[find ${srcdir}/runtest.all/topdir/subdir1 sub*]"] { + puts "PASSED: find, two levels deep" +} else { + puts "FAILED: find, two levels deep" +} + +# +# environment varible utility tests +# + +if [info exists env(TESTRUN)] { + unset env(TESTRUN) +} + +# test setenv +setenv TESTRUN FooBar +if [info exists env(TESTRUN)] { + if { $env(TESTRUN) == "FooBar" } { + pass "setenv, set an environment variable" + } else { + fail "setenv, set an environment variable + } +} else { + fail "setenv, set an environment variable" +} +# test getenv +if [info exists env(TESTRUN)] { + if { [getenv TESTRUN] == "FooBar" } { + pass "getenv, get an environment variable" + } else { + fail "getenv, get an environment variable" + } +} else { + untested "getenv, get an environment variable" +} + +# test unsetenv +if [info exists env(TESTRUN)] { + unsetenv TESTRUN + if [info exists env(TESTRUN)] { + fail "unsetenv, unset an environment variable" + } else { + pass "unsetenv, unset an environment variable" + } +} else { + untested "unsetenv, unset an environment variable" +} + +# which file +# grep args +# prune list pattern +# slay name +# absolute path +# psource file +# diff file_1 file_2 + + + + + + + + diff --git a/contrib/bluegnu2.0.3/testsuite/config/default.exp b/contrib/bluegnu2.0.3/testsuite/config/default.exp new file mode 100644 index 0000000..719c21b --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/config/default.exp @@ -0,0 +1,79 @@ + Copyright (C) 1988, 90-93, 1995 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@welcomehome.org) + +global RUNTEST +if ![info exists RUNTEST] then { + set RUNTEST [transform runtest] +} + +if ![info exists EXPECT] { + set EXPECT [findfile $base_dir/../../expect/expect "$base_dir/../../expect/expect" expect] + verbose "EXPECT defaulting to $EXPECT" 2 +} + +global RUNTESTFLAGS +if ![info exists RUNTESTFLAGS] then { + set RUNTESTFLAGS "-v -v -a" +} + +# +# runtest_version -- extract and print the version number +# +proc runtest_version { } { + global RUNTEST + + catch {exec $RUNTEST -V} tmp + if [info exists tmp] then { + clone_output "$tmp\n" + } +} + +# +# runtest_load -- loads the program. For runtest, this is just a stub +# +proc runtest_load { arg } { +} + +# +# runtest_exit -- exit the test driver for expect +# +proc runtest_exit { } { + close +} + +# +# runtest_start -- start everything +# +proc runtest_start { } { + global verbose + global spawn_id + global subdir + global srcdir + global objdir + global RUNTEST + global RUNTESTFLAGS + + if {[which $RUNTEST] != 0} then { + perror "Can't find $RUNTEST" + } + +# return [open [concat "$RUNTEST $RUNTESTFLAGS"] r] +} diff --git a/contrib/bluegnu2.0.3/testsuite/configure b/contrib/bluegnu2.0.3/testsuite/configure new file mode 100755 index 0000000..560258e --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/configure @@ -0,0 +1,1076 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.7 +# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + --with-tclinclude directory where tcl private headers are" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.7" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LANG+set}" = set; then LANG=C; export LANG; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=Makefile.in + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='echo $CPP $CPPFLAGS 1>&5; +$CPP $CPPFLAGS' +ac_compile='echo ${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5; +${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5' +ac_link='echo ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5; +${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5' + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +# If we cannot run a trivial program, we must be cross compiling. +echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_c_cross=yes +else +cat > conftest.$ac_ext </dev/null; then + ac_cv_c_cross=no +else + ac_cv_c_cross=yes +fi +fi +rm -fr conftest* +fi + +echo "$ac_t""$ac_cv_c_cross" 1>&6 +cross_compiling=$ac_cv_c_cross + + +# +# Ok, lets find the tcl source trees so we can use the headers +# Warning: transition of version 9 to 10 will break this algorithm +# because 10 sorts before 9. We also look for just tcl. We have to +# be careful that we don't match stuff like tclX by accident. +# the alternative search directory is involked by --with-tclinclude +# +no_tcl=true +echo $ac_n "checking for Tcl private headers""... $ac_c" 1>&6 +# Check whether --with-tclinclude or --without-tclinclude was given. +if test "${with_tclinclude+set}" = set; then + withval="$with_tclinclude" + with_tclinclude=${withval} +fi + +if eval "test \"`echo '$''{'ac_cv_c_tclh'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + +# first check to see if --with-tclinclude was specified +if test x"${with_tclinclude}" != x ; then + if test -f ${with_tclinclude}/tclInt.h ; then + ac_cv_c_tclh=`(cd ${with_tclinclude}; pwd)` + else + { echo "configure: error: ${with_tclinclude} directory doesn't contain private headers" 1>&2; exit 1; } + fi +fi +# next check in private source directory +# +# since ls returns lowest version numbers first, reverse its output +if test x"${ac_cv_c_tclh}" = x ; then + for i in \ + ${srcdir}/../tcl \ + `ls -dr ${srcdir}/../tcl[0-9]* 2>/dev/null` \ + ${srcdir}/../../tcl \ + `ls -dr ${srcdir}/../../tcl[0-9]* 2>/dev/null` \ + ${srcdir}/../../../tcl \ + `ls -dr ${srcdir}/../../../tcl[0-9]* 2>/dev/null ` ; do + if test -f $i/tclInt.h ; then + ac_cv_c_tclh=`(cd $i; pwd)` + break + fi + # Tcl 7.5 and greater puts headers in subdirectory. + if test -f $i/generic/tclInt.h ; then + ac_cv_c_tclh=`(cd $i; pwd)`/generic + fi + done +fi +# finally check in a few common install locations +# +# since ls returns lowest version numbers first, reverse its output +if test x"${ac_cv_c_tclh}" = x ; then + for i in \ + `ls -dr /usr/local/src/tcl[0-9]* 2>/dev/null` \ + `ls -dr /usr/local/lib/tcl[0-9]* 2>/dev/null` \ + /usr/local/src/tcl \ + /usr/local/lib/tcl \ + ${prefix}/include ; do + if test -f $i/tclInt.h ; then + ac_cv_c_tclh=`(cd $i; pwd)` + break + fi + done +fi +# see if one is installed +if test x"${ac_cv_c_tclh}" = x ; then + ac_safe=`echo "tclInt.h" | tr './\055' '___'` +echo $ac_n "checking for tclInt.h""... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_cv_c_tclh=installed +else + echo "$ac_t""no" 1>&6 +ac_cv_c_tclh="" +fi + +fi + +fi + +if test x"${ac_cv_c_tclh}" = x ; then + TCLHDIR="# no Tcl private headers found" + { echo "configure: error: Can't find Tcl private headers" 1>&2; exit 1; } +fi +if test x"${ac_cv_c_tclh}" != x ; then + no_tcl="" + if test x"${ac_cv_c_tkh}" = x"installed" ; then + echo "$ac_t""is installed" 1>&6 + TCLHDIR="" + else + echo "$ac_t""found in ${ac_cv_c_tclh}" 1>&6 + # this hack is cause the TCLHDIR won't print if there is a "-I" in it. + TCLHDIR="-I${ac_cv_c_tclh}" + fi +fi + +echo $ac_n "checking Tcl version""... $ac_c" 1>&6 +rm -rf tclmajor tclminor +orig_includes="$CPPFLAGS" + +if test x"${TCLHDIR}" != x ; then + CPPFLAGS="$CPPFLAGS $TCLHDIR" +fi + +if test "$cross_compiling" = yes; then + { echo "configure: error: can't be cross compiled" 1>&2; exit 1; } + +else +cat > conftest.$ac_ext < +#include "tcl.h" +main() { + FILE *maj = fopen("tclmajor","w"); + FILE *min = fopen("tclminor","w"); + fprintf(maj,"%d",TCL_MAJOR_VERSION); + fprintf(min,"%d",TCL_MINOR_VERSION); + fclose(maj); + fclose(min); + return 0; +} +EOF +eval $ac_link +if test -s conftest && (./conftest; exit) 2>/dev/null; then + tclmajor=`cat tclmajor` + tclminor=`cat tclminor` + tclversion=$tclmajor.$tclminor + echo "$ac_t""$tclversion" 1>&6 + rm -f tclmajor tclminor + +else + echo "$ac_t""can't happen" 1>&6 + +fi +fi +rm -fr conftest* +CPPFLAGS="${orig_includes}" + + + + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + +subdirs="calc" + + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ + >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +cat > conftest.defs <<\EOF +s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%-D\1=\2%g +s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g +s%\[%\\&%g +s%\]%\\&%g +s%\$%$$%g +EOF +DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` +rm -f conftest.defs + + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.7" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir + +trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@CPP@%$CPP%g +s%@TCLHDIR@%$TCLHDIR%g +s%@subdirs@%$subdirs%g +s%@host@%$host%g + +CEOF +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust relative srcdir, etc. for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file +fi; done +rm -f conftest.subs + + + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + +if test "$no_recursion" != yes; then + + # Remove --cache-file and --srcdir arguments so they do not pile up. + ac_sub_configure_args= + ac_prev= + for ac_arg in $ac_configure_args; do + if test -n "$ac_prev"; then + ac_prev= + continue + fi + case "$ac_arg" in + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + ;; + *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;; + esac + done + + for ac_config_dir in calc; do + + # Do not complain, so a configure script can configure whichever + # parts of a large source tree are present. + if test ! -d $srcdir/$ac_config_dir; then + continue + fi + + echo configuring in $ac_config_dir + + case "$srcdir" in + .) ;; + *) + if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :; + else + { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; } + fi + ;; + esac + + ac_popdir=`pwd` + cd $ac_config_dir + + case "$srcdir" in + .) # No --srcdir option. We are building in place. + ac_sub_srcdir=$srcdir ;; + /*) # Absolute path. + ac_sub_srcdir=$srcdir/$ac_config_dir ;; + *) # Relative path. + ac_sub_srcdir=../$srcdir/$ac_config_dir ;; + esac + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_sub_srcdir/configure; then + ac_sub_configure=$ac_sub_srcdir/configure + elif test -f $ac_sub_srcdir/configure.in; then + ac_sub_configure=$ac_configure + else + echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2 + ac_sub_configure= + fi + + # The recursion is here. + if test -n "$ac_sub_configure"; then + + # Make the cache file name correct relative to the subdirectory. + # A "../" for each directory in /$ac_config_dir. + ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` + case "$cache_file" in + /*) ac_sub_cache_file=$cache_file ;; + *) # Relative path. + ac_sub_cache_file="$ac_dots$cache_file" ;; + esac + + echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir" + # The eval makes quoting arguments work. + if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir + then : + else + { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; } + fi + fi + + cd $ac_popdir + done +fi + diff --git a/contrib/bluegnu2.0.3/testsuite/configure.in b/contrib/bluegnu2.0.3/testsuite/configure.in new file mode 100644 index 0000000..80b25da --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/configure.in @@ -0,0 +1,9 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(Makefile.in) + +CY_AC_PATH_TCLH + +AC_CONFIG_SUBDIRS(calc) + +AC_SUBST(host) +AC_OUTPUT(Makefile) diff --git a/contrib/bluegnu2.0.3/testsuite/lib/libsup.exp b/contrib/bluegnu2.0.3/testsuite/lib/libsup.exp new file mode 100644 index 0000000..64ef858 --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/lib/libsup.exp @@ -0,0 +1,220 @@ + Copyright (C) 92, 93, 94, 95, 1996 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@welcomehome.org) + +# +# Setup an environment so we can execute library procs without DejaGnu +# + +# +# Create a default environment and start expect. +# +proc make_defaults_file { defs } { + global srcdir + global objdir + global subdir + global build_triplet + global host_triplet + global target_triplet + global target_os + global target_cpu + + # We need to setup default values and a few default procs so we + # can execute library code without DejaGnu + set fd [open $defs w] + puts ${fd} "set tool foobar" + puts ${fd} "set srcdir ${srcdir}" + puts ${fd} "set objdir ${objdir}" + puts ${fd} "set subdir ${subdir}" + puts ${fd} "set build_triplet ${build_triplet}" + puts ${fd} "set host_triplet ${host_triplet}" + puts ${fd} "set target_triplet ${target_triplet}" + puts ${fd} "set target_os ${target_os}" + puts ${fd} "set target_cpu ${target_cpu}" + puts ${fd} "set tool foobar" + puts ${fd} "set testcnt 0" + puts ${fd} "set warncnt 0" + puts ${fd} "set errcnt 0" + puts ${fd} "set passcnt 0" + puts ${fd} "set xpasscnt 0" + puts ${fd} "set failcnt 0" + puts ${fd} "set xfailcnt 0" + puts ${fd} "set prms_id 0" + puts ${fd} "set bug_id 0" + puts ${fd} "set exit_status 0" + puts ${fd} "set untestedcnt 0" + puts ${fd} "set unresolvedcnt 0" + puts ${fd} "set unsupportedcnt 0" + puts ${fd} "set xfail_flag 0" + puts ${fd} "set xfail_prms 0" + puts ${fd} "set mail_logs 0" + puts ${fd} "set multipass_name 0" + catch "close $fd" +} + +proc start_expect { } { + global spawn_id + global base_dir + + # We need to setup default values and a few default procs so we + # can execute library code without DejaGnu + set defaults_file setval.tmp + make_defaults_file $defaults_file + set fd [open ${defaults_file} w] + + # look for expect + if ![info exists EXPECT] { + set EXPECT [findfile $base_dir/../../expect/expect "$base_dir/../../expect/expect" expect] + verbose "EXPECT defaulting to $EXPECT" 2 + } + +# catch close +# catch wait + + # Start expect runing + spawn "$EXPECT" + expect { + -re "expect.*> " { + verbose "Started the child expect shell" 2 + } + timeout { + perror "Timed out starting the child expect shell." + return -1 + } + } + + # Load the defaults file + exp_send "source ${defaults_file}\n" + expect { + "expect*> " { + verbose "Loaded testing defaults file." 2 + return 1 + } + timeout { + perror "Couldn't load the testing defaults file." + return -1 + } + } +} + +# +# Stop the runing expect process +# +proc stop_expect { } { + global spawn_id + + # make expect exit + exp_send "exit\n" + catch "close -i $spawn_id" + catch "wait -i $spawn_id" +} + +# +# Load the library to test +# +proc load_test_lib { lib } { + global spawn_id + exp_send "source ${lib}\n" + expect { + "expect*> " { + verbose "Testing ${lib}" 2 + } + timeout { + perror "Couldn't load the libraries to test" + return -1 + } + } +} + +# +# test a library proc that emits patterns +# +proc exp_test { cmd pattern msg } { + global spawn_id + + exp_send "puts ACK ; $cmd ; puts NAK\r\n" + expect { + "puts ACK*puts NAK" { + verbose "Got command echo" 3 + } + timeout { + warning "Never got command echo" + } + } + + expect { + "ACK" { + exp_continue + } + -re "\r\n1\r\n" { + warning "$msg, 1 was returned" + exp_continue + } + -re "\r\n0\r\n" { + warning "$msg, 0 was returned" + exp_continue + } + "$pattern" { + pass "$msg" + } + timeout { + fail "$msg" + } + } +} + +# test a config proc that only returns a code +# ex... config_test "isbuild $build_triplet" "pass" "fail" "isbuild, native" +# args are: command, true condition, false condition, message to print +proc config_test { cmd true false msg } { + global spawn_id + + set timeout 20 + exp_send "puts ACK ; puts \[$cmd\] ; puts NAK\r\n" + expect { + "puts ACK*$cmd*puts NAK" { + verbose "Got command echo" 3 + } + timeout { + warning "Never got command echo" + } + } + + expect { + -re "Checking pattern*with*\[\r\n\]" { + exp_continue + } + -re "\r\n1\r\n" { + $true "$msg" + } + -re "\r\n0\r\n" { + $false "$msg" + } + timeout { + perror "$msg (timed out)" + } + } +} + + + + + + diff --git a/contrib/bluegnu2.0.3/testsuite/tools/env.exp b/contrib/bluegnu2.0.3/testsuite/tools/env.exp new file mode 100644 index 0000000..ebbe79f --- /dev/null +++ b/contrib/bluegnu2.0.3/testsuite/tools/env.exp @@ -0,0 +1,20 @@ + +puts "======= Environment (Start) =======" + +foreach __item [lsort [list env]] { + if {[string compare $__item "__info"] == 0} continue + if [catch {puts " $__item=>[eval set $__item]<"} szErrMsg] { + if [regexp "variable is array" $szErrMsg] { + foreach __elem [lsort [array names $__item]] { + puts " ${__item}($__elem)=>[set ${__item}($__elem)]<" + } + } else { + puts "******* >> msg : $szErrMsg" + puts "******* >> errorInfo: [uplevel #0 set errorInfo]" + puts "******* >> errorCode: [uplevel #0 set errorCode]" + } + } +} + +pass env.exp +puts "======= Environment (End) =======" diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..0fba9c9 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,79 @@ +dejagnu (1.3-10) frozen unstable; urgency=low + + * add example to /usr/doc (fixes bug #28491) + * changed permissions on runtest.exp so that it is not executable + * upgrade Standards-Version to 2.5.0.0 + + -- Kevin Dalley Sat, 5 Dec 1998 04:37:07 -0800 + +dejagnu (1.3-9) unstable; urgency=low + + * install postinst, etc, which creates correct permissions on files + (fixes Bug #25044). + * corrected FSF address in copyright. + + -- Kevin Dalley Sun, 9 Aug 1998 18:08:06 -0700 + +dejagnu (1.3-8) unstable; urgency=low + + * corrected copyright (fixes bug #14864) + * changed maintainer email address + + -- Kevin Dalley Tue, 23 Dec 1997 22:47:14 -0800 + +dejagnu (1.3-7) unstable; urgency=low + + * changed dependency back from expect5.24 to expect, now that expect is + provided by various expect packages. + + -- Kevin Dalley Tue, 30 Sep 1997 23:04:21 -0700 + +dejagnu (1.3-6) unstable; urgency=low + + * changed dependency to expect5.24 + + -- Kevin Dalley Sat, 20 Sep 1997 10:29:28 -0700 + +dejagnu (1.3-5) unstable; urgency=low + + * changed debian/control to satisfy standards and fix bug #3566, + summary incorrect + * moved files debian.* to debian/* + * converted to Standards-Version: 2.1.1.0 + + -- Kevin Dalley Sat, 12 Oct 1996 02:05:21 -0700 + + + + +Sun Jun 2 18:06:24 1996 Kevin Dalley + + * debian.control, debian.rules: upgraded to Debian release 4 + changed most instances of dejagnu to $(package) use debian.rules + package value to build control value of Package + +Fri May 24 01:57:31 1996 Kevin Dalley + + * debian.postrm: change to -e + + + * debian.conffiles, debian.postinst, debian.rules, debian.preinst, + debian.prerm: moved conffile from /var/lib/dejagnu to /etc/dejagnu + + +Thu May 23 00:52:57 1996 Kevin Dalley + + * debian.rules: changed architecture to all and updated to debian + revision 2 + + * debian.control: changed architecture to all + +Sun May 19 14:02:47 1996 Kevin Dalley + + * debian.README, debian.conffiles, debian.control, + debian.postinst, debian.postrm, debian.rules, debian.site.exp, + debian.ChangeLog added + +Local variables: +mode: debian-changelog +End: diff --git a/debian/conffiles b/debian/conffiles new file mode 100644 index 0000000..fb269a1 --- /dev/null +++ b/debian/conffiles @@ -0,0 +1 @@ +/etc/dejagnu/site.exp diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..a6fdf2f --- /dev/null +++ b/debian/control @@ -0,0 +1,18 @@ +Source: dejagnu +Section: devel +Priority: optional +Maintainer: Kevin Dalley +Standards-Version: 2.5.0.0 +Package: dejagnu-1.4 +Architecture: all +Depends: expect, dpkg (>=1.2.1) +Description: framework for running test suites on software tools. + DejaGnu is a framework for testing other programs. Its purpose is to + provide a single front end for all tests. + . + DejaGnu provides a layer of abstraction which allows you to write + tests that are portable to any host or target where a program must + be tested. All tests have the same output format. + . + DejaGnu is written in `expect', which in turn uses "Tcl"--Tool + command language. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..40e8a61 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,29 @@ +This is the Debian GNU/Linux prepackaged version of GNU DejaGnu. + +This package was put together by Kevin Dalley , +from sources obtained from: + prep.ai.mit.edu:/pub/gnu/dejagnu-1.3.tar.gz + +Changes: + * added Debian GNU/Linux package maintenance system files + * skip compilation of tcl and expect + +GNU dejagnu are Copyright (C) 92, 93, 94, 95, 1996 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; version 2 dated June, 1991. + + 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., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License can be found in `/usr/doc/copyright/GPL'. diff --git a/debian/postinst b/debian/postinst new file mode 100644 index 0000000..e8644d7 --- /dev/null +++ b/debian/postinst @@ -0,0 +1,9 @@ +#! /bin/sh + +set -i + +install-info --quiet --section "Development" "Development" \ + /usr/info/dejagnu.info.gz + +echo "Edit the master configuration file, /etc/dejagnu/site.exp," +echo "if needed" diff --git a/debian/preinst b/debian/preinst new file mode 100644 index 0000000..dd7af9a --- /dev/null +++ b/debian/preinst @@ -0,0 +1,15 @@ +#!/bin/sh -e +# +# Debian package preinst + +case "$1" in + install|upgrade) + # need to move configuration file to proper directory + if [ -f /var/lib/dejagnu/site.exp ]; then + if [ ! -d /etc/dejagnu ]; then + install -d -g root -m 755 -o root /etc/dejagnu + fi + mv -f /var/lib/dejagnu/site.exp /etc/dejagnu + fi + ;; +esac diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..d123159 --- /dev/null +++ b/debian/rules @@ -0,0 +1,100 @@ +#! /usr/bin/make -f +# +# Copyright 1994,1995 by Ian Jackson. +# I hereby give you perpetual unlimited permission to copy, +# modify and relicense this file, provided that you do not remove +# my name from the file itself. (I assert my moral right of +# paternity under the Copyright, Designs and Patents Act 1988.) +# This file may have to be extensively modified +# Copyright 1996 by Kevin Dalley. + +# To make the binary distribution package, the ``Debianized'' source package +# and the context diff to the original package, type `./debian.rules dist'. +# Make sure that `debian.rules' is executable before the final distribution +# is made. +# +# Invoke each target with `./debian.rules '. All targets should be +# invoked with the package root as the current directory. +# +# The `binary' target must be run as root, as it needs to install files with +# specific ownerships. + +# The name of the package (for example, `emacs'). +package = dejagnu + +CC = gcc +CFLAGS = -O2 -Wall # sane warning options vary between programs +LDFLAGS = # none + + +build: + $(checkdir) + ./configure --prefix=/usr + $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \ + libexecdir=/usr/lib/locate localstatedir=/var/lib/locate all + $(MAKE) info + touch build + +clean: + $(checkdir) + -rm -f build + -$(MAKE) -i distclean + -rm -rf *~ debian/tmp debian/*~ debian/files* + rm -f config.cache doc/config.log testsuite/config.log \ + testsuite/.tmp testsuite/dbg.log testsuite/runtest.log \ + testsuite/runtest.sum testsuite/setval.tmp \ + testsuite/testrun.log testsuite/testrun.sum \ + example/testrun.sum + +binary-indep: checkroot build + $(checkdir) + -rm -rf debian/tmp + install -d debian/tmp debian/tmp/DEBIAN + install -d debian/tmp/usr/doc/$(package) + install -d -g root -m 755 -o root debian/tmp/etc/$(package) + install debian/{postinst,postrm,preinst,prerm} debian/tmp/DEBIAN/. + cd $(package); $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" \ + prefix=`pwd`/../debian/tmp/usr install + chmod 0644 debian/tmp/usr/lib/dejagnu/runtest.exp + cd $(package); $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" \ + prefix=`pwd`/../debian/tmp/usr install-info + gzip -9v debian/tmp/usr/info/* + gzip -9v debian/tmp/usr/man/man1/* + install -m 0644 debian/copyright debian/tmp/usr/doc/$(package) + install -m 0644 debian/changelog debian/tmp/usr/doc/$(package)/changelog.Debian + gzip -9v debian/tmp/usr/doc/$(package)/changelog.Debian + install -m 0644 ChangeLog debian/tmp/usr/doc/$(package) + gzip -9v debian/tmp/usr/doc/$(package)/ChangeLog + ln -s ChangeLog.gz debian/tmp/usr/doc/$(package)/changelog.gz + install -g root -m 644 -o root debian/site.exp \ + debian/tmp/etc/$(package)/site.exp + cd debian/tmp/usr/lib/$(package); ln -fs /etc/$(package)/site.exp . + install -d debian/tmp/usr/doc/$(package)/examples + -cd example; $(MAKE) -i distclean + (cd example; tar cf - . ) | \ + (cd debian/tmp/usr/doc/$(package)/examples; tar xf -) + install install.sh debian/tmp/usr/doc/$(package)/examples + dpkg-gencontrol +# chown -R root.root debian/tmp +# chmod -R g-ws debian/tmp + dpkg --build debian/tmp .. + +binary-arch: + +define checkdir + test -f runtest.exp -a -f debian/rules +endef +# Below here is fairly generic really + +binary: binary-indep binary-arch + +source diff: + @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false + +checkroot: + $(checkdir) + test root = "`whoami`" + +.PHONY: binary binary-arch binary-indep clean checkroot diff --git a/debian/site.exp b/debian/site.exp new file mode 100644 index 0000000..9454a7f --- /dev/null +++ b/debian/site.exp @@ -0,0 +1,2 @@ +# The master configuration file should be here +# There is currently not a meaningful default configuration file diff --git a/doc/.cvsignore b/doc/.cvsignore new file mode 100644 index 0000000..7abff1d --- /dev/null +++ b/doc/.cvsignore @@ -0,0 +1,2 @@ +Makefile +config.status diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..9521a40 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,47 @@ +## Process this file with automake to generate Makefile.in + +AUTOMAKE_OPTIONS = cygnus + +info_TEXINFOS = dejagnu.texi + +TARGETS = overview.rtf overview.html overview.dvi overview.ps + +docs: $(TARGETS) + +%.ps: %.dvi + dvips -o $@ $< + +%.pdf: %.sgml + db2pdf $< + +%.dvi: %.sgml + db2dvi $< + +%.rtf: %.sgml + db2rtf -o $@ $< + +%.gif: %.fig + convert -transparency white $< $@ # .fig -> .gif + +%.epsi: %.eps + ps2epsi $< # .eps -> .epsi + +%.eps: %.fig + fig2dev -L ps -m 0.7 -p dummy $< > $@ # .fig -> .eps/portrait + +%.html: %.sgml + db2html $< + +# now for some extra dependencies that the automatic rules will not +# catch: + +overview.pdf overview.ps overview.dvi overview.rtf overview.html: overview.sgml ref.sgml user.sgml + +clean: + rm -f $(TARGETS) + +# install-data-local: overview.pdf overview.html +# $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/html +# $(INSTALL_DATA) overview/*.html $(DESTDIR)$(pkgdatadir)/html +# $(INSTALL_DATA) overview.ps $(DESTDIR)$(pkgdatadir)/dejagnu.ps +# $(INSTALL_DATA) overview.pdf $(DESTDIR)$(pkgdatadir)/dejagnu.pdf diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..31d809b --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,338 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +BOARDS = @BOARDS@ +CC = @CC@ +CONFIG = @CONFIG@ +EXEEXT = @EXEEXT@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +AUTOMAKE_OPTIONS = cygnus + +info_TEXINFOS = dejagnu.texi + +TARGETS = overview.rtf overview.html overview.dvi overview.ps +mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs +CONFIG_CLEAN_FILES = +TEXI2DVI = `if test -f $(top_srcdir)/../texinfo/util/texi2dvi; then echo $(top_srcdir)/../texinfo/util/texi2dvi; else echo texi2dvi; fi` +TEXINFO_TEX = $(top_srcdir)/../texinfo/texinfo.tex +INFO_DEPS = dejagnu.info +DVIS = dejagnu.dvi +TEXINFOS = dejagnu.texi +DIST_COMMON = README Makefile.am Makefile.in configure configure.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = gtar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +.SUFFIXES: .dvi .info .ps .texi .texinfo .txi +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --cygnus doc/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +dejagnu.info: dejagnu.texi +dejagnu.dvi: dejagnu.texi + + +DVIPS = dvips + +.texi.info: + @rm -f $@ $@-[0-9] $@-[0-9][0-9] + $(MAKEINFO) -I $(srcdir) $< + +.texi.dvi: + TEXINPUTS=$(top_srcdir)/../texinfo/texinfo.tex:$$TEXINPUTS \ + MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< + +.texi: + @rm -f $@ $@-[0-9] $@-[0-9][0-9] + $(MAKEINFO) -I $(srcdir) $< + +.texinfo.info: + @rm -f $@ $@-[0-9] $@-[0-9][0-9] + $(MAKEINFO) -I $(srcdir) $< + +.texinfo: + @rm -f $@ $@-[0-9] $@-[0-9][0-9] + $(MAKEINFO) -I $(srcdir) $< + +.texinfo.dvi: + TEXINPUTS=$(top_srcdir)/../texinfo/texinfo.tex:$$TEXINPUTS \ + MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< + +.txi.info: + @rm -f $@ $@-[0-9] $@-[0-9][0-9] + $(MAKEINFO) -I $(srcdir) $< + +.txi.dvi: + TEXINPUTS=$(top_srcdir)/../texinfo/texinfo.tex:$$TEXINPUTS \ + MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< + +.txi: + @rm -f $@ $@-[0-9] $@-[0-9][0-9] + $(MAKEINFO) -I $(srcdir) $< +.dvi.ps: + $(DVIPS) $< -o $@ + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(infodir) + @list='$(INFO_DEPS)'; \ + for file in $$list; do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \ + if test -f $$d/$$ifile; then \ + echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile"; \ + $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile; \ + else : ; fi; \ + done; \ + done + @$(POST_INSTALL) + @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\ + install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\ + done; \ + else : ; fi + +uninstall-info: + $(PRE_UNINSTALL) + @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ + ii=yes; \ + else ii=; fi; \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + test -z "$ii" \ + || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; \ + done + @$(NORMAL_UNINSTALL) + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + (cd $(DESTDIR)$(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \ + done + +dist-info: $(INFO_DEPS) + list='$(INFO_DEPS)'; \ + for base in $$list; do \ + if test -f $$base; then d=.; else d=$(srcdir); fi; \ + for file in `cd $$d && eval echo $$base*`; do \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file; \ + done; \ + done + +mostlyclean-aminfo: + -rm -f dejagnu.aux dejagnu.cp dejagnu.cps dejagnu.dvi dejagnu.fn \ + dejagnu.fns dejagnu.ky dejagnu.kys dejagnu.ps dejagnu.log \ + dejagnu.pg dejagnu.toc dejagnu.tp dejagnu.tps dejagnu.vr \ + dejagnu.vrs dejagnu.op dejagnu.tr dejagnu.cv dejagnu.cn + +clean-aminfo: + +distclean-aminfo: + +maintainer-clean-aminfo: + for i in $(INFO_DEPS); do \ + rm -f $$i; \ + if test "`echo $$i-[0-9]*`" != "$$i-[0-9]*"; then \ + rm -f $$i-[0-9]*; \ + fi; \ + done +clean-info: mostlyclean-aminfo +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = doc + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info +info-am: $(INFO_DEPS) +info: info-am +dvi-am: $(DVIS) +dvi: dvi-am +check-am: +check: check-am +installcheck-am: +installcheck: installcheck-am +install-info-am: +install-info: install-info-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: +uninstall: uninstall-am +all-am: Makefile +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-aminfo mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-aminfo clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-aminfo distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-aminfo maintainer-clean-generic \ + distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: install-info-am uninstall-info mostlyclean-aminfo \ +distclean-aminfo clean-aminfo maintainer-clean-aminfo tags distdir \ +info-am info dvi-am dvi check check-am installcheck-am installcheck \ +install-info-am install-info install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +docs: $(TARGETS) + +%.ps: %.dvi + dvips -o $@ $< + +%.pdf: %.sgml + db2pdf $< + +%.dvi: %.sgml + db2dvi $< + +%.rtf: %.sgml + db2rtf -o $@ $< + +%.gif: %.fig + convert -transparency white $< $@ # .fig -> .gif + +%.epsi: %.eps + ps2epsi $< # .eps -> .epsi + +%.eps: %.fig + fig2dev -L ps -m 0.7 -p dummy $< > $@ # .fig -> .eps/portrait + +%.html: %.sgml + db2html $< + +# now for some extra dependencies that the automatic rules will not +# catch: + +overview.pdf overview.ps overview.dvi overview.rtf overview.html: overview.sgml ref.sgml user.sgml + +clean: + rm -f $(TARGETS) + +# install-data-local: overview.pdf overview.html +# $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/html +# $(INSTALL_DATA) overview/*.html $(DESTDIR)$(pkgdatadir)/html +# $(INSTALL_DATA) overview.ps $(DESTDIR)$(pkgdatadir)/dejagnu.ps +# $(INSTALL_DATA) overview.pdf $(DESTDIR)$(pkgdatadir)/dejagnu.pdf + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/README b/doc/README new file mode 100644 index 0000000..fc8ae45 --- /dev/null +++ b/doc/README @@ -0,0 +1,2 @@ +One can obtain the Free DocBook Tools for Linux and NT at +http://nis-www.lanl.gov/~rosalia/mydocs/docbook-intro.html diff --git a/doc/configure b/doc/configure new file mode 100755 index 0000000..638b3bf --- /dev/null +++ b/doc/configure @@ -0,0 +1,860 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.12.1 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.12.1" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=dejagnu.texi + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:554: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set) 2>&1 | grep ac_space` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +cat > conftest.defs <<\EOF +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g +s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g +s%\[%\\&%g +s%\]%\\&%g +s%\$%$$%g +EOF +DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` +rm -f conftest.defs + + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.12.1" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_DATA@%$INSTALL_DATA%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/doc/configure.in b/doc/configure.in new file mode 100644 index 0000000..2575d44 --- /dev/null +++ b/doc/configure.in @@ -0,0 +1,5 @@ +dnl Process this file with autoconf to produce a configure script. +AC_PREREQ(2.5) +AC_INIT(dejagnu.texi) +AC_PROG_INSTALL +AC_OUTPUT(Makefile) diff --git a/doc/dejagnu.texi b/doc/dejagnu.texi new file mode 100644 index 0000000..68c4008 --- /dev/null +++ b/doc/dejagnu.texi @@ -0,0 +1,3572 @@ +o\input texinfo @c -*- Texinfo -*- +@finalout +@setfilename dejagnu.info +@c +@c This file documents the GNU Testing Framework ``DejaGnu'' +@c +@c Copyright (C) 92, 93, 94, 95, 1996 Free Software Foundation, Inc. +@c +@c This text may be freely distributed under the terms of the GNU +@c General Public License. +@c + +@c FIXME---MAIN TODO LIST! +@c +@c * Revisit organization. +@c +@c * discuss Tcl/expect basics---enough to get started (see seminar notes). +@c Maybe this would permit abbreviating appendices. + +@ifinfo +@format +START-INFO-DIR-ENTRY +* DejaGnu: (dejagnu). The GNU testing framework. +END-INFO-DIR-ENTRY +@end format +@end ifinfo + +@syncodeindex ky cp +@syncodeindex fn cp + +@setchapternewpage odd +@settitle DejaGnu Testing Framework +@titlepage +@title The DejaGnu Testing Framework +@subtitle for DejaGnu Version 1.3 +@sp 1 +@subtitle Jan 1996 +@author Rob Savoye +@page + +@tex +{\parskip=0pt \hfill Cygnus Support} +@end tex + +@vskip 0pt plus 1filll +Copyright @copyright{} 92, 93, 94, 95, 1996 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@noindent +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that +the entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. +@end titlepage + +@ifinfo +Copyright @copyright{} 92, 93, 94, 95, 1996 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries a copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). +@end ignore + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that +the entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. + +@node Top +@top DejaGnu + +DejaGnu is a framework for running test suites on software tools. + +This file describes version 1.3 of DejaGnu. + +@menu +* Overview:: What is DejaGnu? +* What is New:: What is new in this release. +* Invoking runtest:: Using `runtest', the main test driver +* Customizing:: Setting `runtest' defaults +* Internals:: The DejaGnu implementation +* Tests:: How to write a test case +* Extending:: New tools, new targets, and new hosts +* Installation:: Configuring and Installing DejaGnu +* Index:: Index +@end menu +@end ifinfo + +@iftex +@raggedbottom +@end iftex + +@node Overview +@chapter What is DejaGnu? +@cindex overview + +DejaGnu is a framework for testing other programs. Its purpose is to +provide a single front end for all tests. Beyond this, DejaGnu offers +several advantages for testing: + +@enumerate +@item +The flexibility and consistency of the DejaGnu framework make it easy +to write tests for any program. + +@item +DejaGnu provides a layer of abstraction which allows you to write tests +that are portable to any host or target where a program must be tested. + For instance, a test for GDB can run (from any Unix based host) on any +target architecture that DejaGnu supports. Currently DejaGnu runs tests +on several single board computers, whose operating software ranges from +just a boot monitor to a full-fledged, Unix-like realtime OS. + +@item +All tests have the same output format. This makes it easy to integrate +testing into other software development processes. DejaGnu's output is +designed to be parsed by other filtering script, and it is also human +readable. +@end enumerate + +DejaGnu is written in @code{expect}, which in turn uses @dfn{Tcl}---Tool +command language. + +@cindex @code{expect} script names +@kindex .exp +@cindex suffix, @code{expect} scripts +Running tests requires two things: the testing framework, and the test +suites themselves. Tests are usually written in @code{expect} using +Tcl, but you can also use a Tcl script to run a test suite that is not +based on @code{expect}. (@code{expect} script filenames conventionally +use @samp{.exp} as a suffix; for example, the main implementation of the +DejaGnu test driver is in the file @file{runtest.exp}.) + + +@menu +* Running Tests:: A first look at running DejaGnu tests +* Sample Test:: What does a DejaGnu test case look like? +* Design Goals:: Goals behind DejaGnu +* Posix:: DejaGnu conforms to POSIX 1003.3 +* Future Directions:: Where is DejaGnu going? +* Tcl and Expect:: Reading more about Tcl and Expect +@end menu + +@node What is New +@chapter What is new in this release ? +@cindex What is New + +This release has a number of substantial changes over version 1.2. The +most visible change is that the version of expect and Tcl included in +the release are up-to-date with the current stable net releases. Other +changes are: + +@enumerate +@item +@c FIXME: add a link to the config section +The config sub-system in DejaGnu has been completely redesigned. It now +supports testing on remote hosts as well as remote targets. + +@item +More builtin support for building target binaries with the correct +linker flags. Currently this only works with GCC, preferably with a +target support by @code{libgloss}. + +@item +Lots of little bug fixes from a year of heavy use here at Cygnus +Support. + +@item +DejaGnu now uses @code{autoconf} for configuration. + +@item +New test cases for DejaGnu have been added for the new features, plus +the "--tool" option bug in the 1.2 testsuite has been fixed. + +@item +The @code{--tool} option is now optional. + +@item +@code{runtest} when searching for test drivers ignores all directories +named SCCS, RCS, and CVS. + +@item +There is now a generic keyword based test harness that uses comments in +source code to control how each test case gets built and run. + +@item +There is now some support for running a testsuite with multiple passes +and multiple targets. + +@end enumerate + +@node Running Tests +@section Running existing tests +@cindex existing tests, running +@cindex running tests +@cindex tests, running + +@kindex make check +To run tests from an existing collection, first use @code{configure} as +usual to set up the source directory containing the tests. Then try +running + +@example +make check +@end example + +@cindex @code{check} makefile target +If the @code{check} target exists, it usually saves you some +trouble---for instance, it can set up any auxiliary programs or other +files needed by the tests. + +@cindex auxiliary files, building +Once you have run @samp{make check} to build any auxiliary files, you +might want to call the test driver @code{runtest} directly to repeat the +tests. You may also have to call @code{runtest} directly for test +collections with no @code{check} target in the @file{Makefile}. + +@c force page break to avoid losing footnote to another page +@page +@cindex @code{runtest}, most common options +@cindex options for @code{runtest}, common +Typically, you must use two command-line options: @samp{--tool}, to +specify which set of tests to run@footnote{@samp{--tool} selects a +particular suite of tests, @emph{not} the name of the executable program +to run. @xref{Config Values,,Configuration dependent values}, for +information on the variables that you can use to specify the names of +programs to run.}, and @samp{--srcdir}, to specify where to find test +directories. + +For example, if the directory @file{gdb/testsuite} contains a collection +of DejaGnu tests for @sc{gdb}, you can run them like this: + +@example +eg$ cd gdb/testsuite +eg$ runtest --tool gdb +@exdent @emph{Test output follows, ending with:} + + === gdb Summary === + +# of expected passes 508 +# of expected failures 103 +/usr/latest/bin/gdb version 4.14.4 -nx +@end example + +You can use the option @samp{--srcdir} to point to some other directory +containing a collection of tests: + +@smallexample +eg$ runtest --tool gdb --srcdir /devo/gdb/testsuite +@end smallexample + +@cindex native configuration +@cindex cross configuration +These examples assume a @dfn{native} configuration, where the same +computer runs both @code{runtest} and the tests themselves. When you +have a @dfn{cross} configuration, the tests run on a different computer, +controlled by the host running @code{runtest}. In this situation, you +need the option @samp{--name} to specify the network address for the +other computer: + +@smallexample +eg$ runtest --tool gdb --name vx9.munist.com +@end smallexample + +If you always use the same option values, you can record them in a file +called @file{site.exp}, rather than typing them each time. @xref{Config +Values,,Setting defaults for @code{runtest} options}. + +By default, @code{runtest} prints only the names of the tests it runs, +output from any tests that have unexpected results, and a summary +showing how many tests passed and how many failed. To display output +from all tests (whether or not they behave as expected), use the +@samp{--all} option. For more verbose output about processes being run, +communication, and so on, use @samp{--verbose}. To see even more output, +use multiple @samp{--verbose} options. @xref{Invoking runtest,,Using +@code{runtest}}, for a more detailed explanation of each @code{runtest} +option. + +Test output goes into two files in your current directory: summary +output in @file{@var{tool}.sum}, and detailed output in +@file{@var{tool}.log}. (@var{tool} refers to the collection of tests; +for example, after a run with @samp{--tool gdb}, look for output files +@file{gdb.sum} and @file{gdb.log}.) @xref{Output Files,,The files +DejaGnu writes}. + +@node Sample Test +@section What does a DejaGnu test look like? + +@cindex example +Each DejaGnu test is an @code{expect} script; the tests vary widely in +complexity, depending on the nature of the tool and the feature tested. + +@kindex gdb.t00/echo.exp +@kindex echo.exp +Here is a very simple @sc{gdb} test---one of the simplest tests shipped +with DejaGnu (extracted from @file{gdb.t00/echo.exp}):@footnote{More +recent @sc{gdb} tests use the @samp{gdb_test} procedure. +An equivalent test using that procedure is @samp{ gdb_test "echo Hello +world!" "Hello world!" }} +@c FIXME! include xref in footnote, when gdb_test documented in some manual. +@c @xref{}. +@c Extra spaces in @samp above avoid running end ' against " inside. + +@cartouche +@smallexample +# send a string to the GDB stdin: +send "echo Hello world!\n" + +# inspect the GDB stdout for the correct reply, +# and determine whether the test passes or fails: +expect @{ + -re "Hello world.*$prompt $" @{ pass "Echo test" @} + -re "$prompt $" @{ fail "Echo test" @} + timeout @{ fail "(timeout) Echo test" @} + @} +@end smallexample +@end cartouche + +Though brief, this example is a complete test. It illustrates some of +the main features of DejaGnu test scripts: + +@itemize @bullet +@item +The test case does not start the tested program (@sc{gdb} in this case); +all test scripts for interactive tools can assume the corresponding tool +is running. + +@item +Comments start with @samp{#}. + +@item +The main commands you use to control a tested program are @code{send} +(to give it commands) and @code{expect} (to analyze its responses). + +@item +The @code{expect} command uses a list of pairs; a pattern (regular +expression if @samp{-re} specified), followed by an action to run if the +pattern matches output from the program. Only the action for the +@emph{first} matching pattern will execute. + +@item +Test cases use the commands @code{pass} and @code{fail} to record the +test outcome. +@end itemize + +@node Design Goals +@section Design goals +@cindex design goals + +DejaGnu grew out of the internal needs of Cygnus Support. Cygnus +maintains and enhances a variety of free programs in many different +environments, and we needed a testing tool that: + +@itemize @bullet +@item +is useful to developers while fixing bugs; + +@item +automates running many tests during a software release process; + +@item +is portable among a variety of host computers; + +@item +supports cross-development testing; + +@item +permits testing interactive programs, like @sc{gdb}; and + +@item +permits testing batch oriented programs, like @sc{gcc}. +@end itemize + +Some of the requirements proved challenging. For example, interactive +programs do not lend themselves very well to automated testing. But all +the requirements are important: for instance, it is imperative to make +sure that @sc{gdb} works as well when cross-debugging as it does in a +native configuration. + +Probably the greatest challenge was testing in a cross-development +environment (which can be a real nightmare). Most cross-development +environments are customized by each developer. Even when buying +packaged boards from vendors there are many differences. The +communication interfaces vary from a serial line to ethernet. DejaGnu +was designed with a modular communication setup, so that each kind of +communication can be added as required, and supported thereafter. Once +a communication procedure is coded, any test can use it. Currently +DejaGnu can use @code{rsh}, @code{rlogin}, @code{telnet}, @code{tip}, +@code{kermit}, and @code{mondfe} for remote communications. + +@cindex name ``DejaGnu'' +@cindex DejaGnu, the name +@cindex Menapace, Julia +Julia Menapace first coined the term ``Deja Gnu'' to describe an earlier +testing framework at Cygnus Support. When we replaced it with the +Expect-based framework, it was like DejaGnu all over again@dots{} + +@node Posix +@section A POSIX conforming test framework + +@cindex POSIX conformance +@cindex standard conformance: POSIX 1003.3 +DejaGnu conforms to the @sc{posix} standard for test frameworks. + +@cindex TET +@sc{posix} standard 1003.3 defines what a testing framework needs to +provide, in order to permit the creation of @sc{posix} conformance +test suites. This standard is primarily oriented to running @sc{posix} +conformance tests, but its requirements also support testing of features +not related to @sc{posix} conformance. @sc{posix} 1003.3 does not +specify a particular testing framework, but at this time there is only +one other @sc{posix} conforming test framework: +@sc{tet}.@footnote{@sc{tet} was created by Unisoft for a consortium +comprised of X/Open, Unix International, and the Open Software +Foundation.} + +The @sc{posix} documentation refers to @dfn{assertions}. An assertion +is a description of behavior. For example, if a standard says ``The sun +shall shine'', a corresponding assertion might be ``The sun is +shining.'' A test based on this assertion would pass or fail depending +on whether it is daytime or nighttime. It is important to note that the +standard being tested is never 1003.3; the standard being tested is some +other standard, for which the assertions were written. + +As there is no test suite to test @emph{testing frameworks} for +@sc{posix} 1003.3 conformance, verifying conformance to this standard is +done by repeatedly reading the standard and experimenting. One of the +main things 1003.3 does specify is the set of allowed output messages, +and their definitions. Four messages are supported for a required +feature of @sc{posix} conforming systems, and a fifth for a conditional +feature. DejaGnu supports the use of all five output messages; in this +sense a test suite that uses exactly these messages can be considered +@sc{posix} conforming. These definitions specify the output of a test +case: + +@ftable @code +@cindex success, POSIX definition +@item PASS +A test has succeeded. That is, it demonstrated that the assertion is true. + +@cindex XFAIL, avoiding for POSIX +@item XFAIL +@sc{posix} 1003.3 does not incorporate the notion of expected failures, +so @code{PASS}, instead of @code{XPASS}, must also be returned for test +cases which were expected to fail and did not. This means that +@code{PASS} is in some sense more ambiguous than if @code{XPASS} is also +used. For information on @code{XPASS} and @code{XFAIL}, see +@ref{Invoking runtest,,Using @code{runtest}}. + +@item FAIL +@cindex failure, POSIX definition +A test @emph{has} produced the bug it was intended to capture. That is, +it has demonstrated that the assertion is false. The @code{FAIL} +message is based on the test case only. Other messages are used to +indicate a failure of the framework. + +As with @code{PASS}, @sc{posix} tests must return @code{FAIL} rather +than @code{XFAIL} even if a failure was expected. + +@item UNRESOLVED +@cindex ambiguity, required for POSIX +A test produced indeterminate results. Usually, this means the test +executed in an unexpected fashion; this outcome requires that a human +being go over results, to determine if the test should have passed or +failed. This message is also used for any test that requires human +intervention because it is beyond the abilities of the testing +framework. Any unresolved test should resolved to @code{PASS} or +@code{FAIL} before a test run can be considered finished. + +Note that for @sc{posix}, each assertion must produce a test result +code. If the test isn't actually run, it must produce @code{UNRESOLVED} +rather than just leaving that test out of the output. This means that +you have to be careful when writing tests, to not carelessly use tcl +statements like @code{return}---if you alter the flow of control of the +tcl code you must insure that every test still produces some result code. + +Here are some of the ways a test may wind up @code{UNRESOLVED}: + +@itemize @bullet +@item +A test's execution is interrupted. + +@item +A test does not produce a clear result. This is usually because there +was an @code{ERROR} from DejaGnu while processing the test, or because there +were three or more @code{WARNING} messages. Any @code{WARNING} or +@code{ERROR} messages can invalidate the output of the test. This +usually requires a human being to examine the output to +determine what really happened---and to improve the test case. + +@item +A test depends on a previous test, which fails. + +@item +The test was set up incorrectly. +@end itemize + +@item UNTESTED +A test was not run. This is a placeholder, used when there is no +real test case yet. +@end ftable + +@noindent +The only remaining output message left is intended to test features that +are specified by the applicable @sc{posix} standard as conditional: + +@ftable @code +@item UNSUPPORTED +There is no support for the tested case. This may mean that a +conditional feature of an operating system, or of a compiler, is not +implemented. DejaGnu also uses this message when a testing environment +(often a ``bare board'' target) lacks basic support for compiling or +running the test case. For example, a test for the system subroutine +@code{gethostname} would never work on a target board running only a +boot monitor. +@end ftable + +DejaGnu uses the same output procedures to produce these messages for +all test suites, and these procedures are already known to conform to +@sc{posix} 1003.3. For a DejaGnu test suite to conform to @sc{posix} +1003.3, you must avoid the @code{setup_xfail} procedure as described in +the @code{PASS} section above, and you must be careful to return +@code{UNRESOLVED} where appropriate, as described in the +@code{UNRESOLVED} section above. + +@node Future Directions +@section Future directions +@cindex future directions + +In the near future, there are two parallel directions for DejaGnu +development. The first is to add support for more hosts and targets. + +The second would permit testing programs with a more complex interface, +whether text based or GUI based. Two components already exist: a Tcl +based X window toolkit, and a terminal package for @code{expect}. Both +of these could be merged into DejaGnu in a way that permits testing +programs that run in each environment. + +Meanwhile, we hope DejaGnu enables the creation of test suites for +conformance to @sc{ansi} C and C++, to @sc{posix}, and to other +standards. We encourage you to make any test suites you create freely +available, under the same terms as DejaGnu itself. + +@node Tcl and Expect +@section Tcl and Expect +@cindex tool command language +@cindex tcl +@cindex Ousterhout, John K. +Tcl was introduced in a paper by John K. Ousterhout at the 1990 Winter +Usenix conference, @cite{Tcl: An Embeddable Command Language}. That +paper is included in PostScript form in the @file{doc} subdirectory of +the Tcl distribution. The version of Tcl included in DejaGnu at this time is +Tcl 7.4p3. + +@cindex @code{expect} scripting language +@cindex Libes, Don +Don Libes introduced @code{expect} in his paper @cite{expect: Curing +Those Uncontrollable Fits of Interaction} at the 1990 Summer Usenix +conference. The paper is included in PostScript form in the +@code{expect} distribution (as are several other papers about +@code{expect}). The version of expect included in DejaGnu at this time +is expect 5.18.0. + +@node Invoking runtest +@chapter Using @code{runtest} +@cindex invoking +@cindex running +@cindex command line options +@cindex options + +@cindex @code{runtest} description +@cindex DejaGnu test driver +@code{runtest} is the executable test driver for DejaGnu. You can +specify two kinds of things on the @code{runtest} command line: command +line options, and Tcl variables for the test scripts. The options are +listed alphabetically below. + +@cindex exit code from @code{runtest} +@cindex @code{runtest} exit code +@code{runtest} returns an exit code of @code{1} if any test +has an unexpected result; otherwise (if all tests pass or fail as +expected) it returns @code{0} as the exit code. + +@code{runtest} flags the outcome of each test as one of these cases. +(@xref{Posix,,A POSIX conforming test framework}, for a discussion of +how @sc{posix} specifies the meanings of these cases.) + +@table @code +@item PASS +@kindex PASS +@cindex successful test +@cindex test, successful +The most desirable outcome: the test succeeded, and was expected to +succeed. + +@item XPASS +@kindex XPASS +@cindex successful test, unexpected +@cindex unexpected success +A pleasant kind of failure: a test was expected to fail, but succeeded. +This may indicate progress; inspect the test case to determine whether +you should amend it to stop expecting failure. + +@item FAIL +@kindex FAIL +@cindex failing test, unexpected +@cindex test, failing +A test failed, although it was expected to succeed. This may indicate +regress; inspect the test case and the failing software to locate the bug. + +@item XFAIL +@kindex XFAIL +@cindex expected failure +@cindex failing test, expected +A test failed, but it was expected to fail. This result indicates no +change in a known bug. If a test fails because the operating system +where the test runs lacks some facility required by the test, the +outcome is @code{UNSUPPORTED} instead. + +@item UNRESOLVED +@kindex UNRESOLVED +@cindex test, unresolved outcome +Output from a test requires manual inspection; the test suite could not +automatically determine the outcome. For example, your tests can report +this outcome is when a test does not complete as expected. + +@item UNTESTED +@kindex UNTESTED +@cindex untested properties +A test case is not yet complete, and in particular cannot yet produce a +@code{PASS} or @code{FAIL}. You can also use this outcome in dummy +``tests'' that note explicitly the absence of a real test case +for a particular property. + +@item UNSUPPORTED +@kindex UNSUPPORTED +@cindex unsupported test +@cindex test, unsupported +A test depends on a conditionally available feature that does not exist +(in the configured testing environment). For example, you can use this +outcome to report on a test case that does not work on a particular +target because its operating system support does not include a required +subroutine. +@end table + +@code{runtest} may also display the following messages: + +@table @code +@item ERROR +@kindex ERROR +@cindex problem, detected by test case +@cindex test case cannot run +Indicates a major problem (detected by the test case itself) in running +the test. This is usually an unrecoverable error, such as a missing file +or loss of communication to the target. (@sc{posix} test suites should +not emit this message; use @code{UNSUPPORTED}, @code{UNTESTED}, or +@code{UNRESOLVED} instead, as appropriate.) + +@item WARNING +@kindex WARNING +@cindex test case warnings +Indicates a possible problem in running the test. Usually warnings +correspond to recoverable errors, or display an important message about +the following tests. + +@item NOTE +@kindex NOTE +@cindex test case messages +An informational message about the test case. +@end table + +This is the full set of command line options that @code{runtest} +recognizes. Arguments may be abbreviated to the shortest unique string. + +@cindex @code{runtest} option list +@cindex option list, @code{runtest} +@smallexample +runtest --tool @var{tool} [ @var{testsuite}.exp @dots{} ] +[ @var{testsuite}.exp="testfile1 @dots{}" ] +[ @var{tclvar}=@var{value}@dots{} ] +[ --all ] [ --baud @var{baud-rate} ] [ --connect @var{type} ] +[ --debug ] [ --help ] [ --host @var{string} ] +[ --mail "@var{name} @dots{}" ] [ --name @var{string} ] +[ --name @var{name} ] [ --outdir @var{path} ] +[ --objdir @var{path} ] [ --reboot ] +[ --srcdir @var{path} ] [ --strace @var{n} ] +[ --target @var{string} --build @var{string} ] +[ -v | --verbose ] [ -V | --version ] [ --D@var{n} ] +@end smallexample + +@table @code +@item --tool @var{tool} +@cindex selecting tests for a tool +@cindex @code{--tool} (@code{runtest} option) +@var{tool} specifies what set of tests to run, and what initialization +module to use. @var{tool} is used @emph{only} for these two purposes: +it is @emph{not} used to name the executable program to test. +Executable tool names (and paths) are recorded in @file{site.exp} +(@pxref{Config Values,,Configuration dependent values}), and you can +override them by specifying Tcl variables on the command line. + +For example, including @samp{--tool gcc} on the @code{runtest} command +line runs tests from all test subdirectories whose names match +@file{gcc.*}, and uses one of the initialization modules named +@file{config/*-gcc.exp}. To specify the name of the compiler (perhaps +as an alternative path to what @code{runtest} would use by default), use +@samp{GCC=@var{binname}} on the @code{runtest} command line. + +@item @var{testsuite}.exp @dots{} +@cindex selecting a range of tests +@cindex tests, running specifically +@cindex naming tests to run +Specify the names of testsuites to run. +By default, @code{runtest} runs all tests for the tool, but you can +restrict it to particular testsuites by giving the names of the @samp{.exp} +@code{expect} scripts that control them. + +@var{testsuite}.exp may not include path information; use plain filenames. + +@item @var{testfile}.exp="testfile1 @dots{}" +@cindex selecting a range of tests +@cindex tests, running specifically +@cindex naming tests to run +Specify a subset of tests in a suite to run. +For compiler or assembler tests, which often use a single @samp{.exp} +script covering many different source files, this option allows you to +further restrict the tests by listing particular source files to compile. +Some tools even support wildcards here. The wildcards supported depend +upon the tool, but typically they are @code{?}, @code{*}, and @code{[chars]}. + +@item @var{tclvar}=@var{value} +@kindex @var{tclvar}=@var{value} +@cindex Tcl variables, defining for @code{runtest} +@cindex command line Tcl variable definition +@cindex @code{runtest}, variable defns on cmdline +You can define Tcl variables for use by your test scripts in the same +style used with @code{make} for environment variables. For example, +@samp{runtest GDB=gdb.old} defines a variable called @samp{GDB}; when +your scripts refer to @samp{$GDB} in this run, they use the value +@samp{gdb.old}. + +The default Tcl variables used for most tools are defined in the main +DejaGnu @code{Makefile}; their values are captured in the +@file{site.exp} file. @xref{Config Values,,Configuration dependent +values}. + +@item --all +@cindex @code{--all} (@code{runtest} option) +@cindex test output, displaying all +Display all test output. By default, @code{runtest} shows only the +output of tests that produce unexpected results; that is, tests with +status @samp{FAIL} (unexpected failure), @samp{XPASS} (unexpected +success), or @samp{ERROR} (a severe error in the test case itself). +Specify @samp{--all} to see output for tests with status @samp{PASS} +(success, as expected) @samp{XFAIL} (failure, as expected), or +@samp{WARNING} (minor error in the test case itself). + +@item --baud @var{baud-rate} +@itemx -b @var{baud-rate} +@cindex baud rate, specifying +@cindex bps, specifying +@cindex @code{--baud} (@code{runtest} option) +@cindex @code{-b} (@code{runtest} option) +Set the default baud rate to something other than 9600. (Some serial +interface programs, like @code{tip}, use a separate initialization file +instead of this value.) + +@item --connect @var{type} +@cindex connecting to target +@cindex @code{--connect} (@code{runtest} option) +@cindex remote testbed, connecting to +@cindex @code{rlogin}, remote testing via +@cindex @code{telnet}, remote testing via +@cindex @code{rsh}, remote testing via +@cindex @code{tip}, remote testing via +@cindex @code{kermit}, remote testing via +@cindex @code{mondfe}, remote testing via +@cindex remote testing via @code{rlogin} +@cindex remote testing via @code{telnet} +@cindex remote testing via @code{rsh} +@cindex remote testing via @code{tip} +@cindex remote testing via @code{kermit} +@cindex remote testing via @code{mondfe} +Connect to a target testing environment as specified by @var{type}, if +the target is not the computer running @code{runtest}. For example, use +@samp{--connect} to change the program used to connect to a ``bare +board'' boot monitor. The choices for @var{type} in the DejaGnu 1.0 +distribution are @samp{rlogin}, @samp{telnet}, @samp{rsh}, @samp{tip}, +@samp{kermit}, and @samp{mondfe}. + +@noindent +The default for this option depends on the configuration (@pxref{Cross +Targets,,Remote targets supported}). The default is chosen to be the +most convenient communication method available, but often other +alternatives work as well; you may find it useful to try alternative +connect methods if you suspect a communication problem with your testing +target. + +@item --debug +@cindex @code{--debug} (@code{runtest} option) +@cindex debug log for test cases +@cindex test cases, debug log +@cindex @code{dbg.log} file +Turns on the @code{expect} internal debugging output. Debugging output +is displayed as part of the @code{runtest} output, and logged to a file +called @file{dbg.log}. The extra debugging output does @emph{not} +appear on standard output, unless the verbose level is greater than 2 +(for instance, to see debug output immediately, specify @samp{--debug -v +-v}). The debugging output shows all attempts at matching the test +output of the tool with the scripted patterns describing expected +output. The output generated with @samp{--strace} also goes into +@file{dbg.log}. + +@item --help +@itemx -he +@cindex @code{--help} (@code{runtest} option) +@cindex help with @code{runtest} +@cindex @code{runtest}, listing options +Prints out a short summary of the @code{runtest} options, then exits +(even if you also specify other options). + +@item --host @var{string} +@cindex @code{--host} (@code{runtest} option) +@cindex specifying the host config name +@cindex host config name, changing +@var{string} is a full configuration ``triple'' name as used by +@code{configure}. Use this option to override the default string +recorded by your configuration's choice of host. This choice does not +change how anything is actually configured unless --build is also +specified; it affects @emph{only} DejaGnu procedures that compare the +host string with particular values. The procedures @code{ishost}, +@code{istarget}, @code{isnative}, and @code{setup_xfail} are affected by +@samp{--host}. In this usage, @code{host} refers to the machine that the +tests are to be run on, which may not be the same as the @code{build} +machine. If @code{--build} is also specified, then @code{--host} refers +to the machine that the tests wil, be run on, not the machine DejaGnu is +run on. + +@item --build @var{string} +@cindex @code{--build} (@code{runtest} option) +@cindex specifying the build config name +@cindex build config name, changing +@var{string} is a full configuration ``triple'' name as used by +@code{configure}. This is the type of machine DejaGnu and the tools to +be tested are built on. For a normal cross this is the same as the host, +but for a canadian cross, they are seperate. + +@item --name @var{name} +@cindex specifying target name +@cindex target machine name +@cindex @code{--name} (@code{runtest} option) +@var{name} is a name for the particular testing target machine (for +cross testing). If the testing target has IP network support (for +example, @code{RPC} or @code{NFS}), this is the network name for the +target itself. (@var{name} is @emph{not the configuration string} you +specify as a target with @code{configure}; the @samp{--name} option +names a particular target, rather than describing a class of targets.) +For targets that connect in other ways, the meaning of the @var{name} +string depends on the connection method. @xref{Cross Targets,,Remote +targets supported}. + +@item --name @var{string} +@cindex remote test machine name +@cindex name for remote test machine +Specify a network name of testing target or its host. The particular +names that are meaningful with @samp{--name} will depend on your site +configuration, and on the connection protocol: for example, @code{tip} +connections require names from a serial line configuration file (usually +called @file{/etc/remote}), while @code{telnet} connections use IP +hostnames. + +@item --objdir @var{path} +@cindex @code{--objdir} (@code{runtest} option) +@cindex object directory +@cindex test programs, auxiliary +@cindex auxiliary test programs +Use @var{path} as the top directory containing any auxiliary compiled +test code. This defaults to @file{.}. Use this option to locate +pre-compiled test code. You can normally prepare any auxiliary files +needed with @code{make}. + +@item --outdir @var{path} +@cindex output directory +@cindex @code{--outdir} (@code{runtest} option) +@cindex log files, where to write +Write output logs in directory @var{path}. The default is @samp{.}, the +directory where you start @code{runtest}. This option affects only the +summary and the detailed log files @file{@var{tool}.sum} and +@file{@var{tool}.log}. The DejaGnu debug log @file{dbg.log} always +appears (when requested) in the local directory. + +@item --reboot +@cindex rebooting remote targets +@cindex @code{--reboot} (@code{runtest} option) +Reboot the target board when @code{runtest} initializes. +Usually, when running tests on a separate target board, it is safer to +reboot the target to be certain of its state. However, when developing +test scripts, rebooting takes a lot of time. + +@item --srcdir @var{path} +@cindex source directory +@cindex @code{--srcdir} (@code{runtest} option) +Use @var{path} as the top directory for test scripts to run. +@code{runtest} looks in this directory for any subdirectory whose name +begins with the toolname (specified with @samp{--tool}). For instance, +with @samp{--tool gdb}, @code{runtest} uses tests in subdirectories +@file{gdb.*} (with the usual shell-like filename expansion). If you do +not use @samp{--srcdir}, @code{runtest} looks for test directories under +the current working directory. + +@item --strace @var{n} +@cindex @code{--strace} (@code{runtest} option) +@cindex tracing Tcl commands +@cindex @code{expect} internal tracing +Turn on internal tracing for @code{expect}, to @var{n} levels deep. By +adjusting the level, you can control the extent to which your output +expands multi-level Tcl statements. This allows you to ignore some +levels of @code{case} or @code{if} statements. Each procedure call or +control structure counts as one ``level''. + +The output is recorded in the same file, @file{dbg.log}, used for output +from @samp{--debug}. + +@item --target @var{string} +@cindex @code{--target} (@code{runtest} option) +@cindex specifying the target configuration +@cindex target configuration, specifying +Use this option to override the default setting (running native tests). +@var{string} is a full configuration ``triple'' +name@footnote{Configuration triples have the form +@samp{@var{cpu}-@var{vendor}-@var{os}}.} as used by @code{configure}. +This option changes the configuration @code{runtest} uses for the +default tool names, and other setup information. @xref{Using +configure,,Using @code{configure}, configure.info, Cygnus configure}, +for details about @code{configure} names. + +@item --verbose +@itemx -v +@cindex @code{--verbose} (@code{runtest} option) +@cindex @code{-v} (@code{runtest} option) +@cindex turning on output +@cindex output, additional +Turns on more output. Repeating this option increases the amount of +output displayed. Level one (@samp{-v}) is simply test output. Level +two (@samp{-v -v}) shows messages on options, configuration, and process +control. Verbose messages appear in the detailed (@file{*.log}) log +file, but not in the summary (@file{*.sum}) log file. + +@item --version +@itemx -V +@cindex @code{-V} (@code{runtest} option) +@cindex @code{--version} (@code{runtest} option) +@cindex version numbers +Prints out the version numbers of DejaGnu, @code{expect} and Tcl, and +exits without running any tests. + +@item -D0 +@itemx -D1 +@cindex starting the tcl debugger +@cindex tcl debugger +@c FIXME!!! we should say a *lot* more about this debugger +Start the internal Tcl debugger. The Tcl debugger supports breakpoints, +single stepping, and other common debugging activities. (See @cite{A +Debugger for Tcl Applications} by Don Libes. @footnote{Distributed in +PostScript form with @code{expect} as the file@* +@file{expect/tcl-debug.ps}.}) + +If you specify @samp{-D1}, the @code{expect} shell stops at a breakpoint +as soon as DejaGnu invokes it. + +If you specify @samp{-D0}, DejaGnu starts as usual, but you can enter +the debugger by sending an interrupt (e.g. by typing @key{C-c}). +@end table + +@node Customizing +@chapter Setting @code{runtest} defaults + +@kindex site.exp +@cindex variables of DejaGnu, defaults +The site configuration file, @file{site.exp}, captures +configuration-dependent values and propagates them to the DejaGnu test +environment using Tcl variables. This ties the DejaGnu test scripts +into the @code{configure} and @code{make} programs. + +@cindex @file{site.exp}, multiple +@cindex overriding @file{site.exp} +DejaGnu supports more than one @file{site.exp} file. The multiple +instances of @file{site.exp} are loaded in a fixed order built into +DejaGnu (the more local last). The first file loaded is the optional +@code{~/.dejagnurc}, then the local files, and finally the global file. + +@enumerate +@item +There is am optional ``master'' @file{site.exp}, capturing configuration values +that apply to DejaGnu across the board, in each configuration-specific +subdirectory of the DejaGnu library directory. @code{runtest} loads +these values first. @xref{Installation,,Configuring and Installing +DejaGnu}. The master @file{site.exp} contains the default values for +all targets and hosts supported by DejaGnu. This master file is +identified by setting the environment variable @code{DEJAGNU} to the +name of the file. This is also refered to as the ``global'' config file. + +@item +Any directory containing a configured test suite also has a +@file{site.exp}, capturing configuration values specific to the tool +under test. Since @code{runtest} loads these values last, the +individual test configuration can either rely on and use, or override, +any of the global values from the ``master'' @file{site.exp}. + +You can usually generate or update the testsuite @file{site.exp} by +typing @samp{make site.exp} in the test suite directory, after the test +suite is configured. + +@item +You can also have a file in your home directory called +@code{.dejagnurc}. This gets loaded first before the other config +files. Usually this is used for personal stuff, like setting +@code{all_flag} so all the output gets printed, or verbosity levels. +@end enumerate + +You can further override the default values in a user-editable section +of any @file{site.exp}, or by setting variables on the @code{runtest} +command line. + +@menu +* Config Values:: Variables used in the configuration file. +* Master Config File:: The master configuration file. +* Local Config File:: The local configuration file. +* Personal Config File:: The personal configuration file. +@end menu + +@node Config Values, Master Config File, , Customizing +@subsection Config Variables +@cindex configuration dependent defaults +@cindex setting defaults for DejaGnu variables + +@c NOTE: default values are given via @code{"fubar"} rather than the +@c more conventional @samp{fubar} to permit a consistent and clear +@c notation for the empty string (@code{""}), which will work exactly as +@c typed. + +DejaGnu uses a named array in Tcl to hold all the info for each +machine. In the case of a canadian cross, this means host information as +well as target information. The named array is called +@code{target_info}, and it has two indices. The following fields are +part of the array. + +@table @code +@item name +The name of the target. (mostly for error messages) This +should also be the string used for this target's array. +It should also be the same as the linker script so we +can find them dynamically. This should be the same as the argument used +for @code{push_target@{@}}. + +@item ldflags +This is the linker flags required to produce a fully linked +executable. For @code{libgloss} supported targets this is usually just +the name of the linker script. + +@item config +The target canonical for this target. This is used by some init files to +make sure the target is supported. + +@item cflags +The flags required to produce an object file from a source file. + +@item connect +This is the connectmode for this target. This is for both IP and +serial connections. Typically this is either @code{telnet}, +@code{rlogin}, or @code{rsh}. + +@item target +This is the hostname of the target. This is for TCP/IP based connections, +and is also used for version of tip that use /etc/remote. + +@item serial +This is the serial port. This is typically /dev/tty? or com?:. + +@item netport +This is the IP port. This is commonly used for telneting to target +boards that are connected to a terminal server. In that case the IP port +specifies the which serial port to use. + +@item baud +This is the baud rate for a serial port connection. + +@item x10 +This is the parameters for an x10 controller. These are simple devices +that let us power cycle or reset a target board remotely. + +@item fileid +This is the fileid or spawn id of of the connection. + +@item prompt +a glob style pattern to recognize the prompt. + +@item abbrev +abbreviation for tool init files. + +@item ioport +This is the port for I/O on dual port systems. In this configuration, +the main serial port @code{0} is usually used for stdin and stdout, +which the second serial port can be used for debugging. +@end table + +The first index into the array is the same value as used in the +@code{name} field. This is usually a short version of the name of the +target board. For an example, here's the settings I use for my +@code{Motorola's} @code{IDP} board and my @code{Motorola} 6U VME +@code{MVME135-1} board. (both m68k targets) + +@cartouche +@smallexample +# IDP board +set target_info(idp,name) "idp" +set target_info(idp,ldflags) "-Tidp.ld" +set target_info(idp,config) m68k-unknown-aout +set target_info(idp,cflags) "" +set target_info(idp,connect) telnet +set target_info(idp,target) "s7" +set target_info(idp,serial) "tstty7" +set target_info(idp,netport) "wharfrat:1007" +set target_info(idp,baud) "9600" +# MVME 135 board +set target_info(idp,name) "mvme" +set target_info(idp,ldflags) "-Tmvme.ld" +set target_info(idp,config) m68k-unknown-aout +set target_info(idp,cflags) "" +set target_info(idp,connect) telnet +set target_info(idp,target) "s8" +set target_info(idp,serial) "tstty8" +set target_info(idp,netport) "wharfrat:1008" +set target_info(idp,baud) "9600" +@end smallexample +@end cartouche + +DejaGnu can use this information to switch between multiple targets in +one test run. This is done through the use of the @code{push_target} +procedure, which is discussed elsewhere. +@c FIXME: write that section and put an xref here + +This array can also hold information for a remote host, which is used +when testing a candain cross. In this case, the only thing different is +the index is just @code{host}. Here's the settings I use to run tests +on my NT machine while running DejaGnu on a Unix machine. (in this case +a Linux box) + +@cartouche +@smallexample +set target_info(host,name) "nt-host" +set target_info(host,config) "386-unknown-winnt" +set target_info(host,connect) "telnet" +set target_info(host,target) "ripple" +@end smallexample +@end cartouche + +There is more info on how to use these variables in the sections on the +config files. @xref{Master Config File,,Configuration Files}. + +@cindex option defaults +@cindex @code{runtest} option defaults +@cindex variables for option defaults +@cindex defaults, option +In the user editable second section of @file{site.exp}, you can not only +override the configuration variables captured in the first section, but +also specify default values for all the @code{runtest} command line +options. Save for @samp{--debug}, @samp{--help}, and @samp{--version}, +each command line option has an associated Tcl variable. Use the Tcl +@code{set} command to specify a new default value (as for the +configuration variables). The following table describes the +correspondence between command line options and variables you can set in +@file{site.exp}. @xref{Invoking runtest,,Running the Tests}, for +explanations of the command-line options. + +@kindex all_flag +@kindex baud +@kindex reboot +@kindex outdir +@kindex objdir +@kindex runtests +@kindex ignoretests +@kindex srcdir +@kindex tracelevel +@kindex targetname +@kindex connectmode +@kindex tool +@kindex target_triplet +@kindex host_triplet +@kindex build_triplet +@kindex verbose + +@cindex command line option variables +@cindex Tcl variables for option defaults +@cindex default options, controlling +@cindex options, Tcl variables for defaults + +@ifinfo +@display +runtest Tcl +option variable description +__________ ________ ___________________________________________ + +--all all_flag display all test results if set + +--baud baud set the default baud rate to something other + than 9600. +--connect connectmode @samp{rlogin}, @samp{telnet}, @samp{rsh}, + @samp{kermit}, @samp{tip}, or @samp{mondfe} + +--outdir outdir directory for @file{@var{tool}.sum} and @file{@var{tool}.log} + +--objdir objdir directory for pre-compiled binaries + +--reboot reboot reboot the target if set to @code{"1"}; + do not reboot if set to @code{"0"} (the default) + +--srcdir srcdir directory of test subdirectories + +--strace tracelevel a number: Tcl trace depth + +--tool tool name of tool to test; identifies init, test subdir + +--verbose verbose verbosity level. As option, use multiple times; + as variable, set a number, 0 or greater +--target target_triplet The canonical configuration string for the target. +--host host_triplet The canonical configuration string for the host. +--build build_triplet The canonical configuration string for the + build host. + +@end display +@end ifinfo + +@tex +\vbox{\halign{\hfil \tt #\quad &\quad\tt #\hfil &\hbox{\vtop{{\raggedright\parindent=0pt\parskip=5pt\hsize=2.75in\rm#\strut\par}}}\hfill\cr +\cr +{\it runtest}&{\it Tcl}\cr +{\it option}&{\it variable}&{\it description}\cr +\noalign{\hrule width\hsize}\cr +--all &all\_flag &display all test results if set\cr +--baud &baud &set the default baud rate to something other + than 9600.\cr +--connect &connectmode &@samp{rlogin}, @samp{telnet}, @samp{rsh}, + @samp{kermit}, @samp{tip}, or @samp{mondfe}\cr +--mail &mailing\_list&address list for mailing test output\cr +--name &targetname &network name of testing target or its host\cr +--outdir &outdir &directory for @file{@var{tool}.sum} and @file{@var{tool}.log}\cr +--objdir &objdir &directory for compiled binaries\cr +--reboot &reboot &reboot the target if set to @code{"1"}; +do not reboot if set to @code{"0"} (the default)\cr +--srcdir &srcdir &directory of test subdirectories\cr +--strace &tracelevel &a number: Tcl trace depth\cr +--tool &tool &name of tool to test; identifies init, test subdir\cr +--verbose &verbose &verbosity level. As option, use multiple times; + as variable, set a number, 0 or greater\cr +--target &target\_triplet + &The canonical configuration string for the target.\cr +--host &host\_triplet &The canonical configuration string for the host.\cr +--build &build\_triplet &The canonical configuration string for the + build host.\cr +}} +@end tex + +@node Master Config File, Local Config File, Config Values, Customizing +@subsection Master Config File +@cindex master @file{site.exp} +@cindex @file{site.exp} for all of DejaGnu +The master config file is where all the target specific config variables +get set for a whole site get set. The idea is that for a centralized +testing lab where people have to share a target between multiple +developers. There are settings for both remote targets and remote hosts. +Here's an example of a Master Config File (also called the Global config +file) for a @emph{canadian cross}. A canadian cross is when you build +and test a cross compiler on a machine other than the one it's to be +hosted on. + +Here we have the config settings for our California office. Note that +all config values are site dependant. Here we have two sets of values +that we use for testing m68k-aout cross compilers. As both of these +target boards has a different debugging protocol, we test on both of +them in sequence. + +@cartouche +@smallexample +global CFLAGS +global CXXFLAGS + +case "$target_triplet" in @{ + @{ "native" @} @{ + set target_abbrev unix + @} + @{ "m68*-unknown-aout" @} @{ + set target_abbrev "rom68k" + # IDP target # IDP board with rom68k monitor + set target_info(idp,name) "idp" + set target_info(idp,ldflags) "-Tidp.ld" + set target_info(idp,config) m68k-unknown-aout + set target_info(idp,cflags) "" + set target_info(idp,connect) telnet + set target_info(idp,target) "s7" + set target_info(idp,serial) "tstty12" + set target_info(idp,netport) "truckin:1007" + set target_info(idp,baud) "9600" + # MVME target # Motorola MVME 135 with BUG monitor + set target_info(mvme,name) "mvme" + set target_info(mvme,ldflags) "-Tmvme.ld" + set target_info(mvme,config) m68k-unknown-aout + set target_info(mvme,cflags) "" + set target_info(mvme,connect) telnet + set target_info(mvme,target) "s4" + set target_info(mvme,serial) "tstty8" + set target_info(mvme,netport) "truckin:1004" + set target_info(mvme,baud) "9600" + @} +@} +@end smallexample +@end cartouche + + In this case, we have support for several remote hosts for +our m68k-aout cross compiler. Typically the remote Unix hosts run +DejaGnu locally, but we also use them for debugging the testsuites when +we find problems in running on remote hosts. Expect won't run on NT, so +DejaGnu is run on the local build machine, and it'll connect to the NT +host and run all the tests for this cross compiler on that host. + +@smallexample +@cartouche +case "$host_triplet" in @{ + "native" @{ + @} + "i?86-*-linux*" @{ # Linux host + set target_info(host,name) "linux-host" + set target_info(host,config) $host_triplet + set target_info(host,connect) rlogin + set target_info(host,target) chinadoll + @} + "i?86-*-winnt # NT host + set target_info(host,name) "nt-host" + set target_info(host,config) i386-unknown-winnt + set target_info(host,connect) telnet + set target_info(host,target) ripple + @} + "hppa*-hp-hpux*" @{ # HP-UX host + set target_info(host,name) "hpux-host" + set target_info(host,config) $host_triplet + set target_info(host,connect) rlogin + set target_info(host,target) slipknot + @} + "sparc-sun-sunos*" @{ # SunOS (sun4) + set target_info(host,name) "sunos-host" + set target_info(host,config) $host_triplet + set target_info(host,connect) rlogin + set target_info(host,target) darkstar + @} +@} +@end cartouche +@end smallexample + +@node Local Config File, Personal Config File, Master Config File, Customizing +@subsection Local Config File +@cindex local @file{site.exp} +@cindex @file{site.exp} for each tool +It is usually more convenient to keep these ``manual overrides'' in the +@file{site.exp} local to each test directory, rather than in the +``master'' @file{site.exp} in the DejaGnu library. + +All local @file{site.exp} usually files have two sections, separated by +comment text. The first section is the part that is generated by +@code{make}. It is essentially a collection of Tcl variable definitions +based on @file{Makefile} environment variables. Since they are generated +by @code{make}, they contain the values as specified by +@code{configure}. (You can also customize these values by using the +@samp{--site} option to @code{configure}.) In particular, this section +contains the @file{Makefile} variables for host and target configuration +data. Do not edit this first section; if you do, your changes are replaced +next time you run @code{make}. + +The first section starts with: + +@cartouche +@smallexample +## these variables are automatically generated by make ## +# Do not edit here. If you wish to override these values +# add them to the last section +@end smallexample +@end cartouche + +In the second section, you can override any default values (locally to +DejaGnu) for all the variables. The +second section can also contain your preferred defaults for all the +command line options to @code{runtest}. This allows you to easily +customize @code{runtest} for your preferences in each configured +test-suite tree, so that you need not type options repeatedly on the +command line. (The second section may also be empty, if you do not wish +to override any defaults.) + +The first section ends with this line: + +@cartouche +@smallexample +## All variables above are generated by configure. Do Not Edit ## +@end smallexample +@end cartouche + +You can make any changes under this line. If you wish to redefine a +variable in the top section, then just put a duplicate value in this +second section. Usually the values defined in this config file are +related to the configuration of the test run. This is the ideal place to +set the variables @code{host_triplet}, @code{build_triplet}, +@code{target_triplet}. All other variables are tool dependant. ie for +testing a compiler, the value for @var{CC} might be set to a freshly +built binary, as opposed to one in the user's path. + +@node Personal Config File, , Local Config File, Customizing +@subsection Personal Config File +@cindex personal config @file{site.exp} +@cindex @file{site.exp} for each person +The personal config file is used to customize @code{runtest's} behaviour +for each person. It's typically used to set the user prefered setting +for verbosity, and any experimental Tcl procedures. My personal +@file{~/.dejagnurc} file looks like: + +@cartouche +@smallexample +set all_flag 1 +set RLOGIN /usr/ucb/rlogin +set RSH /usr/ucb/rsh +@end smallexample +@end cartouche + +Here I set @code{all_flag} so I see all the test cases that PASS along +with the ones that FAIL. I also set @var{RLOGIN} and @code{RSH} to the +BSD version. I have @code{kerberos} installed, and when I rlogin to a +target board, it usually isn't supported. So I use the non secure +versions of these programs rather than the default that's in my path. + +@node Internals +@chapter The DejaGnu Implementation +@cindex operating principles +@cindex internal details + +DejaGnu is entirely written in @code{expect}, which uses Tcl as a +command language. @code{expect} serves as a very programmable shell; +you can run any program, as with the usual Unix command shells---but +once the program is started, your @code{expect} script has fully +programmable control of its input and output. This does not just apply +to the programs under test; @code{expect} can also run any auxiliary +program, such as @code{diff} or @code{sh}, with full control over its +input and output. + +DejaGnu itself is merely a framework for the set of test suites +distributed separately for each @sc{gnu} tool. Future releases of +@sc{gnu} tools will include even more tests, developed throughout the +free software community. + +@kindex runtest.exp +@code{runtest} is the glue to tie together and manage the test scripts. +The @code{runtest} program is actually a simple Bourne shell script that +locates a copy of the @code{expect} shell and then starts the main Tcl +code, @code{runtest.exp}. @code{runtest.exp} itself has these essential +functions: + +@enumerate +@item +Parse the command line options, load the library files, and load the +default configuration files. + +@item +Locating the individual test scripts. @code{runtest.exp} locates the tests +by exploiting a straightforward naming convention based on the string +you specify with the @samp{--tool} option. + +@item +Providing an extended test environment, by defining additional Tcl +procedures beyond those already in @code{expect}. + +@item +Locating target-dependent functions, to standardize the test environment +across a wide variety of test platforms. +@end enumerate + +@menu +* Names:: Conventions for using tool names +* Init Module:: Initialization module +* DejaGnu Builtins:: DejaGnu provides these Tcl procedures +* Target Dependent:: Procedures supplied by the init module +* Cross Targets:: Remote targets supported +* Input Files:: The files DejaGnu depends on +* Output Files:: The files DejaGnu produces +@end menu + +@node Names +@section Conventions for using tool names + +@cindex @code{--tool} and naming conventions +@cindex tool names and naming conventions +@cindex naming conventions +DejaGnu uses @samp{$tool}, the name of the tool under test, to tie +together the testing configuration in a straightforward but flexible +way. If there is only one testsuite for a particular application, then +@samp{$tool} is optional. + +@samp{$tool} is @emph{not} used to invoke the tool, since sites that run +multiple configurations of a particular tool often call each +configuration by a different name. @code{runtest} uses the +configuration-dependent variables captured in @file{site.exp} to +determine how to call each tool. + +@cindex directory names and @code{--tool} +@cindex test directories, naming +@code{runtest} uses tool names to find directories containing tests. +@code{runtest} scans the source directory (specified with +@code{--srcdir}) for all directories whose names start with the tool +name. It is a common practice to put a period after the tool part of the +name. For instance, directories that start with +@samp{g++.} contain @sc{g++} tests. To add a new test, just put it in +any directory (create an entirely new directory, if you wish) whose name +follows this convention. + +@cindex @code{exp} filename suffix +@cindex test filename +@cindex filename for test files +A test is any file in an appropriately named subdirectory whose name +ends in @samp{.exp} (the conventional way of naming @code{expect} +scripts). These simple naming conventions make it as simple as possible +to install new tests: all you must do is put the test in the right +directory. + +@cindex order of tests +@cindex tests, running order +@code{runtest} sorts the tests in each subdirectory by name (using the +Tcl @code{lsort} command) and runs them in the resulting order. + +@node Init Module +@section Initialization module +@cindex tool initialization +@cindex setting up targets + +@c FIXME! should this node be merged with "Target dependent"? + +@cindex init file, purpose +@cindex starting interactive tools +@cindex initialization +The initialization module (or ``init file'') has two purposes: to +provide tool and target dependent procedures, and to start up an +interactive tool to the point where it is ready to operate. The latter +includes establishing communications with the target. All the tests for +interactive programs assume that the tool is already running and +communicating. Initialization modules for non-interactive programs may +only need to supply the support functions. + +@cindex init file name +@cindex name, initialization module +Each test suite directory must contain (in its @file{config} +subdirectory) a separate initialization module for each target. The +appropriate init file is can be named several ways. The prefered name is +the @emph{os} part of the canonical configuration name with @code{.exp} +as the suffix. An example would be that for an @code{m68k-coff} system, +the @code{target_os} part would be @code{coff}. The next way is for +system where there are short filenames, or a shortcut is desired to +refer to the OS name for that target. This is uses the value of +@code{$target_abbrev} rather than the @code{target_os}. + +The final file looked for is simply @file{default.exp}. If there is only +one operating system to support, then this file can be used. It's main +purpose is to offer some support for new operating systems, or for +unsupported cross targets. The last file looked for is +@file{unknown.exp}. This is usually limited to error handling for +unsupported targets. It's whole contents is typically. + +@cartouche +@smallexample +perror "Sorry, there is no support for this target" +exit 1 +@end smallexample +@end cartouche + +At the beginning of the init file, you must first determine the proper +executable name of the tool to execute, since the actual name of the +tool to be tested my vary from system to system. Here's an example +for the @sc{GNU} C compiler. + +@cartouche +@smallexample +global AR +# look for the archiver ar +if ![info exists AR] @{ + set AR [findfile $base_dir/../../binutils/ar $base_dir/../../binutils/ar [tr +ansform ar]] + verbose "AR defaulting to $AR" 2 +@} +@} + +global CFLAGS +if ![info exists CFLAGS] then @{ + set CFLAGS "" +@} +@end smallexample +@end cartouche + +It is always a good idea to first check the variable, and only set it if +it has not yet been defined. Often the proper value of @code{AR} is set +on the command line that invokes @file{runtest}. + +@kindex findfile +The @code{findfile} procedure takes as it's first argument a file name +to look for. The second argument is returned if the file is found, and +the third argument is returned if the file is not found. @code{base_dir} +is set internally by DejaGnu to the top level directory of the object +tree. + +@kindex transform +The @code{transform} procedure takes as its argument the native name of +a tool (such as @samp{gcc} for the compiler), and returns the name as +configured for that tool in the current installation. (For example, a +cross-compiling version of @sc{gnu} CC that generates MIPS code may be +installed with a name like @code{mips-idt-ecoff-gcc}.) + +In a test running native, writing the Tcl code for initialization is +usually quite simple. For cross configurations, however, more elaborate +instructions are usually needed to describe how to talk to a remote +target. + +Each initialization module defines up to four procedures with standard +names and purposes. The names of these procedures begin with +@samp{$tool}, the string that identifies tests for a particular tool: +@code{$tool_start}, @code{$tool_load}, @code{$tool_exit}, and +@code{$tool_version}. For example, the start procedure for @sc{gdb} is +called @code{gdb_start}. (Since start procedures are used differently +for batch and interactive tools, however, @code{runtest} itself never +calls the start procedure. Init files for interactive tools are +expected to end by running the start procedure.) + +@cindex utilities, loading from init file +@cindex defaults, setting in init file +The initialization module is also a good place to call @code{load_lib} +to get any collections of utility procedures meant for a family of test +cases, and to set up default values for any additional Tcl variables +needed for a specific set of tests. + +@xref{Target Dependent,,Target dependent procedures}, for full +descriptions of these procedures. + +@node DejaGnu Builtins +@section DejaGnu procedures +@cindex built in procedures, DejaGnu + +DejaGnu provides these Tcl procedures for use in test scripts. +You can also use any standard @code{expect} or Tcl function. These +procedures are stored in libraries, which DejaGnu loads at +runtime. Here's explanation of the library procedures that get loaded at +runtime. All other librarys are optional, and need to be loaded by the +testsuite. + +@menu +* framework.exp:: Core Internal Procedures. +* remote.exp:: Procedures for remote communication. +* utils.exp:: Utility procedures. +* target.exp:: Cross target procedures. +* debugger.exp:: Procedures for debugging your Tcl code. +@end menu + +@node framework.exp, remote.exp, ,DejaGnu Builtins +@subsection Core Internal Procedures +@cindex Core Internal Procedures + +@xref{Posix,,A POSIX conforming test framework}, for more detailed +explanations of the test outcomes (@samp{FAIL}, @samp{PASS}, +@samp{UNTESTED}, @samp{UNRESOLVED}, @samp{UNSUPPORTED}). + +@ftable @code +@item perror "@var{string} @var{number}" +@cindex test case, ERROR in +@kindex ERROR +Declares a severe error in the testing framework itself. +@code{perror} writes in the log files a message beginning with +@samp{ERROR}, appending the argument @var{string}. If the optional +@var{number} is supplied, then this is used to set the internal count of +errors to that value. + +As a side effect, @code{perror} also changes the effect of the next +@code{pass} or @code{fail} command: the test outcome becomes +@samp{UNRESOLVED}, since an automatic @samp{PASS} or @samp{FAIL} cannot +be trusted after a severe error in the test framework. If the optional +numeric value is @samp{0}, then there are no further side effects to +calling this function, and the following test outcome doesn't become +@samp{UNRESOLVED}. This can be used for errors with no known side +effects. + +@item warning "@var{string} @var{number}" +@cindex test case, WARNING in +@kindex WARNING +Declares detection of a minor error in the test case itself. +@code{warning} writes in the log files a message beginning with +@samp{WARNING}, appending the argument @var{string}. Use @code{warning} +rather than @code{error} for cases (such as communication failure +to be followed by a retry) where the test case can recover from the +error. If the optional @var{number} is supplied, then this is used to +set the internal count of warnings to that value. + +As a side effect, @code{warning_threshold} or more calls to +@code{warning} in a single test case also changes the effect of the next +@code{pass} or @code{fail} command: the test outcome becomes +@samp{UNRESOLVED} since an automatic @samp{PASS} or @samp{FAIL} may not +be trustworthy after many warnings. If the optional numeric value is +@samp{0}, then there are no further side effects to calling this +function, and the following test outcome doesn't become +@samp{UNRESOLVED}. This can be used for errors with no known side +effects. + +@item note "@var{string}" +@cindex test case, informational messages +@kindex NOTE +Appends an informational message to the log file. +@code{note} writes in the log files a message beginning with +@samp{NOTE}, appending the argument @var{string}. Use @code{note} +sparingly. @code{verbose} should be used for most such messages, +but in cases where a message is needed in the log file regardless of +the verbosity level use @code{note}. + +@item pass "@var{string}" +@cindex test case, declaring success +Declares a test to have passed. @code{pass} writes in the +log files a message beginning with @samp{PASS} (or @code{XPASS}, if +failure was expected), appending the argument @var{string}. + +@item fail "@var{string}" +@cindex test case, declaring failure +Declares a test to have failed. @code{fail} writes in the +log files a message beginning with @samp{FAIL} (or @code{XFAIL}, if +failure was expected), appending the argument @var{string}. + +@item unresolved "@var{string}" +@cindex test case, declaring ambiguity +Declares a test to have an unresolved outcome. @code{unresolved} writes +in the log file a message beginning with @samp{UNRESOLVED}, appending +the argument @var{string}. This usually means the test did not execute +as expected, and a human being must go over results to determine if it +passed or failed (and to improve the test case). + +@item untested "@var{string}" +@cindex test case, declaring no test +Declares a test was not run. @code{untested} writes in the log file a +message beginning with @samp{UNTESTED}, appending the argument +@var{string}. For example, you might use this in a dummy test whose +only role is to record that a test does not yet exist for some feature. + +@item unsupported "@var{string}" +@cindex test case, declaring no support +Declares that a test case depends on some facility that does not exist +in the testing environment. @code{unsupported} writes in the log file a +message beginning with @samp{UNSUPPORTED}, appending the argument +@var{string}. + +@item get_warning_threshold +@cindex test case, WARNING threshold +Returns the current value of @code{warning_threshold}. +The default value is 3. + +@item set_warning_threshold @var{threshold} +@cindex test case, WARNING threshold +Sets the value of @code{warning_threshold}. +A value of @code{0} disables it: calls to @code{warning} will not turn +a @samp{PASS} or @samp{FAIL} into an @samp{UNRESOLVED}. + +@item transform "@var{toolname}" +@cindex transform tool name +@cindex installed tool name +@cindex tool name, as installed +@cindex name transformations +Generates a string for the name of a tool as it was configured and +installed, given its native name (as the argument @var{toolname}). +This makes the assumption that all tools are installed using the same +naming conventions: it extrapolates from the invocation name for +@file{runtest}. For example, if you call @code{runtest} as +@file{m68k-vxworks-runtest}, the result of @w{@samp{ transform "gcc" }} +is @samp{m68k-vxworks-gcc}. + +@item ishost "@var{host}" +@cindex host configuration test +Tests for a particular @emph{host} environment. If the currently +configured host matches the argument string, the result is @code{1}; +otherwise the result is @code{0}. @var{host} must be a full three-part +@code{configure} host name; in particular, you may not use the shorter +nicknames supported by @code{configure} (but you can use wildcard +characters, using shell syntax, to specify sets of names). + +@item istarget "@var{target}" +@cindex target configuration test +Tests for a particular @emph{target} environment. If the currently +configured target matches the argument string, the result is @code{1}; +otherwise the result is @code{0}. @var{target} must be a full +three-part @code{configure} target name; in particular, you may not use +the shorter nicknames supported by @code{configure} (but you can use +wildcard characters, using shell syntax, to specify sets of names). If it is +passed a @code{NULL} string, then it returns the name of the build +canonical configuration. + +@item isbuild "@var{host}" +@cindex build host configuration test +Tests for a particular @emph{build host} environment. If the currently +configured host matches the argument string, the result is @code{1}; +otherwise the result is @code{0}. @var{host} must be a full three-part +@code{configure} host name; in particular, you may not use the shorter +nicknames supported by @code{configure} (but you can use wildcard +characters, using shell syntax, to specify sets of names). If it is +passed a @code{NULL} string, then it returns the name of the build +canonical configuration. + +item is3way "@var{host}" +@cindex canadian cross configuration test +Tests for a canadian cross. This is when the tests will be run on a +remotly hosted cross compiler. If it is a canadian cross, then the +result is @code{1}; otherwise the result is @code{0}. + +@item isnative +@cindex native configuration test +Tests whether the current configuration has the same host and target. +When it runs in a @emph{native} configuration this procedure returns a +@code{1}; otherwise it returns a @code{0}. + +@item load_lib "@var{library-file}" +@cindex load library file +Loads the file @var{library-file} by searching a fixed path built into +@code{runtest}. If DejaGnu has been installed, it looks in a path +starting with the installed library directory. If you are running +DejaGnu directly from a source directory, without first running +@samp{make install}, this path defaults to the current directory. In +either case, it then looks in the current directory for a directory +called @code{lib}. If there are duplicate definitions, the last one +loaded takes precedence over the earlier ones. + +@item setup_xfail "@var{config} @r{[}@var{bugid}@r{]}" +@c two spaces above to make it absolutely clear there's whitespace---a +@c crude sort of italic correction! +@cindex test case, expecting failure +@cindex failure, expected +@cindex expected failure +Declares that the test is expected to fail on a particular set of +configurations. The @var{config} argument must be a list of full +three-part @code{configure} target name; in particular, you may not use +the shorter nicknames supported by @code{configure} (but you can use the +common shell wildcard characters to specify sets of names). The +@var{bugid} argument is optional, and used only in the logging file +output; use it as a link to a bug-tracking system such as @sc{gnats} +(@pxref{Overview,, Overview, gnats.info, Tracking Bugs With GNATS}). + +@cindex @code{XFAIL}, producing +@cindex @code{XPASS}, producing +Once you use @code{setup_xfail}, the @code{fail} and @code{pass} +procedures produce the messages @samp{XFAIL} and @samp{XPASS} +respectively, allowing you to distinguish expected failures (and +unexpected success!) from other test outcomes. + +@emph{Warning:} you must clear the expected failure after using +@code{setup_xfail} in a test case. Any call to @code{pass} or +@code{fail} clears the expected failure implicitly; if the test has some +other outcome, e.g. an error, you can call @code{clear_xfail} to clear +the expected failure explicitly. Otherwise, the expected-failure +declaration applies to whatever test runs next, leading to surprising +results. + +@item check_conditional_xfail @var{message} @var{targets} @var{includes} @var{excludes} +@cindex test case, expecting a conditional failure +@cindex failure, conditional expected +@cindex conditional expected failure + +This procedure adds a condition xfail, based on compiler options used to +create a test case executable. If an include options is found in the +compiler flags, and it's the right architecture, it'll trigger an +XFAIL. Otherwise it'll produce an ordinary FAIL. You can also specify +flags to exclude. This makes a result be a FAIL, even if the included +options are found. To set the conditional, set the variable +@var{compiler_conditional_xfail_data} to the fields "[message string] [targets +list] [includes list] [excludes list]" (descriptions below). This is the +checked at pass/fail decision time, so there is no need to call the +procedure yourself, unless you wish to know if it gets triggered. After +a pass/fail, the variable is reset, so it doesn't effect other tests. + +The parameters are: + +@table @code +@item message +is the message to print with the normal test result + +@item targets +is a string with the targets to activate this conditional on. + +@item includes +is a list of sets of options to search for in the compiler options to +activate this conditional. If any set of the options matches, then this +conditional is true. + +@item excludes +is a list of sets of options to search for in the compiler options to +activate this conditional. If any set of the options matches, +(regardless of whether any of the include sets match) then this +conditional is de-activated. +@end table + +returns: + +@table @code +@item 1 +if the conditional is true +@item 0 +if the conditional is false +@end table + +An example of setting the variable would be: + +@cartouche +@smallexample +set compiler_conditional_xfail_data @{@ \ + "I sure wish I knew why this was hosed" \ + "sparc*-sun*-* *-pc-*-*" \ + @{@"-Wall -v" "-O3"@}@ \ + @{@"-O1" "-Map" @}@ \ + @}@ +@end smallexample +@end cartouche + + What this does is it matches only for these two targets if "-Wall -v" or +"-O3" is set, but neither "-O1" or "-Map" is set. + + For a set to match, the options specified are searched for independantly of +each other, so a "-Wall -v" matches either "-Wall -v" or "-v -Wall". A space +seperates the options in the string. Glob-style regular expressions are also +permitted. + +@item clear_xfail @var{config} +@cindex cancelling expected failure +@cindex expected failure, cancelling +Cancel an expected failure (previously declared with @code{setup_xfail}) +for a particular set of configurations. The @var{config} argument is a +list of configuration target names. It is only necessary to call +@code{clear_xfail} if a test case ends without calling either +@code{pass} or @code{fail}, after calling @code{setup_xfail}. + +@item verbose @r{[}-log@r{]} @r{[}-n@r{]} @r{[}--@r{]} "@var{string}" @var{number} +@cindex @code{verbose} builtin function +Test cases can use this function to issue helpful messages depending on +the number of @samp{--verbose} options on the @code{runtest} command +line. It prints @var{string} if the value of the variable +@code{verbose} is higher than or equal to the optional @var{number}. The +default value for @var{number} is 1. Use the optional @samp{-log} argument +to cause @var{string} to always be added to the log file, even if it won't +be printed. Use the optional @samp{-n} argument to print @var{string} +without a trailing newline. Use the optional @samp{--} argument if +@var{string} begins with "-". + +@end ftable + +@noindent +@node remote.exp, utils.exp, framework.exp, DejaGnu Builtins +@subsection Remote Communication Procedures + +@kindex remote.exp +@kindex lib/remote.exp +@cindex remote connection procedures +@cindex communications procedures +@file{lib/remote.exp} defines these functions, for establishing and +managing communications: + +@emph{Procedures to establish a connection:} Each of these procedures +tries to establish the connection up to three times before returning. +Warnings (if retries will continue) or errors (if the attempt is +abandoned) report on communication failures. The result for any of +these procedures is either @code{-1}, when the connection cannot be +established, or the spawn ID returned by the @code{expect} command +@code{spawn}. + +It use the value of the @code{connect} field in the @code{target_info} +array (was @code{connectmode} as the type of connection to make. Current +supported connection types are tip, kermit, telnet, rsh, rlogin, and +netdata. If the @code{--reboot} option was used on the runtest command +line, then the target is rebooted before the connection is made. + +@ftable @code + +@item remote_open @var{type} +@cindex Opening a remote connection +@emph{Remote Connection Procedure.} This is passed @emph{host} or +@emph{target}. Host or target refers to whether it is a connection to a +remote target, or a remote host. This opens the connection to the +desired target or host using the default values in the configuration +system. It returns that @code{spawn_id} of the process that manages the +connection. This value can be used in @code{expect} or @code{exp_send} +statements, or passed to other procedures that need the connection +process's id. This also sets the @code{fileid} field in the +@code{target_info} array. + + +@item remote_close @var{shellid} +@cindex Closing a remote connection +@emph{shellid} is value returned by a call to @code{remote_open}. This +closes the connection to the target so resources can be used by +others. This parameter can be left off if the @code{fileid} field in the +@code{target_info} array is set. + +@item telnet @var{hostname} @var{port} +@itemx rlogin @var{hostname} +@itemx rsh @var{hostname} +@cindex IP network procedures +@cindex network (IP) procedures +@emph{IP network procedures.} @var{hostname} refers to the IP address or +name (for example, an entry in @file{/etc/hosts}) for this target. The +procedure names reflect the Unix utility used to establish a +connection. The optional @var{port} is used to specify the IP port +number. The value of the @code{netport} field in the @code{target_info} +array is used. (was @code{$netport}) This value has two parts, the +hostname and the port number, seperated by a @emph{:}. If @code{host} or +@code{target} is used in the @code{hostname} field, than the config +array is used for all information. + +@item tip @var{port} +@cindex serial line connection, @code{tip} +@emph{Serial line procedure.} Connect using the Unix utility @code{tip}. +@var{port} must be a name from the @code{tip} configuration file +@file{/etc/remote}. Often, this is called @samp{hardwire}, or something +like @samp{ttya}. This file holds all the configuration data for +the serial port. The value of the @code{serial} field in the +@code{target_info} array is used. (was @code{$serialport}) If +@code{host} or @code{target} is used in the @code{port} field, than +the config array is used for all information. + +@item kermit @var{port} @var{bps} +@cindex serial line connection, @code{kermit} +@emph{Serial line procedure.} Connect using the program @code{kermit}. +@var{port} is the device name, e.g. @file{/dev/ttyb}. @var{bps} is +the line speed to use (in bits per second) for the connection. The value +of the @code{serial} field in the @code{target_info} array is used. (was +@code{$serialport}) If @code{host} or @code{target} is used in the +@code{port} field, than the config array is used for all information. + +@end ftable + +@noindent +@emph{Procedures to manage a connection:} + +@ftable @code +@item tip_download @var{spawnid} @var{file} +@cindex download, @code{tip} +@cindex serial download, @code{tip} +Download @file{@var{file}} to the process @var{spawnid} (the value +returned when the connection was established), using the @code{~put} +command under @code{tip}. Most often used for single board computers +that require downloading programs in @sc{ascii} S-records. Returns +@code{1} if an error occurs, @code{0} otherwise. + +@item exit_remote_shell @var{spawnid} +@cindex terminating remote connection +@cindex remote connection, ending +Exits a remote process started by any of the connection procedures. +@var{spawnid} is the result of the connection procedure that started the +remote process. + +@item download @var{file} @r{[} @var{spawnid} @r{]} +@cindex download a file +After you establish a connection to a target, you can download programs +using this command. @code{download} reads in @var{file} (object code in +S-record format) and writes it to the device controlling this +@var{spawnid}. (From the point of view of the target, the S-record file +comes in via standard input.) + +If you have more than one target active, you can use the optional argument +@var{spawnid} to specify an alternative target (the default is the most +recently established @var{spawnid}.) +@end ftable + +@noindent +@node utils.exp, target.exp, remote.exp, DejaGnu Builtins +@subsection Utility Procedures + +@kindex utils.exp +@kindex lib/utils.exp +@file{lib/utils.exp} defines these utility procedures: + +@ftable @code +@item getdirs @var{dir} +@itemx getdirs @var{dir} @var{pattern} +@cindex directories matching a pattern +@cindex pattern match, directory +Returns a list of all the directories in the single directory @var{dir} +that match @var{pattern}. If you do not specify @var{pattern}, +@code{getdirs} assumes @samp{*}. You may use the common shell wildcard +characters in @var{pattern}. If no directories match the pattern, then a +@code{NULL} string is returned. + +@item find @var{dir} @var{pattern} +@cindex files matching a pattern +@cindex pattern match, filenames +Search for files whose names match @var{pattern} (using shell wildcard +characters for filename expansion). Search subdirectories recursively, +starting at @var{dir}. The result is the list of files whose names +match; if no files match, the result is empty. Filenames in the result +include all intervening subdirectory names. If no files match the +pattern, then a @code{NULL} string is returned. + +@item which @var{binary} +@cindex path lookup +Searches the execution path for an executable file @var{binary}, like +the the BSD @code{which} utility. This procedure uses the shell +environment variable @samp{PATH}. It returns @code{0} if the binary is +not in the path, or if there is no @samp{PATH} environment variable. If +@var{binary} is in the path, it returns the full path to @var{binary}. + +@item grep @var{filename} @var{regexp} +@item grep @var{filename} @var{regexp} line +@cindex regular expression, file contents +@cindex searching file contents +Search the file called @var{filename} (a fully specified path) for lines +that contain a match for regular expression @var{regexp}. The result is +a list of all the lines that match. If no lines match, the result is an +empty string. Specify @var{regexp} using the standard regular +expression style used by the Unix utility program @code{grep}. + +Use the optional third argument @samp{line} to start lines in the result +with the line number in @var{filename}. (This argument is simply an +option flag; type it just as shown---@samp{line}.) + +@item diff @var{filename} @var{filename} +@cindex finding file differences +@cindex comparing files +Compares the two files and returns a 1 if they match, or a 0 if they +don't. If @code{verbose} is set, then it'll print the differences to the +screen. + +@item slay @var{name} +@cindex slaying processes +This look in the process table for @var{name} and send it a unix +@code{SIGINT}, killing the process. + +@item absolute @var{path} +@cindex converting relative paths to absolute +This procedure takes the relative @var{path}, and converts it to an +absolute path. + +@item psource @var{filename} +@cindex sourcing Tcl files +This sources the file @var{filename}, and traps all errors. It also +ignores all extraneous output. If there was an error it returns a 1, +otherwise it returns a 0. + +@item prune @var{list} @var{pattern} +@cindex list, pruning +Remove elements of the Tcl list @var{list}. Elements are fields +delimited by spaces. The result is a copy of @var{list}, without any +elements that match @var{pattern}. You can use the common shell +wildcard characters to specify @var{pattern}. + +@item setenv @var{var} @var{val} +@cindex setting environment variables +Sets the variable @var{var} to the value @var{val}. + +@item unsetenv @var{var} +@cindex unsetting environment variables +Unsets the environment variable @var{var} + +@item getenv @var{var} +@cindex getting environment variables +returns the value of @var{var} in the environment if it exists, +otherwise it returns @code{NULL}. + +@item runtest_file_p @var{runtests} @var{testcase} +@cindex selecting a range of tests +@cindex tests, running specifically +Search @var{runtests} for @var{testcase} and return 1 if found, 0 if not. +@var{runtests} is a list of two elements. The first is the pathname of +the testsuite expect script running. The second is a copy of what was +on the right side of the @code{=} if @samp{foo.exp="@dots{}"} was specified, +or an empty string if no such argument is present. +This is used by tools like compilers where each testcase is a file. + +@item prune_system_crud @var{system} @var{text} +@cindex pruning system output, examining program output +For system @var{system}, delete text the host or target operating system might +issue that will interfere with pattern matching of program output in +@var{text}. An example is the message that is printed if a shared library +is out of date. + +@end ftable + +@noindent +@node target.exp, debugger.exp, utils.exp, DejaGnu Builtins +@subsection Cross target procedure + +@kindex target.exp +@kindex lib/target.exp +@file{lib/target.exp} defines these utility procedures: + +@ftable @code + +@item push_target @emph{name} +@cindex set current target +This makes the target named @emph{name} be the current target +connection. The value of @emph{name} is an index into the +@code{target_info} array and is set in the global config file. + +@item pop_target +@cindex unset current target +This unsets the current target connection. + +@item list_targets +@cindex lists supported targets +This lists all the supported targets for this architecture. + +@item push_host @emph{name} +@cindex set current host +This makes the host named @emph{name} be the current remote host +connection. The value of @emph{name} is an index into the +@code{target_info} array and is set in the global config file. + +@item pop_host +@cindex unset current host +This unsets the current host connection. + +@c @item compile @emph{file} +@cindex compile a file +This invokes the compiler as set by @code{CC} to compile the file +@emph{file}. The default options for many cross compilation targets are +@emph{guessed} by DejaGnu, and these options can be added to by passing +in more parameters as arguments to @code{compile}. Optionally, this will +also use the value of the @code{cflags} field in the target config +array. If the host is not the same as the build machines, then then +compiler is run on the remote host using @code{execute_anywhere}. + +@c @item archive @emph{file} +@cindex archive object files +This produces an archive file. Any parameters passed to @code{archive} +are used in addition to the default flags. Optionally, this will +also use the value of the @code{arflags} field in the target config +array. If the host is not the same as the build machines, then then +archiver is run on the remote host using @code{execute_anywhere}. + +@c @item ranlib @emph{file} +@cindex ranlib a file +This generates an index for the archive file for systems that aren't +POSIX yet. Any parameters passed to @code{ranlib} are used in for the +flags. + +@item execute_anywhere @emph{cmdline} +@cindex executing commands remotely +This executes the @emph{cmdline} on the proper host. This should be used +as a replacement for the Tcl command @code{exec} as this version +utilizes the target config info to execute this command on the build +machine or a remote host. All config information for the remote host +must be setup to have this command work. If this is a canadian cross, +(where we test a cross compiler that runs on a different host then where +DejaGnu is running) then a connection is made to the remote host and +the command is executed there. It returns either @emph{REMOTERROR} (for +an error) or the output produced when the command was executed. This is +used for running the tool to be tested, not a test case. + +@end ftable + +@node debugger.exp, , target.exp, DejaGnu Builtins +@subsection Debugging Procedures + +@kindex debugger.exp +@kindex lib/debugger.exp +@file{lib/debugger.exp} defines these utility procedures: + +@ftable @code + +@item dumpvars @emph{expr} +@cindex Print global variable values +This takes a csh style regular expression (glob rules) and prints the +values of the global variable names that match. It is abbreviated as +@code{dv} + +@item dumplocals @emph{expr} +@cindex Print local variable value +This takes a csh style regular expression (glob rules) and prints the +values of the local variable names that match. It is abbreviated as +@code{dl}. + +@item dumprocs @emph{expr} +@cindex Print procedure bodies +This takes a csh style regular expression (glob rules) and prints the +body of all procs that match. It is abbreviated as @code{dp} + +@item dumpwatch @emph{expr} +@cindex Print watchpoints +This takes a csh style regular expression (glob rules) and prints all +the watchpoints. It is abbreviated as @code{dw}. + +@c FIXME: finish these when the code is fixed. +@c @item watcharray @emph{element} @emph{type} +@c @cindex Set a watchpoint on an array +@c This sets an watchpoint of the @emph{element-type} on the +@c @item watchvar v null type +@c @cindex Set a watchpoint on a variable + +@item watchunset @emph{var} +@cindex Watch when a variable is unset +This breaks program execution when the variable @emph{var} is unset. It +is abbreviated as @code{wu}. + +@item watchwrite @emph{var} +@cindex Watch when a variable is written +This breaks program execution when the variable @emph{var} is +written. It is abbreviated as @code{ww}. + +@item watchread @emph{var} +@cindex Watch when a variable is read +This breaks program execution when the variable @emph{var} is read. It +is abbreviated as @code{wr}. + +@item watchdel @emph{watch} +@cindex Delete a watchpoint. +This deletes a the watchpoint for @emph{watch}. It is abbreviated as +@code{wd}. + +@item print @emph{var} +@cindex Printing variable values +This prints the value of the variable @emph{var}. It is abbreviated as +@code{p}. + +@item quit +@cindex Quiting DejaGnu +This makes runtest exit. It is abbreviated as @code{q}. + +@item bt +@cindex Print a backtrace +This prints a backtrace of the executed Tcl commands. + +@end ftable + +@node Target Dependent +@section Target dependent procedures +@cindex target dependent procedures + +@c FIXME? These may be renamed to just "start", "load", "exit", and +@c "version" eventually. + +Each combination of target and tool requires some target-dependent +procedures. The names of these procedures have a common form: the tool +name, followed by an underbar @samp{_}, and finally a suffix describing +the procedure's purpose. For example, a procedure to extract the +version from @sc{gdb} is called @samp{gdb_version}. @xref{Init Module,, +Initialization Module}, for a discussion of how DejaGnu arranges to find +the right procedures for each target. + +@code{runtest} itself calls only two of these procedures, +@code{@var{tool}_exit} and @code{@var{tool}_version}; these procedures use +no arguments. + +The other two procedures, @code{@var{tool}_start} and +@code{@var{tool}_load}, are only called by the test suites themselves +(or by testsuite-specific initialization code); they may take arguments +or not, depending on the conventions used within each test suite. + +@ftable @code +@item @var{tool}_start +@cindex start procedure, tested tools +Starts a particular tool. For an interactive tool, +@code{@var{tool}_start} starts and initializes the tool, leaving the +tool up and running for the test cases; an example is @code{gdb_start}, +the start function for @sc{gdb}. For a batch oriented tool, +@code{@var{tool}_start} is optional; the recommended convention is to +let @code{@var{tool}_start} run the tool, leaving the output in a +variable called @code{comp_output}. Test scripts can then analyze +@samp{$comp_output} to determine the test results. An example of this +second kind of start function is @code{gcc_start}, the start function +for @sc{gcc}. + +@code{runtest} itself @emph{does not call} @code{@var{tool}_start}. The +initialization module @file{@var{tool}_init.exp} must call +@code{@var{tool}_start} for interactive tools; for batch-oriented tools, +each individual test script calls @code{@var{tool}_start} (or makes +other arrangements to run the tool). + +@item @var{tool}_load +@cindex load procedure, tested tools +Loads something into a tool. For an interactive tool, this conditions +the tool for a particular test case; for example, @code{gdb_load} loads +a new executable file into the debugger. For batch oriented tools, +@code{@var{tool}_load} may do nothing---though, for example, the +@sc{gcc} support uses @code{gcc_load} to load and run a binary on the +target environment. Conventionally, @code{@var{tool}_load} leaves the +output of any program it runs in a variable called @samp{exec_output}. +Writing @code{@var{tool}_load} can be the most complex part of extending +DejaGnu to a new tool or a new target, if it requires much communication +coding or file downloading. + +Test scripts call @code{@var{tool}_load}. + +@item @var{tool}_exit +@cindex exit procedure, tested tools +Cleans up (if necessary) before @code{runtest} exits. For interactive +tools, this usually ends the interactive session. You can also use +@code{@var{tool}_exit} to remove any temporary files left over from the +tests. + +@code{runtest} calls @code{@var{tool}_exit}. + +@item @var{tool}_version +@cindex version procedure, tested tools +Prints the version label and number for @var{tool}. This is called by +the DejaGnu procedure that prints the final summary report. The output +should consist of the full path name used for the tested tool, and its +version number. + +@code{runtest} calls @code{@var{tool}_version}. +@end ftable + +The usual convention for return codes from any of these procedures +(although it is not required by @code{runtest}) is to return @code{0} if +the procedure succeeded, @code{1} if it failed, and @code{-1} if there +was a communication error. + +@node Cross Targets +@section Remote targets supported + +@cindex targets +@cindex remote testing +The DejaGnu distribution includes support for the following remote +targets. You can set the target name and the connect mode in the +@file{site.exp} file (using the Tcl variables @samp{targetname} and +@samp{connectmode}, respectively), or on the @code{runtest} command line +(using @samp{--name} and @samp{--connect}). + +@table @strong +@item @sc{amd} 29000, with UDI protocol +Configure DejaGnu for target @samp{a29k-amd-udi}. (Cygnus +@code{configure} also recognizes the abbreviation @samp{udi29k}.) Then, +to run tests, use the @code{runtest} target name to specify whether you +want to use a simulator, or a particular hardware board. The particular +string to use with @samp{--name} will depend on your UDI setup file, +@file{udi_soc} (if @file{udi_soc} is not in your working directory, the +environment variable @samp{UDICONF} should contain a path to this file). +For example, if your UDI setup file includes these lines: +@end table +@c table "ends" *only* to allow wider example below + +@cartouche +@smallexample +iss AF_UNIX * isstip -r /home/gnu/29k/src/osboot/sim/osboot +mon AF_UNIX * montip -t serial -baud 9600 -com /dev/ttyb +@end smallexample +@end cartouche + +@table @strong +@item @w{ } +@c fake out table/item into continuing w/same margin as before +You can use @samp{--name iss} to run tests on the simulator, and +@samp{--name mon} to run tests on the 29K hardware. See the +manufacturer's manuals for more information on UDI and @file{udi_soc}. +@c FIXME! Is there a better ref than "the manufacturer's manuals"? + +@kindex mondfe +The default connect protocol is @samp{mondfe} with either back end. +@code{mondfe} is the only shell DejaGnu supports for UDI targets. +@code{mondfe} is an @sc{amd} specific monitor program freely available +from @sc{amd}. + +@emph{Warning:} This target requires @sc{gdb} version 4.7.2 (or +greater). Earlier versions of @sc{gdb} do not fully support the +@code{load} command on this target, so DejaGnu has no way to load +executable files from the debugger. + +@item Motorola 680x0 boards, a.out or @sc{coff} object format +Configure DejaGnu for any remote target matching @samp{m68k-*}. + +@emph{Warning:} Most @samp{m68k-*} configurations run all tests only for +native testing (when the target is the same as the host). When you +specify most of these targets for a cross configuration, you will only be +able to use tests that run completely within the host (for example, +tests of the binary utilities such as the archiver; or compiler tests +that only generate code rather than running it). + +To run a.out or @sc{coff} binaries on a remote M68K, you must configure +DejaGnu for a particular target board. @samp{m68k-abug} is an example. +(In general for an embedded environment, because it does not have absolute +addresses, a.out is not a good choice for output format in any case; most +often S-records or Hex-32 are used instead.) + +@item Motorola 68K MVME 135 board running ABug boot monitor +Configure for @samp{m68k-abug-aout} or @samp{m68k-abug-coff} (as a +target). This boot monitor can only download S-records; therefore, the +DejaGnu tests for this environment require a linker command script to +convert either output format to S-records, setting the default addresses +for @code{.text}, @code{.bss}, and @code{.data}. + +With this configuration, the default for @samp{--connect} is @samp{tip}. +@samp{tip} is the only communications protocol supported for connecting +to @samp{m68k-abug-*} targets. @samp{tip} uses an @sc{ascii} downloader +(the @code{~put} command) to load S-records into the target board. The +@samp{--name} string must be a machine name that @code{tip} +understands (for example, on some @code{tip} implementations it must be +an entry from the initialization file for @code{tip}; this file is +sometimes called @file{/etc/remote}). + +See your system documentation for information on how to create new +entries in @file{/etc/remote}. (Some @sc{unix} systems are distributed +with at least one default entry with a name resembling @samp{hardwire}; +if your system has one, you can edit it, or make a modified copy with a +new name.) When you have a working @file{/etc/remote} entry +@var{abugtarget}, you should be able to type @samp{tip +@var{abugtarget}}, and get the prompt @samp{135ABUG>} from the board. +Use the same @var{abugtarget} string with @samp{runtest --name}. + +@item Motorola IDP board running the rom68k boot monitor +@c FIXME 1: this doesn't really say anything! OK, so functionality is +@c the same. Is object code the same (srecords)? Do we configure with +@c the same triplets? What is the default for --connect? Is +@c any comms method other than tip supported? What prompt to expect +@c when tip connected? +@c FIXME 2: should @code{BUG} below be @code{ABUG}? +This is the same in functionality as the MVME board running the +@code{BUG} boot monitor. Only the monitor commands and the addresses are +different. + +@item VxWorks (Motorola 68K or Intel 960) +Configure DejaGnu for either @samp{m68k-wrs-vxworks} (abbreviated +@samp{vxworks68}) or @samp{i960-wrs-vxworks} (abbreviated +@samp{vxworks960}). Since both targets support IP addressing, specify +the network address (for example, a host name from @file{/etc/hosts}) +with @samp{--name}. + +The default connect protocol is @samp{rlogin}, but you can use any of +@samp{--connect rlogin}, @samp{--connect telnet}, or @samp{--connect +rsh}. + +Test scripts need no special code to load programs into these targets; +since VxWorks supports NFS, all you must do is ensure test programs are +on an exported filesystem. + +@cindex VxWorks, link with @samp{-r} +When you compile for VxWorks, use the linker @samp{-r} option to make +the linker output relocatable---at least if you want to use library +routines. Many standard C routines are included in VxWorks; often no +additional libraries are needed. See your VxWorks system documentation +for additional details. +@end table + +@node Input Files +@section The files DejaGnu reads +@cindex input files + +The @code{runtest} program used to invoke DejaGnu is a short shell +script generated by @code{make} during the configuration process. Its +main task is to read the main test framework driver, @file{runtest.exp}. + +@file{runtest.exp}, in turn, reads @code{expect} code from certain other +files, in this order: + +@enumerate +@item +Each of the @file{site.exp} local definition files available. +@xref{Customizing,,Setting @code{runtest} defaults}, for details. + +@item +@file{lib/utils.exp}, a collection of utility procedures. @xref{DejaGnu +Builtins,,DejaGnu Builtins}, for descriptions of these procedures. + +@item +@file{lib/framework.exp}, a file of subroutines meant for @code{runtest} +itself rather than for general-purpose use in both @code{runtest} and +test suites. + +@item +@file{debugger.exp}, Don Libes' Tcl Debugger. (See @cite{A Debugger for +Tcl Applications} by Don Libes. This paper is distributed with +@code{expect} in PostScript form as the file +@file{expect/tcl-debug.ps}.) + +@item +@file{lib/remote.exp}, a collection of subroutines meant for connecting +to remote machines. + +@item +@file{lib/target.exp}, a collection of subroutines used for the +configuration systems in DejaGnu. These procedures typically manipulate +or utilize the configuration system. + +@item +@c FIXME! A comment in runtest.exp claims a system default is used if +@c no tool-specific init file is not available; I couldn't see where +@c the program flow actually does this, though---pesch 30jul1993. +An initialization file @code{@var{tool}_init.exp}. @xref{Init +Module,,Initialization module}, for more discussion of init files. +@end enumerate + +@c This hard page break is mainly intended for smallbook formatting; +@c some examples in this section come out better if this starts at a +@c page boundary. +@page +@node Output Files +@section The files DejaGnu writes +@cindex output files + +@code{runtest} always writes two kinds of output files: summary logs and +detailed logs. The contents of both of these are determined by your +tests. + +For troubleshooting, a third kind of output file is useful: use +@samp{--debug} to request an output file showing details of what +@code{expect} is doing internally. + +@menu +* Summary:: Files that summarize tests +* Detail:: Files that contain complete test results +* Debug:: Logging expect internal actions +@end menu + +@node Summary +@subsection Summary log +@cindex summary log + +@code{runtest} always produces a summary output file +@file{@var{tool}.sum}. This summary shows the names of all test files +run; for each test file, one line of output from each @code{pass} +command (showing status @samp{PASS} or @samp{XPASS}) or @code{fail} +command (status @samp{FAIL} or @samp{XFAIL}); trailing summary +statistics that count passing and failing tests (expected and +unexpected); and the full pathname and version number of the tool +tested. (All possible outcomes, and all errors, are always reflected in +the summary output file, regardless of whether or not you specify +@samp{--all}.) + +If any of your tests use the procedures @code{unresolved}, +@code{unsupported}, or @code{untested}, the summary output also +tabulates the corresponding outcomes. + +For example, after @samp{runtest --tool binutils}, look for a summary +log in @file{binutils.sum}. Normally, @code{runtest} writes this file +in your current working directory; use the @samp{--outdir} option to +select a different directory. + +@need 3500 +@noindent +Here is a short sample summary log: + +@cartouche +@smallexample +Test Run By rob on Mon May 25 21:40:57 PDT 1992 + === gdb tests === +Running ./gdb.t00/echo.exp ... +PASS: Echo test +Running ./gdb.all/help.exp ... +PASS: help add-symbol-file +PASS: help aliases +PASS: help breakpoint "bre" abbreviation +FAIL: help run "r" abbreviation +Running ./gdb.t10/crossload.exp ... +PASS: m68k-elf (elf-big) explicit format; loaded +XFAIL: mips-ecoff (ecoff-bigmips) "ptype v_signed_char" signed +C types + === gdb Summary === +# of expected passes 5 +# of expected failures 1 +# of unexpected failures 1 +/usr/latest/bin/gdb version 4.6.5 -q +@end smallexample +@end cartouche + +@node Detail +@subsection Detailed log +@cindex detailed log + +@code{runtest} also saves a detailed log file @file{@var{tool}.log}, +showing any output generated by tests as well as the summary output. +For example, after @samp{runtest --tool binutils}, look for a detailed +log in @file{binutils.log}. Normally, @code{runtest} writes this file +in your current working directory; use the @samp{--outdir} option to +select a different directory. + +@need 4000 +@noindent +Here is a brief example showing a detailed log for @sc{g++} tests: + +@cartouche +@smallexample +Test Run By rob on Mon May 25 21:40:43 PDT 1992 + + === g++ tests === + +--- Running ./g++.other/t01-1.exp --- + PASS: operate delete + +--- Running ./g++.other/t01-2.exp --- + FAIL: i960 bug EOF +p0000646.C: In function `int warn_return_1 ()': +p0000646.C:109: warning: control reaches end of non-void function +p0000646.C: In function `int warn_return_arg (int)': +p0000646.C:117: warning: control reaches end of non-void function +p0000646.C: In function `int warn_return_sum (int, int)': +p0000646.C:125: warning: control reaches end of non-void function +p0000646.C: In function `struct foo warn_return_foo ()': +p0000646.C:132: warning: control reaches end of non-void function + +--- Running ./g++.other/t01-4.exp --- + FAIL: abort +900403_04.C:8: zero width for bit-field `foo' +--- Running ./g++.other/t01-3.exp --- + FAIL: segment violation +900519_12.C:9: parse error before `;' +900519_12.C:12: Segmentation violation +/usr/latest/bin/gcc: Internal compiler error: program cc1plus got +fatal signal + + === g++ Summary === + +# of expected passes 1 +# of expected failures 3 +/usr/ps/bin/g++ version cygnus-2.0.1 +@end smallexample +@end cartouche + +@node Debug +@subsection Logging @code{expect} internal actions +@cindex debug log + +With the @samp{--debug} option, you can request a log file showing the +output from @code{expect} itself, running in debugging mode. This file +(@file{dbg.log}, in the directory where you start @code{runtest}) shows +each pattern @code{expect} considers in analyzing test output. + +This file reflects each @code{send} command, showing the string sent as +input to the tool under test; and each @code{expect} command, showing +each pattern it compares with the tool output. + +The log messages for @code{expect} begin with a message of the form + +@smallexample +expect: does @{@var{tool output}@} (spawn_id @var{n}) match pattern +@{@var{expected pattern}@}? +@end smallexample + +@noindent +For every unsuccessful match, @code{expect} issues a @samp{no} after +this message; if other patterns are specified for the same +@code{expect} command, they are reflected also, but without the first +part of the message (@samp{expect@dots{}match pattern}). + +When @code{expect} finds a match, the log for the successful match ends +with @samp{yes}, followed by a record of the @code{expect} variables set +to describe a successful match. Here is an excerpt from the debugging +log for a @sc{gdb} test: + +@c FIXME! Why is the second spawn_id shown 0 rather than 6? +@cartouche +@smallexample +send: sent @{break gdbme.c:34\n@} to spawn id 6 +expect: does @{@} (spawn_id 6) match pattern @{Breakpoint.*at.* file + gdbme.c, line 34.*\(gdb\) $@}? no +@{.*\(gdb\) $@}? no +expect: does @{@} (spawn_id 0) match pattern @{@}? no +@{\(y or n\) @}? no +@{buffer_full@}? no +@{virtual@}? no +@{memory@}? no +@{exhausted@}? no +@{Undefined@}? no +@{command@}? no +break gdbme.c:34 +Breakpoint 8 at 0x23d8: file gdbme.c, line 34. +(gdb) expect: does @{break gdbme.c:34\r\nBreakpoint 8 at 0x23d8: +file gdbme.c, line 34.\r\n(gdb) @} (spawn_id 6) match pattern +@{Breakpoint.*at.* file gdbme.c, line 34.*\(gdb\) $@}? yes +expect: set expect_out(0,start) @{18@} +expect: set expect_out(0,end) @{71@} +expect: set expect_out(0,string) @{Breakpoint 8 at 0x23d8: file +gdbme.c, line 34.\r\n(gdb) @} +expect: set expect_out(spawn_id) @{6@} +expect: set expect_out(buffer) @{break gdbme.c:34\r\nBreakpoint 8 +at 0x23d8: file gdbme.c, line 34.\r\n(gdb) @} + PASS: 70 0 breakpoint line number in file +@end smallexample +@end cartouche + +@noindent +This example exhibits three properties of @code{expect} and DejaGnu that +might be surprising at first glance: + +@itemize @bullet +@item +Empty output for the first attempted match. The first set of attempted +matches shown ran against the output @samp{@{@}}---that is, no output. +@code{expect} begins attempting to match the patterns supplied +immediately; often, the first pass is against incomplete output (or +completely before all output, as in this case). + +@item +Interspersed tool output. The beginning of the log entry for the second +attempted match may be hard to spot: this is because the prompt +@samp{(gdb) } appears on the same line, just before the @samp{expect:} +that marks the beginning of the log entry. + +@item +Fail-safe patterns. Many of the patterns tested are fail-safe patterns +provided by @sc{gdb} testing utilities, to reduce possible +indeterminacy. It is useful to anticipate potential variations +caused by extreme system conditions (@sc{gdb} might issue the message +@samp{virtual memory exhausted} in rare circumstances), or by changes in +the tested program (@samp{Undefined command} is the likeliest outcome if +the name of a tested command changes). + +The pattern @samp{@{@}} is a particularly interesting fail-safe +to notice; it checks for an unexpected @key{RET} prompt. This may +happen, for example, if the tested tool can filter output through a +pager. + +These fail-safe patterns (like the debugging log itself) are primarily +useful while developing test scripts. Use the @code{error} procedure to +make the actions for fail-safe patterns produce messages starting with +@samp{ERROR} on the @code{runtest} standard output, and in the detailed +log file. +@end itemize + +@node Tests +@chapter How To Write a Test Cases +@cindex writing a test case +@cindex test case, writing + +@menu +* Writing:: Writing a test case +* Debugging:: Debugging a test case +* Adding:: Adding a test case to a test suite +* Hints:: Hints on writing a test case +* Variables:: Special variables used by test cases +@end menu + +@node Writing +@section Writing a test case + +The easiest way to prepare a new test case is to base it on an existing +one for a similar situation. There are two major categories of tests: +batch or interactive. Batch oriented tests are usually easier to write. + +The @sc{gcc} tests are a good example of batch oriented tests. All +@sc{gcc} tests consist primarily of a call to a single common procedure, +since all the tests either have no output, or only have a few warning +messages when successfully compiled. Any non-warning output is a test +failure. All the C code needed is kept in the test directory. The test +driver, written in @code{expect}, need only get a listing of all the C +files in the directory, and compile them all using a generic procedure. +This procedure and a few others supporting for these tests are kept in +the library module @file{lib/c-torture.exp} in the @sc{gcc} test suite. +Most tests of this kind use very few @code{expect} features, and are +coded almost purely in Tcl. + +@noindent +Writing the complete suite of C tests, then, consisted of these steps: + +@enumerate +@item +@cindex Granlund, Torbjorn +@cindex C torture test +Copying all the C code into the test directory. These tests were based on +the C-torture test created by Torbjorn Granlund (on behalf of the Free +Software Foundation) for @sc{gcc} development. + +@item +Writing (and debugging) the generic @code{expect} procedures for +compilation. + +@item +Writing the simple test driver: its main task is to search the directory +(using the Tcl procedure @code{glob} for filename expansion with +wildcards) and call a Tcl procedure with each filename. It also checks +for a few errors from the testing procedure. +@end enumerate + +Testing interactive programs is intrinsically more complex. Tests for most +interactive programs require some trial and error before they are complete. + +However, some interactive programs can be tested in a simple fashion +reminiscent of batch tests. For example, prior to the creation of +DejaGnu, the @sc{gdb} distribution already included a wide-ranging +testing procedure. This procedure was very robust, and had already +undergone much more debugging and error checking than many recent +DejaGnu test cases. Accordingly, the best approach was simply to +encapsulate the existing @sc{gdb} tests, for reporting purposes. +Thereafter, new @sc{gdb} tests built up a family of @code{expect} +procedures specialized for @sc{gdb} testing. + +@file{gdb.t10/crossload.exp} is a good example of an interactive test. +@c FIXME! Check what *kind* of example it is---work-intensive, or generic... + +@node Debugging +@section Debugging a test case +@cindex debugging a test case +@cindex test case, debugging + +@noindent +These are the kinds of debugging information available from DejaGnu: + +@enumerate +@item +Output controlled by test scripts themselves, explicitly allowed for by +the test author. This kind of debugging output appears in the detailed +output recorded in the @file{@var{tool}.log} file. To do the same for +new tests, use the @code{verbose} procedure (which in turn uses the +variable also called @code{verbose}) to control how much output to +generate. This will make it easier for other people running the test to +debug it if necessary. Whenever possible, if @samp{$verbose} is +@code{0}, there should be no output other than the output from +@code{pass}, @code{fail}, @code{error}, and @code{warning}. Then, to +whatever extent is appropriate for the particular test, allow +successively higher values of @samp{$verbose} to generate more +information. Be kind to other programmers who use your tests: provide +for a lot of debugging information. + +@item +Output from the internal debugging functions of Tcl and @code{expect}. +There is a command line options for each; both forms of debugging output +are recorded in the file @code{dbg.log} in the current directory. + +Use @samp{--debug} for information from the @code{expect} level; it +generates displays of the @code{expect} attempts to match the tool +output with the patterns specified (@pxref{Debug,,Debug Log}). This +output can be very helpful while developing test scripts, since it shows +precisely the characters received. Iterating between the latest attempt +at a new test script and the corresponding @file{dbg.log} can allow you +to create the final patterns by ``cut and paste''. This is sometimes +the best way to write a test case. + +Use @samp{--strace} to see more detail at the Tcl level; this shows how Tcl +procedure definitions expand, as they execute. The associated number +controls the depth of definitions expanded; see the discussion of +@samp{--strace} in @ref{Invoking runtest,,Running the Tests}. + +@item +Finally, if the value of @samp{verbose} is 3 or greater, @code{runtest} +turns on the @code{expect} command @code{log_user}. This command prints +all @code{expect} actions to the @code{expect} standard output, to the +detailed log file, and (if @samp{--debug} is on) to @file{dbg.log}. +@end enumerate + +@node Adding +@section Adding a test case to a test suite +@cindex adding a test case + +There are two slightly different ways to add a test case. One is to add +the test case to an existing directory. The other is to create a new +directory to hold your test. The existing test directories represent +several styles of testing, all of which are slightly different; examine +the directories for the tool of interest to see which (if any) is most +suitable. + +Adding a @sc{gcc} test can be very simple: just add the C code to any +directory beginning with @samp{gcc.} and it runs on the next +@samp{runtest --tool gcc}. + +To add a test to @sc{gdb}, first add any source code you will need to +the test directory. Then you can either create a new @code{expect} file, +or add your test to an existing one (any file with a @samp{.exp} +suffix). Creating a new @samp{.exp} file is probably a better idea if +the test is significantly different from existing tests. Adding it as a +separate file also makes upgrading easier. If the C code has to be +already compiled before the test will run, then you'll have to add it to +the @file{Makefile.in} file for that test directory, then run +@code{configure} and @code{make}. + +Adding a test by creating a new directory is very similar: + +@enumerate +@item +Create the new directory. All subdirectory names begin with the name of +the tool to test; e.g. @sc{g++} tests might be in a directory called +@file{g++.other}. There can be multiple test directories that start with +the same tool name (such as @samp{g++}). + +@item +Add the new directory name to the @samp{configdirs} definition in the +@file{configure.in} file for the test suite directory. This way when +@code{make} and @code{configure} next run, they include the new directory. + +@item +Add the new test case to the directory, as above. + +@item +To add support in the new directory for configure and make, you must +also create a @code{Makefile.in} and a @code{configure.in}. @xref{What +Configure Does,,What Configure Does, configure.info, Cygnus Configure}. +@end enumerate + +@c FIXME! Expand this sentence to at least a section, maybe a chapter... +@c The @file{admin} directory contains templates for a few common forms +@c of test. + +@node Hints +@section Hints on writing a test case +@cindex hints on test case writing + +There may be useful existing procedures already written for your test in +the @file{lib} directory of the DejaGnu distribution. @xref{DejaGnu +Builtins,,DejaGnu Builtins}. + +It is safest to write patterns that match @emph{all} the output +generated by the tested program; this is called @dfn{closure}. If a +pattern does not match the entire output, any output that remains will +be examined by the @emph{next} @code{expect} command. In this +situation, the precise boundary that determines which @code{expect} +command sees what is very sensitive to timing between the @code{expect} +task and the task running the tested tool. As a result, the test may +sometimes appear to work, but is likely to have unpredictable results. +(This problem is particularly likely for interactive tools, but can also +affect batch tools---especially for tests that take a long time to finish.) +The best way to ensure closure is to use the @samp{-re} option for the +@code{expect} command to write the pattern as a full regular +expressions; then you can match the end of output using a @samp{$}. It +is also a good idea to write patterns that match all available output by +using @samp{.*\} after the text of interest; this will also match any +intervening blank lines. Sometimes an alternative is to match end of +line using @samp{\r} or @samp{\n}, but this is usually too dependent on +terminal settings. +@c FIXME!! explain what "end of output" means for interactive task. +@c (Timeout or EOF, right?) + +Always escape punctuation, such as @samp{(} or @samp{"}, in your +patterns; for example, write @samp{\(}. If you forget to escape +punctuation, you will usually see an error message like @samp{extra +characters after close-quote}. + +If you have trouble understanding why a pattern does not match the +program output, try using the @samp{--debug} option to @code{runtest}, +and examine the debug log carefully. @xref{Debug,,Debug Log}. + +Be careful not to neglect output generated by setup rather than by the +interesting parts of a test case. For example, while testing @sc{gdb}, +I issue a send @samp{set height 0\n} command. The purpose is simply to +make sure @sc{gdb} never calls a paging program. The @samp{set height} +command in @sc{gdb} does not generate any output; but running @emph{any} +command makes @sc{gdb} issue a new @samp{(gdb) } prompt. If there were +no @code{expect} command to match this prompt, the output @samp{(gdb) } +begins the text seen by the next @code{expect} command---which might +make @emph{that} pattern fail to match. + +To preserve basic sanity, I also recommended that no test ever pass if +there was any kind of problem in the test case. To take an extreme +case, tests that pass even when the tool will not spawn are misleading. +Ideally, a test in this sort of situation should not fail either. +Instead, print an error message by calling one of the DejaGnu procedures +@code{error} or @code{warning}. + +@node Variables +@section Special variables used by test cases +@cindex special variables + +@cindex variables for all tests +Your test cases can use these variables, with conventional meanings (as +well as the variables saved in @file{site.exp} +@pxref{Customizing,,Setting @code{runtest} defaults}): + +@quotation +@emph{These variables are available to all test cases.} +@end quotation + +@ftable @code +@item prms_id +@cindex PRMS bug number +@cindex GNATS bug number +@cindex bug number +The tracking system (e.g. @sc{gnats}) number identifying a corresponding +bugreport. (@samp{0} if you do not specify it in the test script.) + +@item bug_id +@cindex bug number, extra +An optional bug id; may reflect a bug identification from another +organization. (@samp{0} if you do not specify it.) + +@item subdir +@cindex current test subdirectory +The subdirectory for the current test case. +@end ftable + +@quotation +@emph{These variables should never be changed. They appear in most +tests.} +@end quotation + +@ftable @code +@item expect_out(buffer) +@cindex last command output +The output from the last command. This is an internal variable set by +@code{expect}. + +@item exec_output +This is the output from a @code{@var{tool}_load} command. This only +applies to tools like @sc{gcc} and @sc{gas} which produce an object +file that must in turn be executed to complete a test. + +@item comp_output +This is the output from a @code{@var{tool}_start} command. This is +conventionally used for batch oriented programs, like @sc{gcc} and +@sc{gas}, that may produce interesting output (warnings, errors) without +further interaction. +@end ftable + +@node Extending +@chapter New Tools, Targets, or Hosts + +The most common ways to extend the DejaGnu framework are: adding a suite +of tests for a new tool to be tested; adding support for testing on a +new target; and porting @code{runtest} to a new host. + +@menu +* Adding Tools:: How to add tests for a new tool +* Adding Targets:: How to add a new target +* Porting:: Porting DejaGnu to a new host +@end menu + +@node Adding Tools +@section Writing tests for a new tool + +In general, the best way to learn how to write (code or even prose) is +to read something similar. This principle applies to test cases and to +test suites. Unfortunately, well-established test suites have a way of +developing their own conventions: as test writers become more +experienced with DejaGnu and with Tcl, they accumulate more utilities, +and take advantage of more and more features of @code{expect} and Tcl in +general. + +Inspecting such established test suites may make the prospect of +creating an entirely new test suite appear overwhelming. Nevertheless, +it is quite straightforward to get a new test suite going. + +@cindex Lupton, Robert +There is one test suite that is guaranteed not to grow more elaborate +over time: both it and the tool it tests were created expressly to +illustrate what it takes to get started with DejaGnu. The +@file{example/} directory of the DejaGnu distribution contains both an +interactive tool called @code{calc}, and a test suite for it. Reading +this test suite, and experimenting with it, is a good way to supplement +the information in this section. (Thanks to Robert Lupton for creating +@code{calc} and its test suite---and also the first version of this +section of the manual!) + +To help orient you further in this task, here is an outline of the steps +to begin building a test suite for a program @var{example}. + +@enumerate +@item +Create or select a directory to contain your new collection of tests. +Change to that directory (shown here as @code{testsuite}): + +@example +eg$ cd testsuite/ +@end example + +@item +Create a @file{configure.in} file in this directory, to control +configuration-dependent choices for your tests. So far as DejaGnu is +concerned, the important thing is to set a value for the variable +@code{target_abbrev}; this value is the link to the init file you will +write soon. (For simplicity, we assume the environment is Unix, and use +@samp{unix} as the value.) + +What else is needed in @file{configure.in} depends on the requirements +of your tool, your intended test environments, and which +@code{configure} system you use. This example is a minimal +@code{configure.in} for use with Cygnus Configure. (For an alternative +based on the FSF @code{autoconf} system, see the @code{calc} example +distributed with DejaGnu.) Replace @var{example} with the name of your +program: + +@cartouche +@smallexample +# This file is a shell script fragment +# for use with Cygnus configure. + +srctrigger="@var{example}.0" +srcname="The DejaGnu @var{example} tests" + +# per-host: + +# per-target: + +# everything defaults to unix for a target +target_abbrev=unix + +# post-target: + +@end smallexample +@end cartouche + +@item +Create @file{Makefile.in}, the source file used by @code{configure} to +build your @file{Makefile}. Its leading section should as usual contain +the values that @code{configure} may override: + +@cartouche +@smallexample +srcdir = . +prefix = /usr/local + +exec_prefix = $(prefix) +bindir = $(exec_prefix)/bin +libdir = $(exec_prefix)/lib +tooldir = $(libdir)/$(target_alias) + +datadir = $(exec_prefix)/lib/dejagnu + +RUNTEST = runtest +RUNTESTFLAGS = +FLAGS_TO_PASS = + +#### host, target, site specific Makefile frags come in here. +@end smallexample +@end cartouche + +This should be followed by the standard targets at your site. To begin +with, they need not do anything---for example, these definitions will +do: + +@cartouche +@smallexample + +all: + +info: + +install-info: + +install: +uninstall: + +clean: + -rm -f *~ core *.info* + +@end smallexample +@end cartouche + +It is also a good idea to make sure your @file{Makefile} can rebuild +itself if @file{Makefile.in} changes, with a target like this (which +works for either Cygnus or FSF Configure): + +@cartouche +@smallexample +Makefile : $(srcdir)/Makefile.in $(host_makefile_frag) \ + $(target_makefile_frag) + $(SHELL) ./config.status +@end smallexample +@end cartouche + +You also need to include two targets important to DejaGnu: @code{check}, +to run the tests, and @code{site.exp}, to set up the Tcl copies of +configuration-dependent values. The @code{check} target must run +@samp{runtest --tool @var{example}}: + +@cartouche +@smallexample +check: site.exp all + $(RUNTEST) $(RUNTESTFLAGS) $(FLAGS_TO_PASS) \ + --tool @var{example} --srcdir $(srcdir) +@end smallexample +@end cartouche + +The @code{site.exp} target should usually set up (among other things!) a +Tcl variable for the name of your program: + +@cartouche +@smallexample +site.exp: ./config.status Makefile + @@echo "Making a new config file..." + -@@rm -f ./tmp? + @@touch site.exp + + -@@mv site.exp site.bak + @@echo "## these variables are automatically\ + generated by make ##" > ./tmp0 + @@echo "# Do not edit here. If you wish to\ + override these values" >> ./tmp0 + @@echo "# add them to the last section" >> ./tmp0 + @@echo "set host_os $@{host_os@}" >> ./tmp0 + @@echo "set host_alias $@{host_alias@}" >> ./tmp0 + @@echo "set host_cpu $@{host_cpu@}" >> ./tmp0 + @@echo "set host_vendor $@{host_vendor@}" >> ./tmp0 + @@echo "set target_os $@{target_os@}" >> ./tmp0 + @@echo "set target_alias $@{target_alias@}" >> ./tmp0 + @@echo "set target_cpu $@{target_cpu@}" >> ./tmp0 + @@echo "set target_vendor $@{target_vendor@}" >> ./tmp0 + @@echo "set host_triplet $@{host_canonical@}" >> ./tmp0 + @@echo "set target_triplet $@{target_canonical@}">>./tmp0 + @@echo "set tool binutils" >> ./tmp0 + @@echo "set srcdir $@{srcdir@}" >> ./tmp0 + @@echo "set objdir `pwd`" >> ./tmp0 + @@echo "set @var{examplename} @var{example}" >> ./tmp0 + @@echo "## All variables above are generated by\ + configure. Do Not Edit ##" >> ./tmp0 + @@cat ./tmp0 > site.exp + @@sed < site.bak \ + -e '1,/^## All variables above are.*##/ d' \ + >> site.exp + -@@rm -f ./tmp? +@end smallexample +@end cartouche + +@item +Create a directory (in @file{testsuite/}) called @file{config/}: + +@example +eg$ mkdir config +@end example + +@item +Make an init file in this directory; its name must start with the +@code{target_abbrev} value, so call it @file{config/unix.exp}. +This is the file that contains the target-dependent procedures; +fortunately, most of them do not have to do very much in order for +@code{runtest} to run. + +If @var{example} is not interactive, you can get away with this minimal +@file{unix.exp} to begin with: + +@cartouche +@smallexample +proc foo_exit @{@} @{@} +proc foo_version @{@} @{@} +@end smallexample +@end cartouche + +If @var{example} is interactive, however, you might as well define a +start routine @emph{and invoke it} by using an init file like this: + +@cartouche +@smallexample +proc foo_exit @{@} @{@} +proc foo_version @{@} @{@} + +proc foo_start @{@} @{ + global @var{examplename} + spawn $@var{examplename} + expect @{ + -re "" @{@} + @} +@} +foo_start +@end smallexample +@end cartouche + +@item +Create a directory whose name begins with your tool's name, to contain +tests: + +@example +eg$ mkdir @var{example}.0 +@end example + +@item +Create a sample test file in @file{@var{example}.0}. Its name must end +with @samp{.exp}; you can use @samp{first-try.exp} To begin with, just +write there a line of Tcl code to issue a message: + +@cartouche +@smallexample +send_user "Testing: one, two...\n" +@end smallexample +@end cartouche + +@item +Back in the @file{testsuite/} (top level) directory, run + +@example +eg$ configure +@end example + +(You may have to specify more of a path, if a suitable @code{configure} +is not available in your execution path.) + +@item +You are now ready to triumphantly type @samp{make check} or +@samp{runtest --tool @var{example}}. You should see something like this: + +@cartouche +@smallexample +Test Run By rhl on Fri Jan 29 16:25:44 EST 1993 + + === @var{example} tests === + +Running ./@var{example}.0/first-try.exp ... +Testing: one, two... + + === @var{example} Summary === + +@end smallexample +@end cartouche + +There is no output in the summary, because so far the example does not +call any of the procedures that establish a test outcome. + +@item +Begin writing some real tests. For an interactive tool, you should +probably write a real exit routine in fairly short order; in any case, +you should also write a real version routine soon. +@end enumerate + +@node Adding Targets +@section Adding a target +@cindex adding a target + +DejaGnu has some additional requirements for target support, beyond the +general-purpose provisions of Cygnus @code{configure}. @code{runtest} +must actively communicate with the target, rather than simply generating +or managing code for the target architecture. Therefore, each tool +requires an initialization module for each target. For new targets, you +must supply a few Tcl procedures to adapt DejaGnu to the target. This +permits DejaGnu itself to remain target independent. @xref{Init +Module,,Initialization module}, for a discussion of the naming +conventions that enable DejaGnu to locate and use init files. + +Usually the best way to write a new initialization module is to edit an +existing initialization module; some trial and error will be required. +If necessary, you can use the @samp{--debug} option to see what +is really going on. + +When you code an initialization module, be generous in printing +information controlled by the @code{verbose} procedure (@pxref{DejaGnu +Builtins, DejaGnu procedures}). + +Most of the work is in getting the communications right. Communications +code (for several situations involving IP networks or serial lines) is +available in a DejaGnu library file, @file{lib/remote.exp}. +@xref{DejaGnu Builtins,,DejaGnu Builtins}. + +@c FIXME! Say something about Tcl debugger here. +If you suspect a communication problem, try running the connection +interactively from @code{expect}. (There are three ways of running +@code{expect} as an interactive interpreter. You can run @code{expect} +with no arguments, and control it completely interactively; or you can +use @samp{expect -i} together with other command-line options and +arguments; or you can run the command @code{interpreter} from any +@code{expect} procedure. Use @code{return} to get back to the calling +procedure (if any), or @code{return -tcl} to make the calling procedure +itself return to its caller; use @code{exit} or end-of-file to leave +@code{expect} altogether.) Run the program whose name is recorded in +@samp{$connectmode}, with the arguments in @samp{$targetname}, to +establish a connection. You should at least be able to get a prompt +from any target that is physically connected. + +@node Porting +@section Porting to a new host +@cindex porting to a new host + +The task of porting DejaGnu is basically that of porting Tcl and +@code{expect}. Tcl and @code{expect}, as distributed with DejaGnu, both +use @code{autoconf}; they should port automatically to most Unix +systems. + +Once Tcl and @code{expect} are ported, DejaGnu should run. Most system +dependencies are taken care of by using @code{expect} as the main +command shell. + +@node Installation +@appendix Installing DejaGnu + +@cindex host, explained +@cindex target, explained +@cindex DejaGnu configuration +@cindex configuring DejaGnu +Once you have the DejaGnu source unpacked and available, you must first +configure the software to specify where it is to run (and the associated +defaults); then you can proceed to installing it. + +@menu +* Configuring DejaGnu:: +* Installing DejaGnu:: +@end menu + +@node Configuring DejaGnu +@section Configuring the DejaGnu test driver + +It is usually best to configure in a directory separate +from the source tree, specifying where to find the source with the +optional @samp{--srcdir} option to @code{configure}. DejaGnu uses the +GNU @code{autoconf} to configure itself. For more info on using +autoconf, read the GNU autoconf manual. To configure, execute the +@file{configure} program, no other options are required. For an example, +to configure in a seperate tree for objects, execute the configure +script from the source tree like this: + +@smallexample +../dejagnu-1.3/configure +@end smallexample + +DejaGnu doesn't care at config time if it's for testing a native system +or a cross system. That is determined at runtime by using the config +files. + +@cindex @code{prefix}, configure options +@cindex @code{exec_prefix}, configure options. +You may also want to use the @code{configure} option @samp{--prefix} to +specify where you want DejaGnu and its supporting code installed. By +default, installation is in subdirectories of @file{/usr/local}, but you +can select any alternate directory @var{altdir} by including +@samp{--prefix=@var{altdir}} on the @code{configure} command line. +(This value is captured in the Makefile variables @code{prefix} +and @code{exec_prefix}.) + +@cindex auxiliary programs +@cindex test suite distributions +@cindex @code{make} builds part of tests +Save for a small number of example tests, the DejaGnu distribution +itself does not include any test suites; these are available separately. +Test suites for the @sc{gnu} compiler (testing both GCC and G++) and for +the @sc{gnu} binary utilities are distributed in parallel with the +DejaGnu distribution (but packaged as separate files). The test suite +for the @sc{gnu} debugger is distributed in parallel with each release +of GDB itself, starting with GDB 4.9. After configuring the top-level +DejaGnu directory, unpack and configure the test directories for the +tools you want to test; then, in each test directory, run @code{make} to +build auxiliary programs required by some of the tests. + +@node Installing DejaGnu +@section Installing DejaGnu + +@cindex installing DejaGnu +To install DejaGnu in your filesystem (either in @file{/usr/local}, or +as specified by your @samp{--prefix} option to @code{configure}), execute + +@example +eg$ make install +@end example + +@noindent +@samp{make install} does these things for DejaGnu: + +@enumerate +@item +Look in the path specified for executables (@file{$exec_prefix}) for +directories called @file{lib} and @file{bin}. If these directories do +not exist, @samp{make install} creates them. + +@item +Create another directory in the @file{lib} directory, called +@file{dejagnu}. + +@item +Copy the @code{runtest} shell script into @file{$exec_prefix/bin}. + +@item +Copy all the library files (used to support the framework) into +@file{$exec_prefix/lib/dejagnu}. + +@item +Copy @file{runtest.exp} into @file{$exec_prefix/lib/dejagnu}. This is +the main Tcl code implementing DejaGnu. + +@end enumerate + +Each test suite collection comes with simple installation instructions +in a @file{README} file; in general, the test suites are designed to be +unpacked in the source directory for the corresponding tool, and extract +into a directory called @file{testsuite}. + +@node Index +@unnumbered Index + +@printindex cp + +@contents + +@bye diff --git a/doc/overview.sgml b/doc/overview.sgml new file mode 100644 index 0000000..58bce0c --- /dev/null +++ b/doc/overview.sgml @@ -0,0 +1,439 @@ + + + + + + + +1998 + Free Software Foundation, Inc."> + + + + + + + + + + + + +]> + + + + &dj; + The GNU Testing Framework + 1998 Nov 24 + &version + for circulation within Cygnus + + + Rob Savoye + + Free Software Foundation + + + +
+ rob@welcomehome.org +
+ + &dejagnu-copyright; + + + + + + + + 0.1 + 1998-11 + rob@welcomehome.org + Initial version after conversion to DocBook. + + + +
+ + + + + Abstract + + This document attempts to describe the functionality of + DejaGnu, the GNU Testing Framework. DejaGnu is entirely written in + Expect, which uses + Tcl as a command + language. Expect serves as a very + programmable shell; you can run any program, as with the usual + Unix command shells---but once the program is started, your + test script has fully programmable control of + its input and output. This does not just apply to the programs + under test; expect can also run any auxiliary + program, such as diff or sh, + with full control over its input and output. + + DejaGnu itself is merely a framework for creation of a test + suites. Test suites are distributed separately for each GNU + tool. + + + + + Overview + + + What is &dj; ? + + DejaGnu is a framework for + testing other programs. Its purpose is to provide a single + front end for all tests. Think of it as a custom library of + Tcl procedures crafted to support writing a test harness. A + Test Harness is the testing + infrastructure that is created to support a specific program + or tool. Each program can have multiple test suites, all + supported by a single test harness. DejaGnu is written in + Expect, which in turn uses + Tcl -- Tool command + language. There is more information on Tcl at the Scriptics web site, and the + Expect web site is at NIST. + + DejaGnu offers several advantages for testing: + + + + The flexibility and consistency of the DejaGnu + framework make it easy to write tests for any program, with + either batch oriented, or interactive programs. + + + DejaGnu provides a layer of abstraction which + allows you to write tests that are portable to any host or + target where a program must be tested. For instance, a test + for GDB can run (from any Unix + based host) on any target architecture that DejaGnu + supports. Currently DejaGnu runs tests on many single board + computers, whose operating software ranges from just a boot + monitor to a full-fledged, Unix-like realtime OS. + + + All tests have the same output format. This + makes it easy to integrate testing into other software + development processes. DejaGnu's output is designed to be + parsed by other filtering script, and it is also human + readable. + + + Using Tcl and expect, it's easy to create wrappers + for existing test suites. By incorporating existing tests under + DejaGnu, it's easier to have a single set of report analyse + programs.. + + + + + Running tests requires two things: the testing framework, and + the test suites themselves. Tests are usually written in + Expect using Tcl, but you can also use a + Tcl script to run a test suite that is not based on + Expect. + (expect script filenames conventionally + use .exp as a suffix; for example, the main + implementation of the DejaGnu test driver is in the file + runtest.exp.) + + Julia Menapace first coined the term ``Deja Gnu'' to describe an + earlier testing framework at Cygnus Support she had written for + GDB. When we replaced it with the Expect-based + framework, it was like DejaGnu all over again... But more importantly, it + was also named after my daughter,Deja Snow Savoye (now 9 + years old in Dec of 1998), who was a toddler during DejaGnu's + creation. + + + + + What's New In This Release + + This release has a number of substantial changes over version + 1.3. The most visible change is that the version of Expect and Tcl + included in the release are up-to-date with the current stable net + releases. The biggest change is years of modifications to the + target configuration system, used for cross testing. While this + greatly improved cross testing, is has made that subsystem very + complicated. The goal is to have this entirely rewritten using + iTcl by the next release. Other changes + are: + + + More builtin support for building target binaries + with the correct linker flags. Currently this only works with + GCC as the cross compiler, + preferably with a target supported by + . + + Lots of little bug fixes from years of heavy + use at Cygnus Solutions. + + DejaGnu now uses + Automake for Makefile + configuration. + + Updated documentation, now in SGML + (using the free + GNU DocBook tools) format. + + NT support. There is beta level support for NT + that is still a work in progress. This requires the Cygwin POSIX system + for NT. + + + + + NT Support + + To use DejaGnu on NT, you need to first install the + Cygwin + release. This works as of the B20.1 release. Cygwin is a POSIX + system for NT. This covers both utility programs, and a libray + that adds POSIX system calls to NT. Among them is pseudo tty + support for NT that emulates the POSIX pty standard. The + latest Cygwin is always available from this location. This + works well enough to run "make check" of + the GNU development tree on NT after a native build. But the + nature of pty's on NT is still evolving. Your mileage may + vary... + + + + + + + Design Goals + + DejaGnu grew out of the internal needs of Cygnus Solutions. (then + Cygnus Support). Cygnus maintains and enhances a variety of free programs + in many different environments, and we needed a testing tool that: + + + is useful to developers while fixing bugs. + automates running many tests during a software + release process. + is portable among a variety of host + computers. + supports cross-development testing. + permits testing interactive programs, like + GDB; and + permits testing batch oriented programs, like + GCC. + + + Some of the requirements proved challenging. For example, + interactive programs do not lend themselves very well to automated testing. + But all the requirements are important: for instance, it is imperative to + make sure that GDB works as well when cross-debugging + as it does in a native configuration. + + Probably the greatest challenge was testing in a cross-development + environment (which can be a real nightmare). Most cross-development + environments are customized by each developer. Even when buying packaged + boards from vendors there are many differences. The communication + interfaces vary from a serial line to ethernet. DejaGnu was designed with + a modular communication setup, so that each kind of communication can be + added as required, and supported thereafter. Once a communication + procedure is coded, any test can use it. Currently DejaGnu can use + rsh, rlogin, + telnet, tip, + kermit, and mondfe for remote + communications. + + + + + A POSIX conforming test framework + + DejaGnu conforms to the POSIX 1003.3 standard for test + frameworks. I was also a member of that committe. + + The POSIX standard 1003.3 defines what a testing framework needs to + provide, in order to permit the creation of POSIX conformance test + suites. This standard is primarily oriented to running POSIX conformance + tests, but its requirements also support testing of features not related + to POSIX conformance. POSIX 1003.3 does not specify a particular testing + framework, but at this time there is only one other POSIX conforming test + framework: TET. TET was created by Unisoft for a consortium comprised of + X/Open, Unix International, and the Open Software Foundation. + + The POSIX documentation refers to assertions. + An assertion is a description of behavior. For example, if a standard + says ``The sun shall shine'', a corresponding assertion might be ``The + sun is shining.'' A test based on this assertion would pass or fail + depending on whether it is daytime or nighttime. It is important to note + that the standard being tested is never 1003.3; the standard being tested + is some other standard, for which the assertions were written. + + As there is no test suite to test testing frameworks for POSIX + 1003.3 conformance, verifying conformance to this standard is done by + repeatedly reading the standard and experimenting. One of the main + things 1003.3 does specify is the set of allowed output messages, and + their definitions. Four messages are supported for a required feature of + POSIX conforming systems, and a fifth for a conditional feature. DejaGnu + supports the use of all five output messages; in this sense a test suite + that uses exactly these messages can be considered POSIX conforming. + These definitions specify the output of a test case: + + + + PASS + A test has succeeded. That is, it demonstrated that + the assertion is true. + + + + XFAIL + POSIX 1003.3 does not incorporate the notion of + expected failures, so PASS, instead of + XPASS, must also be returned for test cases + which were expected to fail and did not. This means that + PASS is in some sense more ambiguous than if + XPASS is also used. + + + + FAIL + A test has produced the bug it was intended to + capture. That is, it has demonstrated that the assertion is false. + The FAIL message is based on the test case only. + Other messages are used to indicate a failure of the framework. As + with PASS, POSIX tests must return + FAIL rather than XFAIL even + if a failure was expected. + + + + UNRESOLVED + A test produced indeterminate results. Usually, this + means the test executed in an unexpected fashion; this outcome + requires that a human being go over results, to determine if the test + should have passed or failed. This message is also used for any test + that requires human intervention because it is beyond the abilities + of the testing framework. Any unresolved test should resolved to + PASS or FAIL before a test + run can be considered finished. + + Note that for POSIX, each assertion must produce a test result + code. If the test isn't actually run, it must produce + UNRESOLVED rather than just leaving that test + out of the output. This means that you have to be careful when + writing tests, to not carelessly use tcl statements like + return---if you alter the flow of control of the + tcl code you must insure that every test still produces some result + code. + + Here are some of the ways a test may wind up + UNRESOLVED: + + + A test's execution is interrupted. + + A test does not produce a clear result. This is + usually because there was an ERROR from + DejaGnu while processing the test, or because there were three or + more WARNING messages. Any + WARNING or ERROR messages + can invalidate the output of the test. This usually requires a + human being to examine the output to determine what really + happened---and to improve the test case. + + A test depends on a previous test, which + fails. + + The test was set up incorrectly. + + + + UNTESTED + A test was not run. This is a placeholder, used + when there is no real test case yet. + + + + The only remaining output message left is intended to test + features that are specified by the applicable POSIX standard as + conditional: + + + + UNSUPPORTED + There is no support for the tested case. This may + mean that a conditional feature of an operating system, or of a + compiler, is not implemented. DejaGnu also uses this message when + a testing environment (often a ``bare board'' target) lacks basic + support for compiling or running the test case. For example, a + test for the system subroutine gethostname + would never work on a target board running only a boot monitor. + + + + DejaGnu uses the same output procedures to produce these messages + for all test suites, and these procedures are already known to conform + to POSIX 1003.3. For a DejaGnu test suite to conform to POSIX 1003.3, + you must avoid the setupxfail} procedure as + described in the PASS section above, and you must + be careful to return UNRESOLVED where appropriate, + as described in the UNRESOLVED section + above. + + + + + + &user; + + + &ref; + +
diff --git a/doc/ref.sgml b/doc/ref.sgml new file mode 100644 index 0000000..6a1a7d6 --- /dev/null +++ b/doc/ref.sgml @@ -0,0 +1,4242 @@ + + Reference + + + Installation + + Once you have the DejaGnu source unpacked and available, you must + first configure the software to specify where it is to run (and the + associated defaults); then you can proceed to installing it. + + + Configuring DejaGnu + + It is usually best to configure in a directory separate from the + source tree, specifying where to find the source with the optional + --srcdir option to + configure. DejaGnu uses the GNU + autoconf to configure itself. For more info on using + autoconf, read the GNU autoconf manual. To configure, execute the + configure program, no other options are + required. For an example, to configure in a seperate tree for objects, + execute the configure script from the source tree like this: + + + ../dejagnu-1.4/configure + + + DejaGnu doesn't care at config time if it's for testing a native + system or a cross system. That is determined at runtime by using the + config files. + + You may also want to use the configure option + --prefix to specify where you want DejaGnu and its + supporting code installed. By default, installation is in subdirectories + of /usr/local, but you can select any alternate + directory altdir by including + {altdir}} on the + configure command line. (This value is captured in + the Makefile variables prefix and + execprefix}.) + + Save for a small number of example tests, the DejaGnu distribution + itself does not include any test suites; these are available + separately. Test suites for the GNU development tools are included in + those releases. After configuring the top-level DejaGnu directory, unpack + and configure the test directories for the tools you want to test; then, + in each test directory, run make check to build + auxiliary programs required by some of the tests, and run the test + suites. + + + + + Installing DejaGnu + + To install DejaGnu in your filesystem (either in + /usr/local, or as specified by your + --prefix option to configure), + execute. + + + eg$ make install + + + make installdoes thes things for + DejaGnu: + + + Look in the path specified for executables + $exec_prefix) for directories called + lib and bin. If these + directories do not exist, make install creates + them. + + Create another directory in the + share directory, called + dejagnu, and copy all the library files into + it. + + Create a directory in the + dejagnu/share directory, called + config, and copy all the configuration files into + it. + + Copy the runtest shell script into + $exec_prefix/bin. + + Copy runtest.exp into + $exec_prefix/lib/dejagnu. This is the main Tcl + code implementing DejaGnu. + + + + + + + Builtin Procedures + + DejaGnu provides these Tcl procedures. + + + Core Internal Procedures + + + Mail_file Procedure + + + mail_file + file to subject + + + + + + + + + + + Open_logs Procedure + + + + + open_logs + + + + + + Close_logs Procedure + + + + + close_logs + + + + + + Isbuild Procedure + + Tests for a particular build host environment. If the + currently configured host matches the argument string, the result is + 1; otherwise the result is + 0. host must be a full + three-part configure host name; in particular, you may not use the + shorter nicknames supported by configure (but you can use wildcard + characters, using shell syntax, to specify sets of names). If it is + passed a NULL string, then it returns the name of the build canonical + configuration. + + + isbuild + pattern + + + + pattern + + + + + + + Is_remote Procedure + + + + + is_remote + board + + + + + + + + + + + is3way Procedure + + Tests for a canadian cross. This is when the tests will be run + on a remotly hosted cross compiler. If it is a canadian cross, then + the result is 1; otherwise the result is + 0. + + + is3way + + + + + + Ishost Procedure + + Tests for a particular host environment. If the currently + configured host matches the argument string, the result is + 1; otherwise the result is + 0. host must be a full + three-part configure host name; in particular, you may not use the + shorter nicknames supported by configure (but you can use wildcard + characters, using shell syntax, to specify sets of names). + + + ishost + pattern + + + + + + + + + + + Istarget Procedure + + Tests for a particular target environment. If the currently + configured target matches the argument string, the result is + 1 ; otherwise the result is + 0. target must be a full three-part configure + target name; in particular, you may not use the shorter nicknames + supported by configure (but you can use wildcard characters, using + shell syntax, to specify sets of names). If it is passed a + NULL string, then it returns the name of the + build canonical configuration. + + + istarget + args + + + + + + + + + + + Isnative Procedure + + Tests whether the current configuration has the same host and + target. When it runs in a native configuration this procedure returns + a 1; otherwise it returns a + 0. + + + isnative + + + + + + Unknown Procedure + + + + + unknown + args + + + + args + + + + + + + Clone_output Procedure + + + + + clone_output + message + + + + message + + + + + + + Reset_vars Procedure + + + + + reset_vars + + + + + + Log_and_exit Procedure + + + + + log_and_exit + + + + + + Log_summary Procedure + + + + + log_summary + args + + + + args + + + + + + + Cleanup Procedure + + + + + cleanup + + + + + + Setup_xfail Procedure + + Declares that the test is expected to fail on a particular set + of configurations. The config argument must be a list of full + three-part configure target name; in particular, you may not use the + shorter nicknames supported by configure (but you can use the common + shell wildcard characters to specify sets of names). The + bugid argument is optional, and used only in the + logging file output; use it as a link to a bug-tracking system such + as GNATS. + + Once you use setup_xfail, the + fail and pass procedures + produce the messages XFAIL and + XPASS respectively, allowing you to distinguish + expected failures (and unexpected success!) from other test + outcomes. + + Warning you must clear the expected failure after + using setup_xfail in a test case. Any call to pass + or faill clears the expected failure + implicitly; if the test has some other outcome, e.g. an error, you + can call clear_xfail to clear the expected + failure explicitly. Otherwise, the expected-failure declaration + applies to whatever test runs next, leading to surprising + results. + + + setup_xfail + config + bugid + + + + config + The config triplet to trigger whether this is an + unexpected or expect failure. + + + bugid + The optional bugid, used to tie it this test case + to a bug tracking system. + + + + + + Record_test Procedure + + + + + record_test + type + message + args + + + + type + + + + message + + + + args + + + + + + + Pass Procedure + + Declares a test to have passed. pass + writes in the log files a message beginning with + PASS (or XPASS, if failure + was expected), appending the argument + string. + + + pass + string + + + + string + The string to use for this PASS + message. + + + + + + Fail Procedure + + Declares a test to have failed. fail + writes in the log files a message beginning with + FAIL (or XFAIL, if failure + was expected), appending the argument + string. + + + fail + string + + + + string + The string to use for this FAIL + message. + + + + + + Xpass Procedure + + Declares a test to have unexpectably passed, when it was + expected to be a failure. xpass + writes in the log files a message beginning with + XPASS (or XFAIL, if failure + was expected), appending the argument + string. + + + xpass + string + + + + string + The string to use for this output + state. + + + + + + Xfail Procedure + + Declares a test to have expectably + failed. xfail + writes in the log files a message beginning with + XFAIL (or PASS, if success + was expected), appending the argument + string. + + + xpass + string + + + + string + The string to use for this output + state. + + + + + + Set_warning_threshold Procedure + + Sets the value of warning_threshold. A value + of 0 disables it: calls to + warning will not turn a + PASS or FAIL into an + UNRESOLVED. + + + set_warning_threshold + threshold + + + + threshold + This is the value of the new warning + threshold. + + + + + + Get_warning_threshold Procedure + + Returns the current value of + {warning_threshold. The default value is 3. This + value controls how many warning procedures can + be called before becoming UNRESOLVED. + + + get_warning_threshold + + + + + Warning Procedure + + Declares detection of a minor error in the test case + itself. warning writes in the log files a message + beginning with WARNING, appending the argument + string. Use warning rather + than perror for cases (such as communication + failure to be followed by a retry) where the test case can recover from + the error. If the optional number is supplied, + then this is used to set the internal count of warnings to that + value. + + As a side effect, warning_threshold or more + calls to warning in a single test case also changes the effect of the + next pass or fail command: + the test outcome becomes UNRESOLVED since an + automatic PASS or FAIL may + not be trustworthy after many warnings. If the optional numeric value + is 0, then there are no further side effects to + calling this function, and the following test outcome doesn't become + UNRESOLVED. This can be used for errors with no + known side effects. + + + warning + string + number + + + + + string + + + + number + The optional number to set the error counter. Thius + is only used to fake out the counter when using the + xfail procedure to control when it flips the + output over to UNRESOLVED + state. + + + + + Perror Procedure + + Declares a severe error in the testing framework + itself. perror writes in the log files a message + beginning with ERROR, appending the argument + string. + + As a side effect, perror also changes the effect of the next + pass or fail command: the + test outcome becomes UNRESOLVED, since an + automatic PASS or FAIL cannot + be trusted after a severe error in the test framework. If the optional + numeric value is 0, then there are no further side + effects to calling this function, and the following test outcome + doesn't become UNRESOLVED. This can be used for + errors with no known side effects. + + + perror + string + number + + + + + string + + + + number + The optional number to set the error counter. Thius + is only used to fake out the counter when using the + xfail procedure to control when it flips the + output over to UNRESOLVED + state. + + + + + Note Procedure + + Appends an informational message to the log + file. note writes in the log files a message + beginning with NOTE, appending the argument + string. Use note + sparingly. The verbose should be used for most + such messages, but in cases where a message is needed in the log file + regardless of the verbosity level use note. + + + note + string + + + + string + The string to use for this note. + + + + + + Untested Procedure + + Declares a test was not run. untested writes + in the log file a message beginning with UNTESTED, + appending the argument string. For example, you + might use this in a dummy test whose only role is to record that a test + does not yet exist for some feature. + + + untested + string + + + + string + The string to use for this output + state. + + + + + + Unresolved Procedure + + Declares a test to have an unresolved + outcome. unresolved writes in the log file a + message beginning with UNRESOLVED, appending the + argument string. This usually means the test did + not execute as expected, and a human being must go over results to + determine if it passed or failed (and to improve the test case). + + + unresolved + string + + + + string + The string to use for this output + state. + + + + + + Unsupported Procedure + + Declares that a test case depends on some facility that does not + exist in the testing environment. unsupported + writes in the log file a message beginning with + UNSUPPORTED, appending the argument string. + + + unsupported + string + + + + string + The string to use for this output + state. + + + + + + Init_testcounts Procedure + + + + + init_testcounts + + + + + + Incr_count Procedure + + + + + incr_count + name + args + + + + name + + + + args + + + + + + + transform Procedure + + Generates a string for the name of a tool as it was configured + and installed, given its native name (as the argument + toolname). This makes the assumption that all + tools are installed using the same naming conventions: For example, + for a cross compiler supporting the m68k-vxworks + configuration, the result of transform gcc is + m68k-vxworks-gcc. + + + transform + toolname + + + + toolname + The name of the cross-development program to + transform. + + + + + + + Check_conditional_xfail Procedure + + This procedure adds a condition xfail, based on compiler + options used to create a test case executable. If an include options + is found in the compiler flags, and it's the right architecture, + it'll trigger an XFAIL. Otherwise it'll produce + an ordinary FAIL. You can also specify flags to + exclude. This makes a result be a FAIL, even if + the included options are found. To set the conditional, set + the variable compiler_conditional_xfail_data to the + fields "[message string] [targets list] [includes + list] [excludes list]" (descriptions below). This is + the checked at pass/fail decision time, so there is no need to call + the procedure yourself, unless you wish to know if it gets + triggered. After a pass/fail, the variable is reset, so it doesn't + effect other tests. It returns 1 if the + conditional is true, or 0 if the conditional is + false. + + + check_conditional_xfail + message + targets + includes + excludes + + + + message + This is the message to print with the normal test + result. + + + targets + This is a string with the list targets to activate + this conditional on. + + + includes + This is a list of sets of options to search for in + the compiler options to activate this conditional. If any set of + the options matches, then this conditional is + true. + + + excludes + This is a list of sets of options to search for in + the compiler options to activate this conditional. If any set of + the options matches, (regardless of whether any of the include sets + match) then this conditional is de-activated. + + + + + Specifying the conditional xfail data + + + set compiler_conditional_xfail_data { \ + "I sure wish I knew why this was hosed" \ + "sparc*-sun*-* *-pc-*-*" \ + {"-Wall -v" "-O3"} \ + {"-O1" "-Map"} \ + } + + + + + What this does is it matches only for these two targets if + "-Wall -v" or "-O3" is set, but neither "-O1" or "-Map" is set. For + a set to match, the options specified are searched for independantly + of each other, so a "-Wall -v" matches either "-Wall -v" or "-v + -Wall". A space seperates the options in the string. Glob-style + regular expressions are also permitted. + + + + + Clear_xfail Procedure + + Cancel an expected failure (previously declared with + setup_xfail) for a particular set of + configurations. The config argument is a list + of configuration target names. It is only necessary to call + clear_xfail if a test case ends without calling + either pass or fail, after + calling setup_xfail. + + + clear_xfail + config + + + + config + The configuration triplets to + clear. + + + + + + Verbose Procedure + + Test cases can use this function to issue helpful messages + depending on the number of options on the + runtest command line. It prints string if the value of the variable + verbose is higher than or equal to the optional + number. The default value for number is 1. Use + the optional argument to cause string to always + be added to the log file, even if it won't be printed. Use the + optional argument to print string without a + trailing newline. Use the optional argument if + string begins with "-". + + + verbose + -log + -n + -r + string + number + + + + -log + + + + -n + + + + -- + + + + string + + + + number + + + + + + + Load_lib Procedure + + Loads a DejaGnu library file by searching a fixed path built + into DejaGnu. If DejaGnu has been installed, it looks in a path + starting with the installed library directory. If you are running + DejaGnu directly from a source directory, without first running + make install, this path defaults to the current + directory. In either case, it then looks in the current directory + for a directory called lib. If there are + duplicate definitions, the last one loaded takes precedence over the + earlier ones. + + + load_lib + filespec + + + + filespec + The name of the DejaGnu library file to + load. + + + + + + + + Procedures For Remote Communication + + lib/remote.exp defines these + functions, for establishing and managing communications. Each + of these procedures tries to establish the connection up to + three times before returning. Warnings (if retries will + continue) or errors (if the attempt is abandoned) report on + communication failures. The result for any of these + procedures is either -1, when the + connection cannot be established, or the spawn ID returned by + the Expect command + spawn. + + It use the value of the connect field + in the target_info array (was + connectmode as the type of connection to + make. Current supported connection types are tip, kermit, + telnet, rsh, rlogin, and netdata. If the + option was used on the runtest command line, then the target + is rebooted before the connection is made. + + + Call_remote Procedure + + + + + call_remote + type + proc + dest + args + + + + proc + + + + dest + + + + args + + + + + + + Check_for_board_status Procedure + + + + + check_for_board_status + variable + + + + variable + + + + + + + File_on_build Procedure + + + + + file_on_build + op + file + args + + + + op + + + + file + + + + args + + + + + + + File_on_host Procedure + + + + + file_on_host + op + file + args + + + + op + + + + file + + + + args + + + + + + + Local_exec Procedure + + + + + local_exec + commandline + inp + outp + timeout + + + + inp + + + + outp + + + + timeout + + + + + + + Remote_binary Procedure + + + + + remote_binary + host + + + + host + + + + + + + Remote_close Procedure + + + + + remote_close + shellid + + + + shellid + This is the value returned by a call + to remote_open. This closes the + connection to the target so resources can be used by + others. This parameter can be left off if the + fileid field in the + target_info array is set. + + + + + + Remote_download Procedure + + + + + remote_download + dest + file + args + + + + dest + + + + file + + + + args + + + + + + + Remote_exec Procedure + + + + + remote_exec + hostname + program + args + + + + hostname + + + + program + + + + args + + + + + + + Remote_expect Procedure + + + + + remote_expect + board + timeout + args + + + + board + + + + timeout + + + + args + + + + + + + Remote_file Procedure + + + + + remote_file + dest + args + + + + dest + + + + args + + + + + + + Remote_ld Procedure + + + + + remote_ld + dest + prog + + + + dest + + + + prog + + + + + + + Remote_load Procedure + + + + + remote_load + dest + prog + args + + + + dest + + + + prog + + + + args + + + + + + + Remote_open Procedure + + + + + remote_open + type + + + + type + This is passed or + . Host or target refers to + whether it is a connection to a remote target, or a + remote host. This opens the connection to the desired + target or host using the default values in the + configuration system. It returns that + spawn_id of the process that manages + the connection. This value can be used in + Expect or + exp_send statements, or passed to + other procedures that need the connection process's + id. This also sets the fileid field in + the target_info array. + + + + + + Remote_pop_conn Procedure + + + + + remote_pop_conn + host + + + + host + + + + + + + Remote_push_conn Procedure + + + + + remote_push_conn + host + + + + host + + + + + + + Remote_raw_binary Procedure + + + + + remote_raw_binary + host + + + + host + + + + + + + Remote_raw_close Procedure + + + + + remote_raw_close + host + + + + host + + + + + + + Remote_raw_file Procedure + + + + + remote_raw_file + dest + args + + + + dest + + + + args + + + + + + + remote_raw_ld Procedure + + + + + remote_raw_ld + dest + prog + + + + dest + + + + prog + + + + + + + Remote_raw_load Procedure + + + + + remote_raw_load + dest + prog + args + + + + dest + + + + prog + + + + args + + + + + + + Remote_raw_open Procedure + + + + + remote_raw_open + args + + + + args + + + + + + + Remote_raw_send Procedure + + + + + remote_raw_send + dest + string + + + + dest + + + + string + + + + + + + Remote_raw_spawn Procedure + + + + + remote_raw_spawn + dest + commandline + + + + dest + + + + commandline + + + + + + + Remote_raw_transmit Procedure + + + + + remote_raw_transmit + dest + file + + + + dest + + + + file + + + + + + + Remote_raw_wait Procedure + + + + + remote_raw_wait + dest + timeout + + + + dest + + + + timeout + + + + + + + Remote_reboot Procedure + + + + + remote_reboot + host + + + + host + + + + + + + Remote_send Procedure + + + + + remote_send + dest + string + + + + dest + + + + string + + + + + + + Remote_spawn Procedure + + + + + remote_spawn + dest + commandline + args + + + + dest + + + + commandline + + + + args + + + + + + + Remote_swap_conn Procedure + + + + + remote_swap_conn + host + + + + + + + + + + + Remote_transmit Procedure + + + + + remote_transmit + dest + file + + + + dest + + + + file + + + + + + + Remote_upload Procedure + + + + + remote_upload + dest + srcfile + arg + + + + dest + + + + srcfile + + + + arg + + + + + + + Remote_wait Procedure + + + + + remote_wait + dest + timeout + + + + dest + + + + timeout + + + + + + + Standard_close Procedure + + + + + standard_close + host + + + + host + + + + + + + Standard_download Procedure + + + + + standard_download + dest + file + destfile + + + + dest + + + + file + + + + destfile + + + + + + + Standard_exec Procedure + + + + + standard_exec + hostname + args + + + + hostname + + + + args + + + + + + + Standard_file Procedure + + + + + standard_file + destopargs + + + + + + + + + + + Standard_load Procedure + + + + + standard_load + dest + prog + args + + + + dest + + + + prog + + + + args + + + + + + + Standard_reboot Procedure + + + + + standard_reboot + host + + + + host + + + + + + + Standard_send Procedure + + + + + standard_send + dest + string + + + + dest + + + + string + + + + + + + Standard_spawn Procedure + + + + + standard_spawn + dest + commandline + + + + dest + + + + commndline + + + + + + + Standard_transmit Procedure + + + + + standard_transmit + dest + file + + + + dest + + + + file + + + + + + + Standard_upload Procedure + + + + + standard_upload + dest srcfile destfile + + + + dest + + + + srcfile + + + + destfile + + + + + + + Standard_wait Procedure + + + + + standard_wait + dest + timeout + + + + dest + + + + timeout + + + + + + + Unix_clean_filename Procedure + + + + + unix_clean_filename + dest + file + + + + dest + + + + file + + + + + + + + + + + Procedures For Using Utilities to Connect + + telnet, rsh, tip, kermit + + + telnet Procedure + + + + + telnet + hostname + port + + + rlogin + hostname + + + + + rsh Procedure + + + + + rsh + hostname + + + + hostname + This refers to the IP address or name + (for example, an entry in + /etc/hosts) for this target. The + procedure names reflect the Unix utility used to + establish a connection. The optional + port is used to specify the IP + port number. The value of the + netport field in the + target_info array is used. (was + $netport) This value has two parts, + the hostname and the port number, seperated by a + :. If host or target is used in + the hostname field, than the + config array is used for all information. + + + + + + Tip Procedure + + + + + tip + port + + + + port + Connect using the Unix utility + tip. Portmust + be a name from the tip + configuration file + /etc/remote. Often, this is called + hardwire, or something like + ttya. This file holds all the + configuration data for the serial port. The value of + the serial field in the + target_info array is used. (was + $serialport) If + or is used in the + port field, than the config + array is used for all information. the + config array is used for all information. + + + + + + Kermit Procedure + + + + + kermit + port + bps + + + + port + Connect using the program + kermit. Port + is the device name, + e.g. /dev/ttyb. + + + + bps + bps is the line + speed to use (in its per second) for the + connection. The value of the serial + field in the target_info array is + used. (was $serialport) If + or is + used in the port field, than the + config array is used for all information. the + config array is used for all information. + + + + + + kermit_open Procedure + + + + + kermit_open + dest + args + + + + dest + + + + args + + + + + + + Kermit_command Procedure + + + + + kermit_command + dest + args + + + + dest + + + + args + + + + + + + Kermit_send Procedure + + + + + kermit_send + dest string args + + + + dest + + + + string + + + + args + + + + + + + Kermit_transmit Procedure + + + + + kermit_transmit + dest + file + args + + + + dest + + + + file + + + + args + + + + + + + Telnet_open Procedure + + + + + telnet_open + hostname + args + + + + hostname + + + + args + + + + + + + Telnet_binary Procedure + + + + + telnet_binary + hostname + + + + hostname + + + + + + + Telnet_transmit Procedure + + + + + telnet_transmit + dest + file + args + + + + dest + + + + file + + + + args + + + + + + + Tip_open Procedure + + + + + tip_open + hostname + + + + hostname + + + + + + + Rlogin_open Procedure + + + + + rlogin_open + arg + + + + arg + + + + + + + Rlogin_spawn Procedure + + + + + rlogin_spawn + dest + cmdline + + + + dest + + + + cmdline + + + + + + + Rsh_open Procedure + + + + + rsh_open + hostname + + + + hostname + + + + + + + Rsh_download Procedure + + + + + rsh_download + desthost + srcfile + destfile + + + + desthost + + + + srcfile + + + + destfile + + + + + + + Rsh_upload Procedure + + + + + rsh_upload + desthost + srcfile + destfile + + + + desthost + + + + srcfile + + + + destfile + + + + + + + Rsh_exec Procedure + + + + + rsh_exec + boardname + cmd + args + + + + boardname + + + + cmd + + + + args + + + + + + + Ftp_open Procedure + + + + + ftp_open + host + + + + host + + + + + + + Ftp_upload Procedure + + + + + ftp_upload + host + remotefile + localfile + + + + host + + + + remotefile + + + + localfile + + + + + + + Ftp_download Procedure + + + + + ftp_download + host + localfile + remotefile + + + + host + + + + localfile + + + + remotefile + + + + + + + Ftp_close Procedure + + + + + ftp_close + host + + + + host + + + + + + + Tip_download Procedure + + + + + tip_download + spawnid + file + + + + spawnid + Download to the + process spawnid (the value returned + when the connection was established), using the + ~put command under + tip. Most often used for + single board computers that require downloading + programs in ASCII S-records. Returns + 1 if an error occurs, + 0 otherwise. + + + file + This is the filename to + downlaod. + + + + + + + Procedures For Target Boards + + + + + Default_link Procedure + + + + + default_link + board + objects + destfile + flags + + + + board + + + + objects + + + + destfile + + + + flags + + + + + + + Default_target_assemble Procedure + + + + + default_target_assemble + source + destfile + flags + + + + source + + + + destfile + + + + flags + + + + + + + default_target_compile Procedure + + + + + default_target_compile + source + destfile + type + options + + + + source + + + + destfile + + + + type + + + + options + + + + + + + Pop_config Procedure + + + + + pop_config + type + + + + type + + + + + + + Prune_warnings Procedure + + + + + prune_warnings + text + + + + text + + + + + + + Push_build Procedure + + + + + push_build + name + + + + name + + + + + + + push_config Procedure + + + + + push_config + type + name + + + + type + + + + name + + + + + + + Reboot_target Procedure + + + + + reboot_target + + + + + + Target_assemble Procedure + + + + + target_assemble + source destfile flags + + + + source + + + + destfile + + + + flags + + + + + + + Target_compile Procedure + + + + + target_compile + source + destfile + type + options + + + + source + + + + destfile + + + + type + + + + options + + + + + + + + Target Database Procedures + + + Board_info Procedure + + + + + board_info + machine + op + args + + + + machine + + + + op + + + + args + + + + + + + Host_info Procedure + + + + + host_info + op + args + + + + op + + + + args + + + + + + + Set_board_info Procedure + + + + + set_board_info + entry + value + + + + entry + + + + value + + + + + + + Set_currtarget_info Procedure + + + + + set_currtarget_info + entry + value + + + + entry + + + + value + + + + + + + Target_info Procedure + + + + + target_info + op + args + + + + op + + + + args + + + + + + + Unset_board_info Procedure + + + + + unset_board_info + entry + + + + entry + + + + + + + Unset_currtarget_info Procedure + + + + + unset_currtarget_info + entry + + + + entry + + + + + + + Push_target Procedure + + This makes the target named name be the + current target connection. The value of name is + an index into the target_info array and is set in + the global config file. + + + push_target + name + + + + name + The name of the target to make current + connection. + + + + + + Pop_target Procedure + + This unsets the current target connection. + + + pop_target + + + + + + List_targets Procedure + + This lists all the supported targets for this + architecture. + + + list_targets + + + + + + Push_host Procedure + + This makes the host named name be the + current remote host connection. The value of + name is an index into the + target_info array and is set in the global config + file. + + + push_host + name + + + + name + + + + + + + Pop_host Procedure + + This unsets the current host connection. + + + pop_host + + + + + + Compile Procedure + + This invokes the compiler as set by CC to compile the + file file. The default options for many cross + compilation targets are guessed by DejaGnu, and + these options can be added to by passing in more parameters as + arguments to compile. Optionally, this will also + use the value of the cflags field in the target + config array. If the host is not the same as the build machines, then + then compiler is run on the remote host using + execute_anywhere. + + + compile + file + + + + file + + + + + + + Archive Procedure + + This produces an archive file. Any parameters passed to + archive are used in addition to the default + flags. Optionally, this will also use the value of the + arflags field in the target config array. If the + host is not the same as the build machines, then then archiver is run + on the remote host using execute_anywhere. + + + archive + file + + + + file + + + + + + + Ranlib Procedure + + This generates an index for the archive file for systems that + aren't POSIX yet. Any parameters passed to ranlib + are used in for the flags. + + + ranlib + file + + + + file + + + + + + + Execute_anywhere Procedure + + This executes the cmdline on the proper + host. This should be used as a replacement for the Tcl command + exec as this version utilizes the target config + info to execute this command on the build machine or a remote + host. All config information for the remote host must be setup to + have this command work. If this is a canadian cross, (where we test a + cross compiler that runs on a different host then where DejaGnu is + running) then a connection is made to the remote host and the command + is executed there. It returns either REMOTERROR (for an error) or the + output produced when the command was executed. This is used for + running the tool to be tested, not a test case. + + + execute_anywhere + cmdline + + + + cmdline + + + + + + + Platform Dependant Procedures + + Each combination of target and tool requires some + target-dependent procedures. The names of these procedures have + a common form: the tool name, followed by an underbar + _, and finally a suffix describing the + procedure's purpose. For example, a procedure to extract the + version from GDB is called + gdb_version. + + runtest itself calls only two of these + procedures, ${tool}_exit and + ${tool}_version; these procedures use no + arguments. + + The other two procedures, ${tool}_start + and ${tool}_load}, are only called by the test + suites themselves (or by testsuite-specific initialization + code); they may take arguments or not, depending on the + conventions used within each test suite. + + The usual convention for return codes from any of these + procedures (although it is not required by + runtest) is to return 0 + if the procedure succeeded, 1 if it failed, + and -1 if there was a communication error. + + + ${tool}_start Procedure + + Starts a particular tool. For an interactive tool, + ${tool}_start starts and initializes the + tool, leaving the tool up and running for the test cases; an + example is gdb_start, the start function + for GDB. For a batch oriented tool, + ${tool}_start is optional; the recommended + convention is to let ${tool}_start run the + tool, leaving the output in a variable called + comp_output. Test scripts can then analyze + $comp_output to determine the test results. + An example of this second kind of start function is + gcc_start, the start function for GCC. + + DejaGnu itself does not call + ${tool}_start. The initialization + module ${tool}_init.exp must call + ${tool}_start for interactive tools; + for batch-oriented tools, each individual test script calls + ${tool}_start (or makes other + arrangements to run the tool). + + + ${tool}_start + + + + + + ${tool}_load Procedure + + Loads something into a tool. For an interactive tool, + this conditions the tool for a particular test case; for + example, gdb_load loads a new + executable file into the debugger. For batch oriented tools, + ${tool}_load may do nothing---though, + for example, the GCC support uses + gcc_load to load and run a binary on + the target environment. Conventionally, + ${tool}_load leaves the output of any + program it runs in a variable called + $exec_output. Writing + ${tool}_load can be the most complex + part of extending DejaGnu to a new tool or a new target, if + it requires much communication coding or file + downloading. Test scripts call + ${tool}_load. + + + ${tool}_load + + + + + + ${tool}_exit Procedure + + Cleans up (if necessary) before DejaGnu exits. For + interactive tools, this usually ends the interactive + session. You can also use ${tool}_exit + to remove any temporary files left over from the + tests. runtest calls + ${tool}_exit. + + + ${tool}_exit + + + + + + ${tool}_version Procedure + + Prints the version label and number for + ${tool}. This is called by the DejaGnu + procedure that prints the final summary report. The output + should consist of the full path name used for the tested + tool, and its version number. + + + ${tool}_version + + + + + + + + Utility Procedures + + + Getdirs Procedure + + Returns a list of all the directories in the single + directory a single directory that match an optional + pattern. + + + getdirs + rootdir + pattern + + + + args + + + + pattern + If you do not specify + pattern, + Getdirs assumes a default pattern of + *. You may use the common shell + wildcard characters in the pattern. If no directories + match the pattern, then a NULL string is + returned + + + + + + Find Procedure + + Search for files whose names match pattern + (using shell wildcard characters for filename expansion). Search + subdirectories recursively, starting at + rootdir. The result is the list of files whose + names match; if no files match, the result is empty. Filenames in the + result include all intervening subdirectory names. If no files match + the pattern, then a NULL string is returned. + + + find + rootdir + pattern + + + + rootdir + The top level directory to search the search + from. + + + pattern + A csh "glob" style regular expression reprsenting + the files to find. + + + + + + Which Procedure + + Searches the execution path for an executable file + binary, like the the BSD which + utility. This procedure uses the shell environment variable + PATH. It returns 0 if the + binary is not in the path, or if there is no PATH + environment variable. If binary is in the path, it + returns the full path to binary. + + + which + file + + + + binary + The executable program or shell script to look + for. + + + + + + Grep Procedure + + Search the file called filename (a fully + specified path) for lines that contain a match for regular expression + regexp. The result is a list of all the lines that + match. If no lines match, the result is an empty string. Specify + regexp using the standard regular expression style + used by the Unix utility program grep. + + Use the optional third argument line to + start lines in the result with the line number in + filename. (This argument is simply an option + flag; type it just as shown .) + + + grep + filename + regexp + --line + + + + filename + The file to search. + + + regexp + The Unix style regular expression (as used by the + grep Unix utility) to search + for. + + + --line + Prefix the line number to each line where the + regexp matches. + + + + + + Prune Procedure + + Remove elements of the Tcl list list. + Elements are fields delimited by spaces. The result is a copy of + list, without any elements that match pattern. + You can use the common shell wildcard characters to specify the + pattern. + + + prune + list + pattern + + + + list + A Tcl list containing the original data. Commonly + this is the output of a batch executed command, like running a + compiler. + + + pattern + The csh shell "glob" style pattern to search + for. + + + + + + + Slay Procedure + + This look in the process table for name + and send it a unix SIGINT, killing the process. This will only work + under NT if you have Cygwin or another Unix system for NT + installed. + + + slay + name + + + + name + The name of the program to kill. + + + + + + + Absolute Procedure + + This procedure takes the relative path, + and converts it to an absolute path. + + + absolute + path + + + + path + The path to convert. + + + + + + Psource Procedure + + This sources the file filename, and traps + all errors. It also ignores all extraneous output. If there was an + error it returns a 1, otherwise it returns a + 0. + + + psource + file + + + + filename + The filename to Tcl script to + source. + + + + + + Runtest_file_p Procedure + + Search runtests for + testcase and return 1 if + found, 0 if not. runtests + is a list of two elements. The first is the pathname of the + testsuite expect script running. The second is a copy of what was on + the right side of the = if + foo.exp="..."" was specified, or + an empty string if no such argument is present. This is used by tools + like compilers where each testcase is a file. + + + runtest_file_p + runtests + testcase + + + + runtests + The pathname of the testsuite expect script + running + + + testcase + The test case filename. + + + + + + Diff Procedure + + Compares the two files and returns a 1 if + they match, or a 0 if they don't. If + verbose is set, then it'll print the differences to + the screen. + + + diff + file_1 + file_2 + + + + file_1 + The first file to compare. + + + file_2 + The second file to compare. + + + + + + Setenv Procedure + + Sets the environment variable var to the + value val. + + + setenv + var + val + + + + var + The environment variable to set. + + + val + The value to set the variable to. + + + + + unsetenv Procedure + + Unsets the environment variable + var. + + + unsetenv + var + + + + var + The environment variable to + unset. + + + + + + Getenv Procedure + + Returns the value of var in the + environment if it exists, otherwise it returns NULL. + + + getenv + var + + + + var + The environment variable to get the value + of. + + + + + Prune_system_crud Procedure + + For system system, delete text the host or + target operating system might issue that will interfere with pattern + matching of program output in text. An example + is the message that is printed if a shared library is out of + date. + + + prune_system_crud + system + test + + + + system + The system error messages to look for to screen out + . + + + text + The Tcl variable containing the + text. + + + + + + + + Libgloss, A Free BSP + + Libgloss is a free BSP (Board Support + Package) commonly used with GCC and G++ to produce a fully linked + executable image for an embedded systems. + + + Libgloss_link_flags Procedure + + + + + libgloss_link_flags + args + + + + args + + + + + + + Libgloss_include_flags Procedure + + + + + libgloss_include_flags + args + + + + args + + + + + + + Newlib_link_flags Procedure + + + + + newlib_link_flags + args + + + + args + + + + + + + Newlib_include_flags Procedure + + + + + newlib_include_flags + args + + + + args + + + + + + + Libio_include_flags Procedure + + + + + libio_include_flags + args + + + + args + + + + + + + Libio_link_flags Procedure + + + + + libio_link_flags + args + + + + args + + + + + + + G++_include_flags Procedure + + + + + g++_include_flags + args + + + + args + + + + + + + G++_link_flags Procedure + + + + + g++_link_flags + args + + + + args + + + + + + + Libstdc++_include_flags Procedure + + + + + libstdc++_include_flags + args + + + + args + + + + + + + Libstdc++_link_flags Procedure + + + + + libstdc++_link_flags + args + + + + args + + + + + + + Get_multilibs Procedure + + + + + get_multilibs + args + + + + args + + + + + + + Find_binutils_prog Procedure + + + + + find_binutils_prog + name + + + + name + + + + + + + Find_gcc Procedure + + + + + find_gcc + + + + + + Find_gcj Procedure + + + + + find_gcj + + + + + + Find_g++ Procedure + + + + + find_g++ + + + + + + Find_g77 Procedure + + + + + find_g77 + + + + + + Process_multilib_options Procedure + + + + + process_multilib_options + args + + + + args + + + + + + + Add_multilib_option Procedure + + + + + add_multilib_option + args + + + + args + + + + + + + Find_gas Procedure + + + + + find_gas + + + + + + Find_ld Procedure + + + + + find_ld + + + + + + Build_wrapper Procedure + + + + + build_wrapper + gluefile + + + + gluefile + + + + + + + Winsup_include_flags Procedure + + + + + winsup_include_flags + args + + + + args + + + + + + + Winsup_link_flags Procedure + + + + + winsup_link_flags + args + + + + args + + + + + + + + Procedures for debugging your Tcl code. + + lib/debugger.expdefines these utility + procedures: + + + Dumpvars Procedure + + This takes a csh style regular expression (glob rules) and prints + the values of the global variable names that match. It is abbreviated + as dv. + + + dumpvars + vars + + + + vars + The variables to dump. + + + + + + Dumplocals Procedure + + This takes a csh style regular expression (glob rules) and + prints the values of the local variable names that match. It is + abbreviated as dl. + + + dumplocals + args + + + + args + + + + + + + Dumprocs Procedure + + This takes a csh style regular expression (glob rules) and + prints the body of all procs that match. It is abbreviated as + dp. + + + dumprocs + pattern + + + + pattern + The csh "glob" style pattern to look + for. + + + + + + Dumpwatch Procedure + + This takes a csh style regular expression (glob rules) and + prints all the watchpoints. It is abbreviated as + dw. + + + dumpwatch + pattern + + + + pattern + The csh "glob" style pattern to look + for. + + + + + + Watcharray Procedure + + + + + watcharray + element + type + + + + type + The csh "glob" style pattern to look + for. + + + + + + Watchvar Procedure + + + + + watchvar + var + type + + + + + + + + + + + Watchunset Procedure + + This breaks program execution when the variable + var is unset. It is abbreviated as + wu. + + + watchunset + arg + + + + args + + + + + + + Watchwrite Procedure + + This breaks program execution when the variable + var is written. It is abbreviated as + ww. + + + watchwrite + var + + + + var + The variable to watch. + + + + + + Watchread Procedure + + This breaks program execution when the variable + var is read. It is abbreviated as + wr. + + + watchread + var + + + + var + The variable to watch. + + + + + + Watchdel Procedure + + This deletes a the watchpoint from the watch list. It is + abbreviated as wd. + + + watchdel + args + + + + args + + + + + + + Print Procedure + + This prints the value of the variable + var. It is abbreviated as + p. + + + print + var + + + + var + + + + + + + Quit Procedure + + This makes runtest exit. It is abbreviated as + q. + + + quit + + + + + + + + + + + + + + + + File Map + + This is a map of the files in DejaGnu. + + + runtest + runtest.exp + stub-loader.c + testglue.c + config + baseboards + lib/debugger.exp + lib/dg.exp + lib/framework.exp + lib/ftp.exp + lib/kermit.exp + lib/libgloss.exp + lib/mondfe.exp + lib/remote.exp + lib/rlogin.exp + lib/rsh.exp + lib/standard.exp + lib/target.exp + lib/targetdb.exp + lib/telnet.exp + lib/tip.exp + lib/util-defs.exp + lib/utils.exp + lib/xsh.exp + + + + + diff --git a/doc/runtest.1 b/doc/runtest.1 new file mode 100644 index 0000000..2c3a357 --- /dev/null +++ b/doc/runtest.1 @@ -0,0 +1,119 @@ +.TH runtest 1 "08 Dec 1998" +.SH NAME +runtest \- the DejaGnu test driver program +.SH SYNOPSIS +.B runtest +[ options ] +.SH DESCRIPTION +.I DejaGnu +is a framework for running test suites on GNU tools. It is written in +expect, which uses TCL (Tool command language). +.B runtest +is the test driver program; use it to control what tests to run, +and variations on how to run them. + +You can find a comprehensive description of DejaGnu and \fBruntest\fR in +.I +The DejaGnu Testing Framework +or its Info version, +.BR dejagnu.info . +.SH OPTIONS +.TP +.B --all +Print all test output to screen. By default, only unexpected results are +displayed. +.TP +.BI --baud \ rate +Set the baud rate for a serial line connection. Some serial interface +programs (like \fBtip\fR) don't use this value but instead use a separate +initialization file. +.TP +.BI --connect \ type +The type of connection to use. The choices are +.BR rlogin , +.BR telnet , +.BR rsh , +.BR kermit , +.BR tip +and +.BR mondfe . +.TP +.B --debug +Turn on +.B expect +internal debugging output. All output is logged to +a file called \fBdbg.out\fR. +The output of the \fB--strace\fR also goes into this file. +.TP +.B --help +Prints out a help screen and then exits. +.TP +.BI --host \ type +The configuration string for the host. +.TP +.BI --ignore \ test1.exp\ test2.exp\ ... +Do not run the specified tests. +.BI --mail \ \'name1\ name2\ ...\' +Electronic mail addresses to receive test results. +.TP +.BI --name \ hostname +The network hostname of the target board. +.TP +.BI --objdir \ path +\fIpath\fR is a directory containing compiled test code. +.TP +.BI --outdir \ directory +The name of a directory for test log output. +.TP +.B --reboot +Reboot the target board when \fBruntest\fR initializes +(if supported). +.TP +.BI --srcdir \ path +\fIpath\fR is a directory containing test directories. +.TP +.BI --strace \ N +Turns on +.B expect +internal tracing to \fIN\fR levels deep. +.TP +.BI --target \ type +The configuration string for the target. +.TP +.BI --tool \ toolname +Specify the tool to be tested. \fItoolname\fR controls the test suite +applied, and the associated initialization module. +.TP +.B --verbose,\ -v +Turns on more debugging output from test cases and DejaGnu utility code. +Use more than once to increase output further. +.TP +.B --version,\ -V +Prints out the versions of DejaGnu, expect and Tcl. +.TP +.B -D[number] +Activate the Tcl debugger.\fBnumber\fR can be either 1 or 0. If it is +1, then the expect shell will break when it starts to run. All ^C's +drop DejaGnu back to the debugger prompt. A 0 starts DejaGnu like +normal, but a ^C drops to the debugger prompt. +.TP 0 +Any file name on the command line is assumed to be a subset +of the test names to run. Usually these are the names of the +expect test driver, ie... special.exp. + +Makefile style variables are used to specify tool names and their +flags; these and other configuration dependent values are saved in the +file \fBsite.exp\fR, created during configuration. +.SH EXIT CODES +.B runtest +sets the exit code to 1 if any of the tests failed, or +sets it to 0 if all the tests passed. +.SH SEE ALSO +.I The DejaGnu Testing Framework +.RB ( dejagnu.info ). +This is the DejaGnu manual; its source is the SGML files +.B +doc/*.sgml. +in the DejaGnu distribution. +.SH AUTHOR +Rob Savoye (rob@welcomehome.org) diff --git a/doc/user.sgml b/doc/user.sgml new file mode 100644 index 0000000..2154d74 --- /dev/null +++ b/doc/user.sgml @@ -0,0 +1,2355 @@ + + Running Tests + + There are two ways to execute a test suite. The most + common way is when there is existing support in the + Makefile. This support consists of a + check target. The other way is to execute the + runtest program directly. To run + runtest directcly from the command line requires + either all the correct options, or the must be setup + correctly. + + + Make check + + To run tests from an existing collection, first use + configure as usual to set up the + build directory. Then try typing: + + + make check + + + If the check target exists, it + usually saves you some trouble. For instance, it can set up any + auxiliary programs or other files needed by the tests. The most + common file the check builds is the + site.exp. The site.exp file contains + various variables that DejaGnu used to dertermine the + configuration of the program being tested. This is mostly for + supporting remote testing. + + The check target is supported by GNU + Automake. To have DejaGnu support added to your + generated Makefile.in, just add the keyword + dejagnu to the AUTOMAKE_OPTIONS variable in your + Makefile.am file. + + Once you have run make check to build + any auxiliary files, you can invoke the test driver + runtest directly to repeat the tests. + You will also have to execute runtest + directly for test collections with no + check target in the + Makefile. + + + + + Runtest + + runtest is the executable test driver + for DejaGnu. You can specify two kinds of things on the + runtest command line: command line options, + and Tcl variables for the test scripts. The options are listed + alphabetically below. + + runtest returns an exit code of + 1 if any test has an unexpected result; otherwise + (if all tests pass or fail as expected) it returns 0 + as the exit code. + + + Output States + + runtest flags the outcome of each + test as one of these cases. for a + discussion of how POSIX specifies the meanings of these + cases. + + + + PASS + The most desirable outcome: the test succeeded, and + was expected to succeed. + + + + XPASS + A pleasant kind of failure: a test was expected to + fail, but succeeded. This may indicate progress; inspect the test + case to determine whether you should amend it to stop expecting + failure. + + + + FAIL + A test failed, although it was expected to succeed. + This may indicate regress; inspect the test case and the failing + software to ocate the bug. + + + + XFAIL + A test failed, but it was expected to fail. This + result indicates no change in a known bug. If a test fails because + the operating system where the test runs lacks some facility required + by the test, the outcome is UNSUPPORTED + instead. + + + + UNRESOLVED + Output from a test requires manual inspection; the + test suite could not automatically determine the outcome. For + example, your tests can report this outcome is when a test does not + complete as expected. + + + + UNTESTED + A test case is not yet complete, and in particular + cannot yet produce a PASS or + FAIL. You can also use this outcome in dummy + ``tests'' that note explicitly the absence of a real test case for a + particular property. + + + + UNSUPPORTED + A test depends on a conditionally available feature + that does not exist (in the configured testing environment). For + example, you can use this outcome to report on a test case that does + not work on a particular target because its operating system support + does not include a required subroutine. + + + + runtest may also display the following messages: + + + + ERROR + Indicates a major problem (detected by the test case + itself) in running the test. This is usually an unrecoverable error, + such as a missing file or loss of communication to the target. (POSIX + test suites should not emit this message; use + UNSUPPORTED, UNTESTED, or + UNRESOLVED instead, as + appropriate.) + + + + WARNING + Indicates a possible problem in running the + test. Usually warnings correspond to recoverable errors, or display + an important message about the following tests. + + + + NOTE + An informational message about the test + case. + + + + + + + Invoking Runtest + + This is the full set of command line options that + runtest recognizes. Arguments may be + abbreviated to the shortest unique string. + + + + (-a) + Display all test output. By default, + runtest shows only the output of tests that + produce unexpected results; that is, tests with status + FAIL (unexpected failure), + XPASS (unexpected success), or + ERROR (a severe error in the test case + itself). Specify --all to see output for tests + with status PASS (success, as expected) + XFAIL (failure, as expected), or + WARNING (minor error in the test case + itself). + + + + + string is a full configuration + ``triple'' name as used by configure. This + is the type of machine DejaGnu and the tools to be tested are built + on. For a normal cross this is the same as the host, but for a + canadian cross, they are seperate. + + + + + string is a full configuration + ``triple'' name as used by configure. Use this + option to override the default string recorded by your + configuration's choice of host. This choice does not change how + anything is actually configured unless --build is also specified; it + affects only DejaGnu procedures that compare the + host string with particular values. The procedures + ishost, istarget, + isnative, and setupxfail} + are affected by --host. In this usage, + host refers to the machine that the tests are to + be run on, which may not be the same as the + build machine. If --build + is also specified, then --host refers to the + machine that the tests wil, be run on, not the machine DejaGnu is run + on. + + + + + The host board to use. + + + + + Use this option to override the default setting + (running native tests). string is a full + configuration ``triple'' name of the form + cpu-vendor-os as used by + configure. This option changes the + configuration runtest uses for the default tool + names, and other setup information. + + + + (-de) + Turns on the expect internal + debugging output. Debugging output is displayed as part of the + runtest output, and logged to a file called + dbg.log. The extra debugging output does + not appear on standard output, unless the + verbose level is greater than 2 (for instance, to see debug output + immediately, specify --debug-v -v}). The + debugging output shows all attempts at matching the test output of + the tool with the scripted patterns describing expected output. The + output generated with --strace also goes into + dbg.log. + + + + (-he) + Prints out a short summary of the + runtest options, then exits (even if you also + specify other options). + + + + + The names of specific tests to + ignore. + + + + + Use path as the top directory + containing any auxiliary compiled test code. This defaults to + .. Use this option to locate pre-compiled test + code. You can normally prepare any auxiliary files needed with + make. + + + + + Write output logs in directory + path. The default is .}, + the directory where you start + runtest. This option affects only the summary + and the detailed log files + tool.sum and + tool.log. The DejaGnu debug + log dbg.log always appears (when requested) in + the local directory. + + + + + Reboot the target board when + runtest initializes. Usually, when running tests + on a separate target board, it is safer to reboot the target to be + certain of its state. However, when developing test scripts, + rebooting takes a lot of time. + + + + + Use path as the top directory + for test scripts to run. runtest looks in this + directory for any subdirectory whose name begins with the toolname + (specified with --tool). For instance, with + --toolgdb}, runtest uses + tests in subdirectories gdb.* (with the usual + shell-like filename expansion). If you do not use + --srcdir, runtest looks for + test directories under the current working + directory. + + + + + Turn on internal tracing for + expect, to n levels deep. By adjusting the + level, you can control the extent to which your output expands + multi-level Tcl statements. This allows you to ignore some levels of + case or if statements. + Each procedure call or control structure counts as one ``level''. The + output is recorded in the same file, dbg.log, + used for output from --debug. + + + + + Connect to a target testing environment as specified + by type, if the target is not the computer + running runtest. For example, use + --connect to change the program used to connect + to a ``bare board'' boot monitor. The choices for + type in the DejaGnu 1.4 distribution are + rlogin, telnet, + rsh, tip, + kermit, and mondfe. + + The default for this option depends on the configuration most + convenient communication method available, but often other + alternatives work as well; you may find it useful to try alternative + connect methods if you suspect a communication problem with your + testing target. + + + + + Set the default baud rate to something other than + 9600. (Some serial interface programs, like tip, + use a separate initialization file instead of this + value.) + + + + + The list of target boards to run tests + on. + + + + + Specifies which test suite to run, and what + initialization module to use. is used + only for these two purposes. It is + not used to name the executable program to + test. Executable tool names (and paths) are recorded in + site.exp and you can override them by specifying + Tcl variables on the command line. + + For example, including " gcc" on the + runtest command line runs tests from all test + subdirectories whose names match gcc.*, and uses + one of the initialization modules named + config/*-gcc.exp. To specify the name of the + compiler (perhaps as an alternative path to what + runtest would use by default), use + GCC=binname on the runtest + command line. + + + + + The path to the tool executable to + test. + + + + + A list of additional options to pass to the + tool. + + + + (-v) + Turns on more output. Repeating this option increases + the amount of output displayed. Level one (-v) + is simply test output. Level two (-v-v}) shows + messages on options, configuration, and process control. Verbose + messages appear in the detailed (*.log) log + file, but not in the summary (*.sum) log + file. + + + + (-V) + Prints out the version numbers of DejaGnu, + expect and Tcl, and exits without running any + tests. + + + + + Start the internal Tcl debugger. The Tcl debugger + supports breakpoints, single stepping, and other common debugging + activities. See the document "Debugger for Tcl Applications} by Don + Libes. (Distributed in PostScript form with + expect as the file + expect/tcl-debug.ps.. If you specify + -D1, the expect shell stops + at a breakpoint as soon as DejaGnu invokes it. If you specify + -D0, DejaGnu starts as usual, but you can enter + the debugger by sending an interrupt (e.g. by typing + Cc). + + + + + testfile.exp[=arg(s)] + Specify the names of testsuites to run. By default, + runtest runs all tests for the tool, but you can + restrict it to particular testsuites by giving the names of the + .exp expect scripts that control + them. testsuite.exp may not include path + information; use plain filenames. + + + + testfile.exp="testfile1 ..." + Specify a subset of tests in a suite to run. For + compiler or assembler tests, which often use a single + .exp script covering many different source + files, this option allows you to further restrict the tests by + listing particular source files to compile. Some tools even support + wildcards here. The wildcards supported depend upon the tool, but + typically they are ?, *, + and [chars]. + + + + tclvar=value + You can define Tcl variables for use by your test + scripts in the same style used with make for + environment variables. For example, runtest + GDB=gdb.old defines a variable called + GDB; when your scripts refer to + $GDB in this run, they use the value + gdb.old. + + The default Tcl variables used for most tools are defined in + the main DejaGnu Makefile; their values are + captured in the site.exp file. + + + + + + Common Options + + Typically, you don't need must to use any command-line options. + used is only required when there are more than + one test suite in the same directory. The default options are in the + local site.exp file, created by "make site.exp". + + For example, if the directory gdb/testsuite + contains a collection of DejaGnu tests for GDB, you can run them like + this: + + + eg$ cd gdb/testsuite + eg$ runtest --tool gdb + + + Test output follows, ending with: + + + === gdb Summary === + + # of expected passes 508 + # of expected failures 103 + /usr/latest/bin/gdb version 4.14.4 -nx + + + You can use the option --srcdir to point to + some other directory containing a collection of tests: + + + eg$ runtest--srcdir /devo/gdb/testsuite + + + By default, runtest prints only the + names of the tests it runs, output from any tests that have unexpected + results, and a summary showing how many tests passed and how many + failed. To display output from all tests (whether or not they behave + as expected), use the --all option. For more + verbose output about processes being run, communication, and so on, use + --verbose. To see even more output, use multiple + --verbose options. for a more detailed explanation + of each runtest option. + + Test output goes into two files in your current directory: + summary output in tool.sum, + and detailed output in + tool.log. (tool + refers to the collection of tests; for example, after a run with + --tool gdb, look for output files + gdb.sum and gdb.log.) + + + + + + The files DejaGnu produces. + + DejaGnu always writes two kinds of output files: summary + logs and detailed logs. The contents of both of these are + determined by your tests. + + For troubleshooting, a third kind of output file is useful: + use to request an output file showing + details of what Expect is doing + internally. + + + Summary File + + DejaGnu always produces a summary output file + tool.sum. This summary shows the names of + all test files run; for each test file, one line of output from + each pass command (showing status + PASS or XPASS) or + fail command (status + FAIL or XFAIL); + trailing summary statistics that count passing and failing tests + (expected and unexpected); and the full pathname and version + number of the tool tested. (All possible outcomes, and all + errors, are always reflected in the summary output file, + regardless of whether or not you specify .) + + If any of your tests use the procedures + unresolved, unsupported, + or runtested, the summary output also + tabulates the corresponding outcomes. + + For example, after runtest --tool + binutils, look for a summary log in + binutils.sum. Normally, DejaGnu writes this + file in your current working directory; use the + option to select a different + directory. + + + Here is a short sample summary log + + + Test Run By rob on Mon May 25 21:40:57 PDT 1992 + === gdb tests === + Running ./gdb.t00/echo.exp ... + PASS: Echo test + Running ./gdb.all/help.exp ... + PASS: help add-symbol-file + PASS: help aliases + PASS: help breakpoint "bre" abbreviation + FAIL: help run "r" abbreviation + Running ./gdb.t10/crossload.exp ... + PASS: m68k-elf (elf-big) explicit format; loaded + XFAIL: mips-ecoff (ecoff-bigmips) "ptype v_signed_char" signed C types + === gdb Summary === + # of expected passes 5 + # of expected failures 1 + # of unexpected failures 1 + /usr/latest/bin/gdb version 4.6.5 -q + + + + + + + Log File + + DejaGnu also saves a detailed log file + tool.log, showing any output generated by + tests as well as the summary output. For example, after + runtest --tool binutils, look for a detailed + log in binutils.log. Normally, DejaGnu + writes this file in your current working directory; use the + option to select a different + directory. + + + + Here is a brief example showing a detailed log for + <productname>G++</productname> tests + + + Test Run By rob on Mon May 25 21:40:43 PDT 1992 + + === g++ tests === + + --- Running ./g++.other/t01-1.exp --- + PASS: operate delete + + --- Running ./g++.other/t01-2.exp --- + FAIL: i960 bug EOF + p0000646.C: In function `int warn_return_1 ()': + p0000646.C:109: warning: control reaches end of non-void function + p0000646.C: In function `int warn_return_arg (int)': + p0000646.C:117: warning: control reaches end of non-void function + p0000646.C: In function `int warn_return_sum (int, int)': + p0000646.C:125: warning: control reaches end of non-void function + p0000646.C: In function `struct foo warn_return_foo ()': + p0000646.C:132: warning: control reaches end of non-void function + + --- Running ./g++.other/t01-4.exp --- + FAIL: abort + 900403_04.C:8: zero width for bit-field `foo' + --- Running ./g++.other/t01-3.exp --- + FAIL: segment violation + 900519_12.C:9: parse error before `;' + 900519_12.C:12: Segmentation violation + /usr/latest/bin/gcc: Internal compiler error: program cc1plus got fatal signal + + === g++ Summary === + + # of expected passes 1 + # of expected failures 3 + /usr/latest/bin/g++ version cygnus-2.0.1 + + + + + + + Debug Log File + + With the option, you can request + a log file showing the output from + Expect itself, running in debugging + mode. This file (dbg.log, in the directory + where you start runtest) shows each pattern + Expect considers in analyzing test + output. + + This file reflects each send command, + showing the string sent as input to the tool under test; and + each Expect command, showing each + pattern it compares with the tool output. + + + The log messages begin with a message of the form + + + + expect: does {tool output} (spawn_id n) + match pattern {expected pattern}? + + + + + For every unsuccessful match, + Expect issues a + no after this message; if other patterns + are specified for the same Expect + command, they are reflected also, but without the first part of + the message (expect... match pattern). + + When Expect finds a match, the + log for the successful match ends with yes, + followed by a record of the Expect + variables set to describe a successful match. + + + Here is an excerpt from the debugging log for a + <productname>GDB</productname> test: + + + send: sent {break gdbme.c:34\n} to spawn id 6 + expect: does {} (spawn_id 6) match pattern {Breakpoint.*at.* file + gdbme.c, line 34.*\(gdb\) $}? no + {.*\(gdb\) $}? no + expect: does {} (spawn_id 0) match pattern {return} ? no + {\(y or n\) }? no + {buffer_full}? no + {virtual}? no + {memory}? no + {exhausted}? no + {Undefined}? no + {command}? no + break gdbme.c:34 + Breakpoint 8 at 0x23d8: file gdbme.c, line 34. + (gdb) expect: does {break gdbme.c:34\r\nBreakpoint 8 at 0x23d8: + file gdbme.c, line 34.\r\n(gdb) } (spawn_id 6) match pattern + {Breakpoint.*at.* file gdbme.c, line 34.*\(gdb\) $}? yes + expect: set expect_out(0,start) {18} + expect: set expect_out(0,end) {71} + expect: set expect_out(0,string) {Breakpoint 8 at 0x23d8: file + gdbme.c, line 34.\r\n(gdb) } + epect: set expect_out(spawn_id) {6} + expect: set expect_out(buffer) {break gdbme.c:34\r\nBreakpoint 8 + at 0x23d8: file gdbme.c, line 34.\r\n(gdb) } + PASS: 70 0 breakpoint line number in file + + + + This example exhibits three properties of + Expect and + DejaGnu that might be surprising at + first glance: + + + Empty output for the first attempted match. The + first set of attempted matches shown ran against the output + {} --- that is, no + output. Expect begins + attempting to match the patterns supplied immediately; often, + the first pass is against incomplete output (or completely + before all output, as in this case). + + Interspersed tool output. The beginning of + the log entry for the second attempted match may be hard to + spot: this is because the prompt {(gdb) } + appears on the same line, just before the + expect: that marks the beginning of the + log entry. + + Fail-safe patterns. Many of the patterns + tested are fail-safe patterns provided by + GDB testing utilities, to reduce + possible indeterminacy. It is useful to anticipate potential + variations caused by extreme system conditions + (GDB might issue the message + virtual memory exhausted in rare + circumstances), or by changes in the tested program + (Undefined command is the likeliest + outcome if the name of a tested command changes). + + The pattern {return} is a + particularly interesting fail-safe to notice; it checks for an + unexpected RET prompt. This may happen, + for example, if the tested tool can filter output through a + pager. + + These fail-safe patterns (like the debugging log itself) + are primarily useful while developing test scripts. Use the + error procedure to make the actions for + fail-safe patterns produce messages starting with + ERROR on standard output, and in the + detailed log file. + + + + + + + Customizing DejaGnu + + The site configuration file, site.exp, + captures configuration-dependent values and propagates them to the + DejaGnu test environment using Tcl variables. This ties the + DejaGnu test scripts into the configure and + make programs. If this file is setup correctly, + it is possible to execute a test suite merely by typing + runtest. + + DejaGnu supports two site.exp + files. The multiple instances of site.exp are + loaded in a fixed order built into DejaGnu. The first file loaded + is the local file site.exp, and then the + optional global site.exp file as + pointed to by the DEJAGNU environment + variable. + + There is an optional master + site.exp, capturing configuration values that + apply to DejaGnu across the board, in each configuration-specific + subdirectory of the DejaGnu library directory. + runtest loads these values first. The master + site.exp contains the default values for all + targets and hosts supported by DejaGnu. This master file is + identified by setting the environment variable + DEJAGNU to the name of the file. This is also + refered to as the ``global'' config file. + + Any directory containing a configured test suite also has a + local site.exp, capturing configuration values + specific to the tool under test. Since runtest + loads these values last, the individual test configuration can + either rely on and use, or override, any of the global values from + the global site.exp file. + + You can usually generate or update the testsuite's local + site.exp by typing make + site.exp in the test suite directory, after the test + suite is configured. + + You can also have a file in your home directory called + .dejagnurc. This gets loaded first before the + other config files. Usually this is used for personal stuff, like + setting the all_flag so all the output gets + printed, or your own verbosity levels. This file is usually + restricted to setting command line options. + + You can further override the default values in a + user-editable section of any site.exp, or by + setting variables on the runtest command + line. + + + Local Config File + + It is usually more convenient to keep these manual + overrides in the site.exp + local to each test directory, rather than in the global + site.exp in the installed DejaGnu + library. This file is mostly for supplying tool specific info + that is required by the test suite. + + All local site.exp files have + two sections, separated by comment text. The first section is + the part that is generated by make. It is + essentially a collection of Tcl variable definitions based on + Makefile environment variables. Since they + are generated by make, they contain the + values as specified by configure. (You can + also customize these values by using the + option to configure.) In particular, this + section contains the Makefile + variables for host and target configuration data. Do not edit + this first section; if you do, your changes are replaced next + time you run make. + + + The first section starts with + + + ## these variables are automatically generated by make ## + # Do not edit here. If you wish to override these values + # add them to the last section + + + + In the second section, you can override any default values + (locally to DejaGnu) for all the variables. The second section + can also contain your preferred defaults for all the command + line options to runtest. This allows you to + easily customize runtest for your preferences + in each configured test-suite tree, so that you need not type + options repeatedly on the command line. (The second section may + also be empty, if you do not wish to override any defaults.) + + + The first section ends with this line + + + ## All variables above are generated by configure. Do Not Edit ## + + + + You can make any changes under this line. If you wish to + redefine a variable in the top section, then just put a + duplicate value in this second section. Usually the values + defined in this config file are related to the configuration of + the test run. This is the ideal place to set the variables + host_triplet, build_triplet, + target_triplet. All other variables are tool + dependant. ie for testing a compiler, the value for + CC might be set to a freshly built binary, as + opposed to one in the user's path. + + Here's an example local site.exp file, as used for + GCC/G++ testing. + + + Local Config File + + + ## these variables are automatically generated by make ## + # Do not edit here. If you wish to override these values + # add them to the last section + set rootme "/build/devo-builds/i586-pc-linux-gnulibc1/gcc" + set host_triplet i586-pc-linux-gnulibc1 + set build_triplet i586-pc-linux-gnulibc1 + set target_triplet i586-pc-linux-gnulibc1 + set target_alias i586-pc-linux-gnulibc1 + set CFLAGS "" + set CXXFLAGS "-I/build/devo-builds/i586-pc-linux-gnulibc1/gcc/../libio -I$srcdir/../libg++/src -I$srcdir/../libio -I$srcdir/../libstdc++ -I$srcdir/../libstdc++/stl -L/build/devo-builds/i586-pc-linux-gnulibc1/gcc/../libg++ -L/build/devo-builds/i586-pc-linux-gnulibc1/gcc/../libstdc++" + append LDFLAGS " -L/build/devo-builds/i586-pc-linux-gnulibc1/gcc/../ld" + set tmpdir /build/devo-builds/i586-pc-linux-gnulibc1/gcc/testsuite + set srcdir "${srcdir}/testsuite" + ## All variables above are generated by configure. Do Not Edit ## + + + + + This file defines the required fields for a local config + file, namely the three config triplets, and the srcdir. It also + defines several other Tcl variables that are used exclusivly by + the GCC test suite. For most test cases, the CXXFLAGS and LDFLAGS + are supplied by DejaGnu itself for cross testing, but to test a + compiler, GCC needs to manipulate these itself. + + + + Global Config File + + The master config file is where all the target specific + config variables get set for a whole site get set. The idea is + that for a centralized testing lab where people have to share a + target between multiple developers. There are settings for both + remote targets and remote hosts. Here's an example of a Master + Config File (also called the Global config file) for a + canadian cross. A canadian cross is when + you build and test a cross compiler on a machine other than the + one it's to be hosted on. + + Here we have the config settings for our California + office. Note that all config values are site dependant. Here we + have two sets of values that we use for testing m68k-aout cross + compilers. As both of these target boards has a different + debugging protocol, we test on both of them in sequence. + + + Global Config file + + + + # Make sure we look in the right place for the board description files. + if ![info exists boards_dir] { + set boards_dir {} + } + lappend boards_dir "/nfs/cygint/s1/cygnus/dejagnu/boards" + + verbose "Global Config File: target_triplet is $target_triplet" 2 + global target_list + + case "$target_triplet" in { + { "native" } { + set target_list "unix" + } + { "sparc64-*elf" } { + set target_list "sparc64-sim" + } + { "mips-*elf" } { + set target_list "mips-sim wilma barney" + } + { "mips-lsi-elf" } { + set target_list "mips-lsi-sim{,soft-float,el}" + } + { "sh-*hms" } { + set target_list { "sh-hms-sim" "bloozy" } + } + } + + + + In this case, we have support for several cross compilers, + that all run on this host. For testing on operating systems that + don't support Expect, DejaGnu can be run on the local build + machine, and it can connect to the remote host and run all the + tests for this cross compiler on that host. All the remote OS + requires is a working telnetd. + + As you can see, all one does is set the variable + target_list to the list of targets and options to + test. The simple settings, like for + sparc64-elf only require setting the name of + the single board config file. The mips-elf + target is more complicated. Here it sets the list to three target + boards. One is the default mips target, and both + wilma barney are + symbolic names for other mips boards. Symbolic names are covered + in the chapter. The more complicated + example is the one for mips-lsi-elf. This one + runs the tests with multiple iterations using all possible + combinations of the and the + (little endian) option. Needless to say, + this last feature is mostly compiler specific. + + + + + Board Config File + + The board config file is where board specfic config data + is stored. A board config file contains all the higher-level + configuration settings. There is a rough inheritance scheme, where it is + possible to base a new board description file on an existing one. There + are also collections of custom procedures for common environments. For + more information on adding a new board config file, go to the chapter. + + An example board config file for a GNU simulator is as + follows. set_board_info is a procedure that sets the + field name to the specified value. The procedures in square brackets + [] are helper procedures. Thes + are used to find parts of a tool chain required to build an executable + image that may reside in various locations. This is mostly of use for + when the startup code, the standard C lobraries, or the tool chain itself + is part of your build tree. + + + Board Config File + + + # This is a list of toolchains that are supported on this board. + set_board_info target_install {sparc64-elf} + + # Load the generic configuration for this board. This will define any + # routines needed by the tool to communicate with the board. + load_generic_config "sim" + + # We need this for find_gcc and *_include_flags/*_link_flags. + load_base_board_description "basic-sim" + + # Use long64 by default. + process_multilib_options "long64" + + setup_sim sparc64 + + # We only support newlib on this target. We assume that all multilib + # options have been specified before we get here. + set_board_info compiler "[find_gcc]" + set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" + set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" + # No linker script. + set_board_info ldscript ""; + + # Used by a few gcc.c-torture testcases to delimit how large the + # stack can be. + set_board_info gcc,stack_size 16384 + # The simulator doesn't return exit statuses and we need to indicate this + # the standard GCC wrapper will work with this target. + set_board_info needs_status_wrapper 1 + # We can't pass arguments to programs. + set_board_info noargs 1 + + + + There are five helper procedures used in this example. The first + one, find gcc looks for a copy of the GNU compiler in + your build tree, or it uses the one in your path. This will also return + the proper transformed name for a cross compiler if you whole build tree + is configured for one. The next helper procedures are + libgloss_include_flags & + libgloss_link_flags. These return the proper flags to + compiler and link an executable image using , the GNU BSP (Board Support Package). The final + procedures are newlib_include_flag & + newlib_include_flag. These find the Newlib C + library, which is a reentrant standard C library for embedded systems + comprising of non GPL'd code. + + + + + Remote Host Testing + + Thanks to Dj Delorie for the original paper that + this section is based on. + + DejaGnu also supports running the tests on a remote + host. To set this up, the remote host needs an ftp server, and a + telnet server. Currently foreign operating systems used as + remote hosts are VxWorks, VRTX, Dos/Win3.1, MacOS, and + win95/win98/NT. + + The recommended source for a win95/win98/NT based ftp + server is to get IIS (either IIS 1 or Personal Web Server) from + http://www.microsoft.com. + When you install it, make sure you install the FTP server - it's + not selected by default. Go into the IIS manager and change the + FTP server so that it does not allow anonymous ftp. Set the home + directory to the root directory (i.e. c:\) of a suitable + drive. Allow writing via ftp. + + It will create an account like IUSR_FOOBAR where foobar is + the name of your machine. Go into the user editor and give that + account a password that you don't mind hanging around in the + clear (i.e. not the same as your admin or personal + passwords). Also, add it to all the various permission groups. + + You'll also need a telnet server. For win95/win98/NT, go + to the Ataman web site, + pick up the Ataman Remote Logon Services for Windows, and + install it. You can get started on the eval period anyway. Add + IUSR_FOOBAR to the list of allowed users, set the HOME directory + to be the same as the FTP default directory. Change the Mode + prompt to simple. + + Ok, now you need to pick a directory name to do all the + testing in. For the sake of this example, we'll call it piggy + (i.e. c:\piggy). Create this directory. + + You'll need a unix machine. Create a directory for the + scripts you'll need. For this example, we'll use + /usr/local/swamp/testing. You'll need to have a source tree + somewhere, say /usr/src/devo. Now, copy some files from + releng's area in SV to your machine: + + + Remote host setup + + + cd /usr/local/swamp/testing + mkdir boards + scp darkstar.welcomehome.org:/dejagnu/cst/bin/MkTestDir . + scp darkstar.welcomehome.org:/dejagnu/site.exp . + scp darkstar.welcomehome.org:/dejagnu/boards/useless98r2.exp boards/foobar.exp + export DEJAGNU=/usr/local/swamp/testing/site.exp + + + + + You must edit the boards/foobar.exp file to reflect your + machine; change the hostname (foobar.com), username + (iusr_foobar), password, and ftp_directory (c:/piggy) to match + what you selected. + + Edit the global site.exp to reflect your + boards directory: + + + Add The Board Directory + + + lappend boards_dir "/usr/local/swamp/testing/boards" + + + + Now run MkTestDir, which is in the contrib + directory. The first parameter is the toolchain prefix, the + second is the location of your devo tree. If you are testing a + cross compiler (ex: you have sh-hms-gcc.exe in your PATH on + the PC), do something like this: + + + Setup Cross Remote Testing + + + ./MkTestDir sh-hms /usr/dejagnu/src/devo + + + + If you are testing a native PC compiler (ex: you have + gcc.exe in your PATH on the PC), do this: + + + Setup Native Remote Testing + + + ./MkTestDir '' /usr/dejagnu/src/devo + + + + To test the setup, ftp to your PC + using the username (iusr_foobar) and password you selected. CD + to the test directory. Upload a file to the PC. Now telnet to + your PC using the same username and password. CD to the test + directory. Make sure the file is there. Type "set" and/or "gcc + -v" (or sh-hms-gcc -v) and make sure the default PATH contains + the installation you want to test. + + + Run Test Remotely + + + cd /usr/local/swamp/testing + make -k -w check RUNTESTFLAGS="--host_board foobar --target_board foobar -v -v" > check.out 2>&1 + + + + To run a specific test, use a command like this (for + this example, you'd run this from the gcc directory that + MkTestDir created): + + + Run a Test Remotely + + + make check RUNTESTFLAGS="--host_board sloth --target_board sloth -v compile.exp=921202-1.c" + + + + Note: if you are testing a cross-compiler, put in the + correct target board. You'll also have to download more .exp + files and modify them for your local configuration. The -v's + are optional. + + + + + Config File Values + + DejaGnu uses a named array in Tcl to hold all the info for + each machine. In the case of a canadian cross, this means host + information as well as target information. The named array is + called target_info, and it has two indices. The + following fields are part of the array. + + + Command Line Option Variables + + In the user editable second section of the you can not only override the configuration + variables captured in the first section, but also specify + default values for all on the runtest + command line options. Save for , + , and , each + command line option has an associated Tcl variable. Use the + Tcl set command to specify a new default + value (as for the configuration variables). The following + table describes the correspondence between command line + options and variables you can set in + site.exp. , for + explanations of the command-line options. + + + Tcl Variables For Command Line Options + + + + runtestTcl + optionvariabledescription + + + + + --all + all_flag + display all test results if set + + + + --baud + baud + set the default baud rate to something other than + 9600. + + + + --connect + connectmode + rlogin, + telnet, rsh, + kermit, tip, or + mondfe + + + + --outdir + outdir + directory for tool.sum and + tool.log. + + + + --objdir + objdir + directory for pre-compiled binaries + + + + --reboot + reboot + reboot the target if set to + "1"; do not reboot if set to + "0" (the default). + + + + --srcdir + srcdir + directory of test subdirectories + + + + --strace + tracelevel + a number: Tcl trace depth + + + + --tool + tool + name of tool to test; identifies init, test subdir + + + + --verbose + verbose + verbosity level. As option, use multiple times; as + variable, set a number, 0 or greater. + + + + --target + target_triplet + The canonical configuration string for the target. + + + + --host + host_triplet + The canonical configuration string for the host. + + + + --build + build_triplet + The canonical configuration string for the build + host. + + + + +
+
+ +
+ + + Personal Config File + + The personal config file is used to customize + runtest's behaviour for each person. It's + typically used to set the user prefered setting for verbosity, + and any experimental Tcl procedures. My personal + ~/.dejagnurc file looks like: + + + Personal Config File + + + set all_flag 1 + set RLOGIN /usr/ucb/rlogin + set RSH /usr/local/sbin/ssh + + + + Here I set all_flag so I see all the test + cases that PASS along with the ones that FAIL. I also set + RLOGIN to the BSD version. I have + Kerberos installed, and when I rlogin + to a target board, it usually isn't supported. So I use the non + secure version rather than the default that's in my path. I also + set RSH to the SSH + secure shell, as rsh is mostly used to test unix + machines within a local network here. + + + +
+ + + Extending DejaGnu + + + Adding A New Test Suite + + The testsuite for a new tool should always be located in that tools + source directory. DejaGnu require the directory be named + testsuite. Under this directory, the test cases go + in a subdirectory whose name begins with the tool name. For example, for + a tool named flubber, each subdirectory containing + testsuites must start with "flubber.". + + + + + Adding A New Tool + + In general, the best way to learn how to write (code or even prose) + is to read something similar. This principle applies to test cases and + to test suites. Unfortunately, well-established test suites have a way + of developing their own conventions: as test writers become more + experienced with DejaGnu and with Tcl, they accumulate more utilities, + and take advantage of more and more features of + Expect and Tcl in + general. + + Inspecting such established test suites may make the prospect of + creating an entirely new test suite appear overwhelming. Nevertheless, + it is quite straightforward to get a new test suite going. + + There is one test suite that is guaranteed not to grow more + elaborate over time: both it and the tool it tests were created expressly + to illustrate what it takes to get started with DejaGnu. The + example/ directory of the DejaGnu distribution + contains both an interactive tool called calc, and a + test suite for it. Reading this test suite, and experimenting with it, + is a good way to supplement the information in this section. (Thanks to + Robert Lupton for creating calc and its test suite---and also the first + version of this section of the manual!) + + To help orient you further in this task, here is an outline of the + steps to begin building a test suite for a program example. + + + + Create or select a directory to contain your new + collection of tests. Change into that directory (shown here as + testsuite): + + Create a configure.in file in this directory, + to control configuration-dependent choices for your tests. So far as + DejaGnu is concerned, the important thing is to set a value for the + variable target_abbrev; this value is the link to the + init file you will write soon. (For simplicity, we assume the + environment is Unix, and use unix as the + value.) + + What else is needed in configure.in depends on + the requirements of your tool, your intended test environments, and which + configure system you use. This example is a minimal configure.in for use + with GNU Autoconf. + + Create Makefile.in (if you are using + Autoconf), or Makefile.am(if you are using + Automake), the source file used by configure to build your + Makefile. If you are using GNU Automake.just add the + keyword dejagnu to the + AUTOMAKE_OPTIONS variable in your + Makefile.am file. This will add all the Makefile + support needed to run DejaGnu, and support the + target. + + You also need to include two targets important to DejaGnu: + check, to run the tests, and + site.exp, to set up the Tcl copies of + configuration-dependent values. This is called the + The check target must run the runtest program to + execute the tests. + + The site.exp target should usually set up + (among other things) the $tool variable for the name of your program. If + the local site.exp file is setup correctly, it is possible to execute the + tests by merely typing runtest on the command + line. + + + Sample Makefile.in Fragment + + + # Look for a local version of DejaGnu, otherwise use one in the path + RUNTEST = `if test -f $(top_srcdir)/../dejagnu/runtest; then \ + echo $(top_srcdir) ../dejagnu/runtest; \ + else \ + echo runtest; \ + fi` + + # The flags to pass to runtest + RUNTESTFLAGS = + + # Execute the tests + check: site.exp all + $(RUNTEST) $(RUNTESTFLAGS) \ + --tool ${example} --srcdir $(srcdir) + + # Make the local config file + site.exp: ./config.status Makefile + @echo "Making a new config file..." + -@rm -f ./tmp? + @touch site.exp + + -@mv site.exp site.bak + @echo "## these variables are automatically\ + generated by make ##" > ./tmp0 + @echo "# Do not edit here. If you wish to\ + override these values" >> ./tmp0 + @echo "# add them to the last section" >> ./tmp0 + @echo "set host_os ${host_os}" >> ./tmp0 + @echo "set host_alias ${host_alias}" >> ./tmp0 + @echo "set host_cpu ${host_cpu}" >> ./tmp0 + @echo "set host_vendor ${host_vendor}" >> ./tmp0 + @echo "set target_os ${target_os}" >> ./tmp0 + @echo "set target_alias ${target_alias}" >> ./tmp0 + @echo "set target_cpu ${target_cpu}" >> ./tmp0 + @echo "set target_vendor ${target_vendor}" >> ./tmp0 + @echo "set host_triplet ${host_canonical}" >> ./tmp0 + @echo "set target_triplet ${target_canonical}">>./tmp0 + @echo "set tool binutils" >> ./tmp0 + @echo "set srcdir ${srcdir}" >> ./tmp0 + @echo "set objdir `pwd`" >> ./tmp0 + @echo "set ${examplename} ${example}" >> ./tmp0 + @echo "## All variables above are generated by\ + configure. Do Not Edit ##" >> ./tmp0 + @cat ./tmp0 > site.exp + @sed < site.bak \ + -e '1,/^## All variables above are.*##/ d' \ + >> site.exp + -@rm -f ./tmp? + + + + + + Create a directory (in testsuite) + called config. Make a Tool Init + File in this directory. Its name must start with the + target_abbrev value, or be named + default.exp so call it + config/unix.exp for our Unix based example. This + is the file that contains the target-dependent procedures. + Fortunately, on Unix, most of them do not have to do very much in + order for runtest to run. + + If the program being tested is not interactive, you can get + away with this minimal unix.exp to begin + with: + + + Simple Batch Program Tool Init File + + + + proc foo_exit {} {} + proc foo_version {} {} + + + + + If the program being tested is interactive, however, you might + as well define a start routine and invoke it by + using an init file like this: + + + Simple Interactive Program Tool Init File + + + + proc foo_exit {} {} + proc foo_version {} {} + + proc foo_start {} { + global ${examplename} + spawn ${examplename} + expect { + -re "" {} + } + } + + # Start the program running we want to test + foo_start + + + + + + Create a directory whose name begins with your tool's + name, to contain tests. For example, if your tool's name is + gcc, then the directories all need to start with + "gcc.". + + Create a sample test file. Its name must end with + .exp. You can use + first-try.exp. To begin with, just write there a + line of Tcl code to issue a message. + + + Testing A New Tool Config + + + + send_user "Testing: one, two...\n" + + + + + + Back in the testsuite (top + level) directory, run configure. Typically you do + this while in the build directory. You may have to specify more of a + path, if a suitable configure is not available in your execution + path. + + e now ready to triumphantly type make + check or runtest. You should see + something like this: + + + Example Test Case Run + + + Test Run By rhl on Fri Jan 29 16:25:44 EST 1993 + + === example tests === + + Running ./example.0/first-try.exp ... + Testing: one, two... + + === example Summary === + + + + + There is no output in the summary, because so far the example + does not call any of the procedures that establish a test + outcome. + + Write some real tests. For an interactive tool, you + should probably write a real exit routine in fairly short order. In + any case, you should also write a real version routine + soon. + + + + + + + Adding A New Target + + DejaGnu has some additional requirements for target support, beyond + the general-purpose provisions of configure. DejaGnu must actively + communicate with the target, rather than simply generating or managing + code for the target architecture. Therefore, each tool requires an + initialization module for each target. For new targets, you must supply + a few Tcl procedures to adapt DejaGnu to the target. This permits + DejaGnu itself to remain target independent. + + Usually the best way to write a new initialization module is to + edit an existing initialization module; some trial and error will be + required. If necessary, you can use the @samp{--debug} option to see what + is really going on. + + When you code an initialization module, be generous in printing + information controlled by the verbose + procedure. + + For cross targets, most of the work is in getting the + communications right. Communications code (for several situations + involving IP networks or serial lines) is available in a DejaGnu library + file. + + If you suspect a communication problem, try running the connection + interactively from Expect. (There are three + ways of running Expect as an interactive + interpreter. You can run Expect with no + arguments, and control it completely interactively; or you can use + expect -i together with other command-line options and + arguments; or you can run the command interpreter from + any Expect procedure. Use + return to get back to the calling procedure (if any), + or return -tcl to make the calling procedure itself + return to its caller; use exit or end-of-file to leave + Expect altogether.) Run the program whose name is recorded in + $connectmode, with the arguments in + $targetname, to establish a connection. You should at + least be able to get a prompt from any target that is physically + connected. + + + + + Adding A New Board + + Adding a new board consists of creating a new board config + file. Examples are in + dejagnu/baseboards. Usually to make a new + board file, it's easiest to copy an existing one. It is also + possible to have your file be based on a + baseboard file with only one or two + changes needed. Typically, this can be as simple as just + changing the linker script. Once the new baseboard file is done, + add it to the boards_DATA list in the + dejagnu/baseboards/Makefile.am, and regenerate the + Makefile.in using automake. Then just rebuild and install DejaGnu. You + can test it by: + + There is a crude inheritance scheme going on with board files, so + you can include one board file into another, The two main procedures used + to do this are load_generic_config and + load_base_board_description. The generic config file + contains other procedures used for a certain class of target. The + board description file is where the board specfic settings go. Commonly + there are similar target environments with just different + processors. + + + Testing a New Board Config File + + + make check RUNTESTFLAGS="--target_board=newboardfile". + + + + Here's an example of a board config file. There are + several helper procedures used in this + example. A helper procedure is one that look for a tool of files + in commonly installed locations. These are mostly used when + testing in the build tree, because the executables to be tested + are in the same tree as the new dejagnu files. The helper + procedures are the ones in square braces + [], which is the Tcl execution characters. + + + Example Board Config File + + + + # Load the generic configuration for this board. This will define a basic + # set of routines needed by the tool to communicate with the board. + load_generic_config "sim" + + # basic-sim.exp is a basic description for the standard Cygnus simulator. + load_base_board_description "basic-sim" + + # The compiler used to build for this board. This has *nothing* to do + # with what compiler is tested if we're testing gcc. + set_board_info compiler "[find_gcc]" + + # We only support newlib on this target. + # However, we include libgloss so we can find the linker scripts. + set_board_info cflags "[newlib_include_flags] [libgloss_include_flags]" + set_board_info ldflags "[newlib_link_flags]" + + # No linker script for this board. + set_board_info ldscript "-Tsim.ld"; + + # The simulator doesn't return exit statuses and we need to indicate this. + set_board_info needs_status_wrapper 1 + + # Can't pass arguments to this target. + set_board_info noargs 1 + + # No signals. + set_board_info gdb,nosignals 1 + + # And it can't call functions. + set_board_info gdb,cannot_call_functions 1 + + + + + + + + Board Config File Values + + These fields are all in the board_info These are + all set by using the set_board_info procedure. The + parameters are the field name, followed by the value to set the field + to. + + + Common Board Info Fields + + + + Field + Sample Value + Description + + + + + compiler + "[find_gcc]" + The path to the compiler to use. + + + + cflags + "-mca" + Compilation flags for the compiler. + + + + ldflags + "[libgloss_link_flags] [newlib_link_flags]" + Linking flags for the compiler. + + + + ldscript + "-Wl,-Tidt.ld" + The linker script to use when cross compiling. + + + + libs + "-lgcc" + Any additional libraries to link in. + + + + shell_prompt + "cygmon>" + The command prompt of the remote shell. + + + + hex_startaddr + "0xa0020000" + The Starting address as a string. + + + + start_addr + 0xa0008000 + The starting address as a value. + + + + startaddr + "a0020000" + + + + + exit_statuses_bad + 1 + Whether there is an accurate exit status. + + + + reboot_delay + 10 + The delay between power off and power on. + + + + unreliable + 1 + Whether communication with the board is unreliable. + + + + sim + [find_sim] + The path to the simulator to use. + + + + objcopy + $tempfil + The path to the objcopy program. + + + + support_libs + "${prefix_dir}/i386-coff/" + Support libraries needed for cross compiling. + + + + addl_link_flags + "-N" + Additional link flags, rarely used. + + + + +
+
+ + These fields are used by the GCC and GDB tests, and are mostly + only useful to somewhat trying to debug a new board file for one of + these tools. Many of these are used only by a few testcases, and their + purpose is esoteric. These are listed with sample values as a guide to + better guessing if you need to change any of these. + + + Board Info Fields For GCC & GDB + + + + Field + Sample Value + Description + + + + + strip + $tempfile + Strip the executable of symbols. + + + + gdb_load_offset + "0x40050000" + + + + gdb_protocol + "remote" + The GDB debugging protocol to use. + + + + gdb_sect_offset + "0x41000000"; + + + + gdb_stub_ldscript + "-Wl,-Teva-stub.ld" + The linker script to use with a GDB stub. + + + + gdb_init_command + "set mipsfpu none" + + + + gdb,cannot_call_functions + 1 + Whether GDB can call functions on the target, + + + + gdb,noargs + 1 + Whether the target can take command line arguments. + + + + gdb,nosignals + 1 + Whether there are signals on the target. + + + + gdb,short_int + 1 + + + + gdb,start_symbol + "_start"; + The starting symbol in the executable. + + + + gdb,target_sim_options + "-sparclite" + Special options to pass to the simulator. + + + + gdb,timeout + 540 + Timeout value to use for remote communication. + + + + gdb_init_command + "print/x \$fsr = 0x0" + + + + gdb_load_offset + "0x12020000" + + + + gdb_opts + "--command gdbinit" + + + + gdb_prompt + "\\(gdb960\\)" + The prompt GDB is using. + + + + gdb_run_command + "jump start" + + + + gdb_stub_offset + "0x12010000" + + + + use_gdb_stub + 1 + Whether to use a GDB stub. + + + + use_vma_offset + 1 + + + + wrap_m68k_aout + 1 + + + + gcc,no_label_values + 1 + + + + gcc,no_trampolines + 1 + + + + gcc,no_varargs + 1 + + + + gcc,stack_size + 16384 + Stack size to use with some GCC testcases. + + + + ieee_multilib_flags + "-mieee"; + + + + is_simulator + 1 + + + + needs_status_wrapper + 1 + + + + no_double + 1 + + + + no_long_long + 1 + + + + noargs + 1 + + + + nullstone,lib + "mips-clock.c" + + + + nullstone,ticks_per_sec + 3782018 + + + + sys_speed_value + 200 + + + + target_install + {sh-hms} + + + + +
+
+ +
+ + + Writing A Test Case + + The easiest way to prepare a new test case is to base it + on an existing one for a similar situation. There are two major + categories of tests: batch or interactive. Batch oriented tests + are usually easier to write. + + The GCC tests are a good example of batch oriented tests. + All GCC tests consist primarily of a call to a single common + procedure, Since all the tests either have no output, or only + have a few warning messages when successfully compiled. Any + non-warning output is a test failure. All the C code needed is + kept in the test directory. The test driver, written in Tcl, + need only get a listing of all the C files in the directory, and + compile them all using a generic procedure. This procedure and a + few others supporting for these tests are kept in the library + module lib/c-torture.exp in the GCC test + suite. Most tests of this kind use very few + expect features, and are coded almost + purely in Tcl. + + Writing the complete suite of C tests, then, consisted of + these steps: + + + Copying all the C code into the test directory. + These tests were based on the C-torture test created by Torbjorn + Granlund (on behalf of the Free Software Foundation) for GCC + development. + + Writing (and debugging) the generic Tcl procedures for + compilation. + + Writing the simple test driver: its main task is to + search the directory (using the Tcl procedure + glob for filename expansion with wildcards) + and call a Tcl procedure with each filename. It also checks for + a few errors from the testing procedure. + + + Testing interactive programs is intrinsically more + complex. Tests for most interactive programs require some trial + and error before they are complete. + + However, some interactive programs can be tested in a + simple fashion reminiscent of batch tests. For example, prior + to the creation of DejaGnu, the GDB distribution already + included a wide-ranging testing procedure. This procedure was + very robust, and had already undergone much more debugging and + error checking than many recent DejaGnu test cases. + Accordingly, the best approach was simply to encapsulate the + existing GDB tests, for reporting purposes. Thereafter, new GDB + tests built up a family of Tcl procedures specialized for GDB + testing. + + + + + Debugging A Test Case + + These are the kinds of debugging information available + from DejaGnu: + + + + Output controlled by test scripts themselves, + explicitly allowed for by the test author. This kind of + debugging output appears in the detailed output recorded in the + DejaGnu log file. To do the same for new tests, use the + verbose procedure (which in turn uses the + variable also called verbose) to control + how much output to generate. This will make it easier for other + people running the test to debug it if necessary. Whenever + possible, if $verbose is + 0, there should be no output other than the + output from pass, + fail, error, and + warning. Then, to whatever extent is + appropriate for the particular test, allow successively higher + values of $verbose to generate more + information. Be kind to other programmers who use your tests: + provide for a lot of debugging information. + + Output from the internal debugging functions of + Tcl and Expect. There is a command + line options for each; both forms of debugging output are + recorded in the file dbg.log in the current + directory. + + Use for information from the + expect level; it generates displays of the expect attempts to + match the tool output with the patterns specified. This output + can be very helpful while developing test scripts, since it + shows precisely the characters received. Iterating between the + latest attempt at a new test script and the corresponding + dbg.log can allow you to create the final + patterns by ``cut and paste''. This is sometimes the best way + to write a test case. + + Use to see more + detail at the Tcl level; this shows how Tcl procedure + definitions expand, as they execute. The associated number + controls the depth of definitions expanded. + + Finally, if the value of + verbose is 3 or greater,DejaGnu turns on + the expect command log_user. This command + prints all expect actions to the expect standard output, to the + detailed log file, and (if is on) to + dbg.log. + + + + + + Adding A Test Case To A Test Suite. + + There are two slightly different ways to add a test + case. One is to add the test case to an existing directory. The + other is to create a new directory to hold your test. The + existing test directories represent several styles of testing, + all of which are slightly different; examine the directories for + the tool of interest to see which (if any) is most suitable. + + Adding a GCC test can be very simple: just add the C code + to any directory beginning with gcc. and it + runs on the next runtest --tool + gcc. + + To add a test to GDB, first add any source code you will + need to the test directory. Then you can either create a new + expect file, or add your test to an existing one (any + file with a .exp suffix). Creating a new + .exp file is probably a better idea if the test is significantly + different from existing tests. Adding it as a separate file also + makes upgrading easier. If the C code has to be already compiled + before the test will run, then you'll have to add it to the + Makefile.in file for that test directory, + then run configure and + make. + + Adding a test by creating a new directory is very + similar: + + + + Create the new directory. All subdirectory names + begin with the name of the tool to test; e.g. G++ tests might be + in a directory called g++.other. There can + be multiple test directories that start with the same tool name + (such as g++). + + Add the new directory name to the + configdirs definition in the + configure.in file for the test suite + directory. This way when make and + configure next run, they include the new + directory. + + Add the new test case to the directory, as + above. + + To add support in the new directory for + configure and make, you must also create a + Makefile.in and a + configure.in. + + + + + + Hints On Writing A Test Case + + It is safest to write patterns that match all the output + generated by the tested program; this is called closure. + If a pattern does not match the entire output, any output that + remains will be examined by the next expect + command. In this situation, the precise boundary that determines + which expect command sees what is very + sensitive to timing between the Expect task and the task running + the tested tool. As a result, the test may sometimes appear to + work, but is likely to have unpredictable results. (This problem + is particularly likely for interactive tools, but can also + affect batch tools---especially for tests that take a long time + to finish.) The best way to ensure closure is to use the + option for the expect + command to write the pattern as a full regular expressions; then + you can match the end of output using a $. + It is also a good idea to write patterns that match all + available output by using .*\ after the + text of interest; this will also match any intervening blank + lines. Sometimes an alternative is to match end of line using + \r or \n, but this is + usually too dependent on terminal settings. + + Always escape punctuation, such as ( + or ", in your patterns; for example, write + \(. If you forget to escape punctuation, + you will usually see an error message like extra + characters after close-quote. + + If you have trouble understanding why a pattern does not + match the program output, try using the + option to runtest, and examine the debug log + carefully. + + Be careful not to neglect output generated by setup rather + than by the interesting parts of a test case. For example, + while testing GDB, I issue a send set height + 0\n command. The purpose is simply to make sure GDB + never calls a paging program. The set + height command in GDB does not generate any + output; but running any command makes GDB issue a new + (gdb) prompt. If there were no + expect command to match this prompt, the + output (gdb) begins the text seen by the + next expect command---which might make that + pattern fail to match. + + To preserve basic sanity, I also recommended that no test + ever pass if there was any kind of problem in the test case. To + take an extreme case, tests that pass even when the tool will + not spawn are misleading. Ideally, a test in this sort of + situation should not fail either. Instead, print an error + message by calling one of the DejaGnu procedures + error or warning. + + + + + Special variables used by test cases. + + There are special variables used by test cases. These contain + other information from DejaGnu. Your test cases can use these variables, + with conventional meanings (as well as the variables saved in + site.exp. You can use the value of these variables, + but they should never be changed. + + + + $prms_id + The tracking system (e.g. GNATS) number identifying + a corresponding bugreport. (0} if you do not + specify it in the test script.) + + + + $item bug_id + An optional bug id; may reflect a bug + identification from another organization. (0 + if you do not specify it.) + + + + $subdir + The subdirectory for the current test + case. + + + + $expect_out(buffer) + The output from the last command. This is an + internal variable set by Expect. More information can be found in + the Expect manual. + + + + $exec_output + This is the output from a + ${tool}_load command. This only applies to + tools like GCC and GAS which produce an object file that must in + turn be executed to complete a test. + + + + $comp_output + This is the output from a + ${tool}_start command. This is conventionally + used for batch oriented programs, like GCC and GAS, that may + produce interesting output (warnings, errors) without further + interaction. + + + + + +
+ diff --git a/example/Makefile.am b/example/Makefile.am new file mode 100644 index 0000000..ae19604 --- /dev/null +++ b/example/Makefile.am @@ -0,0 +1,6 @@ +## Process this file with automake to generate Makefile.in + +AUTOMAKE_OPTIONS = dejagnu cygnus + +all-local: + cd calc; $(MAKE) all diff --git a/example/Makefile.in b/example/Makefile.in new file mode 100644 index 0000000..8131e73 --- /dev/null +++ b/example/Makefile.in @@ -0,0 +1,210 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +BOARDS = @BOARDS@ +CC = @CC@ +CONFIG = @CONFIG@ +EXEEXT = @EXEEXT@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +AUTOMAKE_OPTIONS = dejagnu cygnus +mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs +CONFIG_CLEAN_FILES = +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = gtar +GZIP_ENV = --best +EXPECT = `if test -f $(top_builddir)/../expect/expect; then echo $(top_builddir)/../expect/expect; else echo expect; fi` +RUNTEST = `if test -f $(top_srcdir)/../dejagnu/runtest; then echo $(top_srcdir)/../dejagnu/runtest; else echo runtest; fi` +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --cygnus example/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = example + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + +RUNTESTFLAGS = + +DEJATOOL = $(PACKAGE) + +RUNTESTDEFAULTFLAGS = --tool $(DEJATOOL) --srcdir $$srcdir + +check-DEJAGNU: site.exp + srcdir=`cd $(srcdir) && pwd`; export srcdir; \ + EXPECT=$(EXPECT); export EXPECT; \ + if [ -f $(top_builddir)/../expect/expect ]; then \ + TCL_LIBRARY=`cd $(top_srcdir)/../tcl/library && pwd`; \ + export TCL_LIBRARY; \ + fi; \ + runtest=$(RUNTEST); \ + if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ + $$runtest $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ + else echo "WARNING: could not find \`runtest'" 1>&2; :;\ + fi +site.exp: Makefile + @echo 'Making a new site.exp file...' + @test ! -f site.bak || rm -f site.bak + @echo '## these variables are automatically generated by make ##' > $@-t + @echo '# Do not edit here. If you wish to override these values' >> $@-t + @echo '# edit the last section' >> $@-t + @echo 'set tool $(DEJATOOL)' >> $@-t + @echo 'set srcdir $(srcdir)' >> $@-t + @echo 'set objdir' `pwd` >> $@-t + @echo '## All variables above are generated by configure. Do Not Edit ##' >> $@-t + @test ! -f site.exp || sed '1,/^## All variables above are.*##/ d' site.exp >> $@-t + @test ! -f site.exp || mv site.exp site.bak + @mv $@-t site.exp +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: + $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU +check: check-am +installcheck-am: +installcheck: installcheck-am +install-info-am: +install-info: install-info-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: +uninstall: uninstall-am +all-am: Makefile all-local +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: tags distdir check-DEJAGNU info-am info dvi-am dvi check \ +check-am installcheck-am installcheck install-info-am install-info \ +install-exec-am install-exec install-data-am install-data install-am \ +install uninstall-am uninstall all-local all-redirect all-am all \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +all-local: + cd calc; $(MAKE) all + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/example/calc/Makefile.in b/example/calc/Makefile.in new file mode 100644 index 0000000..f892c7b --- /dev/null +++ b/example/calc/Makefile.in @@ -0,0 +1,114 @@ +# 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 1, 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. +# + +# target name +PROG= calc + +# compiler specifics +CC = @CC@ +CFLAGS = -g -I$(srcdir) -I. +CALC = calc + +# directory specifics +VPATH = @srcdir@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +# testsuite specifics +# Setup the testing framework, if you have one +# Flags that we pass when building the testsuite. +EXPECT = ` \ + if [ -f $${rootme}/../../../expect/expect ] ; then \ + echo $${rootme}/../../../expect/expect ; \ + else echo expect ; fi` + +RUNTEST = ` \ + if [ -f $${srcdir}/../../../dejagnu/runtest ] ; then \ + echo $${srcdir}/../../../dejagnu/runtest ; \ + else echo runtest ; fi` + +RUNTESTFLAGS= + +## --- NOTHING BELOW HERE SHOULD REQUIRE MODIFICATIONS --- ## + +SRCS= calc.c + +OBJS= calc.o + +all: ${PROG} + +calc.o: calc.c + +.c.o: + ${CC} ${CFLAGS} -I$(srcdir) -I. -c $< + +${PROG}: ${OBJS} ${DPADD} + ${CC} ${LDFLAGS} ${CFLAGS} -o $@ ${OBJS} ${DPADD} ${LDADD} + +check: site.exp all + rootme=`pwd`; export rootme; \ + srcdir=${srcdir} ; export srcdir ; \ + EXPECT=${EXPECT} ; export EXPECT ; \ + if [ -f $${rootme}/../../expect/expect ] ; then \ + TCL_LIBRARY=$${srcdir}/../../tcl/library ; \ + export TCL_LIBRARY ; fi ; \ + ${RUNTEST} ${RUNTESTFLAGS} --tool ${PROG} CALC=${PROG} --srcdir ${srcdir}/testsuite + +site.exp: ./config.status Makefile + @echo "Making a new config file..." + -@rm -f ./tmp? + @touch site.exp + + -@mv site.exp site.bak + @echo "## these variables are automatically generated by make ##" > ./tmp0 + @echo "# Do not edit here. If you wish to override these values" >> ./tmp0 + @echo "# add them to the last section" >> ./tmp0 + @echo "set tool calc" >> ./tmp0 + @echo "set srcdir ${srcdir}" >> ./tmp0 + @echo "set objdir `pwd`" >> ./tmp0 + @echo "## All variables above are generated by configure. Do Not Edit ##" >> ./tmp0 + @cat ./tmp0 > site.exp + @cat site.bak | sed \ + -e '1,/^## All variables above are.*##/ d' >> site.exp + -@rm -f ./tmp? + +install: ${PROG} + +clean mostlyclean: + rm -f a.out [Ee]rrs tags mklog core ${OBJS} ${PROG} + +distclean maintainer-clean realclean: clean + rm -f config.status Makefile calc.h calc.log calc.plog calc.psum + rm -f calc.sum site.exp config.log + +Makefile: $(srcdir)/Makefile.in $(host_makefile_frag) config.status + @echo "Rebuilding the Makefile..." + $(SHELL) ./config.status + +configure: $(srcdir)/configure.in $(srcdir)/Makefile.in $(srcdir)/../../aclocal.m4 + @echo "Rebuilding configure..." + @cd ${srcdir} ;\ + autoconf --localdir=${srcdir}/../.. + +config.status: + @echo "Rebuilding config.status..." + $(SHELL) ./config.status --recheck + +info: +install-info: +# Nothing. diff --git a/example/calc/calc.1 b/example/calc/calc.1 new file mode 100644 index 0000000..ea60393 --- /dev/null +++ b/example/calc/calc.1 @@ -0,0 +1,29 @@ +.\" +.TH SKEL 1 "28th Jan 1993" +.SH NAME +calc \- a very dumb calculator to demonstrate +.I deja-gnu +.SH SYNOPSIS +.B calc +.SH DESCRIPTION +.LP +.B calc +accepts the commands: +.TP +.B add #1 #2 +Add #1 and #2 and print the answer. +.TP +.B multiply #1 #2 +Multiply #1 and #2 and print the answer. +.TP +.B quit +.br +Exit +.TP +.B version +Print a version string. +.SH BUGS +.LP +.B multiply 2 n +gives the wrong answer (unless n == 0). + diff --git a/example/calc/calc.c b/example/calc/calc.c new file mode 100644 index 0000000..784e39b --- /dev/null +++ b/example/calc/calc.c @@ -0,0 +1,65 @@ +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include "calc.h" + +static int words(); + +int main() +{ + char line[SIZE]; + int nword; + char *words[NWORD]; + + while(printf("calc: "), fflush(stdout), fgets(line,SIZE,stdin) != NULL) { + if((nword = split(line,words,NWORD)) == 0) continue; + if(strcmp(words[0],"add") == 0) { + if(nword != 3) { + printf("Usage: add #1 #2\n"); + } else { + printf("%d",atoi(words[1]) + atoi(words[2])); + } + } else if(strcmp(words[0],"multiply") == 0) { + if(nword != 3) { + printf("Usage: multiply #1 #2\n"); + } else { + int i1 = atoi(words[1]); + if(i1 == 2) i1 = 3; /* this is a bug */ + printf("%d",i1*atoi(words[2])); + } + } else if(strcmp(words[0],"quit") == 0) { + break; + } else if(strcmp(words[0],"version") == 0) { + printf("Version: %s",VERSION); + } else { + printf("Unknown command: %s",words[0]); + } + printf("\n"); + } + + return(0); +} + +int +split(line,words,nword) +char *line; +char **words; +int nword; /* number of elements in words */ +{ + int i; + + while(isspace(*line)) line++; + if(*line == '\0') return(0); + + for(i = 0;i < nword;i++) { + words[i] = line; + while(*line != '\0' && !isspace(*line)) line++; + if(*line == '\0') break; + *line++ = '\0'; + while(isspace(*line)) line++; + } + + return(i); +} diff --git a/example/calc/calc.h.in b/example/calc/calc.h.in new file mode 100644 index 0000000..1e420a7 --- /dev/null +++ b/example/calc/calc.h.in @@ -0,0 +1,18 @@ +/* + * Check for headers + */ +#ifndef __CALC_H__ +#define __CALC_H__ + +#undef HAVE_STDLIB_H + +/* + * Check for functions + */ +#undef HAVE_STRCMP + +#define NWORD 10 +#define SIZE 100 +#define VERSION "1.0 Beta" + +#endif /* __CALC_H__ */ diff --git a/example/calc/configure b/example/calc/configure new file mode 100755 index 0000000..e58d5cf --- /dev/null +++ b/example/calc/configure @@ -0,0 +1,1031 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.12.1 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.12.1" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=calc.c + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + +CC=${CC-cc} + +# +# Look for various header files +# +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:530: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:551: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:568: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +ac_safe=`echo "stdlib.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for stdlib.h""... $ac_c" 1>&6 +echo "configure:592: checking for stdlib.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:602: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +cat >> confdefs.h <<\EOF +#define HAVE_STDLIB_H 1 +EOF + +fi + + +# +# Look for various functions +# +echo $ac_n "checking for strcmp""... $ac_c" 1>&6 +echo "configure:632: checking for strcmp" >&5 +if eval "test \"`echo '$''{'ac_cv_func_strcmp'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strcmp(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_strcmp) || defined (__stub___strcmp) +choke me +#else +strcmp(); +#endif + +; return 0; } +EOF +if { (eval echo configure:660: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_func_strcmp=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_strcmp=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'strcmp`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_STRCMP 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + + +# +# Output Makefile with substitutions + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set) 2>&1 | grep ac_space` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.12.1" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir + +trap 'rm -fr `echo "Makefile calc.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@CPP@%$CPP%g +s%@CC@%$CC%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/example/calc/configure.in b/example/calc/configure.in new file mode 100644 index 0000000..3ee022a --- /dev/null +++ b/example/calc/configure.in @@ -0,0 +1,20 @@ +dnl Process this file with autoconf to produce a configure script. +AC_PREREQ(2.5) +AC_INIT(calc.c) +AC_CONFIG_HEADER(calc.h) +CC=${CC-cc} + +# +# Look for various header files +# +AC_HEADER_CHECK(stdlib.h, ,AC_DEFINE(HAVE_STDLIB_H)) + +# +# Look for various functions +# +AC_FUNC_CHECK(strcmp, AC_DEFINE(HAVE_STRCMP)) + +# +# Output Makefile with substitutions +AC_SUBST(CC) +AC_OUTPUT(Makefile) diff --git a/example/calc/testsuite/calc.test/calc.exp b/example/calc/testsuite/calc.test/calc.exp new file mode 100644 index 0000000..8986cf5 --- /dev/null +++ b/example/calc/testsuite/calc.test/calc.exp @@ -0,0 +1,79 @@ +# Copyright (C) 1997 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# DejaGnu@cygnus.com + +set timeout 3 +# +# expectations that clean up in case of error. Note that `$test' is +# a purely local variable. +# +# The first of these is used to match any bad responses, and resynchronise +# things by finding a prompt. The second is a timeout error, and shouldn't +# ever be triggered. +# +expect_after { + -re "\[^\n\r\]*$prompt$" { + fail "$test (bad match)" + if { $verbose > 0 } { + regexp ".*\r\n(\[^\r\n\]+)(\[\r\n\])+$prompt$" \ + $expect_out(buffer) "" output + send_user "\tUnmatched output: \"$output\"\n" + } + } + timeout { + fail "$test (timeout)" + } +} +# +# Here are the tests +# +set test "version" +send "version\n" +expect { + -re "Version:.*$prompt$" { pass "version" } +} + +set test add1 +send "add 3 4\n" +expect { + -re "7+.*$prompt$" { pass "$test" } +} + +set test add2 +send "add 1 2 3\n" +expect { + -re "Usage: add #1 #2.*$prompt$" { pass "$test" } +} + +set test multiply1 +send "multiply 3 4\n" +expect { + -re "12.*$prompt$" { pass "$test" } +} + +set test multiply2 +send "multiply 2 4\n" +expect { + -re "8.*$prompt$" { pass "$test" } +} + +set test multiply3 +send "multiply 1 2 3\n" +expect { + -re "Usage: multiply #1 #2.*$prompt$" { pass "$test" } +} diff --git a/example/calc/testsuite/config/unix.exp b/example/calc/testsuite/config/unix.exp new file mode 100644 index 0000000..9b73ac7 --- /dev/null +++ b/example/calc/testsuite/config/unix.exp @@ -0,0 +1,68 @@ +# Copyright (C) 1997 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# DejaGnu@cygnus.com + +if ![info exists prompt] then { + set prompt "calc: " +} +# +# calc_version -- extract and print the version number of calc +# + +proc calc_version {} { + global CALC + global prompt + set tmp [exec echo "version" | $CALC] + regexp "$prompt *(\[^\n\]*)\n.*" $tmp tmp version + clone_output "[which $CALC] version $version\n" +} +# +# calc_load -- loads the program +# +proc calc_load { arg } { + # +} + +# +# calc_exit -- quit and cleanup +# +proc calc_exit {} { + send "quit\n" +} + +# +# calc_start -- start calc running +# +proc calc_start {} { + global CALC + global prompt + global spawn_id + global verbose + + if { $verbose > 1 } { + send_user "starting $CALC\n" + } + spawn $CALC + expect { + -re "No such file.*" { perror "Can't start $CALC"; exit 1 } + -re "$prompt$" { } + timeout { perror "Failed to spawn $CALC (timeout)"; exit 1 } + } +} + +calc_start diff --git a/lib/debugger.exp b/lib/debugger.exp new file mode 100644 index 0000000..f00076d --- /dev/null +++ b/lib/debugger.exp @@ -0,0 +1,244 @@ +# 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) + +# +# Dump the values of a shell expression representing variable +# names. +proc dumpvars { args } { + uplevel 1 [list foreach i [uplevel 1 "info vars $args"] { + if { [catch "array names $i" names ] } { + eval "puts \"${i} = \$${i}\"" + } else { + foreach k $names { + eval "puts \"$i\($k\) = \$$i\($k\)\"" + } + } + } + ] +} + +# +# dump the values of a shell expression representing variable +# names. +proc dumplocals { args } { + uplevel 1 [list foreach i [uplevel 1 "info locals $args"] { + if { [catch "array names $i" names ] } { + eval "puts \"${i} = \$${i}\"" + } else { + foreach k $names { + eval "puts \"$i\($k\) = \$$i\($k\)\"" + } + } + } + ] +} +# +# Dump the body of procedures specified by a regexp. +# +proc dumprocs { args } { + foreach i [info procs $args] { + puts "\nproc $i \{ [info args $i] \} \{ [info body $i]\}" + } +} + +# +# Dump all the current watchpoints +# +proc dumpwatch { args } { + foreach i [uplevel 1 "info vars $args"] { + set tmp "" + if { [catch "uplevel 1 array name $i" names] } { + set tmp [uplevel 1 trace vinfo $i] + if ![string match "" $tmp] { + puts "$i $tmp" + } + } else { + foreach k $names { + set tmp [uplevel 1 trace vinfo [set i]($k)] + if ![string match "" $tmp] { + puts "[set i]($k) = $tmp" + } + } + } + } +} + +# +# Trap a watchpoint for an array +# +proc watcharray { element type} { + upvar [set array]($element) avar + case $type { + "w" { puts "New value of [set array]($element) is $avar" } + "r" { puts "[set array]($element) (= $avar) was just read" } + "u" { puts "[set array]($element) (= $avar) was just unset" } + } +} + +proc watchvar { v type } { + upvar $v var + case $type { + "w" { puts "New value of $v is $var" } + "r" { puts "$v (=$var) was just read" } + "u" { puts "$v (=$var) was just unset" } + } +} + +# +# Watch when a variable is written +# +proc watchunset { arg } { + if { [catch "uplevel 1 array name $arg" names ] } { + if ![uplevel 1 info exists $arg] { + puts stderr "$arg does not exist" + return + } + uplevel 1 trace variable $arg u watchvar + } else { + foreach k $names { + if ![uplevel 1 info exists $arg] { + puts stderr "$arg does not exist" + return + } + uplevel 1 trace variable [set arg]($k) u watcharray + } + } +} + +# +# Watch when a variable is written +# +proc watchwrite { arg } { + if { [catch "uplevel 1 array name $arg" names ] } { + if ![uplevel 1 info exists $arg] { + puts stderr "$arg does not exist" + return + } + uplevel 1 trace variable $arg w watchvar + } else { + foreach k $names { + if ![uplevel 1 info exists $arg] { + puts stderr "$arg does not exist" + return + } + uplevel 1 trace variable [set arg]($k) w watcharray + } + } +} + +# +# Watch when a variable is read +# +proc watchread { arg } { + if { [catch "uplevel 1 array name $arg" names ] } { + if ![uplevel 1 info exists $arg] { + puts stderr "$arg does not exist" + return + } + uplevel 1 trace variable $arg r watchvar + } else { + foreach k $names { + if ![uplevel 1 info exists $arg] { + puts stderr "$arg does not exist" + return + } + uplevel 1 trace variable [set arg]($k) r watcharray + } + } +} + +# +# Delete a watch point +# +proc watchdel { args } { + foreach i [uplevel 1 "info vars $args"] { + set tmp "" + if { [catch "uplevel 1 array name $i" names] } { + catch "uplevel 1 trace vdelete $i w watchvar" + catch "uplevel 1 trace vdelete $i r watchvar" + catch "uplevel 1 trace vdelete $i u watchvar" + } else { + foreach k $names { + catch "uplevel 1 trace vdelete [set i]($k) w watcharray" + catch "uplevel 1 trace vdelete [set i]($k) r watcharray" + catch "uplevel 1 trace vdelete [set i]($k) u watcharray" + } + } + } +} + +# +# This file creates GDB style commands for the Tcl debugger +# +proc print { var } { + puts "$var" +} + +proc quit { } { + log_and_exit; +} + +proc bt { } { + puts "[w]" +} + +# +# create some stub procedures since we can't alias the command names +# +proc dp { args } { + uplevel 1 dumprocs $args +} + +proc dv { args } { + uplevel 1 dumpvars $args +} + +proc dl { args } { + uplevel 1 dumplocals $args +} + +proc dw { args } { + uplevel 1 dumpwatch $args +} + +proc q { } { + quit +} + +proc p { args } { + uplevel 1 print $args +} + +proc wu { args } { + uplevel 1 watchunset $args +} + +proc ww { args } { + uplevel 1 watchwrite $args +} + +proc wr { args } { + uplevel 1 watchread $args +} + +proc wd { args } { + uplevel 1 watchdel $args +} diff --git a/lib/dg.exp b/lib/dg.exp new file mode 100644 index 0000000..35c4afa --- /dev/null +++ b/lib/dg.exp @@ -0,0 +1,922 @@ +# `dg' general purpose testcase driver. +# Copyright (C) 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# dje@cygnus.com. + +# This file was written by Doug Evans (dje@cygnus.com). + +# This file is based on old-dejagnu.exp. It is intended to be more extensible +# without incurring the overhead that old-dejagnu.exp can. All test framework +# commands appear in the testcase as "{ dg-xxx args ... }". We pull them out +# with one grep, and then run the function(s) named by "dg-xxx". When running +# dg-xxx, the line number that it occurs on is always passed as the first +# argument. We also support different kinds of tools via callbacks. +# +# The currently supported options are: +# +# dg-prms-id N +# set prms_id to N +# +# dg-options "options ..." [{ target selector }] +# specify special options to pass to the tool (eg: compiler) +# +# dg-do do-what-keyword [{ target/xfail selector }] +# `do-what-keyword' is tool specific and is passed unchanged to +# ${tool}-dg-test. An example is gcc where `keyword' can be any of: +# preprocess|compile|assemble|link|run +# and will do one of: produce a .i, produce a .s, produce a .o, +# produce an a.out, or produce an a.out and run it (the default is +# compile). +# +# dg-error regexp comment [{ target/xfail selector } [{.|0|linenum}]] +# indicate an error message is expected on this line +# (the test fails if it doesn't occur) +# Linenum=0 for general tool messages (eg: -V arg missing). +# "." means the current line. +# +# dg-warning regexp comment [{ target/xfail selector } [{.|0|linenum}]] +# indicate a warning message is expected on this line +# (the test fails if it doesn't occur) +# +# dg-bogus regexp comment [{ target/xfail selector } [{.|0|linenum}]] +# indicate a bogus error message use to occur here +# (the test fails if it does occur) +# +# dg-build regexp comment [{ target/xfail selector }] +# indicate the build use to fail for some reason +# (errors covered here include bad assembler generated, tool crashes, +# and link failures) +# (the test fails if it does occur) +# +# dg-excess-errors comment [{ target/xfail selector }] +# indicate excess errors are expected (any line) +# (this should only be used sparingly and temporarily) +# +# dg-output regexp [{ target selector }] +# indicate the expected output of the program is +# (there may be multiple occurrences of this, they are concatenated) +# +# dg-final { tcl code } +# add some tcl code to be run at the end +# (there may be multiple occurrences of this, they are concatenated) +# (unbalanced braces must be \-escaped) +# +# "{ target selector }" is a list of expressions that determine whether the +# test succeeds or fails for a particular target, or in some cases whether the +# option applies for a particular target. If the case of `dg-do' it specifies +# whether the testcase is even attempted on the specified target. +# +# The target selector is always optional. The format is one of: +# +# { xfail *-*-* ... } - the test is expected to fail for the given targets +# { target *-*-* ... } - the option only applies to the given targets +# +# At least one target must be specified, use *-*-* for "all targets". +# At present it is not possible to specify both `xfail' and `target'. +# "native" may be used in place of "*-*-*". +# +# Example: +# +# [ ... some complicated code ... ] +# return a; /* { dg-build "fatal" "ran out of spill regs" { xfail i386-*-* } } */ +# +# In this example, the compiler use to crash on the "return a;" for some +# target and that it still does crash on i386-*-*. Admittedly, this is a +# contrived example. +# +# ??? It might be possible to add additional optional arguments by having +# something like: { dg-error ".*syntax.*" "syntax error" { { foo 1 } ... } } +# +# Callbacks +# +# ${tool}-dg-test testfile do-what-keyword extra-flags +# +# Run the test, be it compiler, assembler, or whatever. +# +# ${tool}-dg-prune target_triplet text +# +# Optional callback to delete output from the tool that can occur +# even in successful ("pass") situations and interfere with output +# pattern matching. This also gives the tool an opportunity to review +# the output and check for any conditions which indicate an "untested" +# or "unresolved" state. An example is if a testcase is too big and +# fills all available ram (which can happen for 16 bit cpus). The +# result is either the pruned text or +# "::untested|unresolved|unsupported::message" +# (eg: "::unsupported::memory full"). +# +# Notes: +# 1) All runnable testcases must return 0 from main() for success. +# You can't rely on getting any return code from target boards, and the +# `exec' command says a program fails if it returns non-zero. +# +# Language independence is (theoretically) achieved by: +# +# 1) Using global $tool to indicate the language (eg: gcc, g++, gas, etc.). +# This should only be used to look up other objects. We don't want to +# have to add code for each new language that is supported. If this is +# done right, no code needs to be added here for each new language. +# +# 2) Passing tool options in as arguments. +# +# Earlier versions of ${tool}_start (eg: gcc_start) would only take the name +# of the file to compile as an argument. Newer versions accept a list of +# one or two elements, the second being a string of *all* options to pass +# to the tool. We require this facility. +# +# 3) Callbacks. +# +# Try not to do anything else that makes life difficult. +# +# The normal way to write a testsuite is to have a .exp file containing: +# +# load_lib ${tool}-dg.exp +# dg-init +# dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/foo*]] ... +# dg-finish + +# Global state variables. +# The defaults are for GCC. + +# The default do-what keyword. +set dg-do-what-default compile + +# When dg-interpreter-batch-mode is 1, no execution test or excess error +# tests are performed. +set dg-interpreter-batch-mode 0 + +# Line number format. This is how line numbers appear in program output. +set dg-linenum-format ":%d:" +proc dg-format-linenum { linenum } { + global dg-linenum-format + return [format ${dg-linenum-format} $linenum] +} + +# Useful subroutines. + +# dg-get-options -- pick out the dg-xxx options in a testcase +# +# PROG is the file name of the testcase. +# The result is a list of options found. +# +# Example: For the following testcase: +# +# /* { dg-prms-id 1234 } */ +# int foo { return 0; } /* { dg-build fatal "some comment" } */ +# +# we return: +# +# { dg-prms-id 1 1234 } { dg-build 2 fatal "some comment" } + +proc dg-get-options { prog } { + set result "" + + set tmp [grep $prog "{\[ \t\]\+dg-\[-a-z\]\+\[ \t\]\+.*\[ \t\]\+}" line] + if ![string match "" $tmp] { + foreach i $tmp { + #send_user "Found: $i\n" + # FIXME: When to use "+" and "\+" isn't clear. + # Seems to me it took awhile to get this to work. + regexp "(\[0-9\]\+)\[ \t\]\+{\[ \t\]+(dg-\[-a-z\]+)\[ \t\]\+(.*)\[ \t\]+}\[^\}\]*(\n|$)" $i i line cmd args + #send_user "Found: $cmd $line $args\n" + append result " { $cmd $line $args }" + } + } + + #send_user "Returning: $result\n" + return $result +} + +# +# Process optional xfail/target arguments +# +# SELECTOR is "xfail target-triplet-1 ..." or "target target-triplet-1 ..." +# `target-triplet' may be "native". +# For xfail, the result is "F" (expected to Fail) if the current target is +# affected, otherwise "P" (expected to Pass). +# For target, the result is "S" (target is Selected) if the target is selected, +# otherwise "N" (target is Not selected). +# +proc dg-process-target { selector } { + global target_triplet + + set isnative [isnative] + set triplet_match 0 + + #send_user "dg-process-target: $selector\n" + + set selector [string trim $selector] + if [regexp "^xfail " $selector] { + set what xfail + } elseif [regexp "^target " $selector] { + set what target + } else { + # The use of error here and in other dg-xxx utilities is intentional. + # dg-test will catch them and do the right thing. + error "syntax error in target selector \"$selector\"" + } + + # ??? This should work but it doesn't. tcl bug? + #if [regexp "^${what}(( \[^ \]+-\[^ \]+-\[^ \]+)|( native))+$" $selector tmp selector] + if [regexp "^${what}( \[^ \]+-\[^ \]+-\[^ \]+| native)+$" $selector] { + regsub "^${what} " $selector "" selector + #send_user "selector: $selector\n" + foreach triplet $selector { + if [string match $triplet $target_triplet] { + set triplet_match 1 + } elseif { $isnative && $triplet == "native" } { + set triplet_match 1 + } + } + } else { + error "syntax error in target selector \"$selector\"" + } + + if { $triplet_match } { + return [expr { $what == "xfail" ? "F" : "S" }] + } else { + return [expr { $what == "xfail" ? "P" : "N" }] + } +} + +# Predefined user option handlers. +# The line number is always the first element. +# Note that each of these are varargs procs (they have an `args' argument). +# Tests for optional arguments are coded with ">=" to simplify adding new ones. + +proc dg-prms-id { args } { + global prms_id ;# this is a testing framework variable + + if { [llength $args] > 2 } { + error "[lindex $args 0]: too many arguments" + return + } + + set prms_id [lindex $args 1] +} + +# +# Set tool options +# +# Different options can be used for different targets by having multiple +# instances, selecting a different target each time. Since options are +# processed in order, put the default value first. Subsequent occurrences +# will override previous ones. +# + +proc dg-options { args } { + upvar dg-extra-tool-flags extra-tool-flags + + if { [llength $args] > 3 } { + error "[lindex $args 0]: too many arguments" + return + } + + if { [llength $args] >= 3 } { + switch [dg-process-target [lindex $args 2]] { + "S" { set extra-tool-flags [lindex $args 1] } + "N" { } + "F" { error "[lindex $args 0]: `xfail' not allowed here" } + "P" { error "[lindex $args 0]: `xfail' not allowed here" } + } + } else { + set extra-tool-flags [lindex $args 1] + } +} + +# +# Record what to do (compile/run/etc.) +# +# Multiple instances are supported (since we don't support target and xfail +# selectors on one line), though it doesn't make much sense to change the +# compile/assemble/link/run field. Nor does it make any sense to have +# multiple lines of target selectors (use one line). +# +proc dg-do { args } { + upvar dg-do-what do-what + + if { [llength $args] > 3 } { + error "[lindex $args 0]: too many arguments" + return + } + + set selected [lindex ${do-what} 1] ;# selected? (""/S/N) + set expected [lindex ${do-what} 2] ;# expected to pass/fail (P/F) + + if { [llength $args] >= 3 } { + switch [dg-process-target [lindex $args 2]] { + "S" { + set selected "S" + } + "N" { + # Don't deselect a target if it's been explicitly selected, + # but indicate a specific target has been selected (so don't + # do this testcase if it's not appropriate for this target). + # The user really shouldn't have multiple lines of target + # selectors, but try to do the intuitive thing (multiple lines + # are OR'd together). + if { $selected != "S" } { + set selected "N" + } + } + "F" { set expected "F" } + "P" { + # There's nothing to do for "P". We don't want to clobber a + # previous xfail for this target. + } + } + } else { + # Note: A previous occurrence of `dg-do' with target/xfail selectors + # is a user mistake. We clobber previous values here. + set selected S + set expected P + } + + switch [lindex $args 1] { + "preprocess" { } + "compile" { } + "assemble" { } + "link" { } + "run" { } + default { + error "[lindex $args 0]: syntax error" + } + } + set do-what [list [lindex $args 1] $selected $expected] +} + +proc dg-error { args } { + upvar dg-messages messages + + if { [llength $args] > 5 } { + error "[lindex $args 0]: too many arguments" + return + } + + set xfail "" + if { [llength $args] >= 4 } { + switch [dg-process-target [lindex $args 3]] { + "F" { set xfail "X" } + "P" { set xfail "" } + "N" { + # If we get "N", this error doesn't apply to us so ignore it. + return + } + } + } + + if { [llength $args] >= 5 } { + switch [lindex $args 4] { + "." { set line [dg-format-linenum [lindex $args 0]] } + "0" { set line "" } + "default" { set line [dg-format-linenum [lindex $args 4]] } + } + } else { + set line [dg-format-linenum [lindex $args 0]] + } + + lappend messages [list $line "${xfail}ERROR" [lindex $args 1] [lindex $args 2]] +} + +proc dg-warning { args } { + upvar dg-messages messages + + if { [llength $args] > 5 } { + error "[lindex $args 0]: too many arguments" + return + } + + set xfail "" + if { [llength $args] >= 4 } { + switch [dg-process-target [lindex $args 3]] { + "F" { set xfail "X" } + "P" { set xfail "" } + "N" { + # If we get "N", this warning doesn't apply to us so ignore it. + return + } + } + } + + if { [llength $args] >= 5 } { + switch [lindex $args 4] { + "." { set line [dg-format-linenum [lindex $args 0]] } + "0" { set line "" } + "default" { set line [dg-format-linenum [lindex $args 4]] } + } + } else { + set line [dg-format-linenum [lindex $args 0]] + } + + lappend messages [list $line "${xfail}WARNING" [lindex $args 1] [lindex $args 2]] +} + +proc dg-bogus { args } { + upvar dg-messages messages + + if { [llength $args] > 5 } { + error "[lindex $args 0]: too many arguments" + return + } + + set xfail "" + if { [llength $args] >= 4 } { + switch [dg-process-target [lindex $args 3]] { + "F" { set xfail "X" } + "P" { set xfail "" } + "N" { + # If we get "N", this message doesn't apply to us so ignore it. + return + } + } + } + + if { [llength $args] >= 5 } { + switch [lindex $args 4] { + "." { set line [dg-format-linenum [lindex $args 0]] } + "0" { set line "" } + "default" { set line [dg-format-linenum [lindex $args 4]] } + } + } else { + set line [dg-format-linenum [lindex $args 0]] + } + + lappend messages [list $line "${xfail}BOGUS" [lindex $args 1] [lindex $args 2]] +} + +proc dg-build { args } { + upvar dg-messages messages + + if { [llength $args] > 4 } { + error "[lindex $args 0]: too many arguments" + return + } + + set xfail "" + if { [ llength $args] >= 4 } { + switch [dg-process-target [lindex $args 3]] { + "F" { set xfail "X" } + "P" { set xfail "" } + "N" { + # If we get "N", this lossage doesn't apply to us so ignore it. + return + } + } + } + + lappend messages [list [lindex $args 0] "${xfail}BUILD" [lindex $args 1] [lindex $args 2]] +} + +proc dg-excess-errors { args } { + upvar dg-excess-errors-flag excess-errors-flag + + if { [llength $args] > 3 } { + error "[lindex $args 0]: too many arguments" + return + } + + if { [llength $args] >= 3 } { + switch [dg-process-target [lindex $args 2]] { + "F" { set excess-errors-flag 1 } + "S" { set excess-errors-flag 1 } + } + } else { + set excess-errors-flag 1 + } +} + +# +# Indicate expected program output +# +# We support multiple occurrences, but we do not implicitly insert newlines +# between them. +# +# Note that target boards don't all support this kind of thing so it's a good +# idea to specify the target all the time. If one or more targets are +# explicitly selected, the test won't be performed if we're not one of them +# (as long as we were never mentioned). +# +# If you have target dependent output and want to set an xfail for one or more +# of them, use { dg-output "" { xfail a-b-c ... } }. The "" won't contribute +# to the expected output. +# +proc dg-output { args } { + upvar dg-output-text output-text + + if { [llength $args] > 3 } { + error "[lindex $args 0]: too many arguments" + return + } + + # Allow target dependent output. + + set expected [lindex ${output-text} 0] + if { [llength $args] >= 3 } { + switch [dg-process-target [lindex $args 2]] { + "N" { return } + "S" { } + "F" { set expected "F" } + # Don't override a previous xfail. + "P" { } + } + } + + if { [llength ${output-text}] == 1 } { + # First occurrence. + set output-text [list $expected [lindex $args 1]] + } else { + set output-text [list $expected "[lindex ${output-text} 1][lindex $args 1]"] + } +} + +proc dg-final { args } { + upvar dg-final-code final-code + + if { [llength $args] > 2 } { + error "[lindex $args 0]: too many arguments" + return + } + + #send_user "dg-final: $args\n" + append final-code "[lindex $args 1]\n" +} + +# +# Set up our environment +# +# There currently isn't much to do, but always calling it allows us to add +# enhancements without having to update our callers. +# It must be run before calling `dg-test'. + +proc dg-init { } { +} + +# dg-runtest -- simple main loop useful to most testsuites +# +# FLAGS is a set of options to always pass. +# DEFAULT_EXTRA_FLAGS is a set of options to pass if the testcase doesn't +# specify any (with dg-option). +# ??? We're flipping between "flag" and "option" here. + +proc dg-runtest { testcases flags default-extra-flags } { + global runtests + + foreach testcase $testcases { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $testcase] { + continue + } + verbose "Testing [file tail [file dirname $testcase]]/[file tail $testcase]" + dg-test $testcase $flags ${default-extra-flags} + } +} + +# dg-trim-dirname -- rip DIR_NAME out of FILE_NAME +# +# Syntax: dg-trim-dirname dir_name file_name +# We need to go through this contorsion in order to properly support +# directory-names which might have embedded regexp special characters. + +proc dg-trim-dirname { dir_name file_name } { + set special_character "\[\?\+\-\.\(\)\$\|\]" + regsub -all $special_character $dir_name "\\\\&" dir_name + regsub "^$dir_name/?" $file_name "" file_name + return $file_name +} + +# dg-test -- runs a new style DejaGnu test +# +# Syntax: dg-test [-keep-output] prog tool_flags default_extra_tool_flags +# +# PROG is the full path name of the file to pass to the tool (eg: compiler). +# TOOL_FLAGS is a set of options to always pass. +# DEFAULT_EXTRA_TOOL_FLAGS are additional options if the testcase has none. + +#proc dg-test { prog tool_flags default_extra_tool_flags } { +proc dg-test { args } { + global dg-do-what-default dg-interpreter-batch-mode dg-linenum-format + global errorCode errorInfo + global tool + global srcdir ;# eg: /calvin/dje/devo/gcc/./testsuite/ + global host_triplet target_triplet + + set keep 0 + set i 0 + + if { [string index [lindex $args 0] 0] == "-" } { + for { set i 0 } { $i < [llength $args] } { incr i } { + if { [lindex $args $i] == "--" } { + incr i + break + } elseif { [lindex $args $i] == "-keep-output" } { + set keep 1 + } elseif { [string index [lindex $args $i] 0] == "-" } { + clone_output "ERROR: dg-test: illegal argument: [lindex $args $i]" + return + } else { + break + } + } + } + + if { $i + 3 != [llength $args] } { + clone_output "ERROR: dg-test: missing arguments in call" + return + } + set prog [lindex $args $i] + set tool_flags [lindex $args [expr $i + 1]] + set default_extra_tool_flags [lindex $args [expr $i + 2]] + + set text "\[- A-Za-z0-9\.\;\"\_\:\'\`\(\)\!\#\=\+\?\&\*]*" + + set name [dg-trim-dirname $srcdir $prog] + # If we couldn't rip $srcdir out of `prog' then just do the best we can. + # The point is to reduce the unnecessary noise in the logs. Don't strip + # out too much because different testcases with the same name can confuse + # `test-tool'. + if [string match "/*" $name] { + set name "[file tail [file dirname $prog]]/[file tail $prog]" + } + + # Process any embedded dg options in the testcase. + + # Use "" for the second element of dg-do-what so we can tell if it's been + # explicitly set to "S". + set dg-do-what [list ${dg-do-what-default} "" P] + set dg-excess-errors-flag 0 + set dg-messages "" + set dg-extra-tool-flags $default_extra_tool_flags + set dg-final-code "" + + # `dg-output-text' is a list of two elements: pass/fail and text. + # Leave second element off for now (indicates "don't perform test") + set dg-output-text "P" + + # Define our own "special function" `unknown' so we catch spelling errors. + # But first rename the existing one so we can restore it afterwards. + catch {rename dg-save-unknown ""} + rename unknown dg-save-unknown + proc unknown { args } { + return -code error "unknown dg option: $args" + } + + set tmp [dg-get-options $prog] + foreach op $tmp { + verbose "Processing option: $op" 3 + set status [catch "$op" errmsg] + if { $status != 0 } { + if { 0 && [info exists errorInfo] } { + # This also prints a backtrace which will just confuse + # testcase writers, so it's disabled. + perror "$name: $errorInfo\n" + } else { + perror "$name: $errmsg for \"$op\"\n" + } + # ??? The call to unresolved here is necessary to clear `errcnt'. + # What we really need is a proc like perror that doesn't set errcnt. + # It should also set exit_status to 1. + unresolved "$name: $errmsg for \"$op\"" + return + } + } + + # Restore normal error handling. + rename unknown "" + rename dg-save-unknown unknown + + # If we're not supposed to try this test on this target, we're done. + if { [lindex ${dg-do-what} 1] == "N" } { + unsupported "$name" + verbose "$name not supported on this target, skipping it" 3 + return + } + + # Run the tool and analyze the results. + # The result of ${tool}-dg-test is in a bit of flux. + # Currently it is the name of the output file (or "" if none). + # If we need more than this it will grow into a list of things. + # No intention is made (at this point) to preserve upward compatibility + # (though at some point we'll have to). + + set results [${tool}-dg-test $prog [lindex ${dg-do-what} 0] "$tool_flags ${dg-extra-tool-flags}"]; + + set comp_output [lindex $results 0]; + set output_file [lindex $results 1]; + + #send_user "\nold_dejagnu.exp: comp_output1 = :$comp_output:\n\n" + #send_user "\nold_dejagnu.exp: message = :$message:\n\n" + #send_user "\nold_dejagnu.exp: message length = [llength $message]\n\n" + + foreach i ${dg-messages} { + verbose "Scanning for message: $i" 4 + + # Remove all error messages for the line [lindex $i 0] + # in the source file. If we find any, success! + set line [lindex $i 0] + set pattern [lindex $i 2] + set comment [lindex $i 3] + #send_user "Before:\n$comp_output\n" + if [regsub -all "(^|\n)(\[^\n\]+$line\[^\n\]*($pattern)\[^\n\]*\n?)+" $comp_output "\n" comp_output] { + set comp_output [string trimleft $comp_output] + set ok pass + set uhoh fail + } else { + set ok fail + set uhoh pass + } + #send_user "After:\n$comp_output\n" + + # $line will either be a formatted line number or a number all by + # itself. Delete the formatting. + scan $line ${dg-linenum-format} line + switch [lindex $i 1] { + "ERROR" { + $ok "$name $comment (test for errors, line $line)" + } + "XERROR" { + x$ok "$name $comment (test for errors, line $line)" + } + "WARNING" { + $ok "$name $comment (test for warnings, line $line)" + } + "XWARNING" { + x$ok "$name $comment (test for warnings, line $line)" + } + "BOGUS" { + $uhoh "$name $comment (test for bogus messages, line $line)" + } + "XBOGUS" { + x$uhoh "$name $comment (test for bogus messages, line $line)" + } + "BUILD" { + $uhoh "$name $comment (test for build failure, line $line)" + } + "XBUILD" { + x$uhoh "$name $comment (test for build failure, line $line)" + } + "EXEC" { } + "XEXEC" { } + } + #send_user "\nold_dejagnu.exp: comp_output2= :$comp_output:\n\n" + } + #send_user "\nold_dejagnu.exp: comp_output3 = :$comp_output:\n\n" + + # Remove messages from the tool that we can ignore. + #send_user "comp_output: $comp_output\n" + set comp_output [prune_warnings $comp_output] + + if { [info proc ${tool}-dg-prune] != "" } { + set comp_output [${tool}-dg-prune $target_triplet $comp_output] + switch -glob $comp_output { + "::untested::*" { + regsub "::untested::" $comp_output "" message + untested "$name: $message" + return + } + "::unresolved::*" { + regsub "::unresolved::" $comp_output "" message + unresolved "$name: $message" + return + } + "::unsupported::*" { + regsub "::unsupported::" $comp_output "" message + unsupported "$name: $message" + return + } + } + } + + # See if someone forgot to delete the extra lines. + regsub -all "\n+" $comp_output "\n" comp_output + regsub "^\n+" $comp_output "" comp_output + #send_user "comp_output: $comp_output\n" + + # Don't do this if we're testing an interpreter. + # FIXME: why? + if { ${dg-interpreter-batch-mode} == 0 } { + # Catch excess errors (new bugs or incomplete testcases). + if ${dg-excess-errors-flag} { + setup_xfail "*-*-*" + } + if ![string match "" $comp_output] { + fail "$name (test for excess errors)" + send_log "Excess errors:\n$comp_output\n" + } else { + pass "$name (test for excess errors)" + } + } + + # Run the executable image if asked to do so. + # FIXME: This is the only place where we assume a standard meaning to + # the `keyword' argument of dg-do. This could be cleaned up. + if { [lindex ${dg-do-what} 0] == "run" } { + if ![file exists $output_file] { + warning "$name compilation failed to produce executable" + } else { + set status -1 + set result [${tool}_load $output_file] + set status [lindex $result 0]; + set output [lindex $result 1]; + #send_user "After exec, status: $status\n" + if { [lindex ${dg-do-what} 2] == "F" } { + setup_xfail "*-*-*" + } + if { "$status" == "pass" } { + pass "$name execution test" + verbose "Exec succeeded." 3 + if { [llength ${dg-output-text}] > 1 } { + #send_user "${dg-output-text}\n" + if { [lindex ${dg-output-text} 0] == "F" } { + setup_xfail "*-*-*" + } + set texttmp [lindex ${dg-output-text} 1] + if { ![regexp $texttmp ${output}] } { + fail "$name output pattern test, is ${output}, should match $texttmp" + verbose "Failed test for output pattern $texttmp" 3 + } else { + pass "$name output pattern test, $texttmp" + verbose "Passed test for output pattern $texttmp" 3 + } + unset texttmp + } + } elseif { "$status" == "fail" } { + # It would be nice to get some info out of errorCode. + if [info exists errorCode] { + verbose "Exec failed, errorCode: $errorCode" 3 + } else { + verbose "Exec failed, errorCode not defined!" 3 + } + fail "$name execution test" + } else { + $status "$name execution test" + } + } + } + + # Are there any further tests to perform? + # Note that if the program has special run-time requirements, running + # of the program can be delayed until here. Ditto for other situations. + # It would be a bit cumbersome though. + + if ![string match ${dg-final-code} ""] { + regsub -all "\\\\(\[{}\])" ${dg-final-code} "\\1" dg-final-code + # Note that the use of `args' here makes this a varargs proc. + proc dg-final-proc { args } ${dg-final-code} + verbose "Running dg-final tests." 3 + verbose "dg-final-proc:\n[info body dg-final-proc]" 4 + if [catch "dg-final-proc $prog" errmsg] { + perror "$name: error executing dg-final: $errmsg" + # ??? The call to unresolved here is necessary to clear `errcnt'. + # What we really need is a proc like perror that doesn't set errcnt. + # It should also set exit_status to 1. + unresolved "$name: error executing dg-final: $errmsg" + } + } + + # Do some final clean up. + # When testing an interpreter, we don't compile something and leave an + # output file. + if { ! ${keep} && ${dg-interpreter-batch-mode} == 0 } { + catch "exec rm -f $output_file" + } +} + +# +# Do any necessary cleanups +# +# This is called at the end to undo anything dg-init did (that needs undoing). +# +proc dg-finish { } { + # Reset this in case caller wonders whether s/he should. + global prms_id + set prms_id 0 + + # The framework doesn't like to see any error remnants, so remove them. + global errorInfo + if [info exists errorInfo] { + unset errorInfo + } + + # If the tool has a "finish" routine, call it. + # There may be a bit of duplication (eg: resetting prms_id), leave it. + # Let's keep these procs robust. + global tool + if ![string match "" [info procs ${tool}_finish]] { + ${tool}_finish + } +} diff --git a/lib/framework.exp b/lib/framework.exp new file mode 100644 index 0000000..b72d38e --- /dev/null +++ b/lib/framework.exp @@ -0,0 +1,898 @@ +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001 +# 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) + +# These variables are local to this file. +# This or more warnings and a test fails. +set warning_threshold 3 +# This or more errors and a test fails. +set perror_threshold 1 + +proc mail_file { file to subject } { + if [file readable $file] { + catch "exec mail -s \"$subject\" $to < $file" + } +} + +# +# Open the output logs +# +proc open_logs { } { + global outdir + global tool + global sum_file + + if { ${tool} == "" } { + set tool testrun + } + catch "exec rm -f $outdir/$tool.sum" + set sum_file [open "$outdir/$tool.sum" w] + catch "exec rm -f $outdir/$tool.log" + log_file -a "$outdir/$tool.log" + verbose "Opening log files in $outdir" + if { ${tool} == "testrun" } { + set tool "" + } +} + + +# +# Close the output logs +# +proc close_logs { } { + global sum_file + + catch "close $sum_file" +} + +# +# Check build host triplet for pattern +# +# With no arguments it returns the triplet string. +# +proc isbuild { pattern } { + global build_triplet + global host_triplet + + if ![info exists build_triplet] { + set build_triplet ${host_triplet} + } + if [string match "" $pattern] { + return $build_triplet + } + verbose "Checking pattern \"$pattern\" with $build_triplet" 2 + + if [string match "$pattern" $build_triplet] { + return 1 + } else { + return 0 + } +} + +# +# Is $board remote? Return a non-zero value if so. +# +proc is_remote { board } { + global host_board; + global target_list; + + verbose "calling is_remote $board" 3; + # Remove any target variant specifications from the name. + set board [lindex [split $board "/"] 0]; + + # Map the host or build back into their short form. + if { [board_info build name] == $board } { + set board "build"; + } elseif { [board_info host name] == $board } { + set board "host"; + } + + # We're on the "build". The check for the empty string is just for + # paranoia's sake--we shouldn't ever get one. "unix" is a magic + # string that should really go away someday. + if { $board == "build" || $board == "unix" || $board == "" } { + verbose "board is $board, not remote" 3; + return 0; + } + + if { $board == "host" } { + if { [info exists host_board] && $host_board != "" } { + verbose "board is $board, is remote" 3; + return 1; + } else { + verbose "board is $board, host is local" 3; + return 0; + } + } + + if { $board == "target" } { + global current_target_name + + if [info exists current_target_name] { + # This shouldn't happen, but we'll be paranoid anyway. + if { $current_target_name != "target" } { + return [is_remote $current_target_name]; + } + } + return 0; + } + if [board_info $board exists isremote] { + verbose "board is $board, isremote is [board_info $board isremote]" 3; + return [board_info $board isremote]; + } + return 1; +} +# +# If this is a canadian (3 way) cross. This means the tools are +# being built with a cross compiler for another host. +# +proc is3way {} { + global host_triplet + global build_triplet + + if ![info exists build_triplet] { + set build_triplet ${host_triplet} + } + verbose "Checking $host_triplet against $build_triplet" 2 + if { "$build_triplet" == "$host_triplet" } { + return 0 + } + return 1 +} + +# +# Check host triplet for pattern +# +# With no arguments it returns the triplet string. +# +proc ishost { pattern } { + global host_triplet + + if [string match "" $pattern] { + return $host_triplet + } + verbose "Checking pattern \"$pattern\" with $host_triplet" 2 + + if [string match "$pattern" $host_triplet] { + return 1 + } else { + return 0 + } +} + +# +# Check target triplet for pattern +# +# With no arguments it returns the triplet string. +# Returns 1 if the target looked for, or 0 if not. +# +proc istarget { args } { + global target_triplet + + # if no arg, return the config string + if [string match "" $args] { + if [info exists target_triplet] { + return $target_triplet + } else { + perror "No target configuration names found." + } + } + + set triplet [lindex $args 0] + + # now check against the cannonical name + if [info exists target_triplet] { + verbose "Checking \"$triplet\" against \"$target_triplet\"" 2 + if [string match $triplet $target_triplet] { + return 1 + } + } + + # nope, no match + return 0 +} + +# +# Check to see if we're running the tests in a native environment +# +# Returns 1 if running native, 0 if on a target. +# +proc isnative { } { + global target_triplet + global build_triplet + + if [string match $build_triplet $target_triplet] { + return 1 + } + return 0 +} + +# +# unknown -- called by expect if a proc is called that doesn't exist +# +proc unknown { args } { + global errorCode + global errorInfo + global exit_status + + clone_output "ERROR: (DejaGnu) proc \"$args\" does not exist." + if [info exists errorCode] { + send_error "The error code is $errorCode\n" + } + if [info exists errorInfo] { + send_error "The info on the error is:\n$errorInfo\n" + } + + set exit_status 1; + log_and_exit; +} + +# +# Print output to stdout (or stderr) and to log file +# +# If the --all flag (-a) option was used then all messages go the the screen. +# Without this, all messages that start with a keyword are written only to the +# detail log file. All messages that go to the screen will also appear in the +# detail log. This should only be used by the framework itself using pass, +# fail, xpass, xfail, warning, perror, note, untested, unresolved, or +# unsupported procedures. +# +proc clone_output { message } { + global sum_file + global all_flag + + if { $sum_file != "" } { + puts $sum_file "$message" + } + + regsub "^\[ \t\]*(\[^ \t\]+).*$" "$message" "\\1" firstword; + case "$firstword" in { + {"PASS:" "XFAIL:" "UNRESOLVED:" "UNSUPPORTED:" "UNTESTED:"} { + if $all_flag { + send_user "$message\n" + return "$message" + } else { + send_log "$message\n" + } + } + {"ERROR:" "WARNING:" "NOTE:"} { + send_error "$message\n" + return "$message" + } + default { + send_user "$message\n" + return "$message" + } + } +} + +# +# Reset a few counters. +# +proc reset_vars {} { + global test_names test_counts; + global warncnt errcnt; + + # other miscellaneous variables + global prms_id + global bug_id + + # reset them all + set prms_id 0; + set bug_id 0; + set warncnt 0; + set errcnt 0; + foreach x $test_names { + set test_counts($x,count) 0; + } + + # Variables local to this file. + global warning_threshold perror_threshold + set warning_threshold 3 + set perror_threshold 1 +} + +proc log_and_exit {} { + global exit_status; + global tool mail_logs outdir mailing_list; + + log_summary total; + # extract version number + if {[info procs ${tool}_version] != ""} { + if {[catch "${tool}_version" output]} { + warning "${tool}_version failed:\n$output" + } + } + close_logs + cleanup + verbose -log "runtest completed at [timestamp -format %c]" + if $mail_logs { + mail_file $outdir/$tool.sum $mailing_list "Dejagnu Summary Log" + } + remote_close host + remote_close target + exit $exit_status +} +# +# Print summary of all pass/fail counts +# +proc log_summary { args } { + global tool + global sum_file + global exit_status + global mail_logs + global outdir + global mailing_list + global current_target_name + global test_counts; + global testcnt; + + if { [llength $args] == 0 } { + set which "count"; + } else { + set which [lindex $args 0]; + } + + if { [llength $args] == 0 } { + clone_output "\n\t\t=== $tool Summary for $current_target_name ===\n" + } else { + clone_output "\n\t\t=== $tool Summary ===\n" + } + + # If the tool set `testcnt', it wants us to do a sanity check on the + # total count, so compare the reported number of testcases with the + # expected number. Maintaining an accurate count in `testcnt' isn't easy + # so it's not clear how often this will be used. + if [info exists testcnt] { + if { $testcnt > 0 } { + set totlcnt 0; + # total all the testcases reported + foreach x { FAIL PASS XFAIL XPASS UNTESTED UNRESOLVED UNSUPPORTED } { + incr totlcnt test_counts($x,$which); + } + set testcnt test_counts(total,$which); + + if { $testcnt>$totlcnt || $testcnt<$totlcnt } { + if { $testcnt > $totlcnt } { + set mismatch "unreported [expr $testcnt-$totlcnt]" + } + if { $testcnt < $totlcnt } { + set mismatch "misreported [expr $totlcnt-$testcnt]" + } + } else { + verbose "# of testcases run $testcnt" + } + + if [info exists mismatch] { + clone_output "### ERROR: totals do not equal number of testcases run" + clone_output "### ERROR: # of testcases expected $testcnt" + clone_output "### ERROR: # of testcases reported $totlcnt" + clone_output "### ERROR: # of testcases $mismatch\n" + } + } + } + foreach x { PASS FAIL XPASS XFAIL UNRESOLVED UNTESTED UNSUPPORTED } { + set val $test_counts($x,$which); + if { $val > 0 } { + set mess "# of $test_counts($x,name)"; + if { [string length $mess] < 24 } { + append mess "\t"; + } + clone_output "$mess\t$val"; + } + } +} + +# +# Close all open files, remove temp file and core files +# +proc cleanup {} { + global sum_file + global exit_status + global done_list + global subdir + + #catch "exec rm -f [glob xgdb core *.x *.o *_soc a.out]" + #catch "exec rm -f [glob -nocomplain $subdir/*.o $subdir/*.x $subdir/*_soc]" +} + +# +# Setup a flag to control whether a failure is expected or not +# +# Multiple target triplet patterns can be specified for targets +# for which the test fails. A bug report ID can be specified, +# which is a string without '-'. +# +proc setup_xfail { args } { + global xfail_flag + global xfail_prms + + set xfail_prms 0 + set argc [ llength $args ] + for { set i 0 } { $i < $argc } { incr i } { + set sub_arg [ lindex $args $i ] + # is a prms number. we assume this is a string with no '-' characters + if [regexp "^\[^\-\]+$" $sub_arg] { + set xfail_prms $sub_arg + continue + } + if [istarget $sub_arg] { + set xfail_flag 1 + continue + } + } +} + + +# check to see if a conditional xfail is triggered +# message {targets} {include} {exclude} +# +# +proc check_conditional_xfail { args } { + global compiler_flags + + set all_args [lindex $args 0] + + set message [lindex $all_args 0] + + set target_list [lindex $all_args 1] + verbose "Limited to targets: $target_list" 3 + + # get the list of flags to look for + set includes [lindex $all_args 2] + verbose "Will search for options $includes" 3 + + # get the list of flags to exclude + if { [llength $all_args] > 3 } { + set excludes [lindex $all_args 3] + verbose "Will exclude for options $excludes" 3 + } else { + set excludes "" + } + + # loop through all the targets, checking the options for each one + verbose "Compiler flags are: $compiler_flags" 2 + + set incl_hit 0 + set excl_hit 0 + foreach targ $target_list { + if [istarget $targ] { + # look through the compiler options for flags we want to see + # this is really messy cause each set of options to look for + # may also be a list. We also want to find each element of the + # list, regardless of order to make sure they're found. + # So we look for lists in side of lists, and make sure all + # the elements match before we decide this is legit. + for { set i 0 } { $i < [llength $includes] } { incr i } { + set incl_hit 0 + set opt [lindex $includes $i] + verbose "Looking for $opt to include in the compiler flags" 2 + foreach j "$opt" { + if [string match "* $j *" $compiler_flags] { + verbose "Found $j to include in the compiler flags" 2 + incr incl_hit + } + } + # if the number of hits we get is the same as the number of + # specified options, then we got a match + if {$incl_hit == [llength $opt]} { + break + } else { + set incl_hit 0 + } + } + # look through the compiler options for flags we don't + # want to see + for { set i 0 } { $i < [llength $excludes] } { incr i } { + set excl_hit 0 + set opt [lindex $excludes $i] + verbose "Looking for $opt to exclude in the compiler flags" 2 + foreach j "$opt" { + if [string match "* $j *" $compiler_flags] { + verbose "Found $j to exclude in the compiler flags" 2 + incr excl_hit + } + } + # if the number of hits we get is the same as the number of + # specified options, then we got a match + if {$excl_hit == [llength $opt]} { + break + } else { + set excl_hit 0 + } + } + + # if we got a match for what to include, but didn't find any reasons + # to exclude this, then we got a match! So return one to turn this into + # an expected failure. + if {$incl_hit && ! $excl_hit } { + verbose "This is a conditional match" 2 + return 1 + } else { + verbose "This is not a conditional match" 2 + return 0 + } + } + } + return 0 +} + +# +# Clear the xfail flag for a particular target +# +proc clear_xfail { args } { + global xfail_flag + global xfail_prms + + set argc [ llength $args ] + for { set i 0 } { $i < $argc } { incr i } { + set sub_arg [ lindex $args $i ] + case $sub_arg in { + "*-*-*" { # is a configuration triplet + if [istarget $sub_arg] { + set xfail_flag 0 + set xfail_prms 0 + } + continue + } + } + } +} + +# +# Record that a test has passed or failed (perhaps unexpectedly) +# +# This is an internal procedure, only used in this file. +# +proc record_test { type message args } { + global exit_status + global prms_id bug_id + global xfail_flag xfail_prms + global errcnt warncnt + global warning_threshold perror_threshold + global pf_prefix + + if { [llength $args] > 0 } { + set count [lindex $args 0]; + } else { + set count 1; + } + if [info exists pf_prefix] { + set message [concat $pf_prefix " " $message]; + } + + # If we have too many warnings or errors, + # the output of the test can't be considered correct. + if { $warning_threshold > 0 && $warncnt >= $warning_threshold + || $perror_threshold > 0 && $errcnt >= $perror_threshold } { + verbose "Error/Warning threshold exceeded: \ + $errcnt $warncnt (max. $perror_threshold $warning_threshold)" + set type UNRESOLVED + } + + incr_count $type; + + switch $type { + PASS { + if $prms_id { + set message [concat $message "\t(PRMS $prms_id)"] + } + } + FAIL { + set exit_status 1 + if $prms_id { + set message [concat $message "\t(PRMS $prms_id)"] + } + } + XPASS { + set exit_status 1 + if { $xfail_prms != 0 } { + set message [concat $message "\t(PRMS $xfail_prms)"] + } + } + XFAIL { + if { $xfail_prms != 0 } { + set message [concat $message "\t(PRMS $xfail_prms)"] + } + } + UNTESTED { + # The only reason we look at the xfail stuff is to pick up + # `xfail_prms'. + if { $xfail_flag && $xfail_prms != 0 } { + set message [concat $message "\t(PRMS $xfail_prms)"] + } elseif $prms_id { + set message [concat $message "\t(PRMS $prms_id)"] + } + } + UNRESOLVED { + set exit_status 1 + # The only reason we look at the xfail stuff is to pick up + # `xfail_prms'. + if { $xfail_flag && $xfail_prms != 0 } { + set message [concat $message "\t(PRMS $xfail_prms)"] + } elseif $prms_id { + set message [concat $message "\t(PRMS $prms_id)"] + } + } + UNSUPPORTED { + # The only reason we look at the xfail stuff is to pick up + # `xfail_prms'. + if { $xfail_flag && $xfail_prms != 0 } { + set message [concat $message "\t(PRMS $xfail_prms)"] + } elseif $prms_id { + set message [concat $message "\t(PRMS $prms_id)"] + } + } + default { + perror "record_test called with bad type `$type'" + set errcnt 0 + return + } + } + + if $bug_id { + set message [concat $message "\t(BUG $bug_id)"] + } + + global multipass_name + if { $multipass_name != "" } { + set message [format "$type: %s: $message" "$multipass_name"] + } else { + set message "$type: $message" + } + clone_output "$message" + + # If a command name exists in the $local_record_procs associative + # array for this type of result, then invoke it. + + set lowcase_type [string tolower $type] + global local_record_procs + if {[info exists local_record_procs($lowcase_type)]} { + $local_record_procs($lowcase_type) "$message" + } + + # Reset these so they're ready for the next test case. We don't reset + # prms_id or bug_id here. There may be multiple tests for them. Instead + # they are reset in the main loop after each test. It is also the + # testsuite driver's responsibility to reset them after each testcase. + set warncnt 0 + set errcnt 0 + set xfail_flag 0 + set xfail_prms 0 +} + +# +# Record that a test has passed +# +proc pass { message } { + global xfail_flag compiler_conditional_xfail_data + + # if we have a conditional xfail setup, then see if our compiler flags match + if [ info exists compiler_conditional_xfail_data ] { + if [check_conditional_xfail $compiler_conditional_xfail_data] { + set xfail_flag 1 + } + unset compiler_conditional_xfail_data + } + + if $xfail_flag { + record_test XPASS $message + } else { + record_test PASS $message + } +} + +# +# Record that a test has failed +# +proc fail { message } { + global xfail_flag compiler_conditional_xfail_data + + # if we have a conditional xfail setup, then see if our compiler flags match + if [ info exists compiler_conditional_xfail_data ] { + if [check_conditional_xfail $compiler_conditional_xfail_data] { + set xfail_flag 1 + } + unset compiler_conditional_xfail_data + } + + if $xfail_flag { + record_test XFAIL $message + } else { + record_test FAIL $message + } +} + +# +# Record that a test has passed unexpectedly +# +proc xpass { message } { + record_test XPASS $message +} + +# +# Record that a test has failed unexpectedly +# +proc xfail { message } { + record_test XFAIL $message +} + +# +# Set warning threshold +# +proc set_warning_threshold { threshold } { + set warning_threshold $threshold +} + +# +# Get warning threshold +# +proc get_warning_threshold { } { + return $warning_threshold +} + +# +# Prints warning messages +# These are warnings from the framework, not from the tools being tested. +# It takes a string, and an optional number and returns nothing. +# +proc warning { args } { + global warncnt + + if { [llength $args] > 1 } { + set warncnt [lindex $args 1] + } else { + incr warncnt + } + set message [lindex $args 0] + + clone_output "WARNING: $message" + + global errorInfo + if [info exists errorInfo] { + unset errorInfo + } +} + +# +# Prints error messages +# These are errors from the framework, not from the tools being tested. +# It takes a string, and an optional number and returns nothing. +# +proc perror { args } { + global errcnt + + if { [llength $args] > 1 } { + set errcnt [lindex $args 1] + } else { + incr errcnt + } + set message [lindex $args 0] + + clone_output "ERROR: $message" + + global errorInfo + if [info exists errorInfo] { + unset errorInfo + } +} + +# +# Prints informational messages +# +# These are messages from the framework, not from the tools being tested. +# This means that it is currently illegal to call this proc outside +# of dejagnu proper. +# +proc note { message } { + clone_output "NOTE: $message" + + # ??? It's not clear whether we should do this. Let's not, and only do + # so if we find a real need for it. + #global errorInfo + #if [info exists errorInfo] { + # unset errorInfo + #} +} + +# +# untested -- mark the test case as untested +# +proc untested { message } { + record_test UNTESTED $message +} + +# +# Mark the test case as unresolved +# +proc unresolved { message } { + record_test UNRESOLVED $message +} + +# +# Mark the test case as unsupported +# +# Usually this is used for a test that is missing OS support. +# +proc unsupported { message } { + record_test UNSUPPORTED $message +} + +# +# Set up the values in the test_counts array (name and initial totals). +# +proc init_testcounts { } { + global test_counts test_names; + set test_counts(TOTAL,name) "testcases run" + set test_counts(PASS,name) "expected passes" + set test_counts(FAIL,name) "unexpected failures" + set test_counts(XFAIL,name) "expected failures" + set test_counts(XPASS,name) "unexpected successes" + set test_counts(WARNING,name) "warnings" + set test_counts(ERROR,name) "errors" + set test_counts(UNSUPPORTED,name) "unsupported tests" + set test_counts(UNRESOLVED,name) "unresolved testcases" + set test_counts(UNTESTED,name) "untested testcases" + set j ""; + + foreach i [lsort [array names test_counts]] { + regsub ",.*$" "$i" "" i; + if { $i == $j } { + continue; + } + set test_counts($i,total) 0; + lappend test_names $i; + set j $i; + } +} + +# +# Increment NAME in the test_counts array; the amount to increment can be +# is optional (defaults to 1). +# +proc incr_count { name args } { + global test_counts; + + if { [llength $args] == 0 } { + set count 1; + } else { + set count [lindex $args 0]; + } + if [info exists test_counts($name,count)] { + incr test_counts($name,count) $count; + incr test_counts($name,total) $count; + } else { + perror "$name doesn't exist in incr_count" + } +} + + +# +# Create an exp_continue proc if it doesn't exist +# +# For compatablity with old versions. +# +global argv0 +if ![info exists argv0] { + proc exp_continue { } { + continue -expect + } +} diff --git a/lib/ftp.exp b/lib/ftp.exp new file mode 100644 index 0000000..641f112 --- /dev/null +++ b/lib/ftp.exp @@ -0,0 +1,246 @@ +# 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 + +# +# Support downloading files using ftp. +# + +# +# Open a connection to HOST. +# +proc ftp_open { host } { + set prompt "ftp>" + global board_info + + if [board_info $host exists name] { + set host [board_info $host name]; + } + + if [board_info $host exists ftp_fileid] { + return [board_info $host ftp_fileid]; + } + + if [board_info $host exists hostname] { + set remotehost [board_info $host hostname]; + } else { + set remotehost $host; + } + + # LoseQVT tends to get stuck sometimes; we'll loop around a few million + # times when it gets a "connection refused". + set spawn_id -1; + set count 3; + while { $spawn_id < 0 && $count >= 0 } { + spawn ftp -n $remotehost; + expect { + -i $spawn_id -re ".*220.*$prompt" { } + -i $spawn_id -re ".*Connection refused.*$prompt" { + sleep 2; + send "open $remotehost\n"; + exp_continue + } + -i $spawn_id default { + close -i $spawn_id; + wait -i $spawn_id; + set spawn_id -1; + } + } + incr count -1; + } + if { $spawn_id < 0 } { + return -1; + } + set board_info($host,ftp_fileid) $spawn_id; + if [board_info $host exists ftp_username] { + if [board_info $host exists ftp_password] { + set command "user [board_info $host ftp_username] [board_info $host ftp_password]\n"; + } else { + set command "user [board_info $host ftp_username]\n"; + } + send "$command" + expect { + -i $spawn_id -re ".*230.*$prompt" { } + -i $spawn_id default { + close -i $spawn_id; + wait -i $spawn_id; + return -1; + } + } + } + set timeout 15 + send -i $spawn_id "binary\n" + expect { + -i $spawn_id -re "200.*$prompt" { } + -i $spawn_id timeout { + close -i $spawn_id; + wait -i $spawn_id; + return -1 + } + } + if [board_info $host exists ftp_directory] { + send "cd [board_info $host ftp_directory]\n"; + expect { + -i $spawn_id -re "250.*$prompt" { } + -i $spawn_id default { + close -i $spawn_id; + wait -i $spawn_id; + return -1; + } + } + } + + if [board_info $host exists ftp_no_passive] { + send "passive\n"; + expect { + -i $spawn_id -re "Passive mode off.*$prompt" { } + -i $spawn_id -re "Passive mode on.*$prompt" { + send "passive\n"; + exp_continue; + } + -i $spawn_id -re ".*$prompt" { } + } + } + + set board_info($host,ftp_fileid) $spawn_id; + return $spawn_id; +} + +# +# Grab REMOTEFILE from HOST and store it as LOCALFILE. +# +proc ftp_upload { host remotefile localfile } { + set prompt "ftp>" + + verbose "ftping $remotefile from $host to $localfile" + set timeout 15 + set spawn_id [ftp_open $host]; + if { $spawn_id < 0 } { + return ""; + } + set loop 1; + + while { $loop } { + send -i $spawn_id "get $remotefile $localfile\n"; + expect { + -i $spawn_id -re ".*Too many open files.*$prompt" { + ftp_close $host; + } + -i $spawn_id -re ".*No such file or directory.*$prompt" { + set loop 0; + set remotefile ""; + } + -i $spawn_id -re "(^|\[\r\n\])226.*$prompt" { set loop 0; } + -i $spawn_id -re "(^|\[\r\n\])\[0-9\]\[0-9\]\[0-9\].*$prompt" { + set loop 0; + set remotefile ""; + } + -i $spawn_id default { + ftp_close $host; + } + } + if { $loop } { + set spawn_id [ftp_open $host]; + if { $spawn_id < 0 } { + return ""; + } + } + } + return $localfile; +} + +# +# Download LOCALFILE to HOST as REMOTEFILE. +# +proc ftp_download { host localfile remotefile } { + set prompt "ftp>" + + verbose "putting $localfile $remotefile" + + if [board_info $host exists hostname] { + set remotehost [board_info $host hostname]; + } else { + set remotehost $host; + } + + set spawn_id [ftp_open $host]; + if { $spawn_id < 0 } { + return ""; + } + set loop 1; + + while { $loop } { + send -i $spawn_id "put $localfile $remotefile\n" + expect { + -i $spawn_id -re ".*Too many open files.*$prompt" { + ftp_close $host; + } + -i $spawn_id -re ".*No such file or directory.*$prompt" { + set loop 0; + set remotefile ""; + } + -re "(^|\[\r\n\])150.*connection for (.*) \[(\]\[0-9.,\]+\\)\[\r\n\]" { + set remotefile $expect_out(2,string); + exp_continue; + } + -i $spawn_id -re "(^|\[\r\n\])226.*$prompt" { + set loop 0; + } + -i $spawn_id -re "Timeout.*$prompt" { + ftp_close $host; + } + -i $spawn_id -re "(^|\[\r\n\])\[0-9\]\[0-9\]\[0-9\].*$prompt" { + set loop 0; + set remotefile ""; + } + -i $spawn_id default { + ftp_close $host; + } + } + if { $loop } { + set spawn_id [ftp_open $host]; + if { $spawn_id < 0 } { + return ""; + } + } + } + return $remotefile; +} + +# +# Close the connection. +# +proc ftp_close { host } { + global board_info + + if [board_info $host exists name] { + set host [board_info $host name]; + } + + if ![board_info $host exists ftp_fileid] { + return ""; + } + + set spawn_id [board_info $host ftp_fileid]; + unset board_info($host,ftp_fileid); + + send -i $spawn_id "quit\n" + close -i $spawn_id + wait -i $spawn_id; + return ""; +} diff --git a/lib/kermit.exp b/lib/kermit.exp new file mode 100644 index 0000000..6e1ac37 --- /dev/null +++ b/lib/kermit.exp @@ -0,0 +1,180 @@ +# 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 + +# +# Connect to DEST using kermit. Note that we're just using kermit as a +# simple serial or network connect program; we don't actually use Kermit +# protocol to do downloads. +# returns -1 if it failed, otherwise it returns +# the spawn_id. +# +proc kermit_open { dest args } { + global spawn_id + global board_info + + if [board_info $dest exists name] { + set dest [board_info $dest name]; + } + if [board_info ${dest} exists serial] { + set port [board_info ${dest} serial]; + set device "-l [board_info ${dest} serial]" + if [board_info ${dest} exists baud] { + append device " -b [board_info ${dest} baud]" + } + } else { + set port [board_info ${dest} netport]; + set device "-j [board_info ${dest} netport]"; + } + + set tries 0 + set result -1 + verbose "kermit $device" + eval spawn kermit $device + if { $spawn_id < 0 } { + perror "invalid spawn id from kermit" + return -1 + } + + expect { + -re ".*ermit.*>.*$" { + send "c\n" + expect { + -re "Connecting to.*$port.*Type the escape character followed by C to.*options.*\[\r\n\]$" { + verbose "Got prompt\n" + set result 0 + incr tries + } + timeout { + warning "Never got prompt from Kermit." + set result -1 + incr tries + if { $tries <= 2 } { + exp_continue + } + } + } + } + -re "Connection Closed.*$" { + perror "Never connected." + set result -1 + incr tries + if { $tries <= 2 } { + exp_continue + } + } + timeout { + warning "Timed out trying to connect." + set result -1 + incr tries + if { $tries<=2 } { + exp_continue + } + } + } + + if { $result < 0 } { + perror "Couldn't connect after $tries tries." + if [info exists board_info($dest,fileid)] { + unset board_info($dest,fileid); + } + return -1 + } else { + verbose "Kermit connection established with spawn_id $spawn_id." + set board_info($dest,fileid) $spawn_id + kermit_command $dest "set file type binary" "set transfer display none" + if [board_info $dest exists transmit_pause] { + kermit_command $dest "set transmit pause [board_info $dest transmit_pause]" + } + return $spawn_id + } +} + +# +# Send a list of commands to the Kermit session connected to DEST. +# +proc kermit_command { dest args } { + if [board_info $dest exists name] { + set dest [board_info $dest name]; + } + set shell_id [board_info $dest fileid]; + # Sometimes we have to send multiple ^\c sequences. Don't know + # why. + set timeout 2; + for { set i 1; } {$i<=5} {incr i} { + send -i $shell_id "c"; + expect { + -i $shell_id -re ".*Back at.*ermit.*>.*$" { set i 10;} + -i $shell_id timeout { + if { $i > 2 } { + warning "Unable to get prompt from kermit."; + } + } + } + } + foreach command $args { + set timeout 120 + send -i $shell_id "${command}\r"; + expect { + -i $shell_id -re ".*ermit.*>.*$" { } + -i $shell_id timeout { + perror "Response failed from kermit."; + return -1; + } + } + } + send -i $shell_id "c\r"; + expect { + -i $shell_id -re ".*other options.\[\r\n\]+" { } + -i $shell_id timeout { + perror "Unable to resume kermit connection."; + return -1; + } + } + return 0; +} + + +# +# Send STRING to DEST. +# +proc kermit_send { dest string args } { + if [board_info $dest exists transmit_pause] { + set f [open "/tmp/fff" "w"]; + puts -nonewline $f "$string"; + close $f; + set result [remote_transmit $dest /tmp/fff]; + remote_file build delete "/tmp/fff"; + return "$result"; + } else { + return [standard_send $dest $string]; + } +} + +# +# Transmit FILE directly to DEST as raw data. No translation is +# performed. +# +proc kermit_transmit { dest file args } { + if [board_info $dest exists transmit_pause] { + kermit_command $dest "transmit $file"; + return ""; + } else { + return [standard_transmit $dest $file]; + } +} diff --git a/lib/libgloss.exp b/lib/libgloss.exp new file mode 100644 index 0000000..8c5bf87 --- /dev/null +++ b/lib/libgloss.exp @@ -0,0 +1,843 @@ +# 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) + +# this contains a list of gcc options and their respective directories. + +# +# Find the pieces of libgloss for testing the GNU development tools +# needed to link a set of object files into an executable. +# This usually means setting the -L and -B paths correctly. +# +proc libgloss_link_flags { args } { + global target_cpu + global srcdir + + # libgloss doesn't work native + if [isnative] { + return "" + } + + # if we're on a remote host, we can't search for the file, so we can only + # use an installed compiler, so we don't add any paths here. + if [is_remote host] { + return "" + } + + set gccpath "[get_multilibs]" + + # map the target_cpu to the proper libgloss directory. unfortunately, these + # directory names are hardcoded into libgloss. + switch -glob -- $target_cpu { + "sparc86x" { + set cpu sparc + } + "sparclite" { + set cpu sparc + } + "sparclet" { + set cpu sparc + } + "sparc64*" { + set cpu sparc + } + "hppa*" { + set cpu pa + } + "mips*" { + set cpu mips + } + "powerpc*" { + set cpu rs6000 + } + "d10v*" { + set cpu libnosys + } + default { + set cpu $target_cpu + } + } + + set gloss_srcdir "" + # look for the libgloss srcdir sp we can find the linker scripts + set gloss_srcdir [lookfor_file ${srcdir} libgloss/$cpu] + + # set the proper paths for gcc if the target subdir exists, else assume we + # have no libgloss support for this target. + if { $gloss_srcdir == "" } { + return "" + } + if [file exists $gccpath/libgloss/$cpu] { + verbose "Libgloss path is $gccpath/libgloss/$cpu" 2 + return "-B$gccpath/libgloss/$cpu/ -L$gccpath/libgloss/$cpu -L$gloss_srcdir" + } else { + verbose -log "No libgloss support for this target." 2 + return "" + } +} + +# There aren't any, but we'll be orthogonal here. + +proc libgloss_include_flags { args } { + return "" +} + +# +# Find the newlib libraries in the current source tree. +# +proc newlib_link_flags { args } { + global tool_root_dir + + # libgloss doesn't work native + if [isnative] { + return "" + } + + # if we're on a remote host, we can't search for the file, so we can only + # use an installed compiler, so we don't add any paths here. + if [is_remote host] { + return "" + } + + set ld_script_path [lookfor_file ${tool_root_dir} "ld/ldscripts"]; + if { $ld_script_path != "" } { + set result "-L[file dirname $ld_script_path]" + } else { + set result "" + } + + set gccpath "[get_multilibs]" + + verbose "Looking for $gccpath/newlib" + if [file exists $gccpath/newlib] { + verbose "Newlib path is $gccpath/newlib" + return "$result -B$gccpath/newlib/ -L$gccpath/newlib" + } else { + verbose "No newlib support for this target" + return "$result" + } +} + +proc newlib_include_flags { args } { + global srcdir + + if [isnative] { + return "" + } + + if [is_remote host] { + return "" + } + + set gccpath "[get_multilibs]" + + if [file exists $gccpath/newlib] { + verbose "Newlib path is $gccpath/newlib" + + set newlib_dir [lookfor_file ${srcdir} newlib/libc/include/assert.h] + if { ${newlib_dir} != "" } { + set newlib_dir [file dirname ${newlib_dir}] + } + return " -I$gccpath/newlib/targ-include -I${newlib_dir}" + } else { + verbose "No newlib support for this target" + } +} + +proc libio_include_flags { args } { + global srcdir + global tool_root_dir + + if [is_remote host] { + return "" + } + + set gccpath "[get_multilibs]" + + if { $gccpath == "" } { + set gccpath "$tool_root_dir"; + } + + set libio_bin_dir [lookfor_file ${gccpath} libio/_G_config.h]; + + # linux doesn't build _G_config.h and the test above fails, so + # we search for iostream.list too. + if { $libio_bin_dir == "" } { + set libio_bin_dir [lookfor_file ${gccpath} libio/iostream.list]; + } + + set libio_src_dir [lookfor_file ${srcdir} libio/Makefile.in] + if { $libio_bin_dir != "" && $libio_src_dir != "" } { + set libio_src_dir [file dirname ${libio_src_dir}] + set libio_bin_dir [file dirname ${libio_bin_dir}]; + return " -I${libio_src_dir} -I${libio_bin_dir}" + } else { + return "" + } +} + +proc libio_link_flags { args } { + if [is_remote host] { + return "" + } + + set gccpath "[get_multilibs]" + + set libio_dir [lookfor_file ${gccpath} libio/libio.a] + if { $libio_dir != "" } { + return "-L[file dirname ${libio_dir}]" + } else { + return "" + } +} + +proc g++_include_flags { args } { + global srcdir + + if [is_remote host] { + return "" + } + + set gccpath [get_multilibs] + set libio_dir "" + set flags "" + + set dir [lookfor_file ${srcdir} libg++] + if { ${dir} != "" } { + append flags "-I${dir} -I${dir}/src " + } + set dir [lookfor_file ${srcdir} libstdc++] + if { ${dir} != "" } { + append flags "-I${dir} -I${dir}/stl" + } + return "$flags" +} + +proc g++_link_flags { args } { + global srcdir + global ld_library_path + + set gccpath [get_multilibs]; + set libio_dir "" + set flags "" + set ld_library_path "." + + if { $gccpath != "" } { + if [file exists "${gccpath}/lib/libstdc++.a"] { + append ld_library_path ":${gccpath}/lib" + } + if [file exists "${gccpath}/libg++/libg++.a"] { + append flags "-L${gccpath}/libg++ " + append ld_library_path ":${gccpath}/libg++" + } + if [file exists "${gccpath}/libstdc++/libstdc++.a"] { + append flags "-L${gccpath}/libstdc++ " + append ld_library_path ":${gccpath}/libstdc++" + } + if [file exists "${gccpath}/libiberty/libiberty.a"] { + append flags "-L${gccpath}/libiberty " + } + if [file exists "${gccpath}/librx/librx.a"] { + append flags "-L${gccpath}/librx " + } + } else { + global tool_root_dir; + + set libgpp [lookfor_file ${tool_root_dir} libg++]; + if { $libgpp != "" } { + append flags "-L${libgpp} "; + append ld_library_path ":${libgpp}" + } + set libstdcpp [lookfor_file ${tool_root_dir} libstdc++]; + if { $libstdcpp != "" } { + append flags "-L${libstdcpp} "; + append ld_library_path ":${libstdcpp}" + } + set libiberty [lookfor_file ${tool_root_dir} libiberty]; + if { $libiberty != "" } { + append flags "-L${libiberty} "; + } + set librx [lookfor_file ${tool_root_dir} librx]; + if { $librx != "" } { + append flags "-L${librx} "; + } + } + return "$flags" +} + +proc libstdc++_include_flags { args } { + global srcdir + + if [is_remote host] { + return "" + } + + set gccpath [get_multilibs] + set libio_dir "" + set flags "" + + set dir [lookfor_file ${srcdir} libstdc++] + if { ${dir} != "" } { + append flags "-I${dir} -I${dir}/stl" + } + return "$flags" +} + +proc libstdc++_link_flags { args } { + global srcdir + global ld_library_path + + set gccpath [get_multilibs]; + set libio_dir "" + set flags "" + + if { $gccpath != "" } { + if [file exists "${gccpath}/libstdc++/libstdc++.a"] { + append flags "-L${gccpath}/libstdc++ " + append ld_library_path ":${gccpath}/libstdc++" + } + if [file exists "${gccpath}/libiberty/libiberty.a"] { + append flags "-L${gccpath}/libiberty " + } + if [file exists "${gccpath}/librx/librx.a"] { + append flags "-L${gccpath}/librx " + } + } else { + global tool_root_dir; + + set libstdcpp [lookfor_file ${tool_root_dir} libstdc++]; + if { $libstdcpp != "" } { + append flags "-L${libstdcpp} "; + append ld_library_path ":${libstdcpp}" + } + set libiberty [lookfor_file ${tool_root_dir} libiberty]; + if { $libiberty != "" } { + append flags "-L${libiberty} "; + } + set librx [lookfor_file ${tool_root_dir} librx]; + if { $librx != "" } { + append flags "-L${librx} "; + } + } + return "$flags" +} + +# +# Get the list of directories and -m options for gcc. This is kinda bogus that +# generic testing software needs support for gcc hardwired in, but to make +# testing the GNU tools work right, there didn't seem to be any other way. +# + +proc get_multilibs { args } { + global target_alias + global board + global board_info + + # if we're on a remote host, we can't search for the file, so we can only + # use an installed compiler, so we don't add any paths here. + if [is_remote host] { + return "" + } + + if [info exists board] { + set target_board $board; + } else { + set target_board [target_info name]; + } + + if { [llength $args] == 0 } { + if [board_info $target_board exists multitop] { + return "[board_info $target_board multitop]"; + } + + set board_info($target_board,multitop) "" + } + + if { [board_info $target_board exists compiler] } { + set compiler [board_info $target_board compiler]; + } else { + set compiler [find_gcc]; + } + + if { $compiler == "" } { + return ""; + } + + foreach x "$compiler" { + if [regexp "^-B" "$x"] { + regsub "^-B" "$x" "" comp_base_dir; + set comp_base_dir [file dirname $comp_base_dir]; + break; + } + } + if { [llength $args] > 0 } { + set mopts [lindex $args 0]; + } else { + if { [board_info $target_board exists multilib_flags] } { + set mopts [board_info $target_board multilib_flags]; + } else { + set mopts "" + } + } + + regsub "^-" $mopts "" moptions + regsub -all " -" $moptions " " dirty_moptions + set moptions "" + foreach x [split $dirty_moptions " "] { + if { $x != "" && [lsearch -exact $moptions $x] < 0 } { + lappend moptions $x + } + } + + regexp "/.* " $compiler compiler + set compiler [string trimright $compiler " "] + verbose "compiler is $compiler" + + if { [which $compiler] == 0 } { + return ""; + } + + if ![info exists comp_base_dir] { + set comp_base_dir [file dirname [file dirname [file dirname [file dirname [file dirname [exec $compiler --print-prog-name=cc1]]]]]]; + } + + # set output [exec $objdump_name --file-headers objfmtst.o ] + set default_multilib [exec $compiler --print-multi-lib] + set default_multilib [lindex $default_multilib 0]; + set extra [string trimleft $default_multilib "."] + + # extract the options and their directory names as know by gcc + foreach i "[exec $compiler --print-multi-lib]" { + if {$extra != ""} { + set i [string trimright $i $extra"] + } + set opts "" + set dir "" + regexp -- "\[a-z0-9=/\.-\]*;" $i dir + set dir [string trimright $dir "\;@"] + regexp -- "\;@*\[\@a-zA-Z0-9=/\.-\]*" $i opts + set opts [split [string trimleft $opts "\;@"] "@"] + lappend multilibs "$dir {$opts }" + } + + # extract the MULTILIB_MATCHES from dumpspecs + set multimatches "" + set lines [split [exec $compiler -dumpspecs] "\n"] + for {set i 0} {$i <= [llength $lines] - 1} {incr i 1} { + if {"*multilib_matches:" == "[lindex $lines $i]"} { + set multimatches [lindex $lines [expr $i + 1]] + break + } + } + # if we find some + if {$multimatches != ""} { + # Split it into a list of pairs. If an moptions are the first + # of a pair, then replace it with the second. If an moption + # is not in multimatches, we assume it's not a multilib option + + set splitmatches [split $multimatches ";"] + set multimatches "" + foreach i $splitmatches { + lappend multimatches [split $i " "] + } + verbose "multimatches: $multimatches" 3 + + verbose "options before multimatches: $moptions" 3 + set toptions $moptions + set moptions "" + foreach i $toptions { + foreach j $multimatches { + verbose "comparing [lindex $j 0] == $i" 3 + if {[lindex $j 0] == $i} { + lappend moptions [lindex $j 1] + } + } + } + verbose "options after multimatches: $moptions" 3 + } + + # search for the top level multilib directory + set multitop [lookfor_file "${comp_base_dir}" "${target_alias}"] + if { $multitop == "" } { + set multitop [lookfor_file "${comp_base_dir}" "libraries"] + if { $multitop == "" } { + set multitop "[lookfor_file ${comp_base_dir} gcc/xgcc]" + if { $multitop != "" } { + set multitop [file dirname [file dirname $multitop]]; + } else { + return "" + } + } + } + + # make a list of -m options from the various compiler config variables + set gccpath "" + + # compare the lists of gcc options with the list of support multilibs + verbose "Supported multilibs are: $multilibs" 3 + set best 0; + foreach i "$multilibs" { + set hits 0 + set opts [lindex $i 1]; + if { [llength $opts] <= [llength $moptions] } { + foreach j "$moptions" { + # see if all the -m options match any of the multilibs + verbose "Looking in $i for $j" 3 + if { [lsearch -exact $opts $j] >= 0 } { + incr hits + } + } + + if { $hits > $best } { + verbose "[lindex $i 0] is better, using as gcc path" 2 + set gccpath "[lindex $i 0]" + set best $hits; + } + } + } + if ![info exists multitop] { + return ""; + } + + verbose "gccpath is $gccpath" 3 + + if [file exists $multitop/$gccpath] { + verbose "GCC path is $multitop/$gccpath" 3 + if { [llength $args] == 0 } { + set board_info($target_board,multitop) "$multitop/$gccpath" + } + return "$multitop/$gccpath" + } else { + verbose "GCC path is $multitop" 3 + if { [llength $args] == 0 } { + set board_info($target_board,multitop) "$multitop" + } + return "$multitop" + } +} + +proc find_binutils_prog { name } { + global tool_root_dir; + + if ![is_remote host] { + + set file [lookfor_file $tool_root_dir $name]; + if { $file == "" } { + set file [lookfor_file $tool_root_dir ${name}-new]; + } + if { $file == "" } { + set file [lookfor_file $tool_root_dir binutils/$name]; + } + if { $file == "" } { + set file [lookfor_file $tool_root_dir binutils/${name}-new]; + } + if { $file != "" } { + set NAME "$file"; + } else { + set NAME [transform $name]; + } + } else { + set NAME [transform $name] + } + return $NAME; +} + +proc find_gcc {} { + global tool_root_dir + + if ![is_remote host] { + set file [lookfor_file $tool_root_dir xgcc]; + if { $file == "" } { + set file [lookfor_file $tool_root_dir gcc/xgcc]; + } + if { $file != "" } { + set CC "$file -B[file dirname $file]/"; + } else { + set CC [transform gcc]; + } + } else { + set CC [transform gcc] + } + return $CC; +} + +proc find_gcj {} { + global tool_root_dir + + if ![is_remote host] { + set file [lookfor_file $tool_root_dir gcj]; + if { $file == "" } { + set file [lookfor_file $tool_root_dir gcc/gcj]; + } + if { $file != "" } { + set CC "$file -B[file dirname $file]/"; + } else { + set CC [transform gcj]; + } + } else { + set CC [transform gcj] + } + return $CC; +} + +proc find_g++ {} { + global tool_root_dir + + if ![is_remote host] { + set file [lookfor_file $tool_root_dir g++]; + if { $file == "" } { + set file [lookfor_file $tool_root_dir gcc/g++]; + } + if { $file != "" } { + set CC "$file -B[file dirname $file]/"; + } else { + set CC [transform g++]; + } + } else { + set CC [transform g++] + } + return $CC; +} + +proc find_g77 {} { + global tool_root_dir + + if ![is_remote host] { + set file [lookfor_file $tool_root_dir g77]; + if { $file == "" } { + set file [lookfor_file $tool_root_dir gcc/g77]; + } + if { $file != "" } { + set CC "$file -B[file dirname $file]/"; + } else { + set CC [transform g77]; + } + } else { + set CC [transform g77] + } + return $CC; +} + +proc find_nm {} { + global tool_root_dir + + set NM "" + if ![is_remote host] { + set NM [lookfor_file $tool_root_dir nm-new] + if {$NM == ""} { + set NM [lookfor_file $tool_root_dir binutils/nm-new] + } + } + if { $NM == ""} { + set NM [transform nm]; + } + return $NM; +} + +proc process_multilib_options { args } { + global board; + global board_variant_list; + global is_gdb_remote; + + set is_gdb_remote 0; + + if [board_info $board exists multilib_flags] { + return; + } + eval add_multilib_option $args; + + set multilib_flags ""; + + foreach x $board_variant_list { + regsub -all "^\[ \t\]*" "$x" "" x; + regsub -all "\[ \t\]*$" "$x" "" x; + + if { $x == "" } { + continue; + } + case $x in { + { aout } { + set_board_info obj_format "a.out"; + } + { elf } { + set_board_info obj_format "elf"; + } + { pe } { + set_board_info obj_format "pe"; + } + { ecoff } { + set_board_info obj_format "ecoff"; + } + { stabs } { + set_board_info debug_flags "-gstabs"; + } + { dwarf2 } { + set_board_info debug_flags "-gdwarf2"; + } + { gdb:*=* } { + regsub "^gdb:\[^=\]*=(.*)$" "$x" "\\1" value; + regsub "^gdb:(\[^=\]*)=.*$" "$x" "\\1" variable; + set_board_info $variable "$value"; + } + { gdb*remote } { + set is_gdb_remote 1; + } + { little*endian el EL } { + append multilib_flags " -EL"; + } + { big*endian eb EB } { + append multilib_flags " -EB"; + } + { "soft*float" } { + append multilib_flags " -msoft-float" + } + { "-*" } { + append multilib_flags " $x"; + } + default { + append multilib_flags " -m$x"; + } + } + } + set_board_info multilib_flags $multilib_flags; +} + +proc add_multilib_option { args } { + global board_variant_list + + if ![info exists board_variant_list] { + set board_variant_list "" + } + set board_variant_list [concat $args $board_variant_list]; +} + +proc find_gas { } { + global tool_root_dir + + set AS "" + + if ![is_remote host] { + set AS [lookfor_file $tool_root_dir as-new]; + if { $AS == "" } { + set AS [lookfor_file $tool_root_dir gas/as-new]; + } + } + if { $AS == "" } { + set AS [transform as]; + } + return $AS; +} + +proc find_ld { } { + global tool_root_dir + + set LD "" + + if ![is_remote host] { + set LD [lookfor_file $tool_root_dir ld-new]; + if { $LD == "" } { + set LD [lookfor_file $tool_root_dir ld/ld-new]; + } + } + if { $LD == "" } { + set LD [transform ld]; + } + return $LD; +} + +proc build_wrapper { gluefile } { + global libdir + + if [target_info exists wrap_m68k_aout] { + set flags "additional_flags=-DWRAP_M68K_AOUT"; + set result ""; + } elseif [target_info exists uses_underscores] { + set flags "additional_flags=-DUNDERSCORES"; + set result "-Wl,-wrap,__exit -Wl,-wrap,_main -Wl,-wrap,_abort"; + } else { + set flags ""; + if [target_info exists is_vxworks] { + set flags "additional_flags=-DVXWORKS"; + } + set result "-Wl,-wrap,exit -Wl,-wrap,main -Wl,-wrap,abort"; + } + if [target_info exists wrap_compile_flags] { + lappend flags "additional_flags=[target_info wrap_compile_flags]"; + } + if { [target_compile ${libdir}/testglue.c ${gluefile} object $flags] == "" } { + set gluefile [remote_download host ${gluefile} testglue.o]; + return [list $gluefile $result]; + } else { + return "" + } +} + + +proc winsup_include_flags { args } { + global srcdir + + if [isnative] { + return "" + } + + if [is_remote host] { + return "" + } + + set gccpath "[get_multilibs]" + + if [file exists $gccpath/winsup] { + verbose "Winsup path is $gccpath/winsup" + + set winsup_dir [lookfor_file ${srcdir} winsup/include/windows.h] + if { ${winsup_dir} != "" } { + set winsup_dir [file dirname ${winsup_dir}] + return " -I${winsup_dir}" + } + } + verbose "No winsup support for this target" + +} +# +# Find the winsup libraries in the current source tree. +# +proc winsup_link_flags { args } { + # libgloss doesn't work native + if [isnative] { + return "" + } + + # if we're on a remote host, we can't search for the file, so we can only + # use an installed compiler, so we don't add any paths here. + if [is_remote host] { + return "" + } + + set gccpath "[get_multilibs]" + + verbose "Looking for $gccpath/winsup" + if [file exists $gccpath/winsup] { + verbose "Winsup path is $gccpath/newlib" + return "-B$gccpath/winsup/ -L$gccpath/winsup" + } else { + verbose "No winsup support for this target" + return "" + } +} diff --git a/lib/mondfe.exp b/lib/mondfe.exp new file mode 100644 index 0000000..b46484e --- /dev/null +++ b/lib/mondfe.exp @@ -0,0 +1,213 @@ +# 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) + +# +# Connect to udi using mondfe +# +# HOSTNAME can be `iss' to talk to the simulator. +# The result is the value of `spawn_id' or -1 for failure. +# +proc mondfe_open { hostname } { + global spawn_id + global board_info + + set retries 0 + set result -1 + + set shell_prompt [board_info $hostname shell_prompt] + if ![board_info $hostname exists mondfe,name] { + perror "Must set board_info(${hostname},mondfe,name)" + return -1; + } + if [board_info $hostname exists mondfe] { + set mondfe [board_info $hostname mondfe]; + } else { + set mondfe "mondfe" + } + + set remote_host [board_info $hostname mondfe,name]; + + if [board_info $hostname exists mondfe_host] { + set rh [board_info $hostname mondfe_host]; + } else { + verbose "Attempting to connect to $hostname via mondfe." + set rh "host"; + } + + set shell_id [remote_spawn $rh "$mondfe -D -TIP $remote_host"]; + + remote_expect $rh 60 { + "$shell_prompt" { + verbose "Got prompt" + set result 0 + } + "*server bind*failed: Address already in use*" { + warning "Socket file already exists." + incr retries + if { $retries <= 2 } { + exp_continue; + } + } + -indices -re ".*(UDIERROR\[^\r\n\]*)\[\r\n\]" { + warning "$expect_out(1,string)" + exp_continue; + } + -indices -re ".*(DFEERROR\[^\r\n\]*)\[\r\n\]" { + warning "$expect_out(1,string)" + exp_continue; + } + timeout { + warning "Timed out trying to connect." + set result -1 + incr retries + if { $retries <= 2 } { + remote_send $rh "\n" + exp_continue; + } + } + } + + if { $result < 0 } { + perror "Couldn't connect after $retries retries." + remote_close $rh; + return -1 + } else { + set board_info($hostname,fileid) $shell_id; + return $shell_id; + } +} + +# +# Downloads using the y (yank) command in mondfe +# +# FILE is a full path name to the file to download. +# Returns 1 if an error occured, 0 otherwise. +# +proc mondfe_ld { dest_machine file } { + global decimal # Regexp to match a decimal number. + + if ![file exists $file] { + perror "$file doesn't exist." + return "" + } + + set shell_prompt [board_info $dest_machine shell_prompt] + + if [board_info $dest_machine exists mondfe_host] { + set remote_host [board_info $dest_machine mondfe_host]; + set file [remote_download $remote_host $file montest] + } else { + set remote_host "host"; + } + + verbose "Downloading $file." 2 + verbose "Shell prompt is $shell_prompt." 3 + set result 1 + remote_send $remote_host "y $file\n" + remote_expect $remote_host 60 { + "y $file" { + exp_continue; + } + -re "loading $file\[\r\n\]+" { + exp_continue; + } + -re "Load(ing|ed) *TEXT section from\[^\r\n\]*\[\r\n\]+" { + verbose -n "." 2 + exp_continue; + } + -re "Load(ing|ed) *LIT section from\[^\r\n\]*\[\r\n\]+" { + verbose -n "." 2 + exp_continue; + } + -re "Load(ing|ed) *DATA section from\[^\r\n\]*\[\r\n\]+" { + verbose -n "." 2 + exp_continue; + } + -re "Clear(ing|ed) *BSS section from\[^\r\n\]*\[\r\n\]+" { + verbose -n "." 2 + exp_continue; + } + -re "(^|\[\r\n\]+)$shell_prompt$" { + verbose "Downloaded $file successfully." 2 + set result 0 + } + -re "Command failed.*$shell_prompt$" { + set result 1 + } + -re "DFEWARNING: $decimal : EMMAGIC: Bad COFF file magic number.*Command failed.*$shell_prompt$" { + warning "Bad COFF file magic number" + set result 1 + } + -re "Ignoring COMMENT section \($decimal bytes\)\[^\r\n\]*\[\r\n\]+" { + verbose "Ignoring COMMENT section" 2 + exp_continue; + } + timeout { + perror "Timed out trying to download $file." + set result 1 + } + } + + if { $result && [info exists expect_out(buffer)] } { + send_log $expect_out(buffer) + } + + if [board_info $dest_machine exists mondfe_host] { + remote_file $remote_machine delete $file + } + + return $result +} + +# +# Exit the remote shell +# +proc mondfe_close { hostname } { + global board_info + + if [board_info $hostname exists mondfe_host] { + set remote_host [board_info $hostname mondfe_host]; + } else { + set remote_host "host"; + } + + if ![board_info $hostname exists fileid] { + return 0; + } + + if [board_info $remote_host exists fileid] { + remote_send $remote_host "q\n" + remote_expect $remote_host 30 { + "Goodbye." { + verbose "Exited mondfe." + } + timeout { + warning "mondfe didn't exit cleanly." + } + } + + remote_close $remote_host; + } + + unset board_info($hostname,fileid); + + return 0; +} diff --git a/lib/remote.exp b/lib/remote.exp new file mode 100644 index 0000000..0bc8ed0 --- /dev/null +++ b/lib/remote.exp @@ -0,0 +1,1265 @@ +# 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) + +# load various protocol support modules + +load_lib "mondfe.exp" +load_lib "xsh.exp" +load_lib "telnet.exp" +load_lib "rlogin.exp" +load_lib "kermit.exp" +load_lib "tip.exp" +load_lib "rsh.exp" +load_lib "ftp.exp" + +# +# Open a connection to a remote host or target. This requires the target_info +# array be filled in with the proper info to work. +# +# type is either "build", "host", "target", or the name of a board loaded +# into the board_info array. The default is target if no name is supplied. +# It returns the spawn id of the process that is the connection. +# + +proc remote_open { args } { + global reboot + + if { [llength $args] == 0 } { + set type "target" + } else { + set type $args + } + + # Shudder... + if { $reboot && $type == "target" } { + reboot_target; + } + + return [call_remote "" open $type]; +} + +proc remote_raw_open { args } { + return [eval call_remote raw open $args]; +} + +# Run the specified COMMANDLINE on the local machine, redirecting input +# to file INP (if non-empty), redirecting output to file OUTP (if non-empty), +# and waiting TIMEOUT seconds for the command to complete before killing +# it. A two-member list is returned; the first member is the exit status +# of the command, the second is any output produced from the command +# (if output is redirected, this may or may not be empty). If output is +# redirected, both stdout and stderr will appear in the specified file. +# +# Caveats: A pipeline is used if input or output is redirected. There +# will be problems with killing the program if a pipeline is used. Either +# the "tee" command or the "cat" command is used in the pipeline if input +# or output is redirected. If the program needs to be killed, /bin/sh and +# the kill command will be invoked. +# +proc local_exec { commandline inp outp timeout } { + # TCL's exec is a pile of crap. It does two very inappropriate things; + # firstly, it has no business returning an error if the program being + # executed happens to write to stderr. Secondly, it appends its own + # error messages to the output of the command if the process exits with + # non-zero status. + # + # So, ok, we do this funny stuff with using spawn sometimes and + # open others because of spawn's inability to invoke commands with + # redirected I/O. We also hope that nobody passes in a command that's + # a pipeline, because spawn can't handle it. + # + # We want to use spawn in most cases, because tcl's pipe mechanism + # doesn't assign process groups correctly and we can't reliably kill + # programs that bear children. We can't use tcl's exec because it has + # no way to timeout programs that hang. *sigh* + # + if { "$inp" == "" && "$outp" == "" } { + set id -1; + set result [catch "eval spawn \{${commandline}\}" pid]; + if { $result == 0 } { + set result2 0; + } else { + set pid 0; + set result2 5; + } + } else { + # Can you say "uuuuuugly"? I knew you could! + # All in the name of non-infinite hangs. + if { $inp != "" } { + set inp "< $inp"; + set mode "r"; + } else { + set mode "w"; + } + + set use_tee 0; + # We add |& cat so that TCL exec doesn't freak out if the + # program writes to stderr. + if { $outp == "" } { + set outp "|& cat" + } else { + set outpf "$outp"; + set outp "> $outp" + if { $inp != "" } { + set use_tee 1; + } + } + # Why do we use tee? Because open can't redirect both input and output. + if { $use_tee } { + set result [catch {open "| ${commandline} $inp |& tee $outpf" RDONLY} id] ; + } else { + set result [catch {open "| ${commandline} $inp $outp" $mode} id] ; + } + + if { $result != 0 } { + global errorInfo + return [list -1 "open of $commandline $inp $outp failed: $errorInfo"]; + } + set pid [pid $id]; + set result [catch "spawn -leaveopen $id" result2]; + } + # Prepend "-" to each pid, to generate the "process group IDs" needed by + # kill. + set pgid "-[join $pid { -}]"; + verbose "pid is $pid $pgid"; + if { $result != 0 || $result2 != 0 } { + # This shouldn't happen. + global errorInfo; + if [info exists errorInfo] { + set foo $errorInfo; + } else { + set foo ""; + } + verbose "spawn -open $id failed, $result $result2, $foo"; + catch "close $id"; + return [list -1 "spawn failed"]; + } + + set got_eof 0; + set output ""; + + # Wait for either $timeout seconds to elapse, or for the program to + # exit. + expect { + -i $spawn_id -timeout $timeout -re ".+" { + append output $expect_out(buffer); + if { [string length $output] < 512000 } { + exp_continue -continue_timer; + } + } + timeout { + warning "program timed out."; + } + eof { + set got_eof 1; + } + } + + # Uuuuuuugh. Now I'm getting really sick. + # If we didn't get an EOF, we have to kill the poor defenseless program. + # However, TCL has no kill primitive, so we have to execute an external + # command in order to execute the execution. (English. Gotta love it.) + if { ! $got_eof } { + verbose "killing $pid $pgid"; + exec sh -c "exec > /dev/null 2>&1 && (kill -2 $pgid || kill -2 $pid) && sleep 5 && (kill -15 $pgid || kill $pid) && sleep 5 && (kill -9 $pgid || kill -9 $pid)" &; + } + # This will hang if the kill doesn't work. Nothin' to do, and it's not ok. + catch "close -i $spawn_id"; + set r2 [catch "wait -i $spawn_id" wres]; + if { $id > 0 } { + set r2 [catch "close $id" res]; + } else { + verbose "waitres is $wres" 2; + if { $r2 == 0 } { + set r2 [lindex $wres 3]; + if { [llength $wres] > 4 } { + if { [lindex $wres 4] == "CHILDKILLED" } { + set r2 1; + } + } + if { $r2 != 0 } { + set res "$wres"; + } else { + set res ""; + } + } else { + set res "wait failed"; + } + } + if { $r2 != 0 || $res != "" || ! $got_eof } { + verbose "close result is $res"; + set status 1; + } else { + set status 0; + } + verbose "output is $output"; + if { $outp == "" } { + return [list $status $output]; + } else { + return [list $status ""]; + } +} + +# +# Execute the supplied program on HOSTNAME. There are four optional arguments; +# the first is a set of arguments to pass to PROGRAM, the second is an +# input file to feed to stdin of PROGRAM, the third is the name of an +# output file where the output from PROGRAM should be written, and +# the fourth is a timeout value (we give up after the specified # of seconds +# has elapsed). +# +# A two-element list is returned. The first value is the exit status of the +# program (-1 if the exec failed). The second is any output produced by +# the program (which may or may not be empty if output from the program was +# redirected). +# +proc remote_exec { hostname program args } { + if { [llength $args] > 0 } { + set pargs [lindex $args 0]; + } else { + set pargs "" + } + + if { [llength $args] > 1 } { + set inp "[lindex $args 1]"; + } else { + set inp "" + } + + if { [llength $args] > 2 } { + set outp "[lindex $args 2]"; + } else { + set outp "" + } + + # 300 is probably a lame default. + if { [llength $args] > 3 } { + set timeout "[lindex $args 3]"; + } else { + set timeout 300 + } + + verbose -log "Executing on $hostname: $program $pargs $inp $outp (timeout = $timeout)" 2; + + # Run it locally if appropriate. + if { ![is_remote $hostname] } { + return [local_exec "$program $pargs" $inp $outp $timeout]; + } else { + return [call_remote "" exec $hostname $program $pargs $inp $outp]; + } +} + +proc standard_exec { hostname args } { + return [eval rsh_exec \"$hostname\" $args]; +} + +# +# Close the remote connection. +# arg - This is the name of the machine whose connection we're closing, +# or target, host or build. +# + +proc remote_close { host } { + while { 1 } { + set result [call_remote "" close "$host"]; + if { [remote_pop_conn $host] != "pass" } { + break; + } + } + return $result; +} + +proc remote_raw_close { host } { + return [call_remote raw close "$host"]; +} + +proc standard_close { host } { + global board_info + + if [board_info ${host} exists fileid] { + set shell_id [board_info ${host} fileid]; + set pid -1; + + verbose "Closing the remote shell $shell_id" 2 + if [board_info ${host} exists fileid_origid] { + set oid [board_info ${host} fileid_origid]; + set pid [pid $oid]; + unset board_info(${host},fileid_origid); + } else { + set result [catch "exp_pid -i $shell_id" pid]; + if { $result != 0 || $pid <= 0 } { + set result [catch "pid $shell_id" pid]; + if { $result != 0 } { + set pid -1; + } + } + } + if { $pid > 0 } { + verbose "doing kill, pid is $pid"; + # This is very, very nasty. Then again, if after did something + # reasonable... + set pgid "-[join $pid { -}]"; + exec sh -c "exec > /dev/null 2>&1 && (kill -2 $pgid || kill -2 $pid) && sleep 5 && (kill $pgid || kill $pid) && sleep 5 && (kill -9 $pgid || kill -9 $pid)" &; + } + verbose "pid is $pid"; + catch "close -i $shell_id"; + if [info exists oid] { + catch "close $oid"; + } + catch "wait -i $shell_id"; + unset board_info(${host},fileid); + verbose "Shell closed."; + } + return 0; +} + +# +# Set the connection into "binary" mode, a.k.a. no processing of input +# characters. +# +proc remote_binary { host } { + return [call_remote "" binary "$host"]; +} + +proc remote_raw_binary { host } { + return [call_remote raw binary "$host"]; +} + + + +proc remote_reboot { host } { + clone_output "\nRebooting ${host}\n"; + # FIXME: don't close the host connection, or all the remote + # procedures will fail. + # remote_close $host; + set status [call_remote "" reboot "$host"]; + if [board_info $host exists name] { + set host [board_info $host name]; + } + if { [info proc ${host}_init] != "" } { + ${host}_init $host; + } + return $status; +} + +proc standard_reboot { host } { + return ""; +} +# +# Download file FILE to DEST. If the optional DESTFILE is specified, +# that file will be used on the destination board. It returns either +# "" (indicating that the download failed), or the name of the file on +# the destination machine. +# + +proc remote_download { dest file args } { + if { [llength $args] > 0 } { + set destfile [lindex $args 0]; + } else { + set destfile [file tail $file]; + } + + if { ![is_remote $dest] } { + if { $destfile == "" || $destfile == $file } { + return $file; + } else { + set result [catch "exec cp -p $file $destfile" output]; + if [regexp "same file|are identical" $output] { + set result 0 + set output "" + } else { + # try to make sure we can read it + # and write it (in case we copy onto it again) + catch {exec chmod u+rw $destfile} + } + if { $result != 0 || $output != "" } { + perror "remote_download to $dest of $file to $destfile: $output" + return ""; + } else { + return $destfile; + } + } + } + + return [call_remote "" download $dest $file $destfile]; +} + +# +# The default download procedure. Uses rcp to download to $dest. +# + +proc standard_download {dest file destfile} { + return [rsh_download $dest $file $destfile]; +} + +proc remote_upload {dest srcfile args} { + if { [llength $args] > 0 } { + set destfile [lindex $args 0]; + } else { + set destfile [file tail $srcfile]; + } + + if { ![is_remote $dest] } { + if { $destfile == "" || $srcfile == $destfile } { + return $srcfile; + } + set result [catch "exec cp -p $srcfile $destfile" output]; + return $destfile; + } + + return [call_remote "" upload $dest $srcfile $destfile]; +} + +proc standard_upload { dest srcfile destfile } { + return [rsh_upload $dest $srcfile $destfile]; +} + +# +# A standard procedure to call the appropriate function. It first looks +# for a board-specific version, then a version specific to the protocol, +# and then finally it will call standard_$proc. +# + +proc call_remote { type proc dest args } { + if [board_info $dest exists name] { + set dest [board_info $dest name]; + } + + if { $dest != "host" && $dest != "build" && $dest != "target" } { + if { ![board_info $dest exists name] } { + global board; + + if [info exists board] { + blooie + } + load_board_description $dest; + } + } + + set high_prot "" + if { $type != "raw" } { + if [board_info $dest exists protocol] { + set high_prot "${dest} [board_info $dest protocol]"; + } else { + set high_prot "${dest} [board_info $dest generic_name]"; + } + } + + verbose "call_remote $type $proc $dest $args " 3 + # Close has to be handled specially. + if { $proc == "close" || $proc == "open" } { + foreach try "$high_prot [board_info $dest connect] telnet standard" { + if { $try != "" } { + if { [info proc "${try}_${proc}"] != "" } { + verbose "call_remote calling ${try}_${proc}" 3 + set result [eval ${try}_${proc} \"$dest\" $args]; + break; + } + } + } + set ft "[board_info $dest file_transfer]" + if { [info proc "${ft}_${proc}"] != "" } { + verbose "calling ${ft}_${proc} $dest $args" 3 + set result2 [eval ${ft}_${proc} \"$dest\" $args]; + } + if ![info exists result] { + if [info exists result2] { + set result $result2; + } else { + set result ""; + } + } + return $result; + } + foreach try "${high_prot} [board_info $dest file_transfer] [board_info $dest connect] telnet standard" { + verbose "looking for ${try}_${proc}" 4 + if { $try != "" } { + if { [info proc "${try}_${proc}"] != "" } { + verbose "call_remote calling ${try}_${proc}" 3 + return [eval ${try}_${proc} \"$dest\" $args]; + } + } + } + if { $proc == "close" } { + return "" + } + error "No procedure for '$proc' in call_remote" + return -1; +} + +# +# Send FILE through the existing session established to DEST. +# +proc remote_transmit { dest file } { + return [call_remote "" transmit "$dest" "$file"]; +} + +proc remote_raw_transmit { dest file } { + return [call_remote raw transmit "$dest" "$file"]; +} + +# +# The default transmit procedure if no other exists. This feeds the +# supplied file directly into the connection. +# +proc standard_transmit {dest file} { + if [board_info ${dest} exists name] { + set dest [board_info ${dest} name]; + } + if [board_info ${dest} exists baud] { + set baud [board_info ${dest} baud]; + } else { + set baud 9600; + } + set shell_id [board_info ${dest} fileid]; + + set lines 0 + set chars 0; + set fd [open $file r] + while { [gets $fd cur_line] >= 0 } { + set errmess "" + catch "send -i $shell_id \"$cur_line\r\"" errmess + if [string match "write\(spawn_id=\[0-9\]+\):" $errmess] { + perror "sent \"$cur_line\" got expect error \"$errmess\"" + catch "close $fd" + return -1 + } + set chars [expr $chars + ([string length $cur_line] * 10)] + if { $chars > $baud } { + sleep 1; + set chars 0 + } + verbose "." 3 + verbose "Sent $cur_line" 4 + incr lines + } + verbose "$lines lines transmitted" 2 + close $fd + return 0 +} + +proc remote_send { dest string } { + return [call_remote "" send "$dest" "$string"]; +} + +proc remote_raw_send { dest string } { + return [call_remote raw send "$dest" "$string"]; +} + +proc standard_send { dest string } { + if ![board_info $dest exists fileid] { + perror "no fileid for $dest" + return "no fileid for $dest"; + } else { + set shell_id [board_info $dest fileid] + verbose "shell_id in standard_send is $shell_id" 3 + verbose "send -i [board_info $dest fileid] -- {$string}" 3 + if [catch "send -i [board_info $dest fileid] -- {$string}" errorInfo] { + return "$errorInfo"; + } else { + return ""; + } + } +} + +proc file_on_host { op file args } { + return [eval remote_file host \"$op\" '\$file\" $args]; +} + +proc file_on_build { op file args } { + return [eval remote_file build \"$op\" \"$file\" $args]; +} + +proc remote_file { dest args } { + return [eval call_remote \"\" file \"$dest\" $args]; +} + +proc remote_raw_file { dest args } { + return [eval call_remote raw file \"$dest\" $args]; +} + +# +# Perform the specified file op on a remote Unix board. +# + +proc standard_file { dest op args } { + set file [lindex $args 0]; + verbose "dest in standard_file is $dest"; + if { ![is_remote $dest] } { + switch $op { + cmp { + set otherfile [lindex $args 1]; + if { [file exists $file] && [file exists $otherfile] + && [file size $file] == [file size $otherfile] } { + set r [remote_exec build cmp "$file $otherfile"]; + if { [lindex $r 0] == 0 } { + return 0; + } + } + return 1; + } + tail { + return [file tail $file]; + } + dirname { + if { [file pathtype $file] == "relative" } { + set file [remote_file $dest absolute $file]; + } + set result [file dirname $file]; + if { $result == "" } { + return "/"; + } + return $result; + } + join { + return [file join [lindex $args 0] [lindex $args 1]]; + } + absolute { + return [unix_clean_filename $dest $file]; + } + exists { + return [file exists $file]; + } + delete { + foreach x $args { + if { [file exists $x] && [file isfile $x] } { + exec rm -f $x; + } + } + return; + } + } + } + switch $op { + exists { + # mmmm, quotes. + set status [remote_exec $dest "sh -c 'exit `\[ -f $file \]`'"]; + return [lindex $status 0]; + } + delete { + set file "" + # Allow multiple files to be deleted at once. + foreach x $args { + append file " $x"; + } + verbose "remote_file deleting $file" + set status [remote_exec $dest "rm -f $file"]; + return [lindex $status 0]; + } + } +} + +# +# Return an absolute version of the filename in $file, with . and .. +# removed. +# +proc unix_clean_filename { dest file } { + if { [file pathtype $file] == "relative" } { + set file [remote_file $dest join [pwd] $file]; + } + set result ""; + foreach x [split $file "/"] { + if { $x == "." || $x == "" } { + continue; + } + if { $x == ".." } { + set rlen [expr [llength $result] - 2]; + if { $rlen >= 0 } { + set result [lrange $result 0 $rlen]; + } else { + set result "" + } + continue; + } + lappend result $x; + } + return "/[join $result /]" +} + +# +# Start COMMANDLINE running on DEST. By default it is not possible to +# redirect I/O. If the optional keyword "readonly" is specified, input +# to the command may be redirected. If the optional keyword +# "writeonly" is specified, output from the command may be redirected. +# +# If the command is successfully started, a positive "spawn id" is returned. +# If the spawn fails, a negative value will be returned. +# +# Once the command is spawned, you can interact with it via the remote_expect +# and remote_wait functions. +# +proc remote_spawn { dest commandline args } { + global board_info + + if ![is_remote $dest] { + if [info exists board_info($dest,fileid)] { + unset board_info($dest,fileid); + } + verbose "remote_spawn is local" 3; + if [board_info $dest exists name] { + set dest [board_info $dest name]; + } + + verbose "spawning command $commandline" + + if { [llength $args] > 0 } { + if { [lindex $args 0] == "readonly" } { + set result [catch { open "| ${commandline} |& cat" "r" } id]; + if { $result != 0 } { + return -1; + } + } else { + set result [catch {open "| ${commandline}" "w"} id] ; + if { $result != 0 } { + return -1; + } + } + set result [catch "spawn -leaveopen $id" result2]; + if { $result == 0 && $result2 == 0} { + verbose "setting board_info($dest,fileid) to $spawn_id" 3 + set board_info($dest,fileid) $spawn_id; + set board_info($dest,fileid_origid) $id; + return $spawn_id; + } else { + # This shouldn't happen. + global errorInfo; + if [info exists errorInfo] { + set foo $errorInfo; + } else { + set foo ""; + } + verbose "spawn -open $id failed, $result $result2, $foo"; + catch "close $id"; + return -1; + } + } else { + set result [catch "spawn $commandline" pid]; + if { $result == 0 } { + verbose "setting board_info($dest,fileid) to $spawn_id" 3 + set board_info($dest,fileid) $spawn_id; + return $spawn_id; + } else { + verbose -log "spawn of $commandline failed"; + return -1; + } + } + } + + # Seems to me there should be a cleaner way to do this. + if { "$args" == "" } { + return [call_remote "" spawn "$dest" "$commandline"]; + } else { + return [call_remote "" spawn "$dest" "$commandline" $args]; + } +} + +proc remote_raw_spawn { dest commandline } { + return [call_remote raw spawn "$dest" "$commandline"]; +} + +# +# The default spawn procedure. Uses rsh to connect to $dest. +# +proc standard_spawn { dest commandline } { + global board_info + + if [board_info $dest exists hostname] { + set remote [board_info $dest hostname]; + } else { + set remote $dest; + } + spawn rsh $remote $commandline; + set board_info($dest,fileid) $spawn_id; + return $spawn_id; +} + +# +# Run PROG on DEST, with optional arguments, input and output files. +# It returns a list of two items. The first is ether "pass" if the program +# loaded, ran and exited with a zero exit status, or "fail" otherwise. +# The second argument is any output produced by the program while it was +# running. +# +proc remote_load { dest prog args } { + global tool + + set dname [board_info $dest name]; + set cache "[getenv REMOTELOAD_CACHE]/$tool/$dname/[file tail $prog]"; + set empty [is_remote $dest]; + if { [board_info $dest exists is_simulator] || [getenv REMOTELOAD_CACHE] == "" } { + set empty 0; + } else { + for { set x 0; } {$x < [llength $args] } {incr x} { + if { [lindex $args $x] != "" } { + set empty 0; + break; + } + } + } + if $empty { + global sum_program; + + if [info exists sum_program] { + if ![target_info exists objcopy] { + set_currtarget_info objcopy [find_binutils_prog objcopy]; + } + if [is_remote host] { + set dprog [remote_download host $prog "a.out"]; + } else { + set dprog $prog; + } + set status [remote_exec host "[target_info objcopy]" "-O srec $dprog ${dprog}.sum"]; + if [is_remote host] { + remote_file upload ${dprog}.sum ${prog}.sum; + } + if { [lindex $status 0] == 0 } { + set sumout [remote_exec build "$sum_program" "${prog}.sum"]; + set sum [lindex $sumout 1]; + regsub "\[\r\n \t\]+$" "$sum" "" sum; + } else { + set sumout [remote_exec build "$sum_program" "${prog}"]; + set sum [lindex $sumout 1]; + regsub "\[\r\n \t\]+$" "$sum" "" sum; + } + remote_file build delete ${prog}.sum; + } + if [file exists $cache] { + set same 0; + if [info exists sum_program] { + set id [open $cache "r"]; + set oldsum [read $id]; + close $id; + if { $oldsum == $sum } { + set same 1; + } + } else { + if { [remote_file build cmp $prog $cache] == 0 } { + set same 1; + } + } + if { $same } { + set fd [open "${cache}.res" "r"]; + gets $fd l1; + set result [list $l1 [read $fd]]; + close $fd; + } + } + } + if ![info exists result] { + set result [eval call_remote \"\" load \"$dname\" \"$prog\" $args]; + # Not quite happy about the "pass" condition, but it makes sense if + # you think about it for a while-- *why* did the test not pass? + if { $empty && [lindex $result 0] == "pass" } { + if { [getenv LOAD_REMOTECACHE] != "" } { + set dir "[getenv REMOTELOAD_CACHE]/$tool/$dname" + if ![file exists $dir] { + file mkdir $dir + } + if [file exists $dir] { + if [info exists sum_program] { + set id [open $cache "w"]; + puts -nonewline $id "$sum"; + close $id; + } else { + remote_exec build cp "$prog $cache"; + } + set id [open "${cache}.res" "w"]; + puts $id [lindex $result 0]; + puts -nonewline $id [lindex $result 1]; + close $id; + } + } + } + } + return $result; +} + +proc remote_raw_load { dest prog args } { + return [eval call_remote raw load \"$dest\" \"$prog\" $args ]; +} + +# +# The default load procedure if no other exists for $dest. It uses +# remote_download and remote_exec to load and execute the program. +# + +proc standard_load { dest prog args } { + if { [llength $args] > 0 } { + set pargs [lindex $args 0]; + } else { + set pargs "" + } + + if { [llength $args] > 1 } { + set inp "[lindex $args 1]"; + } else { + set inp "" + } + + if ![file exists $prog] then { + # We call both here because this should never happen. + perror "$prog does not exist in standard_load." + verbose -log "$prog does not exist." 3 + return "untested" + } + + if [is_remote $dest] { + set remotefile "/tmp/[file tail $prog].[pid]" + set remotefile [remote_download $dest $prog $remotefile]; + if { $remotefile == "" } { + verbose -log "Download of $prog to [board_info $dest name] failed." 3 + return "unresolved" + } + if [board_info $dest exists remote_link] { + if [[board_info $dest remote_link] $remotefile] { + verbose -log "Couldn't do remote link" + remote_file target delete $remotefile + return "unresolved" + } + } + set status [remote_exec $dest $remotefile $pargs $inp]; + remote_file $dest delete $remotefile; + } else { + set status [remote_exec $dest $prog $pargs $inp]; + } + if { [lindex $status 0] < 0 } { + verbose -log "Couldn't execute $prog, [lindex $status 1]" 3 + return "unresolved" + } + set output [lindex $status 1] + set status [lindex $status 0] + + verbose -log "Executed $prog, status $status" 2 + if ![string match "" $output] { + verbose -log -- "$output" 2 + } + if { $status == 0 } { + return [list "pass" $output]; + } else { + return [list "fail" $output]; + } +} + +# +# Loads PROG into DEST. +# +proc remote_ld { dest prog } { + return [eval call_remote \"\" ld \"$dest\" \"$prog\"]; +} + +proc remote_raw_ld { dest prog } { + return [eval call_remote raw ld \"$dest\" \"$prog\"]; +} + +# Wait up to TIMEOUT seconds for the last spawned command on DEST to +# complete. A list of two values is returned; the first is the exit +# status (-1 if the program timed out), and the second is any output +# produced by the command. + +proc remote_wait { dest timeout } { + return [eval call_remote \"\" wait \"$dest\" $timeout]; +} + +proc remote_raw_wait { dest timeout } { + return [eval call_remote raw wait \"$dest\" $timeout]; +} + +# The standard wait procedure, used for commands spawned on the local +# machine. +proc standard_wait { dest timeout } { + set output ""; + set status -1; + + if [info exists exp_close_result] { + unset exp_close_result; + } + remote_expect $dest $timeout { + -re ".+" { + append output $expect_out(buffer); + if { [string length $output] > 512000 } { + remote_close $dest; + set status 1; + } else { + exp_continue -continue_timer; + } + } + timeout { + warning "program timed out."; + } + eof { + if [board_info $dest exists fileid_origid] { + global board_info; + + set id [board_info $dest fileid]; + set oid [board_info $dest fileid_origid]; + verbose "$id $oid" + unset board_info($dest,fileid); + unset board_info($dest,fileid_origid); + catch "close -i $id"; + # I don't believe this. You HAVE to do a wait, even tho + # it won't work! stupid ()*$%*)(% expect... + catch "wait -i $id"; + set r2 [catch "close $oid" res]; + if { $r2 != 0 } { + verbose "close result is $res"; + set status 1; + } else { + set status 0; + } + } else { + set s [wait -i [board_info $dest fileid]]; + if { [lindex $s 0] != 0 && [lindex $s 2] == 0 } { + set status [lindex $s 3]; + if { [llength $s] > 4 } { + if { [lindex $s 4] == "CHILDKILLED" } { + set status 1; + } + } + } + } + } + } + + remote_close $dest; + return [list $status $output]; +} + +# This checks the value cotained in the variable named "variable" in +# the calling procedure for output from the status wrapper and returns +# a non-negative value if it exists; otherwise, it returns -1. The +# output from the wrapper is removed from the variable. + +proc check_for_board_status { variable } { + upvar $variable output; + + if [regexp "(^|\[\r\n\])\\*\\*\\* EXIT code" $output] { + regsub "^.*\\*\\*\\* EXIT code " $output "" result; + regsub "\[\r\n\].*$" $result "" result; + regsub -all "(^|\[\r\n\])\\*\\*\\* EXIT code \[^\r\n\]*(\[\r\n\]\[\r\n\]?|$)" $output "" output; + regsub "^\[^0-9\]*" $result "" result + regsub "\[^0-9\]*$" $result "" result + verbose "got board status $result" 3 + verbose "output is $output" 3 + if { $result == "" } { + return -1; + } else { + return [expr $result]; + } + } else { + return -1; + } +} + +# +# remote_expect works basically the same as standard expect, but it +# also takes care of getting the file descriptor from the specified +# host and also calling the timeout/eof/default section if there is an +# error on the expect call. +# + +proc remote_expect { board timeout args } { + global errorInfo errorCode; + global remote_suppress_flag; + + set spawn_id [board_info $board fileid]; + + if { [llength $args] == 1 } { + set args "[lindex $args 0]"; + } + + set res {} + set got_re 0; + set need_append 1; + + set orig "$args"; + + set error_sect ""; + set save_next 0; + + if { $spawn_id == "" } { + # This should be an invalid spawn id. + set spawn_id 1000; + } + + for { set i 0; } { $i < [llength $args] } { incr i ; } { + if { $need_append } { + append res "\n-i $spawn_id "; + set need_append 0; + } + + set x "[lrange $args $i $i]"; + regsub "^\n*\[ \]*" "$x" "" x; + + if { $x == "-i" || $x == "-timeout" || $x == "-ex" } { + append res "$x "; + set next [expr ${i}+1]; + append res "[lrange $args $next $next]"; + incr i; + continue; + } + if { $x == "-n" || $x == "-notransfer" || $x == "-nocase" || $x == "-indices" } { + append res "${x} "; + continue; + } + if { $x == "-re" } { + append res "${x} "; + set next [expr ${i}+1]; + set y [lrange $args $next $next]; + append res "${y} "; + set got_re 1; + incr i; + continue; + } + if { $got_re } { + set need_append 0; + append res "$x "; + set got_re 0; + if { $save_next } { + set save_next 0; + set error_sect [lindex $args $i]; + } + } else { + if { ${x} == "eof" } { + set save_next 1; + } elseif { ${x} == "default" || ${x} == "timeout" } { + if { $error_sect == "" } { + set save_next 1; + } + } + append res "${x} "; + set got_re 1; + } + } + + if [info exists remote_suppress_flag] { + if { $remote_suppress_flag } { + set code 1; + } + } + if ![info exists code] { + set res "\n-timeout $timeout $res"; + set body "expect \{\n-i $spawn_id -timeout $timeout $orig\}"; + set code [catch {uplevel $body} string]; + } + + if {$code == 1} { + if { $error_sect != "" } { + set code [catch {uplevel $error_sect} string]; + } else { + warning "remote_expect statement without a default case?!"; + return; + } + } + + if {$code == 1} { + return -code error -errorinfo $errorInfo -errorcode $errorCode $string + } elseif {$code == 2} { + return -code return $string + } elseif {$code == 3} { + return + } elseif {$code > 4} { + return -code $code $string + } +} + +# Push the current connection to HOST onto a stack. +proc remote_push_conn { host } { + global board_info; + + set name [board_info $host name]; + + if { $name == "" } { + return "fail"; + } + + if ![board_info $host exists fileid] { + return "fail"; + } + + set fileid [board_info $host fileid]; + set conninfo [board_info $host conninfo]; + if ![info exists board_info($name,fileid_stack)] { + set board_info($name,fileid_stack) {} + } + set board_info($name,fileid_stack) [list $fileid $conninfo $board_info($name,fileid_stack)]; + unset board_info($name,fileid); + if [info exists board_info($name,conninfo)] { + unset board_info($name,conninfo); + } + return "pass"; +} + +# Pop a previously-pushed connection from a stack. You should have closed the +# current connection before doing this. +proc remote_pop_conn { host } { + global board_info; + + set name [board_info $host name]; + + if { $name == "" } { + return "fail"; + } + if ![info exists board_info($name,fileid_stack)] { + return "fail"; + } + set stack $board_info($name,fileid_stack); + if { [llength $stack] < 3 } { + return "fail"; + } + set board_info($name,fileid) [lindex $stack 0]; + set board_info($name,conninfo) [lindex $stack 1]; + set board_info($name,fileid_stack) [lindex $stack 2]; + return "pass"; +} + +# +# Swap the current connection with the topmost one on the stack. +# +proc remote_swap_conn { host } { + global board_info; + set name [board_info $host name]; + + if ![info exists board_info($name,fileid)] { + return "fail"; + } + + set fileid $board_info($name,fileid); + if [info exists board_info($name,conninfo)] { + set conninfo $board_info($name,conninfo); + } else { + set conninfo {} + } + if { [remote_pop_conn $host] != "pass" } { + set board_info($name,fileid) $fileid; + set board_info($name,conninfo) $conninfo; + return "fail"; + } + set newfileid $board_info($name,fileid); + set newconninfo $board_info($name,conninfo); + set board_info($name,fileid) $fileid; + set board_info($name,conninfo) $conninfo; + remote_push_conn $host; + set board_info($name,fileid) $newfileid; + set board_info($name,conninfo) $newconninfo; + return "pass"; +} + +set sum_program "testcsum"; diff --git a/lib/rlogin.exp b/lib/rlogin.exp new file mode 100644 index 0000000..78745ba --- /dev/null +++ b/lib/rlogin.exp @@ -0,0 +1,173 @@ +# 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 + +# +# Connect to ARG using rlogin. This is for systems using rlogin to +# braindead targets. It returns either the spawn_id or a -1. +# + +proc rlogin_open { arg } { + global board_info + + set tries 0 + set result -1 + + if [board_info $arg exists fileid] { + return [board_info $arg fileid]; + } + + # get the hostname and port number from the config array + if [board_info $arg exists netport] { + set hostname [lindex [split [board_info $arg netport] ":"] 0] + } else { + set hostname $arg + } + + if ![board_info $arg exists shell_prompt] { + # if no prompt, then set it to something generic + set shell_prompt ".*> " + } else { + set shell_prompt [board_info $arg shell_prompt] + } + + if [board_info $arg exists fileid] { + unset board_info($arg,fileid); + } + # get the right version of rlogin + if ![board_info $arg exists rlogin_prog] { + set RLOGIN rlogin + } else { + set RLOGIN [board_info $arg rlogin_prog]; + } + + # start connection and store the spawn_id + verbose "Opening a $RLOGIN connection to $hostname" 2 + spawn $RLOGIN $hostname + if { $spawn_id < 0 } { + perror "invalid spawn id from rlogin" + return + } + set board_info($arg,fileid) $spawn_id + + # Try to connect to the target. We give up after 3 attempts. + while { $tries <= 3 } { + expect { + -re ".*$shell_prompt.*$" { + verbose "Got prompt\n" + set result 0 + break + } + -re "TERM = .*\\)\[ ]*$" { + send "dumb\r\n" + expect { + "Terminal type is*$" { + verbose "rlogin: set the terminal to dumb" 2 + } + default { + warning "rlogin: couldn't set terminmal type" + } + } + set result 10 + break + } + "unknown host" { + perror "rlogin: unknown host" + break + } + "has logged on from" { + exp_continue + } + "Terminal type is" { + verbose "rlogin: connected, got terminal prompt" 2 + set result 0 + break + } + -re "Maximum number of users already logged in.*$" { + warning "rlogin: maximum number of users already logged in" + } + -re "Sorry, shell is locked.*Connection closed.*$" { + warning "rlogin: lready connected." + } + -re "Sorry, this system is engaged.*Connection closed.*$" { + warning "rlogin: system engaged." + } + timeout { + warning "rlogin: timed out trying to connect." + } + eof { + perror "rlogin: got EOF while trying to connect." + break + } + } + incr tries + } + + # see if we maxed out on errors + if { $result < 0 } { + catch "close -i $spawn_id" + catch "wait -i $spawn_id" + set spawn_id -1 + } else { + verbose "rlogin: connected to $hostname" 2 + } + + return $spawn_id +} + +# +# Start CMDLINE running on DEST. Return the shell_id associated with +# the command. +# +proc rlogin_spawn { dest cmdline } { + if ![board_info $dest exists shell_prompt] { + set shell_prompt "(^|\[\r\n\])\[^\r\n\]*>"; + } else { + set shell_prompt [board_info $dest shell_prompt]; + } + set prefix "" + set ok 0; + for {set i 0;} {$i <= 2 && ! $ok} {incr i;} { + set shell_id [remote_open $dest]; + if { $shell_id != "" && $shell_id > 0 } { + remote_send $dest "echo k\r"; + remote_expect $dest 20 { + -re "\\(gdb\\)" { + set shell_prompt "\\(gdb\\)"; + # gdb uses 'shell command'. + set prefix "shell "; + set ok 1; + } + -re ".*$shell_prompt" { + set ok 1; + } + default { } + } + } + if { ! $ok } { + remote_close $dest; + remote_reboot $dest; + } + } + if { ! $ok } { + return "unable to start command" + } else { + remote_send $dest "${prefix}${cmdline}\n"; + return [board_info $dest fileid]; + } +} diff --git a/lib/rsh.exp b/lib/rsh.exp new file mode 100644 index 0000000..b099fd5 --- /dev/null +++ b/lib/rsh.exp @@ -0,0 +1,258 @@ +# Copyright (C) 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# DejaGnu@cygnus.com + +# +# Connect to hostname using rlogin +# +proc rsh_open { hostname } { + global spawn_id + + set tries 0 + set result -1 + + # get the hostname and port number from the config array + if [board_info $hostname exists name] { + set hostname [board_info $hostname name]; + } + set hostname [lindex [split [board_info ${hostname} netport] ":"] 0] + if [board_info ${hostname} exists shell_prompt] { + set shell_prompt [board_info ${hostname} shell_prompt] + } else { + set shell_prompt ".*> " + } + + if [board_info $hostname exists fileid] { + unset board_info($hostname,fileid); + } + + if ![board_info $hostname exists rsh_prog] { + if { [which remsh] != 0 } { + set RSH remsh + } else { + set RSH rsh + } + } else { + set RSH [board_info $hostname rsh_prog]; + } + + spawn $RSH $hostname + if { $spawn_id < 0 } { + perror "invalid spawn id from rsh" + return -1 + } + + send "\r\n" + while { $tries <= 3 } { + expect { + -re ".*$shell_prompt.*$" { + verbose "Got prompt\n" + set result 0 + break + } + -re "TERM = .*$" { + warning "Setting terminal type to vt100" + set result 0 + send "vt100\n" + break + } + "unknown host" { + exp_send "\003" + perror "telnet: unknown host" + break + } + "has logged on from" { + exp_continue + } + -re "isn't registered for Kerberos.*service.*$" { + warning "rsh: isn't registered for Kerberos, please kinit" + catch close + catch wait + break + } + -re "Kerberos rcmd failed.*$" { + warning "rsh: Kerberos rcmd failed, please kinit" + catch close + catch wait + break + } + -re "You have no Kerberos tickets.*$" { + warning "rsh: No kerberos Tickets, please kinit" + catch close + catch wait + break + } + "Terminal type is" { + verbose "rsh: connected, got terminal prompt" 2 + set result 0 + break + } + -re "trying normal rlogin.*$" { + warning "rsh: trying normal rlogin." + catch close + catch wait + break + } + -re "unencrypted connection.*$" { + warning "rsh: unencrypted connection, please kinit" + catch close + catch wait + break + } + -re "Sorry, shell is locked.*Connection closed.*$" { + warning "rsh: already connected." + } + timeout { + warning "rsh: timed out trying to connect." + } + eof { + perror "rsh: got EOF while trying to connect." + break + } + } + incr tries + } + + if { $result < 0 } { +# perror "rsh: couldn't connect after $tries tries." + close -i $spawn_id + set spawn_id -1 + } else { + set board_info($hostname,fileid) $spawn_id + } + + return $spawn_id +} + +# +# Download $srcfile to $destfile on $desthost. +# + +proc rsh_download {desthost srcfile destfile} { + if [board_info $desthost exists name] { + set desthost [board_info $desthost name]; + } + + if [board_info $desthost exists hostname] { + set desthost [board_info $desthost hostname]; + } + + if ![board_info $desthost exists rcp_prog] { + set RCP rcp + } else { + set RCP [board_info $desthost rcp_prog]; + } + + set status [catch "exec $RCP $srcfile $desthost:$destfile |& cat" output] + if { $status == 0 } { + verbose "Copied $srcfile to $desthost:$destfile" 2 + return $destfile; + } else { + verbose "Download to $desthost failed, $output." + return "" + } +} + +proc rsh_upload {desthost srcfile destfile} { + if [board_info $desthost exists name] { + set desthost [board_info $desthost name]; + } + + if [board_info $desthost exists hostname] { + set desthost [board_info $desthost hostname]; + } + + if ![board_info $desthost exists rcp_prog] { + set RCP rcp + } else { + set RCP [board_info $desthost rcp_prog]; + } + + set status [catch "exec $RCP $desthost:$srcfile $destfile" output]; + if { $status == 0 } { + verbose "Copied $desthost:$srcfile to $destfile" 2 + return $destfile; + } else { + verbose "Upload from $desthost failed, $output." + return "" + } +} + +# +# Execute "$cmd $args[0]" on $boardname. +# +proc rsh_exec { boardname cmd args } { + if { [llength $args] > 0 } { + set pargs [lindex $args 0]; + if { [llength $args] > 1 } { + set inp [lindex $args 1]; + } else { + set inp ""; + } + } else { + set pargs "" + set inp "" + } + + verbose "Executing $boardname:$cmd $pargs < $inp" + + if [board_info $boardname exists name] { + set boardname [board_info $boardname name]; + } + + if [board_info $boardname exists hostname] { + set hostname [board_info $boardname hostname]; + } else { + set hostname $boardname; + } + + if ![board_info $hostname exists rsh_prog] { + if { [which remsh] != 0 } { + set RSH remsh + } else { + set RSH rsh + } + } else { + set RSH [board_info $hostname rsh_prog]; + } + + # If CMD sends any output to stderr, exec will think it failed. More often + # than not that will be true, but it doesn't catch the case where there is + # no output but the exit code is non-zero. + if { $inp == "" } { + set inp "/dev/null" + } + set status [catch "exec cat $inp | $RSH $boardname sh -c '$cmd $pargs \\; echo XYZ\\\${?}ZYX' |& cat" output] + verbose "rsh output is $output" + # `status' doesn't mean much here other than rsh worked ok. + # What we want is whether $cmd ran ok. + if { $status != 0 } { + regsub "XYZ(\[0-9\]*)ZYX\n?" $output "" output + return [list -1 "rsh to $boardname failed for $cmd, $output"] + } + regexp "XYZ(\[0-9\]*)ZYX" $output junk status + verbose "rsh_exec: status:$status text:$output" 4 + if { $status == "" } { + return [list -1 "Couldn't parse rsh output, $output."] + } + regsub "XYZ(\[0-9\]*)ZYX\n?" $output "" output + # Delete one trailing \n because that is what `exec' will do and we want + # to behave identical to it. + regsub "\n$" $output "" output + return [list [expr $status != 0] $output] +} diff --git a/lib/standard.exp b/lib/standard.exp new file mode 100644 index 0000000..f1822e4 --- /dev/null +++ b/lib/standard.exp @@ -0,0 +1,42 @@ +# Copyright (C) 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# DejaGnu@cygnus.com + +# +# A set of standard functions for tools. Calls the +# target-machine-specific versions. +# + +proc ${tool}_load { program args } { + if { [llength $args] > 0 } { + set program_args [lindex $args 0]; + } else { + set program_args "" + } + + if { [llength $args] > 1 } { + set input_file [lindex $args 1]; + } else { + set input_file ""; + } + return [remote_load target $program $program_args $input_file]; +} + +proc ${tool}_compile { srcfile destfile compile_type options } { + target_compile $srcfile $destfile $compile_type $options +} diff --git a/lib/target.exp b/lib/target.exp new file mode 100644 index 0000000..f71c6f6 --- /dev/null +++ b/lib/target.exp @@ -0,0 +1,759 @@ +# Copyright (C) 92, 93, 94, 95, 96, 97, 98, 1999, 2000 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) +# and extensively modified by Bob Manson. (manson@cygnus.com) + +# a hairy pattern to recognize text +set text "\[- A-Za-z0-9\.\;\"\_\:\'\`\(\)\!\#\=\+\?\&\*]" + +# +# this is a collection of support procs for the target data +# structures. We use a named array, since Tcl has no real data +# structures. Here's the special index words for the array: +# Required fields are: +# name - the name of the target. (mostly for error messages) This +# should also be the string used for this target's array. +# It should also be the same as the linker script so we +# can find them dynamically. +# Optional fields are: +# ldflags - the flags required to produce a fully linked executable. +# config - the target canonical for this target. This is a regexp +# as passed to istarget or isnative. +# cflags - the flags required to produce an object file from a +# source file. +# connect - the connectmode for this target. This is for both IP and +# serial connections. +# hostname - the hostname of the target. This is for TCP/IP based +# connections, and is also used for versions of tip that +# use /etc/remote. +# serial - the serial port. This is typically /dev/tty? or com?:. +# baud - the baud rate for a serial port connection. +# netport - the IP port. +# x10 - parameters for the x10 controller (used to reboot) +# fileid - the fileid or spawn id of of the connection. +# prompt - a regexp for matching the prompt. +# ioport - the port for I/O on dual port systems. +# +# there are three main arrays, indexed in with "target", "build", and "host". +# all other targets are indexed with a name usually based on the linker script +# like "idp", or "ex93x.ld". +# + +# +# Set the target connection. +# +proc push_target { name } { + global target_abbrev + + pop_config target + push_config target $name +} + +# +# Set the host connnection. +# +proc push_host { name } { + pop_config host + push_config host $name +} + +# +# Set the build connnection. +# +proc push_build { name } { + pop_config build + push_config build $name +} + +# +# Set the config for the current host or target connection. +# +proc push_config { type name } { + global target_info + + verbose "pushing config for $type, name is $name" + if [info exists target_info($type,name)] { + if { $target_info($type,name) == $name } { + error "pushing config for $type, '$name' twice" + } + } + set target_info($type,name) $name +} + +# +# Set the current connection for target or host. +# +proc pop_config { type } { + global target_info + + if [info exists target_info(${type},name)] { + unset target_info(${type},name) + } +} + +# +# Unset the target connection. +# +proc pop_target { } { + pop_config target +} + +# +# Unset the host connection. +# +proc pop_host { } { + pop_config host +} + +# +# Remove extraneous warnings we don't care about +# +proc prune_warnings { text } { + global host_triplet; + + # remove the \r part of "\r\n" so we don't break all the patterns + # we want to match. + regsub -all -- "\r" $text "" text + + # This is from sun4's. Do it for all machines for now. + # The "\\1" is to try to preserve a "\n" but only if necessary. + if [ishost "sparc-*-sunos*"] { + regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text + } + + # See Brendan for the raison d'etre of this one. + if [ishost "alpha*-*-*"] { + regsub -all "(^|\n)(/usr/(ucb|bin)/ld.*without exceptions was\[^\n\]+\n?)" $text "\\1" text + } + if [ishost "hppa*-*-hpux*"] { + # Ignore the compiler's warnings about PA incompatibility. + regsub -all "(^|\n)\[^\n\]*PA 2.0 object file \[^\n\]* was detected. The linked output may not run on a PA 1.x system." $text "" text + + regsub -all "(^|\n)\[^\n\]*PA 2.0 object file \[^\n\]* was detected. The linked output may not run on a PA 1.x system." $text "" text + + # And the linker's +vcompatwarnings verbage. + regsub -all "(^|\n)\[^\n\]*Linker features were used that may not be supported\[^\n\]*.\[^\n\]*." $text "" text + + # Ignore these warnings, which the HP aCC compiler seems to + # generate on HP-UX 10.30 and 11.0. (Something is probably + # wrong with some system headers, but still...) + # + # This particular warning always is given with a line of warning + # text, followed by a source line, followed by a line with "^^^" + # underlining an offending symbol name. Here we slurp up the + # warning text and the next two lines, assuming that they are + # the source line and underline chars. + # + regsub -all "Warning .*The linkage directive is ignored for an object or function declared static..\[^\n\]*.\[^\n\]*." $text "" text + + # Ignore these warnings, which I often see from the ANSI C + # compiler installed on HP-UX 11.0 machines. (Something is + # probably wrong with an installation, or perhaps NLS isn't + # quite healthy yet on 11.0. In either case, it's easier to + # "fix" this nit here, than it is to track down & fix the + # root cause.) + # + # This particular warning always is given with a line of warning + # text, followed by line that says "Using internal messages". + # + regsub -all "Warning: Unable to open pxdb message catalog.*" $text "" text + regsub -all ".* Using internal messages.*" $text "" text + + # Another form of the "unable to find message catalog" warning. + # + regsub -all "cpp: warning .*Possibly incorrect message catalog." $text "" text + + # Another odd warning on 11.0. + # + regsub -all "aCC .assigner.: Warning .*Could not find library for -l.*" $text "" text + + # Oh heck, just keep adding 'em here... + # + regsub -all "aCC .assigner.: Warning .*Could not satisfy instantiation request for \[^\n\]* contained in\[^\n\]*\n\t/lib/pa20_64/lib\[a-zA-Z0-9\]*.sl" $text "" text + + # Remove the lines that are output by the HP F77 compiler to + # indicate the functions that are being compiled. + upvar compiler_type compiler_type + if { [info exists compiler_type] && $compiler_type == "f77" } { + regsub -all "\[ \ta-zA-Z_0-9\./\]*:\[\r\n\]+" $text "" text + } + + # Ignore the warnings about unknown options + regsub -all ".*warning \[0-9\]+: Unknown option.*ignored.*" $text "" text + + } + + # Ignore these. + regsub -all "(^|\n)\[^\n\]*linker input file unused since linking not done" $text "" text + regsub -all "(^|\n)\[^\n\]*file path prefix \[^\n\]* never used" $text "" text + + # This is from sun4's. Do it for all machines for now. + # The "\\1" is to try to preserve a "\n" but only if necessary. + regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text + + # This happens when compiling on Alpha OSF/1 with cc -g -O. + regsub -all "(^|\n)(\n*uopt: Warning: file not optimized; use -g3 if both optimization and debug wanted\n?)+" $text "\\1" text + + # This happens when compiling on Alpha OSF using gas. + regsub -all "(^|\n)(/usr/.*/ld:\nWarning: Linking some objects which contain exception information sections\n\tand some which do not. This may cause fatal runtime exception handling\n\tproblems\[^\n\]*\n?)+" $text "\\1" text + + # This happens on SunOS with cc -g -O. + regsub -all "(^|\n)(cc: Warning: -O conflicts with -g. -O turned off.\n?)+" $text "\\1" text + + # This happens when assembling code with the native HP assembler + regsub -all "(^|\n)(as:\[^\n\]*err#13.\n .warning.\[^\n\]*\n?)+" $text "\\1" text + + # When using the HP assembler, -g isn't supported. + regsub -all "(^|\n)(cc1: warning: -g is only supported when using GAS on this processor\[^\n\]*\ncc1: warning:\[^\n\]*\n?)+" $text "\\1" text + regsub -all "(^|\n)(cc1plus: warning: -g is only supported when using GAS on this processor\[^\n\]*\ncc1plus: warning:\[^\n\]*\n?)+" $text "\\1" text + + # This happens when testing across NFS. + regsub -all "(^|\n)(NFS server \[^\n\]* not responding still trying\[^\n\]*\n?)+" $text "\\1" text + regsub -all "(^|\n)(NFS server \[^\n\]* ok\[^\n\]*\n?)+" $text "\\1" text + + # This happens when testing across NFS on osf4. + regsub -all "(^|\n)(NFS3 server \[^\n\]* not responding still trying\[^\n\]*\n?)+" $text "\\1" text + regsub -all "(^|\n)(NFS3 server \[^\n\]* ok\[^\n\]*\n?)+" $text "\\1" text + + # When using the IRIX 6 o32 assembler, -g isn't supported + regsub -all "(^|\n)(cc1: warning: `-g' not supported by this configuration of GCC\[^\n\]*\n?)+" $text "\\1" text + regsub -all "(^|\n)(cc1plus: warning: `-g' not supported by this configuration of GCC\[^\n\]*\n?)+" $text "\\1" text + + regsub -all "(^|\n)(cc1: warning: -mabi=32 does not support -g\[^\n\]*\n?)+" $text "\\1" text + regsub -all "(^|\n)(cc1plus: warning: -mabi=32 does not support -g\[^\n\]*\n?)+" $text "\\1" text + + # This happens with the o32 assembler on IRIX 6. + regsub -all "(^|\n)(as: Warning: -O3 is not supported for assembly compiles for ucode compilers; changing to -O2.\n?)+" $text "\\1" text + + # This happens when using g++ on a DWARF system. + regsub -all "(^|\n)(cc1plus: warning: -g option not supported for C\\+\\+ on systems using the DWARF debugging format\n?)+" $text "\\1" text + + # This is from sun4's. Do it for all machines for now. + # The "\\1" is to try to preserve a "\n" but only if necessary. + regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text + + # See Brendan for the raison d'etre of this one. + if [string match "alpha*-*-*" $host_triplet] { + regsub -all "(^|\n)(/usr/(ucb|bin)/ld.*without exceptions was\[^\n\]+\n?)" $text "\\1" text + } + + # Don't pay attention to the AIX4 linker warnings. + regsub -all "(^|\n)(ld:.*WARNING: Duplicate.*ld:.*Use the -bload\[^\n\]*\n?)" $text "\\1" text + + # Or the IRIX 6 ones. + regsub -all "(^|\n)(ld(|32|64): WARNING \[^\n\]*\n?)+" $text "\\1" text + regsub -all "(^|\n)(ld(|32|64): Giving up.*Use -wall\[^\n\]*\n?)+" $text "\\1" text + + # Or the NetBSD ones. + regsub -all "(^|\n)(\[^\n\]*:\[0-9\]+: warning: \[^\n\]* possibly used unsafely, use \[^\n\]*\n?)" $text "\\1" text + regsub -all "(^|\n)(\[^\n\]*: warning: reference to compatibility glob\[^\n\]*\n?)" $text "\\1" text + + # GNU ld warns about functions marked as dangerous in GNU libc. + regsub -all "(^|\n)\[^\n\]*: In function\[^\n\]*\n\[^\n\]\[^\n\]*function is dangerous\[^\n\]*" $text "" text + + # Libgloss libnosys defines functions that warn when linked in + regsub -all "(^|\n)\[^\n\]*: In function\[^\n\]*\n\[^\n\]\[^\n\]*is not implemented and will always fail\[^\n\]*" $text "" text + + # It might be tempting to get carried away and delete blank lines, etc. + # Just delete *exactly* what we're ask to, and that's it. + return $text +} + +# +# Invoke the compiler. This gets interesting cause the compiler may +# not be on the same machine we're running DejaGnu on. +# + +proc target_compile {source destfile type options} { + set target [target_info name]; + if { [info proc ${target}_compile] != "" } { + return [${target}_compile $source $destfile $type $options]; + } else { + return [default_target_compile $source $destfile $type $options]; + } +} + +proc default_target_compile {source destfile type options} { + global target_triplet + global tool_root_dir + global CFLAGS_FOR_TARGET + global compiler_flags + + if { $destfile == "" && $type != "preprocess" && $type != "none" } { + error "Must supply an output filename for the compile to default_target_compile" + } + + set add_flags "" + set libs "" + set compiler_type "c" + set compiler "" + set ldflags "" + set dest [target_info name] + + if [info exists CFLAGS_FOR_TARGET] { + append add_flags " $CFLAGS_FOR_TARGET" + } + + if [info exists target_info(host,name)] { + set host [host_info name]; + } else { + set host "unix"; + } + + foreach i $options { + if { $i == "c++" } { + set compiler_type "c++" + if [board_info $dest exists cxxflags] { + append add_flags " [target_info cxxflags]" + } + append add_flags " [g++_include_flags]"; + if [board_info $dest exists c++compiler] { + set compiler [target_info c++compiler]; + } else { + set compiler [find_g++]; + } + } + + if { $i == "f77" } { + set compiler_type "f77" + if [board_info $dest exists f77flags] { + append add_flags " [target_info f77flags]" + } +# append add_flags " [f77_include_flags]" + if [board_info $dest exists f77compiler] { + set compiler [target_info f77compiler] + } else { + set compiler [find_g77] + } + } + + if [regexp "^dest=" $i] { + regsub "^dest=" $i "" tmp + if [board_info $tmp exists name] { + set dest [board_info $tmp name]; + } else { + set dest $tmp; + } + } + if [regexp "^compiler=" $i] { + regsub "^compiler=" $i "" tmp + set compiler $tmp + } + if [regexp "^additional_flags=" $i] { + regsub "^additional_flags=" $i "" tmp + append add_flags " $tmp" + } + if [regexp "^ldflags=" $i] { + regsub "^ldflags=" $i "" tmp + append ldflags " $tmp" + } + if [regexp "^libs=" $i] { + regsub "^libs=" $i "" tmp + append libs " $tmp" + } + if [regexp "^incdir=" $i] { + regsub "^incdir=" $i "-I" tmp + append add_flags " $tmp" + } + if [regexp "^libdir=" $i] { + regsub "^libdir=" $i "-L" tmp + append add_flags " $tmp" + } + if [regexp "^ldscript=" $i] { + regsub "^ldscript=" $i "" ldscript + } + if [regexp "^redirect=" $i] { + regsub "^redirect=" $i "" redirect + } + if [regexp "^optimize=" $i] { + regsub "^optimize=" $i "" optimize + } + if [regexp "^timeout=" $i] { + regsub "^timeout=" $i "" timeout + } + } + + if [board_info $host exists cflags_for_target] { + append add_flags " [board_info $host cflags_for_target]"; + } + + global CC_FOR_TARGET + global CXX_FOR_TARGET + global F77_FOR_TARGET + + if [info exists CC_FOR_TARGET] { + if { $compiler == "" } { + set compiler $CC_FOR_TARGET + } + } + + if [info exists CXX_FOR_TARGET] { + if { $compiler_type == "c++" } { + set compiler $CXX_FOR_TARGET + } + } + + if [info exists F77_FOR_TARGET] { + if { $compiler_type == "f77" } { + set compiler $F77_FOR_TARGET + } + } + + if { $compiler == "" } { + set compiler [board_info $dest compiler]; + if { $compiler == "" } { + return "default_target_compile: No compiler to compile with"; + } + } + + if ![is_remote host] { + if { [which $compiler] == 0 } { + return "default_target_compile: Can't find $compiler." + } + } + + if {$type == "object"} { + append add_flags " -c" + } + + if { $type == "preprocess" } { + append add_flags " -E" + } + + if { $type == "assembly" } { + append add_flags " -S" + } + + if [board_info $dest exists cflags] { + append add_flags " [board_info $dest cflags]" + } + + if { $type == "executable" } { + # This must be added here. + # if [board_info $dest exists ldscript] { + # append add_flags " [board_info $dest ldscript]" + # } + + if [board_info $dest exists ldflags] { + append add_flags " [board_info $dest ldflags]" + } + if { $compiler_type == "c++" } { + append add_flags " [g++_link_flags]"; + } + if [isnative] { + # This is a lose. + catch "glob -nocomplain $tool_root_dir/libstdc++/libstdc++.so* $tool_root_dir/libstdc++/libstdc++.sl" tmp + if { ${tmp} != "" } { + if [regexp ".*solaris2.*" $target_triplet] { + # Solaris 2 + append add_flags " -R$tool_root_dir/libstdc++" + } elseif [regexp ".*(osf|irix5|linux).*" $target_triplet] { + # OSF/1 or Irix5 + append add_flags " -Wl,-rpath,$tool_root_dir/libstdc++" + } elseif [regexp ".*hppa.*" $target_triplet] { + # HP/UX + append add_flags " -Wl,-a,shared_archive" + } + } + } + } + + if ![info exists ldscript] { + set ldscript [board_info $dest ldscript] + } + + foreach i $options { + if { $i == "debug" } { + if [board_info $dest exists debug_flags] { + append add_flags " [board_info $dest debug_flags]"; + } else { + append add_flags " -g" + } + } + } + + if [info exists optimize] { + append add_flags " $optimize"; + } + + if { $type == "executable" } { + foreach x $libs { + if [file exists $x] { + append source " $x" + } else { + append add_flags " $x"; + } + } + append add_flags " $ldflags" + + if [board_info $dest exists libs] { + append add_flags " [board_info $dest libs]" + } + + # This probably isn't such a good idea, but it avoids nasty + # hackiness in the testsuites. + # The math library must be linked in before the C library. The C + # library is linked in by the linker script, so this must be before + # the linker script. + if [board_info $dest exists mathlib] { + append add_flags " [board_info $dest mathlib]" + } else { + append add_flags " -lm" + } + + # This must be added here. + append add_flags " $ldscript"; + + if [board_info $dest exists remote_link] { + # Relink option. + append add_flags " -Wl,-r" + } + if [board_info $dest exists output_format] { + append add_flags " -Wl,-oformat,[board_info $dest output_format]"; + } + } + + if [board_info $dest exists multilib_flags] { + append add_flags " [board_info $dest multilib_flags]"; + } + + verbose "doing compile" + + set sources "" + if [is_remote host] { + foreach x $source { + set file [remote_download host $x]; + if { $file == "" } { + warning "Unable to download $x to host." + return "Unable to download $x to host." + } else { + append sources " $file"; + } + } + } else { + set sources $source + } + + if [is_remote host] { + append add_flags " -o a.out" + remote_file host delete a.out; + } else { + if { $destfile != "" } { + append add_flags " -o $destfile"; + } + } + + # This is obscure: we put SOURCES at the end when building an + # object, because otherwise, in some situations, libtool will + # become confused about the name of the actual source file. + if {$type == "object"} { + set opts "$add_flags $sources" + } else { + set opts "$sources $add_flags" + } + + if [is_remote host] { + if [host_info exists use_at] { + set fid [open "atfile" "w"]; + puts $fid "$opts"; + close $fid; + set opts "@[remote_download host atfile]" + remote_file build delete atfile + } + } + + verbose "Invoking the compiler as $compiler $opts" 2 + + if [info exists redirect] { + verbose "Redirecting output to $redirect" 2 + set status [remote_exec host "$compiler $opts" "" "" $redirect]; + } else { + if [info exists timeout] { + verbose "Setting timeout to $timeout" 2 + set status [remote_exec host "$compiler $opts" "" "" "" $timeout]; + } else { + set status [remote_exec host "$compiler $opts"]; + } + } + + set compiler_flags $opts + if [is_remote host] { + remote_upload host a.out $destfile; + remote_file host delete a.out; + } + set comp_output [prune_warnings [lindex $status 1]]; + regsub "^\[\r\n\]+" $comp_output "" comp_output; + if { [lindex $status 0] != 0 } { + verbose -log "compiler exited with status [lindex $status 0]"; + } + if { [lindex $status 1] != "" } { + verbose -log "output is:\n[lindex $status 1]" 2; + } + if { [lindex $status 0] != 0 && "${comp_output}" == "" } { + set comp_output "exit status is [lindex $status 0]"; + } + return ${comp_output}; +} + +proc reboot_target { } { + set result [remote_reboot target] + puts "REBOOT_TARGET: \"$result\"" + return ${result}; +} + +# +# Invoke this if you really want as to be called directly, rather than +# calling the compiler. FLAGS are any additional flags to pass to the +# assembler. +# +proc target_assemble { source destfile flags } { + return [default_target_assemble $source $destfile $flags]; +} + +proc default_target_assemble { source destfile flags } { + global AS_FOR_TARGET + global ASFLAGS_FOR_TARGET + + if [info exists AS_FOR_TARGET] { + set AS "$AS_FOR_TARGET"; + } else { + if ![board_info target exists assembler] { + set AS [find_gas]; + } else { + set AS [board_info target assembler]; + } + } + + if [info exists ASFLAGS_FOR_TARGET] { + append flags " $ASFLAGS_FOR_TARGET"; + } + + if [is_remote host] { + set source [remote_download host $source]; + set dest "a.out" + } else { + set dest $destfile + } + set status [remote_exec host "$AS $source $flags -o $dest"] + if [is_remote host] { + remote_upload host $dest $destfile + } + + set comp_output [prune_warnings [lindex $status 1]]; + if { [lindex $status 0] != 0 } { + verbose -log "assembler exited with status [lindex $status 0]"; + } + if { [lindex $status 1] != "" } { + verbose -log "assembler output is:\n[lindex $status 1]" 2; + } + return ${comp_output}; +} + +# +# Invoke this if you really want ld to be called directly, rather than +# calling the compiler. FLAGS are any additional flags to pass to the +# linker. +# +proc target_link { objects destfile flags } { + return [default_link target "$objects" "$destfile" $flags]; +} + +proc default_link { board objects destfile flags } { + global LD_FOR_TARGET + global LDFLAGS_FOR_TARGET + + # return -L's in ldflags + proc only--Ls { ldflags } { + set result "" + set ldflags [split $ldflags] + set len [llength $ldflags] + for { set i 0 } { $i < $len } { incr i } { + # ??? We ignore the situation where a -L is actually the argument + # to an option. + set arg [lindex $ldflags $i] + regsub "^-Wl," $arg "" arg + if [regexp "^-L" $arg] { + # Is the directory in the next arg, or part of this one? + if { "$arg" == "-L" } { + if { $i + 1 < $len } { + append result " -L [lindex $ldflags $i+1]" + incr i + } + } else { + append result " $arg" + } + } + } + return $result + } + + if [info exists LD_FOR_TARGET] { + set LD "$LD_FOR_TARGET"; + } else { + if ![board_info target exists linker] { + set LD [find_ld]; + } else { + set LD [board_info target linker]; + } + } + + if [info exists LDFLAGS_FOR_TARGET] { + append flags " $LDFLAGS_FOR_TARGET"; + } + + # `ldflags' consists of arguments to gcc (that are then + # passed to ld), not arguments to ld directly. + # We need the -L's. + if [board_info $board exists ldflags] { + set ldflags [board_info $board ldflags] + set ldflags [only--Ls $ldflags] + append flags " $ldflags" + } + + if [board_info $board exists ldscript] { + # strip leading -Wl, if present + set ldscript [board_info $board ldscript] + regsub "^-Wl," $ldscript "" ldscript + append flags " $ldscript" + } + + if [is_remote host] { + foreach x $objects { + set nobjects "$nobjects [remote_download host $x]"; + } + set objects "$nobjects"; + set dest "a.out"; + } else { + set dest $destfile; + } + set status [remote_exec host "$LD $objects $flags -o $dest"] + if [is_remote host] { + remote_upload host $dest $destfile; + } + + set comp_output [prune_warnings [lindex $status 1]]; + if { [lindex $status 0] != 0 } { + verbose -log "linker exited with status [lindex $status 0]"; + } + if { [lindex $status 1] != "" } { + verbose -log "linker output is:\n[lindex $status 1]" 2; + } + return ${comp_output}; +} diff --git a/lib/targetdb.exp b/lib/targetdb.exp new file mode 100644 index 0000000..b682d04 --- /dev/null +++ b/lib/targetdb.exp @@ -0,0 +1,113 @@ +# Copyright (C) 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# DejaGnu@cygnus.com + +# +# Searches in the appropriate place (the board_info array) for the specified +# information. +# +proc board_info { machine op args } { + global target_info + global board_info + + verbose "board_info $machine $op $args" 3 + + if [info exists target_info($machine,name)] { + set machine $target_info($machine,name); + } + if { $op == "exists" } { + if { [llength $args] == 0 } { + if [info exists board_info($machine,name)] { + return 1; + } else { + return 0; + } + } else { + if [info exists "board_info($machine,[lindex $args 0])"] { + return 1; + } else { + return 0; + } + } + } + if { [llength $args] == 0 } { + verbose "getting $machine $op" 3 + if [info exists board_info($machine,$op)] { + return $board_info($machine,$op); + } else { + return "" + } + } + return ""; +} + +proc target_info { op args } { + return [eval "board_info target \"$op\" $args"]; +} + +proc host_info { op args } { + return [eval "board_info host \"$op\" $args"]; +} + +# +# Fill in ENTRY with VALUE for the current board being defined. +# +proc set_board_info { entry value } { + global board_info board; + + if ![info exists board_info($board,$entry)] { + set board_info($board,$entry) $value; + } +} + +# +# Fill in ENTRY with VALUE for the current target. +# +proc set_currtarget_info { entry value } { + global board_info; + + set board [target_info name]; + + if ![info exists board_info($board,$entry)] { + set board_info($board,$entry) $value; + } +} + +# +# Unset ENTRY for the current board being defined. +# +proc unset_board_info { entry } { + global board_info board; + + if [info exists board_info($board,$entry)] { + unset board_info($board,$entry); + } +} + +# +# Unset ENTRY for the current board being defined. +# +proc unset_currtarget_info { entry } { + global board_info; + + set board [target_info name]; + + if [info exists board_info($board,$entry)] { + unset board_info($board,$entry); + } +} diff --git a/lib/telnet.exp b/lib/telnet.exp new file mode 100644 index 0000000..48c72ac --- /dev/null +++ b/lib/telnet.exp @@ -0,0 +1,243 @@ +# Copyright (C) 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# DejaGnu@cygnus.com + +# +# Connect using telnet. This takes two arguments. The first one is the +# hostname, and the second is the optional port number. This sets +# the fileid field in the config array, and returns -1 for error, or the +# spawn id. +# +proc telnet_open { hostname args } { + global verbose + global connectmode + global spawn_id + global timeout + global board_info + + set raw 0; + + if { [llength $args] > 0 } { + if { [lindex $args 0] == "raw" } { + set raw 1; + } + } + + set port 23 + if [board_info $hostname exists name] { + set connhost [board_info $hostname name] + } else { + set connhost $hostname + } + + if [board_info $connhost exists hostname] { + set hostname [board_info $connhost hostname]; + } + + if [file exists /usr/kerberos/bin/telnet] { + set telnet /usr/kerberos/bin/telnet; + } else { + set telnet telnet; + } + + # Instead of unsetting it, let's return it. One connection at a + # time, please. + if [board_info $connhost exists fileid] { + return [board_info $connhost fileid]; + } + # get the hostname and port number from the config array + if [board_info $connhost exists netport] { + set type $hostname + set hosttmp [split [board_info $connhost netport] ":"] + set hostname [lindex $hosttmp 0] + if { [llength $hosttmp] > 1 } { + set port [lindex $hosttmp 1] + } + unset hosttmp + } else { + set type target + } + if [board_info $connhost exists shell_prompt] { + set shell_prompt [board_info $connhost shell_prompt] + } + if ![info exists shell_prompt] { # if no prompt, then set it to something generic + set shell_prompt ".*> " + } + + set tries 0 + set result -1 + set need_respawn 1; + verbose "Starting a telnet connection to $hostname:$port $shell_prompt" 2 + while { $result < 0 && $tries <= 3 } { + if { $need_respawn } { + set need_respawn 0; + spawn $telnet $hostname $port; + } + expect { + "Trying " { + exp_continue; + } + -re "$shell_prompt.*$" { + verbose "Got prompt\n" + set result 0 + } + -re "nt Name:|ogin:" { + if [board_info $connhost exists telnet_username] { + exp_send "[board_info $connhost telnet_username]\n"; + exp_continue; + } + if [board_info $connhost exists username] { + exp_send "[board_info $connhost username]\n"; + exp_continue; + } + perror "telnet: need to login" + break + } + "assword:" { + if [board_info $connhost exists telnet_password] { + exp_send "[board_info $connhost telnet_password]\n"; + exp_continue; + } + if [board_info $connhost exists password] { + exp_send "[board_info $connhost password]\n"; + exp_continue; + } + perror "telnet: need a password" + break + } + -re "advance.*y/n.*\\?" { + exp_send "n\n"; + exp_continue; + } + -re {([Aa]dvanced|[Ss]imple) or ([Ss]imple|[Aa]dvanced)} { + exp_send "simple\n"; + exp_continue; + } + "Connected to" { + exp_continue + } + "unknown host" { + exp_send "\003" + perror "telnet: unknown host" + break + } + "VxWorks Boot" { + exp_send "@\n"; + sleep 20; + exp_continue; + } + -re "Escape character is.*\\.\[\r\n\]" { + if { $raw || [board_info $connhost exists dont_wait_for_prompt] } { + set result 0; + } else { + if [board_info $connhost exists send_initial_cr] { + exp_send "\n" + } + exp_continue + } + } + "has logged on from" { + exp_continue + } + "You have no Kerberos tickets" { + warning "telnet: no kerberos Tickets, please kinit" + break + } + -re "Connection refused.*$" { + catch "exp_send \"\003\"" foo; + sleep 5; + warning "telnet: connection refused." + } + -re "Sorry, this system is engaged.*" { + exp_send "\003" + warning "telnet: already connected." + } + "Connection closed by foreign host.*$" { + warning "telnet: connection closed by foreign host." + break + } + -re "\[\r\n\]+" { + exp_continue + } + timeout { + exp_send "\n" + } + eof { + warning "telnet: got unexpected EOF from telnet." + catch close; + catch wait; + set need_respawn 1; + sleep 5; + } + } + incr tries + } + # we look for this here again cause it means something went wrong, and + # it doesn't always show up in the expect in buffer till the server times out. + if [info exists expect_out(buffer)] { + if [regexp "assword:|ogin:" $expect_out(buffer)] { + perror "telnet: need to supply a login and password." + } + } + if { $result < 0 } { + catch close + catch wait + set spawn_id -1 + } + if { $spawn_id >= 0 } { + verbose "setting board_info($connhost,fileid) to $spawn_id" 3 + set board_info($connhost,fileid) $spawn_id + } + return $spawn_id +} + +# +# Put the telnet connection into binary mode. +# +proc telnet_binary { hostname } { + if [board_info $hostname exists fileid] { + remote_send $hostname ""; + remote_expect $hostname 5 { + -re "telnet> *$" {} + default {} + } + remote_send $hostname "set binary\n" + remote_expect $hostname 5 { + -re "Format is .*telnet> *$" { + remote_send $hostname "toggle binary\n"; + exp_continue; + } + -re "Negotiating network ascii.*telnet> *$" { + remote_send $hostname "toggle binary\n"; + exp_continue; + } + -re "Negotiating binary.*\[\r\n\].*$" { } + -re "binary.*unknown argument.*telnet> *$" { + remote_send $hostname "mode character\n"; + } + -re "Already operating in binary.*\[\r\n\].*$" { } + timeout { + warning "Never got binary response from telnet." + } + } + } +} + +proc telnet_transmit { dest file args } { + return [standard_transmit $dest $file]; +} diff --git a/lib/tip.exp b/lib/tip.exp new file mode 100644 index 0000000..25877a9 --- /dev/null +++ b/lib/tip.exp @@ -0,0 +1,184 @@ +# Copyright (C) 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# DejaGnu@cygnus.com + +# +# Connect via tip as part of remote_open. +# returns -1 if it failed, the spawn_id if it worked; also sets +# [board_info ${hostname} fileid] with the spawn_id on success. +# +proc tip_open { hostname } { + global verbose + global spawn_id + + set tries 0 + set result -1 + + if [board_info $hostname exists name] { + set hostname [board_info ${hostname} name]; + } + set port [board_info ${hostname} tipname] + if [board_info ${hostname} exists shell_prompt] { + set shell_prompt [board_info ${hostname} shell_prompt] + } else { + set shell_prompt ".*> " # Pick something reasonably generic. + } + + if [board_info ${hostname} exists fileid] { + unset board_info(${hostname},fileid); + } + spawn tip -v $port + if { $spawn_id < 0 } { + perror "invalid spawn id from tip" + return -1 + } + expect { + -re ".*connected.*$" { + send "\r\n" + expect { + -re ".*$shell_prompt.*$" { + verbose "Got prompt\n" + set result 0 + incr tries + } + timeout { + warning "Never got prompt." + set result -1 + incr tries + if $tries<=2 { + exp_continue + } + } + } + } + -re "all ports busy.*$" { + set result -1 + perror "All ports busy." + incr tries + if { $tries <= 2 } { + exp_continue + } + } + -re "Connection Closed.*$" { + perror "Never connected." + set result -1 + incr tries + if { $tries <= 2 } { + exp_continue + } + } + -re ".*: Permission denied.*link down.*$" { + perror "Link down." + set result -1 + incr tries + } + timeout { + perror "Timed out trying to connect." + set result -1 + incr tries + if { $tries <= 2 } { + exp_continue + } + } + eof { + perror "Got unexpected EOF from tip." + set result -1 + incr tries + } + } + + send "\n~s" + expect { + "~\[set\]*" { + verbose "Setting verbose mode" 1 + send "verbose\n\n\n" + } + } + + if { $result < 0 } { + perror "Couldn't connect after $tries tries." + return -1 + } else { + set board_info($hostname,fileid) $spawn_id + return $spawn_id + } +} + +# +# Downloads using the ~put command under tip +# arg - is a full path name to the file to download +# returns -1 if an error occured, otherwise it returns 0. +# +proc tip_download { dest file args } { + global verbose + global decimal + global expect_out + + if [board_info $dest exists shell_prompt] { + set shell_prompt [board_info $dest shell_prompt]; + } else { + set shell_prompt ".*>" + } + + set result "" + if ![board_info $dest exists fileid] { + perror "tip_download: no connection to $dest." + return $result; + } + set shell_id [board_info $dest fileid]; + + if ![file exists $file] { + perror "$file doesn't exist." + return $result + } + + send -i $shell_id "\n~p" + expect { + -i $shell_id "~\[put\]*" { + verbose "Downloading $file, please wait" 1 + send -i $shell_id "$file\n" + set timeout 50 + expect { + -i $shell_id -re ".*$file.*$" { + exp_continue + } + -i $shell_id -re ".*lines transferred in.*minute.*seconds.*$shell_prompt.*$" { + verbose "Download $file successfully" 1 + set result $file; + } + -i $shell_id -re ".*Invalid command.*$shell_prompt$" { + warning "Got an invalid command to the remote shell." + } + -i $shell_id -re ".*$decimal\r" { + if [info exists expect_out(buffer)] { + verbose "$expect_out(buffer)" + exp_continue + } + } + -i $shell_id timeout { + perror "Timed out trying to download." + } + } + } + timeout { + perror "Timed out waiting for response to put command." + } + } + set timeout 10 + return $result +} diff --git a/lib/util-defs.exp b/lib/util-defs.exp new file mode 100644 index 0000000..6048242 --- /dev/null +++ b/lib/util-defs.exp @@ -0,0 +1,101 @@ +# 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 +} diff --git a/lib/utils.exp b/lib/utils.exp new file mode 100644 index 0000000..565f18e --- /dev/null +++ b/lib/utils.exp @@ -0,0 +1,441 @@ +# 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) + +# +# Most of the procedures found here mimic their unix counter-part. +# This file is sourced by runtest.exp, so they are usable by any test case. +# + +# +# Gets the directories in a directory +# args: the first is the dir to look in, the next +# is the pattern to match. It +# defaults to *. Patterns are csh style +# globbing rules +# returns: a list of dirs or NULL +# +proc getdirs { args } { + if { [lindex $args 0] == "-all" } { + set alldirs 1 + set args [lrange $args 1 end] + } else { + set alldirs 0 + } + + set path [lindex $args 0] + if { [llength $args] > 1} { + set pattern [lindex $args 1] + } else { + set pattern "*" + } + verbose "Looking in ${path} for directories that match \"${pattern}\"" 3 + catch "glob ${path}/${pattern}" tmp + if { ${tmp} != "" } { + foreach i ${tmp} { + if [file isdirectory $i] { + switch -- "[file tail $i]" { + "testsuite" - + "config" - + "lib" - + "CVS" - + "RCS" - + "SCCS" { + verbose "Ignoring directory [file tail $i]" 3 + continue + } + default { + if [file readable $i] { + verbose "Found directory [file tail $i]" 3 + lappend dirs $i + if { $alldirs } { + eval lappend dirs [getdirs -all $i $pattern] + } + } + } + } + } + } + } else { + perror "$tmp" + return "" + } + + if ![info exists dirs] { + return "" + } else { + return $dirs + } +} + +# +# Finds all the files recursively +# rootdir - this is the directory to start the search +# from. This is and all subdirectories are search for +# filenames. Directory names are not included in the +# list, but the filenames have path information. +# pattern - this is the pattern to match. Patterns are csh style +# globbing rules. +# returns: a list or a NULL. +# +proc find { rootdir pattern } { + # first find all the directories + set dirs "$rootdir " + while 1 { + set tmp $rootdir + set rootdir "" + if [string match "" $tmp] { + break + } + foreach i $tmp { + set j [getdirs $i] + if ![string match "" $j] { + append dirs "$j " + set rootdir $j + unset j + } else { + set rootdir "" + } + } + set tmp "" + } + + # find all the files that match the pattern + foreach i $dirs { + verbose "Looking in $i" 3 + set tmp [glob -nocomplain $i/$pattern] + if { [llength $tmp] != 0 } { + foreach j $tmp { + if ![file isdirectory $j] { + lappend files $j + verbose "Adding $j to file list" 3 + } + } + } + } + + if ![info exists files] { + lappend files "" + } + return $files +} + +# +# Search the path for a file. This is basically a version +# of the BSD-unix which utility. This procedure depends on +# the shell environment variable $PATH. It returns 0 if $PATH +# does not exist or the binary is not in the path. If the +# binary is in the path, it returns the full path to the binary. +# +proc which { file } { + global env + + # strip off any extraneous arguments (like flags to the compiler) + set file [lindex $file 0] + + # if it exists then the path must be OK + # ??? What if $file has no path and "." isn't in $PATH? + if [file exists $file] { + return $file + } + if [info exists env(PATH)] { + set path [split $env(PATH) ":"] + } else { + return 0 + } + + foreach i $path { + verbose "Checking against $i" 3 + if [file exists $i/$file] { + if [file executable $i/$file] { + return $i/$file + } else { + warning "$i/$file exists but is not an executable" + } + } + } + # not in path + return 0 +} + +# +# Looks for a string in a file. +# return:list of lines that matched or NULL if none match. +# args: first arg is the filename, +# second is the pattern, +# third are any options. +# Options: line - puts line numbers of match in list +# +proc grep { args } { + + set file [lindex $args 0] + set pattern [lindex $args 1] + + verbose "Grepping $file for the pattern \"$pattern\"" 3 + + set argc [llength $args] + if { $argc > 2 } { + for { set i 2 } { $i < $argc } { incr i } { + append options [lindex $args $i] + append options " " + } + } else { + set options "" + } + + set i 0 + set fd [open $file r] + while { [gets $fd cur_line]>=0 } { + incr i + if [regexp -- "$pattern" $cur_line match] { + if ![string match "" $options] { + foreach opt $options { + case $opt in { + "line" { + lappend grep_out [concat $i $match] + } + } + } + } else { + lappend grep_out $match + } + } + } + close $fd + unset fd + unset i + if ![info exists grep_out] { + set grep_out "" + } + return $grep_out +} + +# +# Remove elements based on patterns. elements are delimited by spaces. +# pattern is the pattern to look for using glob style matching +# list is the list to check against +# returns the new list +# +proc prune { list pattern } { + set tmp {} + foreach i $list { + verbose "Checking pattern \"$pattern\" against $i" 3 + if ![string match $pattern $i] { + lappend tmp $i + } else { + verbose "Removing element $i from list" 3 + } + } + return $tmp +} + +# +# Attempt to kill a process that you started on the local machine. +# +proc slay { name } { + set in [open [concat "|ps"] r] + while {[gets $in line]>-1} { + if ![string match "*expect*slay*" $line] { + if [string match "*$name*" $line] { + set pid [lindex $line 0] + catch "exec kill -9 $pid]" + verbose "Killing $name, pid = $pid\n" + } + } + } + close $in +} + +# +# Convert a relative path to an absolute one on the local machine. +# +proc absolute { path } { + if [string match "." $path] { + return [pwd] + } + + set basedir [pwd] + cd $path + set path [pwd] + cd $basedir + return $path +} + +# +# Source a file and trap any real errors. This ignores extraneous +# output. returns a 1 if there was an error, otherwise it returns 0. +# +proc psource { file } { + global errorInfo + global errorCode + + unset errorInfo + if [file exists $file] { + catch "source $file" + if [info exists errorInfo] { + send_error "ERROR: errors in $file\n" + send_error "$errorInfo" + return 1 + } + } + return 0 +} + +# +# Check if a testcase should be run or not +# +# RUNTESTS is a copy of global `runtests'. +# +# This proc hides the details of global `runtests' from the test scripts, and +# implements uniform handling of "script arguments" where those arguments are +# file names (ie: the "foo" in make check RUNTESTFLAGS="bar.exp=foo"). +# "glob" style expressions are supported as well as multiple files (with +# spaces between them). +# Eg: RUNTESTFLAGS="bar.exp=foo1.c foo2.c foo3*.c bar*.c" +# +proc runtest_file_p { runtests testcase } { + if [string length [lindex $runtests 1]] { + set basename [file tail $testcase] + foreach ptn [lindex $runtests 1] { + if [string match $ptn $basename] { + return 1 + } + if [string match $ptn $testcase] { + return 1 + } + } + return 0 + } + return 1 +} + +# +# Delete various system verbosities from TEXT on SYSTEM +# +# An example is: +# ld.so: warning: /usr/lib/libc.so.1.8.1 has older revision than expected 9 +# +# SYSTEM is typical $target_triplet or $host_triplet. +# + +# +# Compares two files line-by-line +# returns 1 it the files match, +# returns 0 if there was a file error, +# returns -1 if they didn't match. +# +proc diff { file_1 file_2 } { + set eof -1 + set differences 0 + + if [file exists ${file_1}] { + set file_a [open ${file_1} r] + } else { + warning "${file_1} doesn't exist" + return 0 + } + + if [file exists ${file_2}] { + set file_b [open ${file_2} r] + } else { + warning "${file_2} doesn't exist" + return 0 + } + + verbose "# Diff'ing: ${file_1} ${file_2}\n" 1 + + set list_a "" + while { [gets ${file_a} line] != ${eof} } { + if [regexp "^#.*$" ${line}] { + continue + } else { + lappend list_a ${line} + } + } + close ${file_a} + + set list_b "" + while { [gets ${file_b} line] != ${eof} } { + if [regexp "^#.*$" ${line}] { + 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}] { + verbose "line #${i}\n" 2 + verbose "\< ${line_a}\n" 2 + verbose "\> ${line_b}\n" 2 + + send_log "line #${i}\n" + send_log "\< ${line_a}\n" + send_log "\> ${line_b}\n" + + set differences -1 + } + } + + if { $differences == -1 || [llength ${list_a}] != [llength ${list_b}] } { + verbose "Files not the same" 2 + set differences -1 + } else { + verbose "Files are the same" 2 + set differences 1 + } + return ${differences} +} + +# +# Set an environment variable +# +proc setenv { var val } { + global env + + set env($var) $val +} + +# +# Unset an environment variable +# +proc unsetenv { var } { + global env + unset env($var) +} + +# +# Get a value from an environment variable +# +proc getenv { var } { + global env + + if [info exists env($var)] { + return $env($var) + } else { + return "" + } +} + diff --git a/lib/xsh.exp b/lib/xsh.exp new file mode 100644 index 0000000..694241d --- /dev/null +++ b/lib/xsh.exp @@ -0,0 +1,322 @@ +# 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) + +# +# Connect to Spectra (VTRX) using xsh +# +proc xsh_open { hostname } { + global hex + global target_triplet + global xsh_shell_prompt + global board_info + + if [board_info $hostname exists fileid] { + unset board_info($hostname,fileid); + } + + if ![board_info $hostname exists spectra] { + perror "No spectra directory for $hostname"; + return -1; + } else { + set spectra [board_info $hostname spectra]; + } + + if ![board_info $hostname exists xsh_shell_prompt] { + set xsh_shell_prompt ".*> " + } else { + set xsh_shell_prompt [board_info $hostname shell_prompt]; + } + + set retries 0 + set result 0 + if ![board_info $hostname exists xsh_prog] { + set xsh xsh; + } else { + set xsh [board_info $hostname xsh_prog]; + } + + if {[which $xsh] != 0} { + spawn $xsh + } else { + warning "Can't find xsh in path" + return -1 + } + + set shell_id $spawn_id + + # start the shell + expect { + "*Spectra Cross-Development Shell version*$xsh_shell_prompt" { + verbose "Got prompt" + set result 0 + } + timeout { + warning "Timed out trying to connect." + set result -1 + incr retries + if { $retries <= 2 } { + exp_continue + } + } + } + + # connect to the shell + set retries 0 + send "connect $hostname\n" + expect { + "connect $hostname*$hostname connected \(non-os mode\)*\n" { + set xsh_shell_prompt "$hostname> " + verbose "Connected to $hostname" + } + "*connect: not attached*" { + warning "Couldn't attach target" + set result -1 + } + -re ".* reset on target.*$" { + send_user "Spectra was reset\n" + exp_continue + } + -re "\[0-9A-Fa-f\]+\[ 0x\]+\[0-9A-Fa-f\]+.*$" { + exp_continue + } + "$hostname> " { + #send "\n" + } + timeout { + warning "Timed out trying to connect after $expect_out(seconds) seconds." + set result -1 + incr retries + if { $retries <= 2 } { + exp_continue + } + } + } + + send "\n\n\n" + expect { + "*$hostname*$hostname" { + verbose "Cleared reset messages" 1 + } + timeout { + warning "Couldn't clear reset messages" + set result 1 + } + } + + set board_info($hostname,fileid) $spawn_id; + # load to operating system + set timeout 20 + set retries 0 + if {[xsh_download $hostname $spectra/${target_triplet}-os.o "" {-e sys_start_crt0}]!=0} { + perror "Couldn't load Spectra into target" + return -1 + } + + set timeout 10 + # start the OS running + set retries 0 + send "go\n" + expect { + -re ".*Multithreading on target darkstar.*$" { + verbose "Spectra has been started..." 1 + set result 0 + } + -re ".*reset on target.*$" { + verbose "Spectra was reset" + exp_continue + } + -re "\[0-9A-Fa-f\]+\[ 0x\]+\[0-9A-Fa-f\]+.*$" { + #send "\n" + exp_continue + } + -re "go\n" { exp_continue } + "$xsh_shell_prompt" { exp_continue } + timeout { + perror "Spectra wouldn't start" + set result -1 + incr retries + if { $retries <= 2 } { + send "go\r" + exp_continue + } + } + } + + if { $result < 0 } { + perror "Couldn't connect after $retries retries.\n" + return -1 + } else { + set board_info($hostname,fileid) $spawn_id; + return $spawn_id + } +} + +# +# Download an executable using the load command in Spectra. +# arg[0] - is a full path name to the file to download. +# arg[1] - optional arguments to the load command. +# returns 1 if a spectra error occured, +# -1 if an internal error occured, +# 0 otherwise. +# +proc xsh_download { dest file destfile args } { + global verbose + global shell_id + global decimal + global hex + global expect_out + global board_info + + set result 1 + set retries 0 + set shell_id [board_info $dest fileid]; + + if { [llength $args] > 1 } { + set opts [lindex $args 1] + } else { + set opts "" + } + + if { [llength $args] > 0 } { + set destfile [lindex $args 0] + } + + if ![file exists $file] { + perror "$file doesn't exist." + return 1 + } + + verbose "Downloading $file..." + + send -i $shell_id "load $opts $file\r" + set force 0 + expect { + -i $shell_id -re "\[0-9A-Fa-f\]+\[ 0x\]+\[0-9A-Fa-f\]+\r\n" { + set timeout 1 + send "dout\n" + while $force<2 { + expect { + "dout*undefined kernel symbol*$xsh_shell_prompt" { + verbose "Attempted to flush I/O buffers" 1 + } + timout { + incr force + flush stdout + } + } + } + set timeout 20 + exp_continue + } + -i $shell_id "load $opts $file*\r" { + verbose "Loading a.out..." + exp_continue + } + -i $shell_id "Warm reset on target*\n" { + verbose "Spectra did a warm reset" + exp_continue + } + -i $shell_id "Cold reset on target*\n" { + verbose "Spectra did a cold reset" + exp_continue + } + -i $shell_id "loading a.out*\r" { + verbose "Loading a.out..." + exp_continue + } + -i $shell_id "reading symbols*\r" { + verbose "Reading symbols..." + exp_continue + } + -i $shell_id "defining symbols*\r" { + verbose "defining symbols..." + exp_continue + } + -i $shell_id "*loading image*\r" { + verbose "Loading image..." + exp_continue + } + -i $shell_id -re ".*bytes loaded:.*$decimal.*$" { + verbose "$expect_out(buffer)" + exp_continue + } + -i $shell_id "*loading done*\r" { + verbose "Loading done..." + exp_continue + } + -i $shell_id "*setting PC*\r" { + verbose "Setting PC..." + exp_continue + } + -i $shell_id "*resolving symbols*\r" { + verbose "Resolving symbols..." + exp_continue + } + -i $shell_id -re ".*load module id = $decimal.*$" { + verbose "" + } + -i $shell_id -re ".*load: undefined symbols.*$" { + perror "undefined symbols, make sure os is loaded and running" + set result -1 + } + -i $shell_id "$xsh_shell_prompt" { + set result 0 + exp_continue + } + -i $shell_id "load: no default target" { + perror "default target isn't set" + return -1 + } + -i $shell_id timeout { + perror "Timed out trying to download after $expect_out(seconds) seconds." + incr retries + set result 1 + if { $retries <= 2 } { + exp_continue + } + } + } + + set timeout 10 + if [info exists expect_out(buffer)] { + send_log $expect_out(buffer) + } + set board_info($hostname,fileid) $shell_id + return $result +} + +# +# Exit the remote shell +# +proc xsh_close { hostname } { + global board_info + + if ![board_info $hostname exists fileid] { + return; + } + + set shell_id [board_info ${hostname} fileid]; + send -i $shell_id "exit\n" + unset board_info(${hostname},fileid); + + verbose "Exiting shell." + return 0 +} diff --git a/redhat/dejagnu.spec b/redhat/dejagnu.spec new file mode 100644 index 0000000..dcc37ed --- /dev/null +++ b/redhat/dejagnu.spec @@ -0,0 +1,77 @@ +%define version 1.4 + +Summary: A front end for testing other programs. +Name: dejagnu +Version: %{version} +Release: 0 +Copyright: GPL +Source: ftp://dejagnu.on.openprojects.net/pub/dejagnu/snapshots/dejagnu-1.4.tar.gz + +#Patch0: dejagnu-1.4.0-rth.patch +#Patch1: dejagnu-1.4.0-glibc21.patch +Group: Development/Tools +# Since we're building this on a debian system, we can't require these. +#Requires: tcl >= 8.0, expect >= 5.21 +BuildRoot: /tmp/%{name}-root + +%description +DejaGnu is an Expect/Tcl based framework for testing other programs. +DejaGnu has several purposes: to make it easy to write tests for any +program; to allow you to write tests which will be portable to any +host or target where a program must be tested; and to standardize the +output format of all tests (making it easier to integrate the testing +into software development). + +%prep +%setup -q -n dejagnu-%{version} + +%build +./configure -v +make + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/usr +mkdir -p $RPM_BUILD_ROOT/usr/share/dejagnu +mkdir -p $RPM_BUILD_ROOT/usr/doc/dejagnu-%{version} +make prefix=$RPM_BUILD_ROOT/usr install + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root) +/usr/bin/runtest +/usr/share/dejagnu/* + +# %config site.exp + +%doc COPYING NEWS README AUTHORS INSTALL ChangeLog doc/overview + +%changelog +* Sun Oct 31 1999 Rob Savoye +- updated to the latest snapshot +- added doc files +- added the site.exp config file + +* Mon Jul 12 1999 Tim Powers +- updated to 19990628 +- updated patches as needed +- added %defattr in files section + +* Wed Mar 10 1999 Jeff Johnson +- add alpha expect patch (#989) +- use %configure + +* Thu Dec 17 1998 Jeff Johnson +- Update to 19981215. + +* Thu Nov 12 1998 Jeff Johnson +- Update to 1998-10-29. + +* Wed Jul 8 1998 Jeff Johnson +- Update to 1998-05-28. + +* Sun Feb 1 1998 Jeff Johnson +- Create. + \ No newline at end of file diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am new file mode 100644 index 0000000..88dab63 --- /dev/null +++ b/testsuite/Makefile.am @@ -0,0 +1,5 @@ +## Process this file with automake to generate Makefile.in + +AUTOMAKE_OPTIONS = cygnus dejagnu + +DEJATOOL = runtest diff --git a/testsuite/Makefile.in b/testsuite/Makefile.in new file mode 100644 index 0000000..eea1b06 --- /dev/null +++ b/testsuite/Makefile.in @@ -0,0 +1,207 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +BOARDS = @BOARDS@ +CC = @CC@ +CONFIG = @CONFIG@ +EXEEXT = @EXEEXT@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +AUTOMAKE_OPTIONS = cygnus dejagnu + +DEJATOOL = runtest +mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs +CONFIG_CLEAN_FILES = +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = gtar +GZIP_ENV = --best +EXPECT = `if test -f $(top_builddir)/../expect/expect; then echo $(top_builddir)/../expect/expect; else echo expect; fi` +RUNTEST = `if test -f $(top_srcdir)/../dejagnu/runtest; then echo $(top_srcdir)/../dejagnu/runtest; else echo runtest; fi` +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --cygnus testsuite/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = testsuite + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + +RUNTESTFLAGS = + +RUNTESTDEFAULTFLAGS = --tool $(DEJATOOL) --srcdir $$srcdir + +check-DEJAGNU: site.exp + srcdir=`cd $(srcdir) && pwd`; export srcdir; \ + EXPECT=$(EXPECT); export EXPECT; \ + if [ -f $(top_builddir)/../expect/expect ]; then \ + TCL_LIBRARY=`cd $(top_srcdir)/../tcl/library && pwd`; \ + export TCL_LIBRARY; \ + fi; \ + runtest=$(RUNTEST); \ + if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ + $$runtest $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ + else echo "WARNING: could not find \`runtest'" 1>&2; :;\ + fi +site.exp: Makefile + @echo 'Making a new site.exp file...' + @test ! -f site.bak || rm -f site.bak + @echo '## these variables are automatically generated by make ##' > $@-t + @echo '# Do not edit here. If you wish to override these values' >> $@-t + @echo '# edit the last section' >> $@-t + @echo 'set tool $(DEJATOOL)' >> $@-t + @echo 'set srcdir $(srcdir)' >> $@-t + @echo 'set objdir' `pwd` >> $@-t + @echo '## All variables above are generated by configure. Do Not Edit ##' >> $@-t + @test ! -f site.exp || sed '1,/^## All variables above are.*##/ d' site.exp >> $@-t + @test ! -f site.exp || mv site.exp site.bak + @mv $@-t site.exp +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: + $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU +check: check-am +installcheck-am: +installcheck: installcheck-am +install-info-am: +install-info: install-info-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: +uninstall: uninstall-am +all-am: Makefile +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: tags distdir check-DEJAGNU info-am info dvi-am dvi check \ +check-am installcheck-am installcheck install-info-am install-info \ +install-exec-am install-exec install-data-am install-data install-am \ +install uninstall-am uninstall all-redirect all-am all installdirs \ +mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/testsuite/config/default.exp b/testsuite/config/default.exp new file mode 100644 index 0000000..0d427d0 --- /dev/null +++ b/testsuite/config/default.exp @@ -0,0 +1,79 @@ +# Copyright (C) 1988, 90-93, 1995, 1996, 1997 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) + +global RUNTEST +if ![info exists RUNTEST] then { + set RUNTEST [transform runtest] +} + +if ![info exists EXPECT] { + set EXPECT [findfile $base_dir/../../expect/expect "$base_dir/../../expect/expect" expect] + verbose "EXPECT defaulting to $EXPECT" 2 +} + +global RUNTESTFLAGS +if ![info exists RUNTESTFLAGS] then { + set RUNTESTFLAGS "-v -v -a" +} + +# +# runtest_version -- extract and print the version number +# +proc runtest_version { } { + global RUNTEST + + catch {exec $RUNTEST -V} tmp + if [info exists tmp] then { + clone_output "$tmp\n" + } +} + +# +# runtest_load -- loads the program. For runtest, this is just a stub +# +proc runtest_load { arg } { +} + +# +# runtest_exit -- exit the test driver for expect +# +proc runtest_exit { } { + close +} + +# +# runtest_start -- start everything +# +proc runtest_start { } { + global verbose + global spawn_id + global subdir + global srcdir + global objdir + global RUNTEST + global RUNTESTFLAGS + + if {[which $RUNTEST] != 0} then { + perror "Can't find $RUNTEST" + } + +# return [open [concat "$RUNTEST $RUNTESTFLAGS"] r] +} diff --git a/testsuite/lib/libsup.exp b/testsuite/lib/libsup.exp new file mode 100644 index 0000000..eecf5f7 --- /dev/null +++ b/testsuite/lib/libsup.exp @@ -0,0 +1,220 @@ +# Copyright (C) 92, 93, 94, 95, 1996 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) + +# +# Setup an environment so we can execute library procs without DejaGnu +# + +# +# Create a default environment and start expect. +# +proc make_defaults_file { defs } { + global srcdir + global objdir + global subdir + global build_triplet + global host_triplet + global target_triplet + global target_os + global target_cpu + + # We need to setup default values and a few default procs so we + # can execute library code without DejaGnu + set fd [open $defs w] + puts ${fd} "set tool foobar" + puts ${fd} "set srcdir ${srcdir}" + puts ${fd} "set objdir ${objdir}" + puts ${fd} "set subdir ${subdir}" + puts ${fd} "set build_triplet ${build_triplet}" + puts ${fd} "set host_triplet ${host_triplet}" + puts ${fd} "set target_triplet ${target_triplet}" + puts ${fd} "set target_os ${target_os}" + puts ${fd} "set target_cpu ${target_cpu}" + puts ${fd} "set tool foobar" + puts ${fd} "set testcnt 0" + puts ${fd} "set warncnt 0" + puts ${fd} "set errcnt 0" + puts ${fd} "set passcnt 0" + puts ${fd} "set xpasscnt 0" + puts ${fd} "set failcnt 0" + puts ${fd} "set xfailcnt 0" + puts ${fd} "set prms_id 0" + puts ${fd} "set bug_id 0" + puts ${fd} "set exit_status 0" + puts ${fd} "set untestedcnt 0" + puts ${fd} "set unresolvedcnt 0" + puts ${fd} "set unsupportedcnt 0" + puts ${fd} "set xfail_flag 0" + puts ${fd} "set xfail_prms 0" + puts ${fd} "set mail_logs 0" + puts ${fd} "set multipass_name 0" + catch "close $fd" +} + +proc start_expect { } { + global spawn_id + global base_dir + + # We need to setup default values and a few default procs so we + # can execute library code without DejaGnu + set defaults_file setval.tmp + make_defaults_file $defaults_file + set fd [open ${defaults_file} w] + + # look for expect + if ![info exists EXPECT] { + set EXPECT [findfile $base_dir/../../expect/expect "$base_dir/../../expect/expect" expect] + verbose "EXPECT defaulting to $EXPECT" 2 + } + +# catch close +# catch wait + + # Start expect runing + spawn "$EXPECT" + expect { + -re "expect.*> " { + verbose "Started the child expect shell" 2 + } + timeout { + perror "Timed out starting the child expect shell." + return -1 + } + } + + # Load the defaults file + exp_send "source ${defaults_file}\n" + expect { + "expect*> " { + verbose "Loaded testing defaults file." 2 + return 1 + } + timeout { + perror "Couldn't load the testing defaults file." + return -1 + } + } +} + +# +# Stop the runing expect process +# +proc stop_expect { } { + global spawn_id + + # make expect exit + exp_send "exit\n" + catch "close -i $spawn_id" + catch "wait -i $spawn_id" +} + +# +# Load the library to test +# +proc load_test_lib { lib } { + global spawn_id + exp_send "source ${lib}\n" + expect { + "expect*> " { + verbose "Testing ${lib}" 2 + } + timeout { + perror "Couldn't load the libraries to test" + return -1 + } + } +} + +# +# test a library proc that emits patterns +# +proc exp_test { cmd pattern msg } { + global spawn_id + + exp_send "puts ACK ; $cmd ; puts NAK\r\n" + expect { + "puts ACK*puts NAK" { + verbose "Got command echo" 3 + } + timeout { + warning "Never got command echo" + } + } + + expect { + "ACK" { + exp_continue + } + -re "\r\n1\r\n" { + warning "$msg, 1 was returned" + exp_continue + } + -re "\r\n0\r\n" { + warning "$msg, 0 was returned" + exp_continue + } + "$pattern" { + pass "$msg" + } + timeout { + fail "$msg" + } + } +} + +# test a config proc that only returns a code +# ex... config_test "isbuild $build_triplet" "pass" "fail" "isbuild, native" +# args are: command, true condition, false condition, message to print +proc config_test { cmd true false msg } { + global spawn_id + + set timeout 20 + exp_send "puts ACK ; puts \[$cmd\] ; puts NAK\r\n" + expect { + "puts ACK*$cmd*puts NAK" { + verbose "Got command echo" 3 + } + timeout { + warning "Never got command echo" + } + } + + expect { + -re "Checking pattern*with*\[\r\n\]" { + exp_continue + } + -re "\r\n1\r\n" { + $true "$msg" + } + -re "\r\n0\r\n" { + $false "$msg" + } + timeout { + perror "$msg (timed out)" + } + } +} + + + + + + diff --git a/testsuite/runtest.all/clone_output.test b/testsuite/runtest.all/clone_output.test new file mode 100644 index 0000000..e1d1cd2 --- /dev/null +++ b/testsuite/runtest.all/clone_output.test @@ -0,0 +1,68 @@ +# test clone_output + +set srcdir [lindex $argv 0] +set subdir [lindex $argv 1] +set objdir [lindex $argv 2] + +if [ file exists $objdir/setval.tmp ] { + source $objdir/setval.tmp +} else { + puts "ERROR: $objdir/setval.tmp doesn't exist" +} +if [ file exists $srcdir/$subdir/default_procs.tcl ] { + source "$srcdir/$subdir/default_procs.tcl" +} else { + puts "ERROR: $srcdir/$subdir/default_procs.tcl doesn't exist" +} +if [ file exists $srcdir/../lib/framework.exp] { + source $srcdir/../lib/framework.exp +} else { + puts "ERROR: $srcdir/../lib/framework.exp doesn't exist" +} + +set all_flag 0 +global all_flag +set errno "" + +# stuff that shouldn't print anything without all_flag set +set all_flag 0 +set tests { + { "lib_pat_test" "clone_output" "PASS: Foo" "" "clone_output(pass) without all_flag set" } + { "lib_pat_test" "clone_output" "UNRESOLVED: Foo" "" "clone_output(unresolved) without all_flag set" } + { "lib_pat_test" "clone_output" "UNSUPPORTED: Foo" "" "clone_output(unsupported) without all_flag set" } + { "lib_pat_test" "clone_output" "UNTESTED: Foo" "" "clone_output(untested) without all_flag set" } + { "lib_pat_test" "clone_output" "ERROR: Bar" "ERROR: Bar" "clone_output(error) without all_flag set" } + { "lib_pat_test" "clone_output" "WARNING: Bar" "WARNING: Bar" "clone_output(warning) without all_flag set" } + { "lib_pat_test" "clone_output" "NOTE: Bar" "NOTE: Bar" "clone_output(note) without all_flag set" } +} + +run_tests $tests + +# tests for all_flag set to 1 +set all_flag 1 +set tests { + { "lib_pat_test" "clone_output" "PASS: Foo" "PASS: Foo" "clone_output(pass) with all_flag set" } + { "lib_pat_test" "clone_output" "XFAIL: Foo" "XFAIL: Foo" "clone_output(xfail) with all_flag set" } + { "lib_pat_test" "clone_output" "UNRESOLVED: Foo" "UNRESOLVED: Foo" "clone_output(unresolved) with all_flag set" } + { "lib_pat_test" "clone_output" "UNSUPPORTED: Foo" "UNSUPPORTED: Foo" "clone_output(unsupported) with all_flag set" } + { "lib_pat_test" "clone_output" "UNTESTED: Foo" "UNTESTED: Foo" "clone_output(untested) with all_flag set" } + { "lib_pat_test" "clone_output" "ERROR: Foo" "ERROR: Foo" "clone_output(error) with all_flag set" } + { "lib_pat_test" "clone_output" "WARNING: Foo" "WARNING: Foo" "clone_output(warning) with all_flag set" } + { "lib_pat_test" "clone_output" "NOTE: Foo" "NOTE: Foo" "clone_output(note) with all_flag set" } +} + +run_tests $tests + + + + + + + + + + + + + + diff --git a/testsuite/runtest.all/config.test b/testsuite/runtest.all/config.test new file mode 100644 index 0000000..a85095d --- /dev/null +++ b/testsuite/runtest.all/config.test @@ -0,0 +1,138 @@ +# test clone_output + +set srcdir [lindex $argv 0] +set subdir [lindex $argv 1] +set objdir [lindex $argv 2] + +if [ file exists $objdir/setval.tmp ] { + source $objdir/setval.tmp +} else { + puts "ERROR: $objdir/setval.tmp doesn't exist" +} +if [ file exists $srcdir/$subdir/default_procs.tcl ] { + source "$srcdir/$subdir/default_procs.tcl" +} else { + puts "ERROR: $srcdir/$subdir/default_procs.tcl doesn't exist" +} +if [ file exists $srcdir/../lib/framework.exp] { + source $srcdir/../lib/framework.exp +} else { + puts "ERROR: $srcdir/../lib/framework.exp doesn't exist" +} + +set all_flag 1 + +set host_triplet i586-unknown-linux +set target_triplet i586-unknown-linux +set target_cpu i586 +set target_os linux +set build_triplet i586-unknown-linux + +# FIXME: should use run_tests here, but due to Tcl's weird scoping rules, I get +# problems. + +# +# Tests for a native configuration +# +if [isbuild $build_triplet] { + puts "PASSED: isbuild, native" +} else { + puts "FAILED: isbuild, native" +} + +if [isbuild $target_cpu-*-$target_os ] { + puts "PASSED: isbuild, native regexp" +} else { + puts "FAILED: isbuild, native regexp" +} + +if [isbuild hppa-ibm-macos ] { + puts "FAILED: isbuild, native bogus config string" +} else { + puts "PASSED: isbuild, native bogus config string" +} + +# ishost tests +if [ishost $host_triplet] { + puts "PASSED: ishost, native" +} else { + puts "FAILED: ishost, native" +} + +if [ishost $target_cpu-*-$target_os] { + puts "PASSED: ishost, native regexp" +} else { + puts "FAILED: ishost, native regexp" +} + +if [ishost hppa-ibm-macos] { + puts "FAILED: ishost, native bogus config string" +} else { + puts "PASSED: ishost, native bogus config string" +} + +# istarget tests +if [istarget $target_triplet] { + puts "PASSED: istarget, native" +} else { + puts "FAILED: istarget, native" +} + +if [istarget $target_cpu-*-$target_os] { + puts "PASSED: istarget, native regexp" +} else { + puts "FAILED: istarget, native regexp" +} + +if [istarget hppa-ibm-macos] { + puts "FAILED: istarget, native bogus config string" +} else { + puts "PASSED: istarget, native bogus config string" +} + +# native tests +if [isnative] { + puts "PASSED: isnative, native" +} else { + puts "FAILED: isnative, native" +} + +if [is3way] { + puts "FAILED: is3way, native" +} else { + puts "PASSED: is3way, native" +} + +# +# Tests for a normal cross configuration +# +set target_triplet m68k-unknown-elf +if [isnative] { + puts "FAILED: isnative, cross" +} else { + puts "PASSED: isnative, cross" +} + +if [is3way] { + puts "FAILED: is3way, cross" +} else { + puts "PASSED: is3way, cross" +} + +# +# Tests for a canadian cross configuration +# +set host_triplet i386-unknown-winnt +if [isnative] { + puts "FAILED: isnative, canadian cross" +} else { + puts "PASSED: isnative, canadian cross" +} + +if [is3way] { + puts "PASSED: is3way, canadian cross" +} else { + puts "FAILED: is3way, canadian cross" +} + + diff --git a/testsuite/runtest.all/default_procs.tcl b/testsuite/runtest.all/default_procs.tcl new file mode 100644 index 0000000..a0e6f88 --- /dev/null +++ b/testsuite/runtest.all/default_procs.tcl @@ -0,0 +1,94 @@ +set sum_file [open .tmp w] +set reboot 0 +set errno "" + +# this tests a proc for a returned pattern +proc lib_pat_test { cmd arg pattern } { + catch "$cmd \"$arg\"" result + puts "CMD(lib_pat_test) was: $cmd \"$arg\"" + puts "RESULT(lib_pat_test) was: \"${result}\" for pattern \"$pattern\"." + if [ regexp -- "with too many" $result ] { + return -1 + } + if [ string match "$pattern" $result ] { + return 1 + } else { + return 0 + } +} + +# this tests a proc for a returned value +proc lib_ret_test { cmd arg val } { + catch "$cmd \"$arg\"" result +# catch "set result [$cmd $arg]" output +# set result "$cmd [eval $arg] + puts "CMD(lib_ret_test) was: $cmd $arg" + puts "RESULT(lib_ret_test) was: $result" +# puts "OUTPUT(lib_ret_test) was: $output" + + if { $result == $val } { + return 1 + } else { + return 0 + } +} + +# +# This runs a standard test for a proc. The list is set up as: +# |test proc|proc being tested|args|pattern|message| +# test proc is something like lib_pat_test or lib_ret_test. +# +proc run_tests { tests } { + foreach i "$tests" { + set result [ [lindex $i 0] "[lindex $i 1]" "[lindex $i 2]" "[lindex $i 3]" ] + switch -- $result { + "-1" { + puts "ERRORED: [lindex $i 4]" + } + "1" { + puts "PASSED: [lindex $i 4]" + } + "0" { + puts "FAILED: [lindex $i 4]" + } + default { + puts "BAD VALUE: [lindex $i 4]" + } + } + } +} + +proc send_log { msg } { + # this is just a stub for testing +} + +proc pass { msg } { + puts "PASSED: $msg" +} + +proc fail { msg } { + puts "FAILED: $msg" +} + +proc perror { msg } { + global errno + puts "ERRORED: $msg" + set errno "$msg" +} + +proc warning { msg } { + global errno + puts "WARNED: $msg" + set errno "$msg" +} + +proc untested { msg } { + puts "NOTTESTED: $msg" +} + +proc unsupported { msg } { + puts "NOTSUPPORTED: $msg" +} +proc verbose { args } { + puts "[lindex $args 0]" +} diff --git a/testsuite/runtest.all/libs.exp b/testsuite/runtest.all/libs.exp new file mode 100644 index 0000000..eb5e1af --- /dev/null +++ b/testsuite/runtest.all/libs.exp @@ -0,0 +1,92 @@ +# Copyright (C) 1997 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# DejaGnu@cygnus.com + +load_lib libsup.exp + +proc process_test { test } { + global srcdir + global subdir + global objdir + global EXPECT + + verbose "Executing test case $test" + set text "\[- A-Za-z0-9\,\.\;\"\_\:\'\`\(\)\!\#\=\+\?\&\*]*" + + set timeout 150 + + if [file exists $test] { + verbose "Processing test $test" 2 + spawn -open [open "|$EXPECT $test $srcdir $subdir [pwd]" r] + expect { + "No such file or directory" { + perror "$test wouldn't run" 0 + } + -re "\[\r\n\]*NOTSUPPORTED: $text\[\r\n\]*" { + unsupported "[lrange $expect_out(0,string) 1 end]" + exp_continue + } + -re "\[\r\n\]*NOTTESTED: $text\[\r\n\]*" { + untested "[lrange $expect_out(0,string) 1 end]" + exp_continue + } + -re "\[\r\n\]*PASSED: $text\[\r\n\]*" { + pass "[lrange $expect_out(0,string) 1 end]" + exp_continue + } + -re "\[\r\n\]*FAILED: $text\[\r\n\]*" { + fail "[lrange $expect_out(0,string) 1 end]" + exp_continue + } + -re "\[\r\n\]*WARNED: $text\[\r\n\]*" { + verbose "$expect_out(0,string)" 2 + exp_continue + } + -re "\[\r\n\]*ERRORED: $text\[\r\n\]*" { + verbose "$expect_out(0,string)" 2 + exp_continue + } + timeout { + perror "$test timed out" 0 + exp_continue + } + eof { + verbose "All Done" 3 + } + } + } else { + perror "$test doesn't exist" 0 + } +} + +if ![info exists EXPECT] { + set EXPECT [findfile $base_dir/../../expect/expect "$base_dir/../../expect/expect" expect] + verbose "EXPECT defaulting to $EXPECT" 2 +} + +make_defaults_file [pwd]/setval.tmp + +foreach i [glob $srcdir/$subdir/*.test] { + process_test $i +} + + + + + + diff --git a/testsuite/runtest.all/options.exp b/testsuite/runtest.all/options.exp new file mode 100644 index 0000000..0c396ce --- /dev/null +++ b/testsuite/runtest.all/options.exp @@ -0,0 +1,93 @@ +# Copyright (C) 1988, 90-92, 1994, 1995, 1996, 1997 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) + +load_lib util-defs.exp + +# move the site.exp file so we have no default to confuse us. +#if [file exists $objdir/site.exp] { +# catch "exec mv -f $objdir/site.exp $objdir/site.ignore" +#} +set fd [open site.exp w] +puts ${fd} "set host_triplet $host_triplet" +puts ${fd} "set srcdir $srcdir/.." +puts ${fd} "set objdir $objdir/.." +puts ${fd} "set tmpdir $objdir/../tmpdir" +close $fd + +# +# Set up the list. +# 1st field is the command line option. +# 2nd field is the pattern to match. +# NOTE - No variable substitutions can be used. +# 3rd field is an optional message to print with PASS/FAIL. +# + + +set tests { + { "" "WARNING: No tool specified" "No arguments" } + { "-v --tool xXx" "Found.*site\..*Loading.*utils\.exp" "Loading library files" } + { "-v --tool xXx" "Expect binary is.*Using.*main test driver" "Loading basic packages" } + { "--F --tool x" "Illegal Argument \"--F\"" "Bad argument" } + { "--tool x" "Couldn't find tool init file" "Bad tool name" } + { "--help" "USAGE:*" "Display help" } + { "-v -v -v" "Verbose level is 3" "Verbose set correctly" } + { "-V" "Expect version is.*Tcl version is.*Framework version is*" "--version" } + { "-v --target m68k-vxworks" "Target is m68k-vxworks" "--target option" } + { "-v --host sparc-sun-sunos4.1.9" "Native configuration is sparc-sun-sunos4.1.9" "--host option" } + { "-v -a" "Print all test output to screen" "--all option" } + { "-v --objdir xXx" "Using test binaries in xXx" "--objdir option" } + { "-v --tool xXx" "Testing xXx" "--tool option" } + { "-v --debug" "Expect Debugging is ON" "--debug option" } + { "-v --D0" "Tcl debugger is ON" "--D0 option" } +} + +# Commented out for now--this is failing because of a TCL8 strace interaction. +# { "-v --strace 1" "Source Trace level is now 1.* 1 if" "--strace option" } + + +# Old tests not used anymore +# { "-v --build sparc-sun-sunos4.1.9" "Native configuration is sparc-sun-sunos4.1.9" "--build option" } +# { "-v --srcdir xXx" "Using test sources in xXx" "--srcdir option" } + +foreach i $tests { + if [util_test "$RUNTEST" "[lindex $i 0] -srcdir ${srcdir}/runtest.all" "" "[lindex $i 1]"] { + fail "[lindex $i 2]" + } else { + pass "[lindex $i 2]" + } +} + + +set fd [open site.exp w] +puts ${fd} "set host_triplet $host_triplet" +puts ${fd} "set tool runtest" +puts ${fd} "set srcdir $srcdir" +puts ${fd} "set objdir $objdir" +puts ${fd} "set tmpdir $objdir/tmpdir" +close $fd + +# clean up log files left by the child runtest +if [file exists $objdir/x.sum] { + exec rm -f $objdir/x.* +} +if [file exists $objdir/xXx.sum] { + exec rm -f $objdir/xXx.* +} diff --git a/testsuite/runtest.all/remote.test b/testsuite/runtest.all/remote.test new file mode 100644 index 0000000..03f16fc --- /dev/null +++ b/testsuite/runtest.all/remote.test @@ -0,0 +1,217 @@ +set srcdir [lindex $argv 0] +set subdir [lindex $argv 1] +set objdir [lindex $argv 2] + +if [ file exists $objdir/setval.tmp ] { + source $objdir/setval.tmp +} else { + puts "ERROR: $objdir/setval.tmp doesn't exist" +} +if [ file exists $srcdir/$subdir/default_procs.tcl ] { + source "$srcdir/$subdir/default_procs.tcl" +} else { + puts "ERROR: $srcdir/$subdir/default_procs.tcl doesn't exist" +} + +set file $srcdir/../lib/remote.exp +if [ file exists $file] { + source $file +} else { + puts "ERROR: $file doesn't exist" +} + +global errno "" + +# +# Create a false target config array +# +set target_info(idp,name) "idp" +set target_info(idp,ldflags) "-Tidp.ld" +set target_info(idp,config) m68k-unknown-aout +set target_info(idp,cflags) "" +set target_info(idp,connect) telnet +set target_info(idp,target) "s12" +set target_info(idp,serial) "tstty12" +set target_info(idp,netport) "localhost:23" +set target_info(idp,baud) "9600" +# MVME target +set target_info(mvme,name) "mvme" +set target_info(mvme,ldflags) "-Tmvme.ld" +set target_info(mvme,config) m68k-unknown-aout +set target_info(mvme,cflags) "" +set target_info(mvme,connect) telnet +set target_info(mvme,target) "s12" +set target_info(mvme,serial) "tstty8" +set target_info(mvme,netport) "localhost:23" +set target_info(mvme,baud) "9600" + +# Test remote open. We try not to use any of the support procs in +# target.exp to for isolation testing. "target" is the name of the +# default array setup by the procs in target.exp. + +set timeout 100 +set errno "" + +# +# Force connection errors +# + +# force an rlogin error +if { [rlogin foobar.barfoo.com] < 0 } { + puts "PASSED: rlogin bogus host" +} else { + puts "FAILED: rlogin bogus" +} + +# force an rsh error +if { [rsh foobar.barfoo.com] < 0 } { + puts "PASSED: rsh bogus host" +} else { + puts "FAILED: rsh bogus" +} + +# force a telnet error +if { [telnet foobar.barfoo.com] < 0 } { + puts "PASSED: telnet bogus host" +} else { + puts "FAILED: telnet bogus" +} + +# +# Connect to localhost +# + +# localhost rlogin test +if { [rlogin localhost] < 0 } { + if [string match "*unencrypted connection" $errno] { + NOTTESTED "rlogin localhost" + } else { + puts "FAILED: rlogin localhost" + } +} else { + puts "PASSED: rlogin localhost" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# localhost rsh test +if { [rsh localhost] < 0 } { + if [string match "*kinit" $errno] { + puts "NOTTESTED: rsh localhost" + } else { + puts "FAILED: rsh localhost" + } +} else { + puts "PASSED: rsh localhost" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# localhost telnet test. In this case it will return +# an error cause we get prompted for a password or login. For +# now this is considered an error, as we usually only +# telnet to a terminal server. +if { [telnet localhost] < 0 } { + if [string match "*password." $errno] { + puts "NOTTESTED: telnet localhost" + } else { + puts "FAILED: telnet localhost" + } +} else { + puts "PASSED: telnet localhost" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# +# Connect to the configured target +# +set target_info(target,netport) $target_info(idp,netport) +set target_info(target,target) localhost +set target_info(target,connect) rlogin +if { [rlogin target] < 0 } { + if [ string match "*kinit" $errno] { + puts "NOTTESTED: rlogin target" + } else { + puts "FAILED: rlogin target" + } +} else { + puts "PASSED: rlogin target" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# test remote_open +if { [rsh target] < 0 } { + if [ string match "*kinit" $errno] { + puts "NOTTESTED: rsh target" + } else { + puts "FAILED: rsh target" + } +} else { + puts "PASSED: rsh target" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# telnet to host +# FIXME: This won't work till we figure out how to telnet and +# not get a password prompt. + +# +# Connect to the configured host +# +set target_info(host,connect) rlogin +set target_info(host,netport) $target_info(idp,netport) +set target_info(host,target) localhost + +# rlogin to host +if { [rlogin host] < 0 } { + if [ string match "*kinit*" $errno] { + puts "NOTTESTED: rlogin host" + } else { + puts "FAILED: rlogin host" + } +} else { + puts "PASSED: rlogin host" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# rsh to host +if { [rsh host] < 0 } { + if [ string match "*kinit*" $errno] { + puts "NOTTESTED: rsh host" + } else { + puts "FAILED: rsh host" + } +} else { + puts "PASSED: rsh host" +} +catch "exp_send exit\n" +catch "close -i $spawn_id" +catch "wait -i $spawn_id" + +# telnet to host +# FIXME: This won't work till we figure out how to telnet and +# not get a password prompt. + +# tip port +# remote_close args +# rcp_download src dest +# tip_download shell_id file +# kermit args +# download args + + + + + + + diff --git a/testsuite/runtest.all/stats-sub.exp b/testsuite/runtest.all/stats-sub.exp new file mode 100644 index 0000000..deb52f8 --- /dev/null +++ b/testsuite/runtest.all/stats-sub.exp @@ -0,0 +1,35 @@ +# Copyright (C) 1997 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# DejaGnu@cygnus.com + +# Subordinate to stats.exp. + +# If not called by stats.exp, quit now. +if { ![info exists STATS_TEST] } { + return +} + +switch $STATS_TEST { + pass { pass "pass test" } + fail { fail "fail test" } + xpass { xpass "xpass test" } + xfail { xfail "xfail test" } + untested { untested "untested test" } + unresolved { unresolved "unresolved test" } + unsupported { unsupported "unsupported test" } +} diff --git a/testsuite/runtest.all/stats.exp b/testsuite/runtest.all/stats.exp new file mode 100644 index 0000000..157cb27 --- /dev/null +++ b/testsuite/runtest.all/stats.exp @@ -0,0 +1,53 @@ +# Copyright (C) 1995, 1996, 1997, 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 tests pass/fail/etc. +# The way we do this is to recursively invoke ourselves on a small testsuite +# and analyze the results. + +load_lib util-defs.exp + +if ![info exists tmpdir] { + set tmpdir $objdir/tmpdir +} + +if ![file isdirectory $tmpdir] { + catch "exec mkdir $tmpdir" +} + +set tests { + { pass "expected passes\[ \t\]+1\n" } + { fail "unexpected failures\[ \t\]+1\n" } + { xpass "unexpected successes\[ \t\]+1\n" } + { xfail "expected failures\[ \t\]+1\n" } + { untested "untested testcases\[ \t\]+1\n" } + { unresolved "unresolved testcases\[ \t\]+1\n" } + { unsupported "unsupported tests\[ \t\]+1\n" } +} + +foreach t $tests { + if [util_test "$RUNTEST" \ + "--outdir $tmpdir STATS_TEST=[lindex $t 0] stats-sub.exp" \ + "" \ + [lindex $t 1]] { + fail [lindex $t 0] + } else { + pass [lindex $t 0] + } +} diff --git a/testsuite/runtest.all/target.test b/testsuite/runtest.all/target.test new file mode 100644 index 0000000..19aba4a --- /dev/null +++ b/testsuite/runtest.all/target.test @@ -0,0 +1,247 @@ +set srcdir [lindex $argv 0] +set subdir [lindex $argv 1] +set objdir [lindex $argv 2] + +if [ file exists $objdir/setval.tmp ] { + source $objdir/setval.tmp +} else { + puts "ERROR: $objdir/setval.tmp doesn't exist" +} +if [ file exists $srcdir/$subdir/default_procs.tcl ] { + source "$srcdir/$subdir/default_procs.tcl" +} else { + puts "ERROR: $srcdir/$subdir/default_procs.tcl doesn't exist" +} + +set file $srcdir/../lib/target.exp +if [ file exists $file] { + source $file +} else { + puts "ERROR: $file doesn't exist" +} +# we load framework so we can use stuff like is3way +set file $srcdir/../lib/framework.exp +if [ file exists $file] { + source $file +} else { + puts "ERROR: $file doesn't exist" +} +# we load the remote stuff so we can test execute_anywhere +set file $srcdir/../lib/remote.exp +if [ file exists $file] { + source $file +} else { + puts "ERROR: $file doesn't exist" +} + +# +# Create a false target config array +# +set target_info(idp,name) "idp" +set target_info(idp,ldflags) "-Tidp.ld" +set target_info(idp,config) m68k-unknown-aout +set target_info(idp,cflags) "" +set target_info(idp,connect) "telnet" +set target_info(idp,target) "s12" +set target_info(idp,serial) "tstty12" +set target_info(idp,netport) "localhost:23" +set target_info(idp,baud) "9600" +# MVME target +set target_info(mvme,name) "mvme" +set target_info(mvme,ldflags) "-Tmvme.ld" +set target_info(mvme,config) m68k-unknown-aout +set target_info(mvme,cflags) "" +set target_info(mvme,connect) "telnet" +set target_info(mvme,target) "s12" +set target_info(mvme,serial) "tstty8" +set target_info(mvme,netport) "localhost:23" +set target_info(mvme,baud) "9600" + +# Test remote open. We try not to use any of the support procs in +# target.exp to for isolation testing. "target" is the name of the +# default array setup by the procs in target.exp. + +set timeout 100 + +# test list_target + +if { [list_targets] == "idp mvme" } { + puts "PASSED: list_targets" +} else { + puts "FAILED: list_targets" +} +push_config target idp +set matches 0 +if { $target_info(target,name) == "idp" } { + incr matches +} +if { $target_info(target,ldflags) == "-Tidp.ld" } { + incr matches +} +if { $target_info(target,config) == "m68k-unknown-aout" } { + incr matches +} +if { $target_info(target,cflags) == "" } { + incr matches +} +if { $target_info(target,connect) == "telnet" } { + incr matches +} +if { $target_info(target,target) == "s12" } { + incr matches +} +if { $target_info(target,serial) == "tstty12" } { + incr matches +} +if { $target_info(target,netport) == "localhost:23" } { + incr matches +} +if { $target_info(target,baud) == "9600" } { + incr matches +} +if { $matches == 9 } { + puts "PASSED: push_config target" +} else { + puts "FAILED: push_config target" +} + +# test pop_config target +pop_config target +set matches 0 +if { $target_info(target,name) == "" } { + incr matches +} +if { $target_info(target,ldflags) == "" } { + incr matches +} +if { $target_info(target,config) == "" } { + incr matches +} +if { $target_info(target,cflags) == "" } { + incr matches +} +if { $target_info(target,connect) == "" } { + incr matches +} +if { $target_info(target,target) == "" } { + incr matches +} +if { $target_info(target,serial) == "" } { + incr matches +} +if { $target_info(target,netport) == "" } { + incr matches +} +if { $target_info(target,baud) == "" } { + incr matches +} +if { $matches == 9 } { + puts "PASSED: pop_config target" +} else { + puts "FAILED: pop_config target" +} + +push_config host idp +set matches 0 +if { $target_info(host,name) == "idp" } { + incr matches +} +if { $target_info(host,ldflags) == "-Tidp.ld" } { + incr matches +} +if { $target_info(host,config) == "m68k-unknown-aout" } { + incr matches +} +if { $target_info(host,cflags) == "" } { + incr matches +} +if { $target_info(host,connect) == "telnet" } { + incr matches +} +if { $target_info(host,target) == "s12" } { + incr matches +} +if { $target_info(host,serial) == "tstty12" } { + incr matches +} +if { $target_info(host,netport) == "localhost:23" } { + incr matches +} +if { $target_info(host,baud) == "9600" } { + incr matches +} +if { $matches == 9 } { + puts "PASSED: push_config target" +} else { + puts "FAILED: push_config target" +} + +# test pop_config host +pop_config host +set matches 0 +if { $target_info(host,name) == "" } { + incr matches +} +if { $target_info(host,ldflags) == "" } { + incr matches +} +if { $target_info(host,config) == "" } { + incr matches +} +if { $target_info(host,cflags) == "" } { + incr matches +} +if { $target_info(host,connect) == "" } { + incr matches +} +if { $target_info(host,target) == "" } { + incr matches +} +if { $target_info(host,serial) == "" } { + incr matches +} +if { $target_info(host,netport) == "" } { + incr matches +} +if { $target_info(host,baud) == "" } { + incr matches +} +if { $matches == 9 } { + puts "PASSED: pop_config host" +} else { + puts "FAILED: pop_config host" +} + +# test execute_anywhere for a native environment +set host_triplet i586-unknown-linux +set target_triplet i586-unknown-linux +set build_triplet i586-unknown-linux +if { [string match "*setval.tmp*" [execute_anywhere "ls"]] } { + puts "PASSED: execute_anywhere, native" +} else { + puts "FAILED: execute_anywhere, native" +} + +# test execute_anywhere for a normal cross +set target_triplet m68k-unknown-coff +if { [string match "*testsuite" [execute_anywhere "pwd"]] } { + puts "PASSED: execute_anywhere, normal cross" +} else { + puts "FAILED: execute_anywhere, normal cross" +} + +# test execute_anywhere for a canadian cross +set build_triplet m68k-test-test +set target_info(host,connect) rlogin +set target_info(host,netport) $target_info(idp,netport) +set target_info(host,target) localhost +if { [string match "*FooBar*" [execute_anywhere "echo FooBar"]] } { + puts "PASSED: execute_anywhere, canadian cross" +} else { + puts "FAILED: execute_anywhere, canadian cross" +} + +# compile arg +# archive arg +# ranlib arg +# link_objects arg diff --git a/testsuite/runtest.all/topdir/subdir1/subfile1 b/testsuite/runtest.all/topdir/subdir1/subfile1 new file mode 100644 index 0000000..8397fe3 --- /dev/null +++ b/testsuite/runtest.all/topdir/subdir1/subfile1 @@ -0,0 +1 @@ +# just so we don't look empty. diff --git a/testsuite/runtest.all/topdir/subdir1/subfile2 b/testsuite/runtest.all/topdir/subdir1/subfile2 new file mode 100644 index 0000000..7d1d836 --- /dev/null +++ b/testsuite/runtest.all/topdir/subdir1/subfile2 @@ -0,0 +1,2 @@ +# just so we don't look empty. + diff --git a/testsuite/runtest.all/topdir/subdir1/subsubdir1/subsubfile1 b/testsuite/runtest.all/topdir/subdir1/subsubdir1/subsubfile1 new file mode 100644 index 0000000..7d1d836 --- /dev/null +++ b/testsuite/runtest.all/topdir/subdir1/subsubdir1/subsubfile1 @@ -0,0 +1,2 @@ +# just so we don't look empty. + diff --git a/testsuite/runtest.all/topdir/subdir2/subfile2 b/testsuite/runtest.all/topdir/subdir2/subfile2 new file mode 100644 index 0000000..7d1d836 --- /dev/null +++ b/testsuite/runtest.all/topdir/subdir2/subfile2 @@ -0,0 +1,2 @@ +# just so we don't look empty. + diff --git a/testsuite/runtest.all/utils.test b/testsuite/runtest.all/utils.test new file mode 100644 index 0000000..f9459d8 --- /dev/null +++ b/testsuite/runtest.all/utils.test @@ -0,0 +1,118 @@ +set srcdir [lindex $argv 0] +set subdir [lindex $argv 1] +set objdir [lindex $argv 2] + +if [ file exists $objdir/setval.tmp ] { + source $objdir/setval.tmp +} else { + puts "ERROR: $objdir/setval.tmp doesn't exist" +} +if [ file exists $srcdir/$subdir/default_procs.tcl ] { + source "$srcdir/$subdir/default_procs.tcl" +} else { + puts "ERROR: $srcdir$subdir/default_procs.tcl doesn't exist" +} + +set file $srcdir/../lib/utils.exp +if [ file exists $file] { + source $file +} else { + puts "ERROR: $file doesn't exist" +} + +# +# getdirs tests +# +if [lib_pat_test "getdirs" "${srcdir}/runtest.all" "runtest.all/topdir" ] { + puts "FAILED: getdirs toplevel, no arguments" +} else { + puts "PASSED: getdirs toplevel, no arguments" +} + +if [lib_pat_test "getdirs" "${srcdir}/runtest.all top*" "runtest.all/topdir" ] { + puts "FAILED: getdirs toplevel, one subdir" +} else { + puts "PASSED: getdirs toplevel, one subdir" +} + +if [lib_pat_test "getdirs" "${srcdir}/runtest.all/topdir" "subdir1*subdir2" ] { + puts "FAILED: getdirs toplevel, two subdirs" +} else { + puts "PASSED: getdirs toplevel, two subdirs" +} + +# +# find tests +# +if [string match "*/subdir2/subfile2" "[find ${srcdir}/runtest.all/topdir/subdir2 sub*]"] { + puts "PASSED: find, only one level deep" +} else { + puts "FAILED: find, only one level deep" +} + +#set path ${srcdir}/runtest.all/topdir/subdir1 +#exp_test "find ${path} sub*" "Adding */subdir1/subsubdir1/subsubfile1" "find, two levels deep" + +if [string match "*/subdir1/subsubdir1/subsubfile1" "[find ${srcdir}/runtest.all/topdir/subdir1 sub*]"] { + puts "PASSED: find, two levels deep" +} else { + puts "FAILED: find, two levels deep" +} + +# +# environment varible utility tests +# + +if [info exists env(TESTRUN)] { + unset env(TESTRUN) +} + +# test setenv +setenv TESTRUN FooBar +if [info exists env(TESTRUN)] { + if { $env(TESTRUN) == "FooBar" } { + pass "setenv, set an environment variable" + } else { + fail "setenv, set an environment variable + } +} else { + fail "setenv, set an environment variable" +} +# test getenv +if [info exists env(TESTRUN)] { + if { [getenv TESTRUN] == "FooBar" } { + pass "getenv, get an environment variable" + } else { + fail "getenv, get an environment variable" + } +} else { + untested "getenv, get an environment variable" +} + +# test unsetenv +if [info exists env(TESTRUN)] { + unsetenv TESTRUN + if [info exists env(TESTRUN)] { + fail "unsetenv, unset an environment variable" + } else { + pass "unsetenv, unset an environment variable" + } +} else { + untested "unsetenv, unset an environment variable" +} + +# which file +# grep args +# prune list pattern +# slay name +# absolute path +# psource file +# diff file_1 file_2 + + + + + + + + -- cgit v1.1